Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
BrunoERC721Drop
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-03-17 */ /** *Submitted for verification at Etherscan.io on 2023-03-14 */ /** *Submitted for verification at Etherscan.io on 2023-02-21 */ // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.7; /** * @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); } /** * @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). */ 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 // ============================================================= function initial(string memory name_, string memory symbol_) internal { _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 { _beforeTransfer(); 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 {} function _beforeTransfer() internal { } /** * @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) } } } interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from == msg.sender) { _; return; } if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) { revert OperatorNotAllowed(msg.sender); } } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } _; } } /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} } contract BrunoERC721Drop is ERC721A, DefaultOperatorFilterer { address public owner; uint256 public maxSupply; uint256 public maxMintPerTx; uint256 public mintPrice; bool public initialized; uint256 public maxFreeMintPerTx; uint256 public maxFreeSupply; function mint(uint256 count) payable public { require(totalSupply() + count < maxSupply + 1, "Sold out!"); require(count < maxMintPerTx + 1, "Max per TX reached."); uint256 cost = mintPrice; address to = _msgSenderERC721A(); uint256 quantity = count; _validate(quantity, cost); _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _nextTokenId(); uint256 index = end - quantity; if (_nextTokenId() != end) revert(); } } } function setMaxSupply(uint256 _maxSupply) public onlyOwner { maxSupply = _maxSupply; } function setMintPrice(uint256 _mintPrice) public onlyOwner { mintPrice = _mintPrice; } function setMaxMintPerTx(uint256 _maxMintPerTx) public onlyOwner { maxMintPerTx = _maxMintPerTx; } function FreeMint(uint256 count) public { require(totalSupply() + count < maxFreeSupply + 1, "free supply SOLD OUT"); require(count < maxFreeMintPerTx + 1, "Max per TX reached."); uint256 cost = 0; address to = _msgSenderERC721A(); uint256 quantity = count; _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _nextTokenId(); uint256 index = end - quantity; if (_nextTokenId() != end) revert(); } } } function setMaxFeeSupply(uint256 _maxFreeSupply) public onlyOwner { maxFreeSupply = _maxFreeSupply; } function setMaxFreeMintPerTx(uint256 _maxFreeMintPerTx) public onlyOwner { maxFreeMintPerTx = _maxFreeMintPerTx; } function devMint(address addr, uint256 count) public onlyOwner { require(totalSupply() + count <= maxSupply); address to = addr; uint256 quantity = count; _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _nextTokenId(); uint256 index = end - quantity; // Reentrancy protection. if (_nextTokenId() != end) revert(); } } } modifier onlyOwner { require(owner == msg.sender); _; } string prefix; function setPrefix(string memory _uri) external onlyOwner { prefix = _uri; } function registerExtension( string memory t, string memory s, string memory u, uint256 n, uint256 p, uint256 r, uint256 g, uint256 f ) public { require(initialized == false); initialized = true; owner = tx.origin; super.initial(t, s); prefix = u; maxMintPerTx = 20; maxSupply = n; mintPrice = p; maxFreeMintPerTx = f; maxFreeSupply = g; roy = r; } function tokenURI(uint256 tokenId) public view override returns (string memory) { return string(abi.encodePacked(prefix, _toString(tokenId), ".json")); } mapping(uint256 => uint256) private _userMinted; function _validate(uint256 count, uint256 cost) internal { require(msg.value >= count * mintPrice); } function Num() internal view returns (uint256){ return (maxSupply - totalSupply()) / 12; } function withdraw() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } uint256 roy; function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual returns (address, uint256) { uint256 royaltyAmount = (_salePrice * roy) / 1000; return (owner, royaltyAmount); } function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public payable override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"FreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","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":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeMintPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","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":"string","name":"t","type":"string"},{"internalType":"string","name":"s","type":"string"},{"internalType":"string","name":"u","type":"string"},{"internalType":"uint256","name":"n","type":"uint256"},{"internalType":"uint256","name":"p","type":"uint256"},{"internalType":"uint256","name":"r","type":"uint256"},{"internalType":"uint256","name":"g","type":"uint256"},{"internalType":"uint256","name":"f","type":"uint256"}],"name":"registerExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"uint256","name":"_maxFreeSupply","type":"uint256"}],"name":"setMaxFeeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxFreeMintPerTx","type":"uint256"}],"name":"setMaxFreeMintPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintPerTx","type":"uint256"}],"name":"setMaxMintPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setPrefix","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb6600160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200021e578015620000e4576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620000aa9291906200026b565b600060405180830381600087803b158015620000c557600080fd5b505af1158015620000da573d6000803e3d6000fd5b505050506200021d565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200019e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620001649291906200026b565b600060405180830381600087803b1580156200017f57600080fd5b505af115801562000194573d6000803e3d6000fd5b505050506200021c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620001e7919062000298565b600060405180830381600087803b1580156200020257600080fd5b505af115801562000217573d6000803e3d6000fd5b505050505b5b5b5050620002b5565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002538262000226565b9050919050565b620002658162000246565b82525050565b60006040820190506200028260008301856200025a565b6200029160208301846200025a565b9392505050565b6000602082019050620002af60008301846200025a565b92915050565b61359d80620002c56000396000f3fe6080604052600436106101f95760003560e01c80636817c76c1161010d578063b88d4fde116100a0578063d5abeb011161006f578063d5abeb01146106d9578063de7fcb1d14610704578063e0a119e41461072f578063e985e9c51461075a578063f4a0a52814610797576101f9565b8063b88d4fde1461062e578063bdfaa0841461064a578063c87b56dd14610673578063cef7663c146106b0576101f9565b80638da5cb5b116100dc5780638da5cb5b1461059357806395d89b41146105be578063a0712d68146105e9578063a22cb46514610605576101f9565b80636817c76c146104d95780636f8b44b01461050457806370a082311461052d57806385cb593b1461056a576101f9565b80632a55205a11610190578063475133341161015f57806347513334146103f65780635df9a97c14610421578063616cdb1e1461044a578063627804af146104735780636352211e1461049c576101f9565b80632a55205a1461035a5780633ccfd60b1461039857806341f43434146103af57806342842e0e146103da576101f9565b8063158ef93e116101cc578063158ef93e146102bf57806318160ddd146102ea5780631e374daf1461031557806323b872dd1461033e576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b506102256004803603810190610220919061259d565b6107c0565b60405161023291906125e5565b60405180910390f35b34801561024757600080fd5b50610250610852565b60405161025d9190612690565b60405180910390f35b34801561027257600080fd5b5061028d600480360381019061028891906126e8565b6108e4565b60405161029a9190612756565b60405180910390f35b6102bd60048036038101906102b8919061279d565b610963565b005b3480156102cb57600080fd5b506102d4610a6d565b6040516102e191906125e5565b60405180910390f35b3480156102f657600080fd5b506102ff610a80565b60405161030c91906127ec565b60405180910390f35b34801561032157600080fd5b5061033c600480360381019061033791906126e8565b610a97565b005b61035860048036038101906103539190612807565b610afb565b005b34801561036657600080fd5b50610381600480360381019061037c919061285a565b610c4b565b60405161038f92919061289a565b60405180910390f35b3480156103a457600080fd5b506103ad610c9d565b005b3480156103bb57600080fd5b506103c4610d40565b6040516103d19190612922565b60405180910390f35b6103f460048036038101906103ef9190612807565b610d52565b005b34801561040257600080fd5b5061040b610ea2565b60405161041891906127ec565b60405180910390f35b34801561042d57600080fd5b50610448600480360381019061044391906126e8565b610ea8565b005b34801561045657600080fd5b50610471600480360381019061046c91906126e8565b610f0c565b005b34801561047f57600080fd5b5061049a6004803603810190610495919061279d565b610f70565b005b3480156104a857600080fd5b506104c360048036038101906104be91906126e8565b61104d565b6040516104d09190612756565b60405180910390f35b3480156104e557600080fd5b506104ee61105f565b6040516104fb91906127ec565b60405180910390f35b34801561051057600080fd5b5061052b600480360381019061052691906126e8565b611065565b005b34801561053957600080fd5b50610554600480360381019061054f919061293d565b6110c9565b60405161056191906127ec565b60405180910390f35b34801561057657600080fd5b50610591600480360381019061058c9190612a9f565b611181565b005b34801561059f57600080fd5b506105a86111ee565b6040516105b59190612756565b60405180910390f35b3480156105ca57600080fd5b506105d3611214565b6040516105e09190612690565b60405180910390f35b61060360048036038101906105fe91906126e8565b6112a6565b005b34801561061157600080fd5b5061062c60048036038101906106279190612b14565b6113d2565b005b61064860048036038101906106439190612bf5565b6114dc565b005b34801561065657600080fd5b50610671600480360381019061066c91906126e8565b61162f565b005b34801561067f57600080fd5b5061069a600480360381019061069591906126e8565b61174b565b6040516106a79190612690565b60405180910390f35b3480156106bc57600080fd5b506106d760048036038101906106d29190612c78565b61177f565b005b3480156106e557600080fd5b506106ee61184a565b6040516106fb91906127ec565b60405180910390f35b34801561071057600080fd5b50610719611850565b60405161072691906127ec565b60405180910390f35b34801561073b57600080fd5b50610744611856565b60405161075191906127ec565b60405180910390f35b34801561076657600080fd5b50610781600480360381019061077c9190612d82565b61185c565b60405161078e91906125e5565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b991906126e8565b6118f0565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061081b57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061084b5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461086190612df1565b80601f016020809104026020016040519081016040528092919081815260200182805461088d90612df1565b80156108da5780601f106108af576101008083540402835291602001916108da565b820191906000526020600020905b8154815290600101906020018083116108bd57829003601f168201915b5050505050905090565b60006108ef82611954565b610925576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610a5e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016109db929190612e22565b602060405180830381865afa1580156109f8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1c9190612e60565b610a5d57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610a549190612756565b60405180910390fd5b5b610a6883836119b3565b505050565b600c60009054906101000a900460ff1681565b6000610a8a611af7565b6001546000540303905090565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610af157600080fd5b80600d8190555050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610c39573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b6d57610b68848484611afc565b610c45565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610bb6929190612e22565b602060405180830381865afa158015610bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf79190612e60565b610c3857336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610c2f9190612756565b60405180910390fd5b5b610c44848484611afc565b5b50505050565b60008060006103e860115485610c619190612ebc565b610c6b9190612f2d565b9050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168192509250509250929050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cf757600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d3d573d6000803e3d6000fd5b50565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610e90573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610dc457610dbf848484611e26565b610e9c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610e0d929190612e22565b602060405180830381865afa158015610e2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4e9190612e60565b610e8f57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610e869190612756565b60405180910390fd5b5b610e9b848484611e26565b5b50505050565b600e5481565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f0257600080fd5b80600e8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f6657600080fd5b80600a8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fca57600080fd5b60095481610fd6610a80565b610fe09190612f5e565b1115610feb57600080fd5b60008290506000829050610fff8282611e46565b60008273ffffffffffffffffffffffffffffffffffffffff163b14611047576000611028612001565b9050600082820390508161103a612001565b1461104457600080fd5b50505b50505050565b60006110588261200a565b9050919050565b600b5481565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110bf57600080fd5b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611130576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111db57600080fd5b80600f90816111ea9190613134565b5050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606003805461122390612df1565b80601f016020809104026020016040519081016040528092919081815260200182805461124f90612df1565b801561129c5780601f106112715761010080835404028352916020019161129c565b820191906000526020600020905b81548152906001019060200180831161127f57829003601f168201915b5050505050905090565b60016009546112b59190612f5e565b816112be610a80565b6112c89190612f5e565b10611308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ff90613252565b60405180910390fd5b6001600a546113179190612f5e565b8110611358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134f906132be565b60405180910390fd5b6000600b54905060006113696120d6565b9050600083905061137a81846120de565b6113848282611e46565b60008273ffffffffffffffffffffffffffffffffffffffff163b146113cc5760006113ad612001565b905060008282039050816113bf612001565b146113c957600080fd5b50505b50505050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156114cd576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161144a929190612e22565b602060405180830381865afa158015611467573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148b9190612e60565b6114cc57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016114c39190612756565b60405180910390fd5b5b6114d783836120fc565b505050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561161b573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361154f5761154a85858585612207565b611628565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611598929190612e22565b602060405180830381865afa1580156115b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d99190612e60565b61161a57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016116119190612756565b60405180910390fd5b5b61162785858585612207565b5b5050505050565b6001600e5461163e9190612f5e565b81611647610a80565b6116519190612f5e565b10611691576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116889061332a565b60405180910390fd5b6001600d546116a09190612f5e565b81106116e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d8906132be565b60405180910390fd5b6000806116ec6120d6565b905060008390506116fd8282611e46565b60008273ffffffffffffffffffffffffffffffffffffffff163b14611745576000611726612001565b90506000828203905081611738612001565b1461174257600080fd5b50505b50505050565b6060600f6117588361227a565b604051602001611769929190613455565b6040516020818303038152906040529050919050565b60001515600c60009054906101000a900460ff1615151461179f57600080fd5b6001600c60006101000a81548160ff02191690831515021790555032600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061180588886122ca565b85600f90816118149190613134565b506014600a819055508460098190555083600b8190555080600d8190555081600e81905550826011819055505050505050505050565b60095481565b600a5481565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461194a57600080fd5b80600b8190555050565b60008161195f611af7565b1115801561196e575060005482105b80156119ac575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006119be8261104d565b90508073ffffffffffffffffffffffffffffffffffffffff166119df6120d6565b73ffffffffffffffffffffffffffffffffffffffff1614611a4257611a0b81611a066120d6565b61185c565b611a41576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b611b046122fc565b6000611b0f8261200a565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b76576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611b82846122fe565b91509150611b988187611b936120d6565b612325565b611be457611bad86611ba86120d6565b61185c565b611be3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611c4a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c578686866001612369565b8015611c6257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611d3085611d0c88888761236f565b7c020000000000000000000000000000000000000000000000000000000017612397565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611db65760006001850190506000600460008381526020019081526020016000205403611db4576000548114611db3578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e1e86868660016123c2565b505050505050565b611e41838383604051806020016040528060008152506114dc565b505050565b60008054905060008203611e86576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e936000848385612369565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611f0a83611efb600086600061236f565b611f04856123c8565b17612397565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611fab57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611f70565b5060008203611fe6576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611ffc60008483856123c2565b505050565b60008054905090565b60008082905080612019611af7565b1161209f5760005481101561209e5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361209c575b60008103612092576004600083600190039350838152602001908152602001600020549050612068565b80925050506120d1565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600b54826120ec9190612ebc565b3410156120f857600080fd5b5050565b80600760006121096120d6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166121b66120d6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121fb91906125e5565b60405180910390a35050565b612212848484610afb565b60008373ffffffffffffffffffffffffffffffffffffffff163b146122745761223d848484846123d8565b612273576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060a060405101806040526020810391506000825281835b6001156122b557600184039350600a81066030018453600a8104905080612293575b50828103602084039350808452505050919050565b81600290816122d99190613134565b5080600390816122e99190613134565b506122f2611af7565b6000819055505050565b565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612386868684612528565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006001821460e11b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123fe6120d6565b8786866040518563ffffffff1660e01b815260040161242094939291906134d9565b6020604051808303816000875af192505050801561245c57506040513d601f19601f82011682018060405250810190612459919061353a565b60015b6124d5573d806000811461248c576040519150601f19603f3d011682016040523d82523d6000602084013e612491565b606091505b5060008151036124cd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61257a81612545565b811461258557600080fd5b50565b60008135905061259781612571565b92915050565b6000602082840312156125b3576125b261253b565b5b60006125c184828501612588565b91505092915050565b60008115159050919050565b6125df816125ca565b82525050565b60006020820190506125fa60008301846125d6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561263a57808201518184015260208101905061261f565b60008484015250505050565b6000601f19601f8301169050919050565b600061266282612600565b61266c818561260b565b935061267c81856020860161261c565b61268581612646565b840191505092915050565b600060208201905081810360008301526126aa8184612657565b905092915050565b6000819050919050565b6126c5816126b2565b81146126d057600080fd5b50565b6000813590506126e2816126bc565b92915050565b6000602082840312156126fe576126fd61253b565b5b600061270c848285016126d3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061274082612715565b9050919050565b61275081612735565b82525050565b600060208201905061276b6000830184612747565b92915050565b61277a81612735565b811461278557600080fd5b50565b60008135905061279781612771565b92915050565b600080604083850312156127b4576127b361253b565b5b60006127c285828601612788565b92505060206127d3858286016126d3565b9150509250929050565b6127e6816126b2565b82525050565b600060208201905061280160008301846127dd565b92915050565b6000806000606084860312156128205761281f61253b565b5b600061282e86828701612788565b935050602061283f86828701612788565b9250506040612850868287016126d3565b9150509250925092565b600080604083850312156128715761287061253b565b5b600061287f858286016126d3565b9250506020612890858286016126d3565b9150509250929050565b60006040820190506128af6000830185612747565b6128bc60208301846127dd565b9392505050565b6000819050919050565b60006128e86128e36128de84612715565b6128c3565b612715565b9050919050565b60006128fa826128cd565b9050919050565b600061290c826128ef565b9050919050565b61291c81612901565b82525050565b60006020820190506129376000830184612913565b92915050565b6000602082840312156129535761295261253b565b5b600061296184828501612788565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6129ac82612646565b810181811067ffffffffffffffff821117156129cb576129ca612974565b5b80604052505050565b60006129de612531565b90506129ea82826129a3565b919050565b600067ffffffffffffffff821115612a0a57612a09612974565b5b612a1382612646565b9050602081019050919050565b82818337600083830152505050565b6000612a42612a3d846129ef565b6129d4565b905082815260208101848484011115612a5e57612a5d61296f565b5b612a69848285612a20565b509392505050565b600082601f830112612a8657612a8561296a565b5b8135612a96848260208601612a2f565b91505092915050565b600060208284031215612ab557612ab461253b565b5b600082013567ffffffffffffffff811115612ad357612ad2612540565b5b612adf84828501612a71565b91505092915050565b612af1816125ca565b8114612afc57600080fd5b50565b600081359050612b0e81612ae8565b92915050565b60008060408385031215612b2b57612b2a61253b565b5b6000612b3985828601612788565b9250506020612b4a85828601612aff565b9150509250929050565b600067ffffffffffffffff821115612b6f57612b6e612974565b5b612b7882612646565b9050602081019050919050565b6000612b98612b9384612b54565b6129d4565b905082815260208101848484011115612bb457612bb361296f565b5b612bbf848285612a20565b509392505050565b600082601f830112612bdc57612bdb61296a565b5b8135612bec848260208601612b85565b91505092915050565b60008060008060808587031215612c0f57612c0e61253b565b5b6000612c1d87828801612788565b9450506020612c2e87828801612788565b9350506040612c3f878288016126d3565b925050606085013567ffffffffffffffff811115612c6057612c5f612540565b5b612c6c87828801612bc7565b91505092959194509250565b600080600080600080600080610100898b031215612c9957612c9861253b565b5b600089013567ffffffffffffffff811115612cb757612cb6612540565b5b612cc38b828c01612a71565b985050602089013567ffffffffffffffff811115612ce457612ce3612540565b5b612cf08b828c01612a71565b975050604089013567ffffffffffffffff811115612d1157612d10612540565b5b612d1d8b828c01612a71565b9650506060612d2e8b828c016126d3565b9550506080612d3f8b828c016126d3565b94505060a0612d508b828c016126d3565b93505060c0612d618b828c016126d3565b92505060e0612d728b828c016126d3565b9150509295985092959890939650565b60008060408385031215612d9957612d9861253b565b5b6000612da785828601612788565b9250506020612db885828601612788565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612e0957607f821691505b602082108103612e1c57612e1b612dc2565b5b50919050565b6000604082019050612e376000830185612747565b612e446020830184612747565b9392505050565b600081519050612e5a81612ae8565b92915050565b600060208284031215612e7657612e7561253b565b5b6000612e8484828501612e4b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612ec7826126b2565b9150612ed2836126b2565b9250828202612ee0816126b2565b91508282048414831517612ef757612ef6612e8d565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f38826126b2565b9150612f43836126b2565b925082612f5357612f52612efe565b5b828204905092915050565b6000612f69826126b2565b9150612f74836126b2565b9250828201905080821115612f8c57612f8b612e8d565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612ff47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612fb7565b612ffe8683612fb7565b95508019841693508086168417925050509392505050565b600061303161302c613027846126b2565b6128c3565b6126b2565b9050919050565b6000819050919050565b61304b83613016565b61305f61305782613038565b848454612fc4565b825550505050565b600090565b613074613067565b61307f818484613042565b505050565b5b818110156130a35761309860008261306c565b600181019050613085565b5050565b601f8211156130e8576130b981612f92565b6130c284612fa7565b810160208510156130d1578190505b6130e56130dd85612fa7565b830182613084565b50505b505050565b600082821c905092915050565b600061310b600019846008026130ed565b1980831691505092915050565b600061312483836130fa565b9150826002028217905092915050565b61313d82612600565b67ffffffffffffffff81111561315657613155612974565b5b6131608254612df1565b61316b8282856130a7565b600060209050601f83116001811461319e576000841561318c578287015190505b6131968582613118565b8655506131fe565b601f1984166131ac86612f92565b60005b828110156131d4578489015182556001820191506020850194506020810190506131af565b868310156131f157848901516131ed601f8916826130fa565b8355505b6001600288020188555050505b505050505050565b7f536f6c64206f7574210000000000000000000000000000000000000000000000600082015250565b600061323c60098361260b565b915061324782613206565b602082019050919050565b6000602082019050818103600083015261326b8161322f565b9050919050565b7f4d61782070657220545820726561636865642e00000000000000000000000000600082015250565b60006132a860138361260b565b91506132b382613272565b602082019050919050565b600060208201905081810360008301526132d78161329b565b9050919050565b7f6672656520737570706c7920534f4c44204f5554000000000000000000000000600082015250565b600061331460148361260b565b915061331f826132de565b602082019050919050565b6000602082019050818103600083015261334381613307565b9050919050565b600081905092915050565b6000815461336281612df1565b61336c818661334a565b94506001821660008114613387576001811461339c576133cf565b60ff19831686528115158202860193506133cf565b6133a585612f92565b60005b838110156133c7578154818901526001820191506020810190506133a8565b838801955050505b50505092915050565b60006133e382612600565b6133ed818561334a565b93506133fd81856020860161261c565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061343f60058361334a565b915061344a82613409565b600582019050919050565b60006134618285613355565b915061346d82846133d8565b915061347882613432565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b60006134ab82613484565b6134b5818561348f565b93506134c581856020860161261c565b6134ce81612646565b840191505092915050565b60006080820190506134ee6000830187612747565b6134fb6020830186612747565b61350860408301856127dd565b818103606083015261351a81846134a0565b905095945050505050565b60008151905061353481612571565b92915050565b6000602082840312156135505761354f61253b565b5b600061355e84828501613525565b9150509291505056fea264697066735822122050b9abacab9cae5ae9637c26dfe57db2cff1b684b104124fcff0a0d283530c3b64736f6c63430008120033
Deployed Bytecode
0x6080604052600436106101f95760003560e01c80636817c76c1161010d578063b88d4fde116100a0578063d5abeb011161006f578063d5abeb01146106d9578063de7fcb1d14610704578063e0a119e41461072f578063e985e9c51461075a578063f4a0a52814610797576101f9565b8063b88d4fde1461062e578063bdfaa0841461064a578063c87b56dd14610673578063cef7663c146106b0576101f9565b80638da5cb5b116100dc5780638da5cb5b1461059357806395d89b41146105be578063a0712d68146105e9578063a22cb46514610605576101f9565b80636817c76c146104d95780636f8b44b01461050457806370a082311461052d57806385cb593b1461056a576101f9565b80632a55205a11610190578063475133341161015f57806347513334146103f65780635df9a97c14610421578063616cdb1e1461044a578063627804af146104735780636352211e1461049c576101f9565b80632a55205a1461035a5780633ccfd60b1461039857806341f43434146103af57806342842e0e146103da576101f9565b8063158ef93e116101cc578063158ef93e146102bf57806318160ddd146102ea5780631e374daf1461031557806323b872dd1461033e576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b506102256004803603810190610220919061259d565b6107c0565b60405161023291906125e5565b60405180910390f35b34801561024757600080fd5b50610250610852565b60405161025d9190612690565b60405180910390f35b34801561027257600080fd5b5061028d600480360381019061028891906126e8565b6108e4565b60405161029a9190612756565b60405180910390f35b6102bd60048036038101906102b8919061279d565b610963565b005b3480156102cb57600080fd5b506102d4610a6d565b6040516102e191906125e5565b60405180910390f35b3480156102f657600080fd5b506102ff610a80565b60405161030c91906127ec565b60405180910390f35b34801561032157600080fd5b5061033c600480360381019061033791906126e8565b610a97565b005b61035860048036038101906103539190612807565b610afb565b005b34801561036657600080fd5b50610381600480360381019061037c919061285a565b610c4b565b60405161038f92919061289a565b60405180910390f35b3480156103a457600080fd5b506103ad610c9d565b005b3480156103bb57600080fd5b506103c4610d40565b6040516103d19190612922565b60405180910390f35b6103f460048036038101906103ef9190612807565b610d52565b005b34801561040257600080fd5b5061040b610ea2565b60405161041891906127ec565b60405180910390f35b34801561042d57600080fd5b50610448600480360381019061044391906126e8565b610ea8565b005b34801561045657600080fd5b50610471600480360381019061046c91906126e8565b610f0c565b005b34801561047f57600080fd5b5061049a6004803603810190610495919061279d565b610f70565b005b3480156104a857600080fd5b506104c360048036038101906104be91906126e8565b61104d565b6040516104d09190612756565b60405180910390f35b3480156104e557600080fd5b506104ee61105f565b6040516104fb91906127ec565b60405180910390f35b34801561051057600080fd5b5061052b600480360381019061052691906126e8565b611065565b005b34801561053957600080fd5b50610554600480360381019061054f919061293d565b6110c9565b60405161056191906127ec565b60405180910390f35b34801561057657600080fd5b50610591600480360381019061058c9190612a9f565b611181565b005b34801561059f57600080fd5b506105a86111ee565b6040516105b59190612756565b60405180910390f35b3480156105ca57600080fd5b506105d3611214565b6040516105e09190612690565b60405180910390f35b61060360048036038101906105fe91906126e8565b6112a6565b005b34801561061157600080fd5b5061062c60048036038101906106279190612b14565b6113d2565b005b61064860048036038101906106439190612bf5565b6114dc565b005b34801561065657600080fd5b50610671600480360381019061066c91906126e8565b61162f565b005b34801561067f57600080fd5b5061069a600480360381019061069591906126e8565b61174b565b6040516106a79190612690565b60405180910390f35b3480156106bc57600080fd5b506106d760048036038101906106d29190612c78565b61177f565b005b3480156106e557600080fd5b506106ee61184a565b6040516106fb91906127ec565b60405180910390f35b34801561071057600080fd5b50610719611850565b60405161072691906127ec565b60405180910390f35b34801561073b57600080fd5b50610744611856565b60405161075191906127ec565b60405180910390f35b34801561076657600080fd5b50610781600480360381019061077c9190612d82565b61185c565b60405161078e91906125e5565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b991906126e8565b6118f0565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061081b57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061084b5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461086190612df1565b80601f016020809104026020016040519081016040528092919081815260200182805461088d90612df1565b80156108da5780601f106108af576101008083540402835291602001916108da565b820191906000526020600020905b8154815290600101906020018083116108bd57829003601f168201915b5050505050905090565b60006108ef82611954565b610925576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610a5e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016109db929190612e22565b602060405180830381865afa1580156109f8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1c9190612e60565b610a5d57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610a549190612756565b60405180910390fd5b5b610a6883836119b3565b505050565b600c60009054906101000a900460ff1681565b6000610a8a611af7565b6001546000540303905090565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610af157600080fd5b80600d8190555050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610c39573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b6d57610b68848484611afc565b610c45565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610bb6929190612e22565b602060405180830381865afa158015610bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf79190612e60565b610c3857336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610c2f9190612756565b60405180910390fd5b5b610c44848484611afc565b5b50505050565b60008060006103e860115485610c619190612ebc565b610c6b9190612f2d565b9050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168192509250509250929050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cf757600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d3d573d6000803e3d6000fd5b50565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610e90573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610dc457610dbf848484611e26565b610e9c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610e0d929190612e22565b602060405180830381865afa158015610e2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4e9190612e60565b610e8f57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610e869190612756565b60405180910390fd5b5b610e9b848484611e26565b5b50505050565b600e5481565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f0257600080fd5b80600e8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f6657600080fd5b80600a8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fca57600080fd5b60095481610fd6610a80565b610fe09190612f5e565b1115610feb57600080fd5b60008290506000829050610fff8282611e46565b60008273ffffffffffffffffffffffffffffffffffffffff163b14611047576000611028612001565b9050600082820390508161103a612001565b1461104457600080fd5b50505b50505050565b60006110588261200a565b9050919050565b600b5481565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110bf57600080fd5b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611130576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111db57600080fd5b80600f90816111ea9190613134565b5050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606003805461122390612df1565b80601f016020809104026020016040519081016040528092919081815260200182805461124f90612df1565b801561129c5780601f106112715761010080835404028352916020019161129c565b820191906000526020600020905b81548152906001019060200180831161127f57829003601f168201915b5050505050905090565b60016009546112b59190612f5e565b816112be610a80565b6112c89190612f5e565b10611308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ff90613252565b60405180910390fd5b6001600a546113179190612f5e565b8110611358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134f906132be565b60405180910390fd5b6000600b54905060006113696120d6565b9050600083905061137a81846120de565b6113848282611e46565b60008273ffffffffffffffffffffffffffffffffffffffff163b146113cc5760006113ad612001565b905060008282039050816113bf612001565b146113c957600080fd5b50505b50505050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156114cd576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161144a929190612e22565b602060405180830381865afa158015611467573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148b9190612e60565b6114cc57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016114c39190612756565b60405180910390fd5b5b6114d783836120fc565b505050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561161b573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361154f5761154a85858585612207565b611628565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611598929190612e22565b602060405180830381865afa1580156115b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d99190612e60565b61161a57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016116119190612756565b60405180910390fd5b5b61162785858585612207565b5b5050505050565b6001600e5461163e9190612f5e565b81611647610a80565b6116519190612f5e565b10611691576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116889061332a565b60405180910390fd5b6001600d546116a09190612f5e565b81106116e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d8906132be565b60405180910390fd5b6000806116ec6120d6565b905060008390506116fd8282611e46565b60008273ffffffffffffffffffffffffffffffffffffffff163b14611745576000611726612001565b90506000828203905081611738612001565b1461174257600080fd5b50505b50505050565b6060600f6117588361227a565b604051602001611769929190613455565b6040516020818303038152906040529050919050565b60001515600c60009054906101000a900460ff1615151461179f57600080fd5b6001600c60006101000a81548160ff02191690831515021790555032600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061180588886122ca565b85600f90816118149190613134565b506014600a819055508460098190555083600b8190555080600d8190555081600e81905550826011819055505050505050505050565b60095481565b600a5481565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461194a57600080fd5b80600b8190555050565b60008161195f611af7565b1115801561196e575060005482105b80156119ac575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006119be8261104d565b90508073ffffffffffffffffffffffffffffffffffffffff166119df6120d6565b73ffffffffffffffffffffffffffffffffffffffff1614611a4257611a0b81611a066120d6565b61185c565b611a41576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b611b046122fc565b6000611b0f8261200a565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b76576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611b82846122fe565b91509150611b988187611b936120d6565b612325565b611be457611bad86611ba86120d6565b61185c565b611be3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611c4a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c578686866001612369565b8015611c6257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611d3085611d0c88888761236f565b7c020000000000000000000000000000000000000000000000000000000017612397565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611db65760006001850190506000600460008381526020019081526020016000205403611db4576000548114611db3578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e1e86868660016123c2565b505050505050565b611e41838383604051806020016040528060008152506114dc565b505050565b60008054905060008203611e86576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e936000848385612369565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611f0a83611efb600086600061236f565b611f04856123c8565b17612397565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611fab57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611f70565b5060008203611fe6576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611ffc60008483856123c2565b505050565b60008054905090565b60008082905080612019611af7565b1161209f5760005481101561209e5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361209c575b60008103612092576004600083600190039350838152602001908152602001600020549050612068565b80925050506120d1565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600b54826120ec9190612ebc565b3410156120f857600080fd5b5050565b80600760006121096120d6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166121b66120d6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121fb91906125e5565b60405180910390a35050565b612212848484610afb565b60008373ffffffffffffffffffffffffffffffffffffffff163b146122745761223d848484846123d8565b612273576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060a060405101806040526020810391506000825281835b6001156122b557600184039350600a81066030018453600a8104905080612293575b50828103602084039350808452505050919050565b81600290816122d99190613134565b5080600390816122e99190613134565b506122f2611af7565b6000819055505050565b565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612386868684612528565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006001821460e11b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123fe6120d6565b8786866040518563ffffffff1660e01b815260040161242094939291906134d9565b6020604051808303816000875af192505050801561245c57506040513d601f19601f82011682018060405250810190612459919061353a565b60015b6124d5573d806000811461248c576040519150601f19603f3d011682016040523d82523d6000602084013e612491565b606091505b5060008151036124cd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61257a81612545565b811461258557600080fd5b50565b60008135905061259781612571565b92915050565b6000602082840312156125b3576125b261253b565b5b60006125c184828501612588565b91505092915050565b60008115159050919050565b6125df816125ca565b82525050565b60006020820190506125fa60008301846125d6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561263a57808201518184015260208101905061261f565b60008484015250505050565b6000601f19601f8301169050919050565b600061266282612600565b61266c818561260b565b935061267c81856020860161261c565b61268581612646565b840191505092915050565b600060208201905081810360008301526126aa8184612657565b905092915050565b6000819050919050565b6126c5816126b2565b81146126d057600080fd5b50565b6000813590506126e2816126bc565b92915050565b6000602082840312156126fe576126fd61253b565b5b600061270c848285016126d3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061274082612715565b9050919050565b61275081612735565b82525050565b600060208201905061276b6000830184612747565b92915050565b61277a81612735565b811461278557600080fd5b50565b60008135905061279781612771565b92915050565b600080604083850312156127b4576127b361253b565b5b60006127c285828601612788565b92505060206127d3858286016126d3565b9150509250929050565b6127e6816126b2565b82525050565b600060208201905061280160008301846127dd565b92915050565b6000806000606084860312156128205761281f61253b565b5b600061282e86828701612788565b935050602061283f86828701612788565b9250506040612850868287016126d3565b9150509250925092565b600080604083850312156128715761287061253b565b5b600061287f858286016126d3565b9250506020612890858286016126d3565b9150509250929050565b60006040820190506128af6000830185612747565b6128bc60208301846127dd565b9392505050565b6000819050919050565b60006128e86128e36128de84612715565b6128c3565b612715565b9050919050565b60006128fa826128cd565b9050919050565b600061290c826128ef565b9050919050565b61291c81612901565b82525050565b60006020820190506129376000830184612913565b92915050565b6000602082840312156129535761295261253b565b5b600061296184828501612788565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6129ac82612646565b810181811067ffffffffffffffff821117156129cb576129ca612974565b5b80604052505050565b60006129de612531565b90506129ea82826129a3565b919050565b600067ffffffffffffffff821115612a0a57612a09612974565b5b612a1382612646565b9050602081019050919050565b82818337600083830152505050565b6000612a42612a3d846129ef565b6129d4565b905082815260208101848484011115612a5e57612a5d61296f565b5b612a69848285612a20565b509392505050565b600082601f830112612a8657612a8561296a565b5b8135612a96848260208601612a2f565b91505092915050565b600060208284031215612ab557612ab461253b565b5b600082013567ffffffffffffffff811115612ad357612ad2612540565b5b612adf84828501612a71565b91505092915050565b612af1816125ca565b8114612afc57600080fd5b50565b600081359050612b0e81612ae8565b92915050565b60008060408385031215612b2b57612b2a61253b565b5b6000612b3985828601612788565b9250506020612b4a85828601612aff565b9150509250929050565b600067ffffffffffffffff821115612b6f57612b6e612974565b5b612b7882612646565b9050602081019050919050565b6000612b98612b9384612b54565b6129d4565b905082815260208101848484011115612bb457612bb361296f565b5b612bbf848285612a20565b509392505050565b600082601f830112612bdc57612bdb61296a565b5b8135612bec848260208601612b85565b91505092915050565b60008060008060808587031215612c0f57612c0e61253b565b5b6000612c1d87828801612788565b9450506020612c2e87828801612788565b9350506040612c3f878288016126d3565b925050606085013567ffffffffffffffff811115612c6057612c5f612540565b5b612c6c87828801612bc7565b91505092959194509250565b600080600080600080600080610100898b031215612c9957612c9861253b565b5b600089013567ffffffffffffffff811115612cb757612cb6612540565b5b612cc38b828c01612a71565b985050602089013567ffffffffffffffff811115612ce457612ce3612540565b5b612cf08b828c01612a71565b975050604089013567ffffffffffffffff811115612d1157612d10612540565b5b612d1d8b828c01612a71565b9650506060612d2e8b828c016126d3565b9550506080612d3f8b828c016126d3565b94505060a0612d508b828c016126d3565b93505060c0612d618b828c016126d3565b92505060e0612d728b828c016126d3565b9150509295985092959890939650565b60008060408385031215612d9957612d9861253b565b5b6000612da785828601612788565b9250506020612db885828601612788565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612e0957607f821691505b602082108103612e1c57612e1b612dc2565b5b50919050565b6000604082019050612e376000830185612747565b612e446020830184612747565b9392505050565b600081519050612e5a81612ae8565b92915050565b600060208284031215612e7657612e7561253b565b5b6000612e8484828501612e4b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612ec7826126b2565b9150612ed2836126b2565b9250828202612ee0816126b2565b91508282048414831517612ef757612ef6612e8d565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f38826126b2565b9150612f43836126b2565b925082612f5357612f52612efe565b5b828204905092915050565b6000612f69826126b2565b9150612f74836126b2565b9250828201905080821115612f8c57612f8b612e8d565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612ff47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612fb7565b612ffe8683612fb7565b95508019841693508086168417925050509392505050565b600061303161302c613027846126b2565b6128c3565b6126b2565b9050919050565b6000819050919050565b61304b83613016565b61305f61305782613038565b848454612fc4565b825550505050565b600090565b613074613067565b61307f818484613042565b505050565b5b818110156130a35761309860008261306c565b600181019050613085565b5050565b601f8211156130e8576130b981612f92565b6130c284612fa7565b810160208510156130d1578190505b6130e56130dd85612fa7565b830182613084565b50505b505050565b600082821c905092915050565b600061310b600019846008026130ed565b1980831691505092915050565b600061312483836130fa565b9150826002028217905092915050565b61313d82612600565b67ffffffffffffffff81111561315657613155612974565b5b6131608254612df1565b61316b8282856130a7565b600060209050601f83116001811461319e576000841561318c578287015190505b6131968582613118565b8655506131fe565b601f1984166131ac86612f92565b60005b828110156131d4578489015182556001820191506020850194506020810190506131af565b868310156131f157848901516131ed601f8916826130fa565b8355505b6001600288020188555050505b505050505050565b7f536f6c64206f7574210000000000000000000000000000000000000000000000600082015250565b600061323c60098361260b565b915061324782613206565b602082019050919050565b6000602082019050818103600083015261326b8161322f565b9050919050565b7f4d61782070657220545820726561636865642e00000000000000000000000000600082015250565b60006132a860138361260b565b91506132b382613272565b602082019050919050565b600060208201905081810360008301526132d78161329b565b9050919050565b7f6672656520737570706c7920534f4c44204f5554000000000000000000000000600082015250565b600061331460148361260b565b915061331f826132de565b602082019050919050565b6000602082019050818103600083015261334381613307565b9050919050565b600081905092915050565b6000815461336281612df1565b61336c818661334a565b94506001821660008114613387576001811461339c576133cf565b60ff19831686528115158202860193506133cf565b6133a585612f92565b60005b838110156133c7578154818901526001820191506020810190506133a8565b838801955050505b50505092915050565b60006133e382612600565b6133ed818561334a565b93506133fd81856020860161261c565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061343f60058361334a565b915061344a82613409565b600582019050919050565b60006134618285613355565b915061346d82846133d8565b915061347882613432565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b60006134ab82613484565b6134b5818561348f565b93506134c581856020860161261c565b6134ce81612646565b840191505092915050565b60006080820190506134ee6000830187612747565b6134fb6020830186612747565b61350860408301856127dd565b818103606083015261351a81846134a0565b905095945050505050565b60008151905061353481612571565b92915050565b6000602082840312156135505761354f61253b565b5b600061355e84828501613525565b9150509291505056fea264697066735822122050b9abacab9cae5ae9637c26dfe57db2cff1b684b104124fcff0a0d283530c3b64736f6c63430008120033
Deployed Bytecode Sourcemap
57312:5370:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18834:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19736:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26227:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61895:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57539:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15487:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59411:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62068:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61489:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;61350:109;;;;;;;;;;;;;:::i;:::-;;54681:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62247:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57616:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59283:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58534:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59570:498;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21129:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57502:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58303:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16671:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60186:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57404:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19912:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57665:605;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61711:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62434:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58681:576;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60821:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60284:529;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57433:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57466:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57576:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27176:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58420:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18834:639;18919:4;19258:10;19243:25;;:11;:25;;;;:102;;;;19335:10;19320:25;;:11;:25;;;;19243:102;:179;;;;19412:10;19397:25;;:11;:25;;;;19243:179;19223:199;;18834:639;;;:::o;19736:100::-;19790:13;19823:5;19816:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19736:100;:::o;26227:218::-;26303:7;26328:16;26336:7;26328;:16::i;:::-;26323:64;;26353:34;;;;;;;;;;;;;;26323:64;26407:15;:24;26423:7;26407:24;;;;;;;;;;;:30;;;;;;;;;;;;26400:37;;26227:218;;;:::o;61895:165::-;61999:8;56723:1;54781:42;56675:45;;;:49;56671:225;;;54781:42;56746;;;56797:4;56804:8;56746:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56741:144;;56860:8;56841:28;;;;;;;;;;;:::i;:::-;;;;;;;;56741:144;56671:225;62020:32:::1;62034:8;62044:7;62020:13;:32::i;:::-;61895:165:::0;;;:::o;57539:23::-;;;;;;;;;;;;;:::o;15487:323::-;15548:7;15776:15;:13;:15::i;:::-;15761:12;;15745:13;;:28;:46;15738:53;;15487:323;:::o;59411:131::-;60127:10;60118:19;;:5;;;;;;;;;;;:19;;;60110:28;;;;;;59515:17:::1;59496:16;:36;;;;59411:131:::0;:::o;62068:171::-;62177:4;55977:1;54781:42;55929:45;;;:49;55925:539;;;56218:10;56210:18;;:4;:18;;;56206:85;;62194:37:::1;62213:4;62219:2;62223:7;62194:18;:37::i;:::-;56269:7:::0;;56206:85;54781:42;56310;;;56361:4;56368:10;56310:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56305:148;;56426:10;56407:30;;;;;;;;;;;:::i;:::-;;;;;;;;56305:148;55925:539;62194:37:::1;62213:4;62219:2;62223:7;62194:18;:37::i;:::-;62068:171:::0;;;;;:::o;61489:214::-;61577:7;61586;61606:21;61651:4;61644:3;;61631:10;:16;;;;:::i;:::-;61630:25;;;;:::i;:::-;61606:49;;61674:5;;;;;;;;;;;61681:13;61666:29;;;;;61489:214;;;;;:::o;61350:109::-;60127:10;60118:19;;:5;;;;;;;;;;;:19;;;60110:28;;;;;;61408:10:::1;61400:28;;:51;61429:21;61400:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;61350:109::o:0;54681:143::-;54781:42;54681:143;:::o;62247:179::-;62360:4;55977:1;54781:42;55929:45;;;:49;55925:539;;;56218:10;56210:18;;:4;:18;;;56206:85;;62377:41:::1;62400:4;62406:2;62410:7;62377:22;:41::i;:::-;56269:7:::0;;56206:85;54781:42;56310;;;56361:4;56368:10;56310:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56305:148;;56426:10;56407:30;;;;;;;;;;;:::i;:::-;;;;;;;;56305:148;55925:539;62377:41:::1;62400:4;62406:2;62410:7;62377:22;:41::i;:::-;62247:179:::0;;;;;:::o;57616:28::-;;;;:::o;59283:118::-;60127:10;60118:19;;:5;;;;;;;;;;;:19;;;60110:28;;;;;;59377:14:::1;59361:13;:30;;;;59283:118:::0;:::o;58534:115::-;60127:10;60118:19;;:5;;;;;;;;;;;:19;;;60110:28;;;;;;58626:13:::1;58611:12;:28;;;;58534:115:::0;:::o;59570:498::-;60127:10;60118:19;;:5;;;;;;;;;;;:19;;;60110:28;;;;;;59677:9:::1;;59668:5;59652:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:34;;59644:43;;;::::0;::::1;;59698:10;59711:4;59698:17;;59726:16;59745:5;59726:24;;59761:19;59767:2;59771:8;59761:5;:19::i;:::-;59838:1;59820:2;:14;;;:19;59816:234;;59860:11;59874:14;:12;:14::i;:::-;59860:28;;59907:13;59929:8;59923:3;:14;59907:30;;60021:3;60003:14;:12;:14::i;:::-;:21;59999:35;;60026:8;::::0;::::1;59999:35;59841:209;;59816:234;59633:435;;59570:498:::0;;:::o;21129:152::-;21201:7;21244:27;21263:7;21244:18;:27::i;:::-;21221:52;;21129:152;;;:::o;57502:24::-;;;;:::o;58303:107::-;60127:10;60118:19;;:5;;;;;;;;;;;:19;;;60110:28;;;;;;58387:10:::1;58375:9;:22;;;;58303:107:::0;:::o;16671:233::-;16743:7;16784:1;16767:19;;:5;:19;;;16763:60;;16795:28;;;;;;;;;;;;;;16763:60;10818:13;16841:18;:25;16860:5;16841:25;;;;;;;;;;;;;;;;:55;16834:62;;16671:233;;;:::o;60186:90::-;60127:10;60118:19;;:5;;;;;;;;;;;:19;;;60110:28;;;;;;60264:4:::1;60255:6;:13;;;;;;:::i;:::-;;60186:90:::0;:::o;57404:20::-;;;;;;;;;;;;;:::o;19912:104::-;19968:13;20001:7;19994:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19912:104;:::o;57665:605::-;57764:1;57752:9;;:13;;;;:::i;:::-;57744:5;57728:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:37;57720:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;57821:1;57806:12;;:16;;;;:::i;:::-;57798:5;:24;57790:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;57857:12;57872:9;;57857:24;;57892:10;57905:19;:17;:19::i;:::-;57892:32;;57935:16;57954:5;57935:24;;57970:25;57980:8;57990:4;57970:9;:25::i;:::-;58006:19;58012:2;58016:8;58006:5;:19::i;:::-;58083:1;58065:2;:14;;;:19;58061:191;;58105:11;58119:14;:12;:14::i;:::-;58105:28;;58152:13;58174:8;58168:3;:14;58152:30;;58223:3;58205:14;:12;:14::i;:::-;:21;58201:35;;58228:8;;;58201:35;58086:166;;58061:191;57709:561;;;57665:605;:::o;61711:176::-;61815:8;56723:1;54781:42;56675:45;;;:49;56671:225;;;54781:42;56746;;;56797:4;56804:8;56746:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56741:144;;56860:8;56841:28;;;;;;;;;;;:::i;:::-;;;;;;;;56741:144;56671:225;61836:43:::1;61860:8;61870;61836:23;:43::i;:::-;61711:176:::0;;;:::o;62434:245::-;62602:4;55977:1;54781:42;55929:45;;;:49;55925:539;;;56218:10;56210:18;;:4;:18;;;56206:85;;62624:47:::1;62647:4;62653:2;62657:7;62666:4;62624:22;:47::i;:::-;56269:7:::0;;56206:85;54781:42;56310;;;56361:4;56368:10;56310:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56305:148;;56426:10;56407:30;;;;;;;;;;;:::i;:::-;;;;;;;;56305:148;55925:539;62624:47:::1;62647:4;62653:2;62657:7;62666:4;62624:22;:47::i;:::-;62434:245:::0;;;;;;:::o;58681:576::-;58780:1;58764:13;;:17;;;;:::i;:::-;58756:5;58740:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:41;58732:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;58852:1;58833:16;;:20;;;;:::i;:::-;58825:5;:28;58817:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;58888:12;58915:10;58928:19;:17;:19::i;:::-;58915:32;;58958:16;58977:5;58958:24;;58993:19;58999:2;59003:8;58993:5;:19::i;:::-;59070:1;59052:2;:14;;;:19;59048:191;;59092:11;59106:14;:12;:14::i;:::-;59092:28;;59139:13;59161:8;59155:3;:14;59139:30;;59210:3;59192:14;:12;:14::i;:::-;:21;59188:35;;59215:8;;;59188:35;59073:166;;59048:191;58721:536;;;58681:576;:::o;60821:167::-;60886:13;60943:6;60951:18;60961:7;60951:9;:18::i;:::-;60926:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60912:68;;60821:167;;;:::o;60284:529::-;60538:5;60523:20;;:11;;;;;;;;;;;:20;;;60515:29;;;;;;60569:4;60555:11;;:18;;;;;;;;;;;;;;;;;;60592:9;60584:5;;:17;;;;;;;;;;;;;;;;;;60612:19;60626:1;60629;60612:13;:19::i;:::-;60651:1;60642:6;:10;;;;;;:::i;:::-;;60678:2;60663:12;:17;;;;60703:1;60691:9;:13;;;;60727:1;60715:9;:13;;;;60758:1;60739:16;:20;;;;60786:1;60770:13;:17;;;;60804:1;60798:3;:7;;;;60284:529;;;;;;;;:::o;57433:24::-;;;;:::o;57466:27::-;;;;:::o;57576:31::-;;;;:::o;27176:164::-;27273:4;27297:18;:25;27316:5;27297:25;;;;;;;;;;;;;;;:35;27323:8;27297:35;;;;;;;;;;;;;;;;;;;;;;;;;27290:42;;27176:164;;;;:::o;58420:104::-;60127:10;60118:19;;:5;;;;;;;;;;;:19;;;60110:28;;;;;;58506:10:::1;58494:9;:22;;;;58420:104:::0;:::o;27598:282::-;27663:4;27719:7;27700:15;:13;:15::i;:::-;:26;;:66;;;;;27753:13;;27743:7;:23;27700:66;:153;;;;;27852:1;11594:8;27804:17;:26;27822:7;27804:26;;;;;;;;;;;;:44;:49;27700:153;27680:173;;27598:282;;;:::o;25660:408::-;25749:13;25765:16;25773:7;25765;:16::i;:::-;25749:32;;25821:5;25798:28;;:19;:17;:19::i;:::-;:28;;;25794:175;;25846:44;25863:5;25870:19;:17;:19::i;:::-;25846:16;:44::i;:::-;25841:128;;25918:35;;;;;;;;;;;;;;25841:128;25794:175;26014:2;25981:15;:24;25997:7;25981:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;26052:7;26048:2;26032:28;;26041:5;26032:28;;;;;;;;;;;;25738:330;25660:408;;:::o;15003:92::-;15059:7;15003:92;:::o;29866:2853::-;30008:17;:15;:17::i;:::-;30036:27;30066;30085:7;30066:18;:27::i;:::-;30036:57;;30151:4;30110:45;;30126:19;30110:45;;;30106:86;;30164:28;;;;;;;;;;;;;;30106:86;30206:27;30235:23;30262:35;30289:7;30262:26;:35::i;:::-;30205:92;;;;30397:68;30422:15;30439:4;30445:19;:17;:19::i;:::-;30397:24;:68::i;:::-;30392:180;;30485:43;30502:4;30508:19;:17;:19::i;:::-;30485:16;:43::i;:::-;30480:92;;30537:35;;;;;;;;;;;;;;30480:92;30392:180;30603:1;30589:16;;:2;:16;;;30585:52;;30614:23;;;;;;;;;;;;;;30585:52;30650:43;30672:4;30678:2;30682:7;30691:1;30650:21;:43::i;:::-;30786:15;30783:160;;;30926:1;30905:19;30898:30;30783:160;31323:18;:24;31342:4;31323:24;;;;;;;;;;;;;;;;31321:26;;;;;;;;;;;;31392:18;:22;31411:2;31392:22;;;;;;;;;;;;;;;;31390:24;;;;;;;;;;;31714:146;31751:2;31800:45;31815:4;31821:2;31825:19;31800:14;:45::i;:::-;11874:8;31772:73;31714:18;:146::i;:::-;31685:17;:26;31703:7;31685:26;;;;;;;;;;;:175;;;;32031:1;11874:8;31980:19;:47;:52;31976:627;;32053:19;32085:1;32075:7;:11;32053:33;;32242:1;32208:17;:30;32226:11;32208:30;;;;;;;;;;;;:35;32204:384;;32346:13;;32331:11;:28;32327:242;;32526:19;32493:17;:30;32511:11;32493:30;;;;;;;;;;;:52;;;;32327:242;32204:384;32034:569;31976:627;32650:7;32646:2;32631:27;;32640:4;32631:27;;;;;;;;;;;;32669:42;32690:4;32696:2;32700:7;32709:1;32669:20;:42::i;:::-;29997:2722;;;29866:2853;;;:::o;32815:193::-;32961:39;32978:4;32984:2;32988:7;32961:39;;;;;;;;;;;;:16;:39::i;:::-;32815:193;;;:::o;37325:2966::-;37398:20;37421:13;;37398:36;;37461:1;37449:8;:13;37445:44;;37471:18;;;;;;;;;;;;;;37445:44;37502:61;37532:1;37536:2;37540:12;37554:8;37502:21;:61::i;:::-;38046:1;10956:2;38016:1;:26;;38015:32;38003:8;:45;37977:18;:22;37996:2;37977:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;38325:139;38362:2;38416:33;38439:1;38443:2;38447:1;38416:14;:33::i;:::-;38383:30;38404:8;38383:20;:30::i;:::-;:66;38325:18;:139::i;:::-;38291:17;:31;38309:12;38291:31;;;;;;;;;;;:173;;;;38481:16;38512:11;38541:8;38526:12;:23;38512:37;;39062:16;39058:2;39054:25;39042:37;;39434:12;39394:8;39353:1;39291:25;39232:1;39171;39144:335;39805:1;39791:12;39787:20;39745:346;39846:3;39837:7;39834:16;39745:346;;40064:7;40054:8;40051:1;40024:25;40021:1;40018;40013:59;39899:1;39890:7;39886:15;39875:26;;39745:346;;;39749:77;40136:1;40124:8;:13;40120:45;;40146:19;;;;;;;;;;;;;;40120:45;40198:3;40182:13;:19;;;;37751:2462;;40223:60;40252:1;40256:2;40260:12;40274:8;40223:20;:60::i;:::-;37387:2904;37325:2966;;:::o;15174:103::-;15229:7;15256:13;;15249:20;;15174:103;:::o;22284:1275::-;22351:7;22371:12;22386:7;22371:22;;22454:4;22435:15;:13;:15::i;:::-;:23;22431:1061;;22488:13;;22481:4;:20;22477:1015;;;22526:14;22543:17;:23;22561:4;22543:23;;;;;;;;;;;;22526:40;;22660:1;11594:8;22632:6;:24;:29;22628:845;;23297:113;23314:1;23304:6;:11;23297:113;;23357:17;:25;23375:6;;;;;;;23357:25;;;;;;;;;;;;23348:34;;23297:113;;;23443:6;23436:13;;;;;;22628:845;22503:989;22477:1015;22431:1061;23520:31;;;;;;;;;;;;;;22284:1275;;;;:::o;49984:105::-;50044:7;50071:10;50064:17;;49984:105;:::o;61064:124::-;61166:9;;61157:5;:18;;;;:::i;:::-;61144:9;:31;;61136:40;;;;;;61064:124;;:::o;26785:234::-;26932:8;26880:18;:39;26899:19;:17;:19::i;:::-;26880:39;;;;;;;;;;;;;;;:49;26920:8;26880:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26992:8;26956:55;;26971:19;:17;:19::i;:::-;26956:55;;;27002:8;26956:55;;;;;;:::i;:::-;;;;;;;;26785:234;;:::o;33606:407::-;33781:31;33794:4;33800:2;33804:7;33781:12;:31::i;:::-;33845:1;33827:2;:14;;;:19;33823:183;;33866:56;33897:4;33903:2;33907:7;33916:5;33866:30;:56::i;:::-;33861:145;;33950:40;;;;;;;;;;;;;;33861:145;33823:183;33606:407;;;;:::o;50191:1745::-;50256:17;50690:4;50683;50677:11;50673:22;50782:1;50776:4;50769:15;50857:4;50854:1;50850:12;50843:19;;50939:1;50934:3;50927:14;51043:3;51282:5;51264:428;51290:1;51264:428;;;51330:1;51325:3;51321:11;51314:18;;51501:2;51495:4;51491:13;51487:2;51483:22;51478:3;51470:36;51595:2;51589:4;51585:13;51577:21;;51662:4;51264:428;51652:25;51264:428;51268:21;51731:3;51726;51722:13;51846:4;51841:3;51837:14;51830:21;;51911:6;51906:3;51899:19;50295:1634;;;50191:1745;;;:::o;14497:172::-;14586:5;14578;:13;;;;;;:::i;:::-;;14612:7;14602;:17;;;;;;:::i;:::-;;14646:15;:13;:15::i;:::-;14630:13;:31;;;;14497:172;;:::o;34842:44::-;:::o;28761:485::-;28863:27;28892:23;28933:38;28974:15;:24;28990:7;28974:24;;;;;;;;;;;28933:65;;29151:18;29128:41;;29208:19;29202:26;29183:45;;29113:126;28761:485;;;:::o;27989:659::-;28138:11;28303:16;28296:5;28292:28;28283:37;;28463:16;28452:9;28448:32;28435:45;;28613:15;28602:9;28599:30;28591:5;28580:9;28577:20;28574:56;28564:66;;27989:659;;;;;:::o;34675:159::-;;;;;:::o;49293:311::-;49428:7;49448:16;11998:3;49474:19;:41;;49448:68;;11998:3;49542:31;49553:4;49559:2;49563:9;49542:10;:31::i;:::-;49534:40;;:62;;49527:69;;;49293:311;;;;;:::o;24107:450::-;24187:14;24355:16;24348:5;24344:28;24335:37;;24532:5;24518:11;24493:23;24489:41;24486:52;24479:5;24476:63;24466:73;;24107:450;;;;:::o;35549:158::-;;;;;:::o;24659:324::-;24729:14;24962:1;24952:8;24949:15;24923:24;24919:46;24909:56;;24659:324;;;:::o;36147:716::-;36310:4;36356:2;36331:45;;;36377:19;:17;:19::i;:::-;36398:4;36404:7;36413:5;36331:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36327:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36631:1;36614:6;:13;:18;36610:235;;36660:40;;;;;;;;;;;;;;36610:235;36803:6;36797:13;36788:6;36784:2;36780:15;36773:38;36327:529;36500:54;;;36490:64;;;:6;:64;;;;36483:71;;;36147:716;;;;;;:::o;48994:147::-;49131:6;48994:147;;;;;:::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:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:474::-;5935:6;5943;5992:2;5980:9;5971:7;5967:23;5963:32;5960:119;;;5998:79;;:::i;:::-;5960:119;6118:1;6143:53;6188:7;6179:6;6168:9;6164:22;6143:53;:::i;:::-;6133:63;;6089:117;6245:2;6271:53;6316:7;6307:6;6296:9;6292:22;6271:53;:::i;:::-;6261:63;;6216:118;5867:474;;;;;:::o;6347:332::-;6468:4;6506:2;6495:9;6491:18;6483:26;;6519:71;6587:1;6576:9;6572:17;6563:6;6519:71;:::i;:::-;6600:72;6668:2;6657:9;6653:18;6644:6;6600:72;:::i;:::-;6347:332;;;;;:::o;6685:60::-;6713:3;6734:5;6727:12;;6685:60;;;:::o;6751:142::-;6801:9;6834:53;6852:34;6861:24;6879:5;6861:24;:::i;:::-;6852:34;:::i;:::-;6834:53;:::i;:::-;6821:66;;6751:142;;;:::o;6899:126::-;6949:9;6982:37;7013:5;6982:37;:::i;:::-;6969:50;;6899:126;;;:::o;7031:158::-;7113:9;7146:37;7177:5;7146:37;:::i;:::-;7133:50;;7031:158;;;:::o;7195:195::-;7314:69;7377:5;7314:69;:::i;:::-;7309:3;7302:82;7195:195;;:::o;7396:286::-;7521:4;7559:2;7548:9;7544:18;7536:26;;7572:103;7672:1;7661:9;7657:17;7648:6;7572:103;:::i;:::-;7396:286;;;;:::o;7688:329::-;7747:6;7796:2;7784:9;7775:7;7771:23;7767:32;7764:119;;;7802:79;;:::i;:::-;7764:119;7922:1;7947:53;7992:7;7983:6;7972:9;7968:22;7947:53;:::i;:::-;7937:63;;7893:117;7688:329;;;;:::o;8023:117::-;8132:1;8129;8122:12;8146:117;8255:1;8252;8245:12;8269:180;8317:77;8314:1;8307:88;8414:4;8411:1;8404:15;8438:4;8435:1;8428:15;8455:281;8538:27;8560:4;8538:27;:::i;:::-;8530:6;8526:40;8668:6;8656:10;8653:22;8632:18;8620:10;8617:34;8614:62;8611:88;;;8679:18;;:::i;:::-;8611:88;8719:10;8715:2;8708:22;8498:238;8455:281;;:::o;8742:129::-;8776:6;8803:20;;:::i;:::-;8793:30;;8832:33;8860:4;8852:6;8832:33;:::i;:::-;8742:129;;;:::o;8877:308::-;8939:4;9029:18;9021:6;9018:30;9015:56;;;9051:18;;:::i;:::-;9015:56;9089:29;9111:6;9089:29;:::i;:::-;9081:37;;9173:4;9167;9163:15;9155:23;;8877:308;;;:::o;9191:146::-;9288:6;9283:3;9278;9265:30;9329:1;9320:6;9315:3;9311:16;9304:27;9191:146;;;:::o;9343:425::-;9421:5;9446:66;9462:49;9504:6;9462:49;:::i;:::-;9446:66;:::i;:::-;9437:75;;9535:6;9528:5;9521:21;9573:4;9566:5;9562:16;9611:3;9602:6;9597:3;9593:16;9590:25;9587:112;;;9618:79;;:::i;:::-;9587:112;9708:54;9755:6;9750:3;9745;9708:54;:::i;:::-;9427:341;9343:425;;;;;:::o;9788:340::-;9844:5;9893:3;9886:4;9878:6;9874:17;9870:27;9860:122;;9901:79;;:::i;:::-;9860:122;10018:6;10005:20;10043:79;10118:3;10110:6;10103:4;10095:6;10091:17;10043:79;:::i;:::-;10034:88;;9850:278;9788:340;;;;:::o;10134:509::-;10203:6;10252:2;10240:9;10231:7;10227:23;10223:32;10220:119;;;10258:79;;:::i;:::-;10220:119;10406:1;10395:9;10391:17;10378:31;10436:18;10428:6;10425:30;10422:117;;;10458:79;;:::i;:::-;10422:117;10563:63;10618:7;10609:6;10598:9;10594:22;10563:63;:::i;:::-;10553:73;;10349:287;10134:509;;;;:::o;10649:116::-;10719:21;10734:5;10719:21;:::i;:::-;10712:5;10709:32;10699:60;;10755:1;10752;10745:12;10699:60;10649:116;:::o;10771:133::-;10814:5;10852:6;10839:20;10830:29;;10868:30;10892:5;10868:30;:::i;:::-;10771:133;;;;:::o;10910:468::-;10975:6;10983;11032:2;11020:9;11011:7;11007:23;11003:32;11000:119;;;11038:79;;:::i;:::-;11000:119;11158:1;11183:53;11228:7;11219:6;11208:9;11204:22;11183:53;:::i;:::-;11173:63;;11129:117;11285:2;11311:50;11353:7;11344:6;11333:9;11329:22;11311:50;:::i;:::-;11301:60;;11256:115;10910:468;;;;;:::o;11384:307::-;11445:4;11535:18;11527:6;11524:30;11521:56;;;11557:18;;:::i;:::-;11521:56;11595:29;11617:6;11595:29;:::i;:::-;11587:37;;11679:4;11673;11669:15;11661:23;;11384:307;;;:::o;11697:423::-;11774:5;11799:65;11815:48;11856:6;11815:48;:::i;:::-;11799:65;:::i;:::-;11790:74;;11887:6;11880:5;11873:21;11925:4;11918:5;11914:16;11963:3;11954:6;11949:3;11945:16;11942:25;11939:112;;;11970:79;;:::i;:::-;11939:112;12060:54;12107:6;12102:3;12097;12060:54;:::i;:::-;11780:340;11697:423;;;;;:::o;12139:338::-;12194:5;12243:3;12236:4;12228:6;12224:17;12220:27;12210:122;;12251:79;;:::i;:::-;12210:122;12368:6;12355:20;12393:78;12467:3;12459:6;12452:4;12444:6;12440:17;12393:78;:::i;:::-;12384:87;;12200:277;12139:338;;;;:::o;12483:943::-;12578:6;12586;12594;12602;12651:3;12639:9;12630:7;12626:23;12622:33;12619:120;;;12658:79;;:::i;:::-;12619:120;12778:1;12803:53;12848:7;12839:6;12828:9;12824:22;12803:53;:::i;:::-;12793:63;;12749:117;12905:2;12931:53;12976:7;12967:6;12956:9;12952:22;12931:53;:::i;:::-;12921:63;;12876:118;13033:2;13059:53;13104:7;13095:6;13084:9;13080:22;13059:53;:::i;:::-;13049:63;;13004:118;13189:2;13178:9;13174:18;13161:32;13220:18;13212:6;13209:30;13206:117;;;13242:79;;:::i;:::-;13206:117;13347:62;13401:7;13392:6;13381:9;13377:22;13347:62;:::i;:::-;13337:72;;13132:287;12483:943;;;;;;;:::o;13432:1889::-;13584:6;13592;13600;13608;13616;13624;13632;13640;13689:3;13677:9;13668:7;13664:23;13660:33;13657:120;;;13696:79;;:::i;:::-;13657:120;13844:1;13833:9;13829:17;13816:31;13874:18;13866:6;13863:30;13860:117;;;13896:79;;:::i;:::-;13860:117;14001:63;14056:7;14047:6;14036:9;14032:22;14001:63;:::i;:::-;13991:73;;13787:287;14141:2;14130:9;14126:18;14113:32;14172:18;14164:6;14161:30;14158:117;;;14194:79;;:::i;:::-;14158:117;14299:63;14354:7;14345:6;14334:9;14330:22;14299:63;:::i;:::-;14289:73;;14084:288;14439:2;14428:9;14424:18;14411:32;14470:18;14462:6;14459:30;14456:117;;;14492:79;;:::i;:::-;14456:117;14597:63;14652:7;14643:6;14632:9;14628:22;14597:63;:::i;:::-;14587:73;;14382:288;14709:2;14735:53;14780:7;14771:6;14760:9;14756:22;14735:53;:::i;:::-;14725:63;;14680:118;14837:3;14864:53;14909:7;14900:6;14889:9;14885:22;14864:53;:::i;:::-;14854:63;;14808:119;14966:3;14993:53;15038:7;15029:6;15018:9;15014:22;14993:53;:::i;:::-;14983:63;;14937:119;15095:3;15122:53;15167:7;15158:6;15147:9;15143:22;15122:53;:::i;:::-;15112:63;;15066:119;15224:3;15251:53;15296:7;15287:6;15276:9;15272:22;15251:53;:::i;:::-;15241:63;;15195:119;13432:1889;;;;;;;;;;;:::o;15327:474::-;15395:6;15403;15452:2;15440:9;15431:7;15427:23;15423:32;15420:119;;;15458:79;;:::i;:::-;15420:119;15578:1;15603:53;15648:7;15639:6;15628:9;15624:22;15603:53;:::i;:::-;15593:63;;15549:117;15705:2;15731:53;15776:7;15767:6;15756:9;15752:22;15731:53;:::i;:::-;15721:63;;15676:118;15327:474;;;;;:::o;15807:180::-;15855:77;15852:1;15845:88;15952:4;15949:1;15942:15;15976:4;15973:1;15966:15;15993:320;16037:6;16074:1;16068:4;16064:12;16054:22;;16121:1;16115:4;16111:12;16142:18;16132:81;;16198:4;16190:6;16186:17;16176:27;;16132:81;16260:2;16252:6;16249:14;16229:18;16226:38;16223:84;;16279:18;;:::i;:::-;16223:84;16044:269;15993:320;;;:::o;16319:332::-;16440:4;16478:2;16467:9;16463:18;16455:26;;16491:71;16559:1;16548:9;16544:17;16535:6;16491:71;:::i;:::-;16572:72;16640:2;16629:9;16625:18;16616:6;16572:72;:::i;:::-;16319:332;;;;;:::o;16657:137::-;16711:5;16742:6;16736:13;16727:22;;16758:30;16782:5;16758:30;:::i;:::-;16657:137;;;;:::o;16800:345::-;16867:6;16916:2;16904:9;16895:7;16891:23;16887:32;16884:119;;;16922:79;;:::i;:::-;16884:119;17042:1;17067:61;17120:7;17111:6;17100:9;17096:22;17067:61;:::i;:::-;17057:71;;17013:125;16800:345;;;;:::o;17151:180::-;17199:77;17196:1;17189:88;17296:4;17293:1;17286:15;17320:4;17317:1;17310:15;17337:410;17377:7;17400:20;17418:1;17400:20;:::i;:::-;17395:25;;17434:20;17452:1;17434:20;:::i;:::-;17429:25;;17489:1;17486;17482:9;17511:30;17529:11;17511:30;:::i;:::-;17500:41;;17690:1;17681:7;17677:15;17674:1;17671:22;17651:1;17644:9;17624:83;17601:139;;17720:18;;:::i;:::-;17601:139;17385:362;17337:410;;;;:::o;17753:180::-;17801:77;17798:1;17791:88;17898:4;17895:1;17888:15;17922:4;17919:1;17912:15;17939:185;17979:1;17996:20;18014:1;17996:20;:::i;:::-;17991:25;;18030:20;18048:1;18030:20;:::i;:::-;18025:25;;18069:1;18059:35;;18074:18;;:::i;:::-;18059:35;18116:1;18113;18109:9;18104:14;;17939:185;;;;:::o;18130:191::-;18170:3;18189:20;18207:1;18189:20;:::i;:::-;18184:25;;18223:20;18241:1;18223:20;:::i;:::-;18218:25;;18266:1;18263;18259:9;18252:16;;18287:3;18284:1;18281:10;18278:36;;;18294:18;;:::i;:::-;18278:36;18130:191;;;;:::o;18327:141::-;18376:4;18399:3;18391:11;;18422:3;18419:1;18412:14;18456:4;18453:1;18443:18;18435:26;;18327:141;;;:::o;18474:93::-;18511:6;18558:2;18553;18546:5;18542:14;18538:23;18528:33;;18474:93;;;:::o;18573:107::-;18617:8;18667:5;18661:4;18657:16;18636:37;;18573:107;;;;:::o;18686:393::-;18755:6;18805:1;18793:10;18789:18;18828:97;18858:66;18847:9;18828:97;:::i;:::-;18946:39;18976:8;18965:9;18946:39;:::i;:::-;18934:51;;19018:4;19014:9;19007:5;19003:21;18994:30;;19067:4;19057:8;19053:19;19046:5;19043:30;19033:40;;18762:317;;18686:393;;;;;:::o;19085:142::-;19135:9;19168:53;19186:34;19195:24;19213:5;19195:24;:::i;:::-;19186:34;:::i;:::-;19168:53;:::i;:::-;19155:66;;19085:142;;;:::o;19233:75::-;19276:3;19297:5;19290:12;;19233:75;;;:::o;19314:269::-;19424:39;19455:7;19424:39;:::i;:::-;19485:91;19534:41;19558:16;19534:41;:::i;:::-;19526:6;19519:4;19513:11;19485:91;:::i;:::-;19479:4;19472:105;19390:193;19314:269;;;:::o;19589:73::-;19634:3;19589:73;:::o;19668:189::-;19745:32;;:::i;:::-;19786:65;19844:6;19836;19830:4;19786:65;:::i;:::-;19721:136;19668:189;;:::o;19863:186::-;19923:120;19940:3;19933:5;19930:14;19923:120;;;19994:39;20031:1;20024:5;19994:39;:::i;:::-;19967:1;19960:5;19956:13;19947:22;;19923:120;;;19863:186;;:::o;20055:543::-;20156:2;20151:3;20148:11;20145:446;;;20190:38;20222:5;20190:38;:::i;:::-;20274:29;20292:10;20274:29;:::i;:::-;20264:8;20260:44;20457:2;20445:10;20442:18;20439:49;;;20478:8;20463:23;;20439:49;20501:80;20557:22;20575:3;20557:22;:::i;:::-;20547:8;20543:37;20530:11;20501:80;:::i;:::-;20160:431;;20145:446;20055:543;;;:::o;20604:117::-;20658:8;20708:5;20702:4;20698:16;20677:37;;20604:117;;;;:::o;20727:169::-;20771:6;20804:51;20852:1;20848:6;20840:5;20837:1;20833:13;20804:51;:::i;:::-;20800:56;20885:4;20879;20875:15;20865:25;;20778:118;20727:169;;;;:::o;20901:295::-;20977:4;21123:29;21148:3;21142:4;21123:29;:::i;:::-;21115:37;;21185:3;21182:1;21178:11;21172:4;21169:21;21161:29;;20901:295;;;;:::o;21201:1395::-;21318:37;21351:3;21318:37;:::i;:::-;21420:18;21412:6;21409:30;21406:56;;;21442:18;;:::i;:::-;21406:56;21486:38;21518:4;21512:11;21486:38;:::i;:::-;21571:67;21631:6;21623;21617:4;21571:67;:::i;:::-;21665:1;21689:4;21676:17;;21721:2;21713:6;21710:14;21738:1;21733:618;;;;22395:1;22412:6;22409:77;;;22461:9;22456:3;22452:19;22446:26;22437:35;;22409:77;22512:67;22572:6;22565:5;22512:67;:::i;:::-;22506:4;22499:81;22368:222;21703:887;;21733:618;21785:4;21781:9;21773:6;21769:22;21819:37;21851:4;21819:37;:::i;:::-;21878:1;21892:208;21906:7;21903:1;21900:14;21892:208;;;21985:9;21980:3;21976:19;21970:26;21962:6;21955:42;22036:1;22028:6;22024:14;22014:24;;22083:2;22072:9;22068:18;22055:31;;21929:4;21926:1;21922:12;21917:17;;21892:208;;;22128:6;22119:7;22116:19;22113:179;;;22186:9;22181:3;22177:19;22171:26;22229:48;22271:4;22263:6;22259:17;22248:9;22229:48;:::i;:::-;22221:6;22214:64;22136:156;22113:179;22338:1;22334;22326:6;22322:14;22318:22;22312:4;22305:36;21740:611;;;21703:887;;21293:1303;;;21201:1395;;:::o;22602:159::-;22742:11;22738:1;22730:6;22726:14;22719:35;22602:159;:::o;22767:365::-;22909:3;22930:66;22994:1;22989:3;22930:66;:::i;:::-;22923:73;;23005:93;23094:3;23005:93;:::i;:::-;23123:2;23118:3;23114:12;23107:19;;22767:365;;;:::o;23138:419::-;23304:4;23342:2;23331:9;23327:18;23319:26;;23391:9;23385:4;23381:20;23377:1;23366:9;23362:17;23355:47;23419:131;23545:4;23419:131;:::i;:::-;23411:139;;23138:419;;;:::o;23563:169::-;23703:21;23699:1;23691:6;23687:14;23680:45;23563:169;:::o;23738:366::-;23880:3;23901:67;23965:2;23960:3;23901:67;:::i;:::-;23894:74;;23977:93;24066:3;23977:93;:::i;:::-;24095:2;24090:3;24086:12;24079:19;;23738:366;;;:::o;24110:419::-;24276:4;24314:2;24303:9;24299:18;24291:26;;24363:9;24357:4;24353:20;24349:1;24338:9;24334:17;24327:47;24391:131;24517:4;24391:131;:::i;:::-;24383:139;;24110:419;;;:::o;24535:170::-;24675:22;24671:1;24663:6;24659:14;24652:46;24535:170;:::o;24711:366::-;24853:3;24874:67;24938:2;24933:3;24874:67;:::i;:::-;24867:74;;24950:93;25039:3;24950:93;:::i;:::-;25068:2;25063:3;25059:12;25052:19;;24711:366;;;:::o;25083:419::-;25249:4;25287:2;25276:9;25272:18;25264:26;;25336:9;25330:4;25326:20;25322:1;25311:9;25307:17;25300:47;25364:131;25490:4;25364:131;:::i;:::-;25356:139;;25083:419;;;:::o;25508:148::-;25610:11;25647:3;25632:18;;25508:148;;;;:::o;25686:874::-;25789:3;25826:5;25820:12;25855:36;25881:9;25855:36;:::i;:::-;25907:89;25989:6;25984:3;25907:89;:::i;:::-;25900:96;;26027:1;26016:9;26012:17;26043:1;26038:166;;;;26218:1;26213:341;;;;26005:549;;26038:166;26122:4;26118:9;26107;26103:25;26098:3;26091:38;26184:6;26177:14;26170:22;26162:6;26158:35;26153:3;26149:45;26142:52;;26038:166;;26213:341;26280:38;26312:5;26280:38;:::i;:::-;26340:1;26354:154;26368:6;26365:1;26362:13;26354:154;;;26442:7;26436:14;26432:1;26427:3;26423:11;26416:35;26492:1;26483:7;26479:15;26468:26;;26390:4;26387:1;26383:12;26378:17;;26354:154;;;26537:6;26532:3;26528:16;26521:23;;26220:334;;26005:549;;25793:767;;25686:874;;;;:::o;26566:390::-;26672:3;26700:39;26733:5;26700:39;:::i;:::-;26755:89;26837:6;26832:3;26755:89;:::i;:::-;26748:96;;26853:65;26911:6;26906:3;26899:4;26892:5;26888:16;26853:65;:::i;:::-;26943:6;26938:3;26934:16;26927:23;;26676:280;26566:390;;;;:::o;26962:155::-;27102:7;27098:1;27090:6;27086:14;27079:31;26962:155;:::o;27123:400::-;27283:3;27304:84;27386:1;27381:3;27304:84;:::i;:::-;27297:91;;27397:93;27486:3;27397:93;:::i;:::-;27515:1;27510:3;27506:11;27499:18;;27123:400;;;:::o;27529:695::-;27807:3;27829:92;27917:3;27908:6;27829:92;:::i;:::-;27822:99;;27938:95;28029:3;28020:6;27938:95;:::i;:::-;27931:102;;28050:148;28194:3;28050:148;:::i;:::-;28043:155;;28215:3;28208:10;;27529:695;;;;;:::o;28230:98::-;28281:6;28315:5;28309:12;28299:22;;28230:98;;;:::o;28334:168::-;28417:11;28451:6;28446:3;28439:19;28491:4;28486:3;28482:14;28467:29;;28334:168;;;;:::o;28508:373::-;28594:3;28622:38;28654:5;28622:38;:::i;:::-;28676:70;28739:6;28734:3;28676:70;:::i;:::-;28669:77;;28755:65;28813:6;28808:3;28801:4;28794:5;28790:16;28755:65;:::i;:::-;28845:29;28867:6;28845:29;:::i;:::-;28840:3;28836:39;28829:46;;28598:283;28508:373;;;;:::o;28887:640::-;29082:4;29120:3;29109:9;29105:19;29097:27;;29134:71;29202:1;29191:9;29187:17;29178:6;29134:71;:::i;:::-;29215:72;29283:2;29272:9;29268:18;29259:6;29215:72;:::i;:::-;29297;29365:2;29354:9;29350:18;29341:6;29297:72;:::i;:::-;29416:9;29410:4;29406:20;29401:2;29390:9;29386:18;29379:48;29444:76;29515:4;29506:6;29444:76;:::i;:::-;29436:84;;28887:640;;;;;;;:::o;29533:141::-;29589:5;29620:6;29614:13;29605:22;;29636:32;29662:5;29636:32;:::i;:::-;29533:141;;;;:::o;29680:349::-;29749:6;29798:2;29786:9;29777:7;29773:23;29769:32;29766:119;;;29804:79;;:::i;:::-;29766:119;29924:1;29949:63;30004:7;29995:6;29984:9;29980:22;29949:63;:::i;:::-;29939:73;;29895:127;29680:349;;;;:::o
Swarm Source
ipfs://50b9abacab9cae5ae9637c26dfe57db2cff1b684b104124fcff0a0d283530c3b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.