ERC-721
Overview
Max Total Supply
2,500 BRICKED
Holders
67
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
50 BRICKEDLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BrickedUp
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT import "./Context.sol"; import "./Ownable.sol"; import './ERC721A.sol'; pragma solidity ^0.8.7; contract BrickedUp is Ownable, ERC721A { uint256 public maxSupply = 5000; uint256 public maxFreeSupply = 2500; uint256 public maxPerAddressDuringMint = 50; uint256 public maxPerAddressDuringFreeMint = 50; uint256 public price = 0.005 ether; bool public saleIsActive = false; string private _baseTokenURI; mapping(address => uint256) public freeMintedAmount; mapping(address => uint256) public mintedAmount; constructor() ERC721A("Bricked Up", "BRICKED") { } modifier mintCompliance() { require(saleIsActive, "Sale is not active yet."); require(tx.origin == msg.sender, "Caller cannot be a contract."); _; } function mint(uint256 _quantity) external payable mintCompliance() { require( msg.value >= price * _quantity, "Insufficient Fund." ); require( maxSupply >= totalSupply() + _quantity, "Exceeds max supply." ); uint256 _mintedAmount = mintedAmount[msg.sender]; require( _mintedAmount + _quantity <= maxPerAddressDuringMint, "Exceeds max mints per address!" ); mintedAmount[msg.sender] = _mintedAmount + _quantity; _safeMint(msg.sender, _quantity); } function freeMint(uint256 _quantity) external mintCompliance() { require( maxFreeSupply >= totalSupply() + _quantity, "Exceeds max free supply." ); uint256 _freeMintedAmount = freeMintedAmount[msg.sender]; require( _freeMintedAmount + _quantity <= maxPerAddressDuringFreeMint, "Exceeds max free mints per address!" ); freeMintedAmount[msg.sender] = _freeMintedAmount + _quantity; _safeMint(msg.sender, _quantity); } function flipSale() public onlyOwner { saleIsActive = !saleIsActive; } function burnSupply(uint256 _amount) public onlyOwner { require( maxSupply - _amount >= totalSupply(), "Supply cannot fall below minted tokens." ); maxSupply -= _amount; } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId),".json")) : ''; } function withdraw() external payable onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT import './IERC721A.sol'; pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxillary 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 auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _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] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @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. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _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] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // 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] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // 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] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } }
// SPDX-License-Identifier: MIT // File: erc721a/contracts/IERC721A.sol pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * 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(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"maxFreeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressDuringFreeMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressDuringMint","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":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526113886009556109c4600a556032600b556032600c556611c37937e08000600d556000600e60006101000a81548160ff0219169083151502179055503480156200004d57600080fd5b506040518060400160405280600a81526020017f427269636b6564205570000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f425249434b454400000000000000000000000000000000000000000000000000815250620000da620000ce6200012a60201b60201c565b6200013260201b60201c565b8160039080519060200190620000f2929190620001fb565b5080600490805190602001906200010b929190620001fb565b506200011c620001f660201b60201c565b600181905550505062000310565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b8280546200020990620002ab565b90600052602060002090601f0160209004810192826200022d576000855562000279565b82601f106200024857805160ff191683800117855562000279565b8280016001018555821562000279579182015b82811115620002785782518255916020019190600101906200025b565b5b5090506200028891906200028c565b5090565b5b80821115620002a75760008160009055506001016200028d565b5090565b60006002820490506001821680620002c457607f821691505b60208210811415620002db57620002da620002e1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61330180620003206000396000f3fe6080604052600436106101d85760003560e01c80637c928fe911610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c51461066a578063eb8d2444146106a7578063f2fde38b146106d2578063fbbf8cc3146106fb576101d8565b8063b88d4fde146105b0578063c87b56dd146105d9578063d595c33114610616578063d5abeb011461063f576101d8565b806396b10201116100d157806396b1020114610503578063a035b1fe14610540578063a0712d681461056b578063a22cb46514610587576101d8565b80637c928fe9146104595780638bc35c2f146104825780638da5cb5b146104ad57806395d89b41146104d8576101d8565b80633ccfd60b1161017a5780636352211e116101495780636352211e146103b157806370a08231146103ee578063715018a61461042b5780637ba5e62114610442576101d8565b80633ccfd60b1461032a57806342842e0e14610334578063475133341461035d57806355f804b314610388576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806318160ddd146102ab57806323b872dd146102d65780632e0fd6eb146102ff576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff919061274f565b610738565b6040516102119190612b42565b60405180910390f35b34801561022657600080fd5b5061022f6107ca565b60405161023c9190612b5d565b60405180910390f35b34801561025157600080fd5b5061026c600480360381019061026791906127f6565b61085c565b6040516102799190612adb565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a4919061270f565b6108d8565b005b3480156102b757600080fd5b506102c0610a7f565b6040516102cd9190612cbf565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f891906125f9565b610a96565b005b34801561030b57600080fd5b50610314610aa6565b6040516103219190612cbf565b60405180910390f35b610332610aac565b005b34801561034057600080fd5b5061035b600480360381019061035691906125f9565b610ba8565b005b34801561036957600080fd5b50610372610bc8565b60405161037f9190612cbf565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa91906127a9565b610bce565b005b3480156103bd57600080fd5b506103d860048036038101906103d391906127f6565b610c60565b6040516103e59190612adb565b60405180910390f35b3480156103fa57600080fd5b506104156004803603810190610410919061258c565b610c72565b6040516104229190612cbf565b60405180910390f35b34801561043757600080fd5b50610440610d2b565b005b34801561044e57600080fd5b50610457610db3565b005b34801561046557600080fd5b50610480600480360381019061047b91906127f6565b610e5b565b005b34801561048e57600080fd5b50610497611060565b6040516104a49190612cbf565b60405180910390f35b3480156104b957600080fd5b506104c2611066565b6040516104cf9190612adb565b60405180910390f35b3480156104e457600080fd5b506104ed61108f565b6040516104fa9190612b5d565b60405180910390f35b34801561050f57600080fd5b5061052a6004803603810190610525919061258c565b611121565b6040516105379190612cbf565b60405180910390f35b34801561054c57600080fd5b50610555611139565b6040516105629190612cbf565b60405180910390f35b610585600480360381019061058091906127f6565b61113f565b005b34801561059357600080fd5b506105ae60048036038101906105a991906126cf565b611394565b005b3480156105bc57600080fd5b506105d760048036038101906105d2919061264c565b61150c565b005b3480156105e557600080fd5b5061060060048036038101906105fb91906127f6565b61157f565b60405161060d9190612b5d565b60405180910390f35b34801561062257600080fd5b5061063d600480360381019061063891906127f6565b61161e565b005b34801561064b57600080fd5b5061065461170d565b6040516106619190612cbf565b60405180910390f35b34801561067657600080fd5b50610691600480360381019061068c91906125b9565b611713565b60405161069e9190612b42565b60405180910390f35b3480156106b357600080fd5b506106bc6117a7565b6040516106c99190612b42565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f4919061258c565b6117ba565b005b34801561070757600080fd5b50610722600480360381019061071d919061258c565b6118b2565b60405161072f9190612cbf565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061079357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107c35750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600380546107d990612f18565b80601f016020809104026020016040519081016040528092919081815260200182805461080590612f18565b80156108525780601f1061082757610100808354040283529160200191610852565b820191906000526020600020905b81548152906001019060200180831161083557829003601f168201915b5050505050905090565b6000610867826118ca565b61089d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108e382611929565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561094b576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661096a6119f7565b73ffffffffffffffffffffffffffffffffffffffff16146109cd57610996816109916119f7565b611713565b6109cc576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a896119ff565b6002546001540303905090565b610aa1838383611a04565b505050565b600c5481565b610ab4611dae565b73ffffffffffffffffffffffffffffffffffffffff16610ad2611066565b73ffffffffffffffffffffffffffffffffffffffff1614610b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1f90612bff565b60405180910390fd5b6000610b32611066565b73ffffffffffffffffffffffffffffffffffffffff1647604051610b5590612ac6565b60006040518083038185875af1925050503d8060008114610b92576040519150601f19603f3d011682016040523d82523d6000602084013e610b97565b606091505b5050905080610ba557600080fd5b50565b610bc38383836040518060200160405280600081525061150c565b505050565b600a5481565b610bd6611dae565b73ffffffffffffffffffffffffffffffffffffffff16610bf4611066565b73ffffffffffffffffffffffffffffffffffffffff1614610c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4190612bff565b60405180910390fd5b8181600f9190610c5b9291906123ba565b505050565b6000610c6b82611929565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cda576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610d33611dae565b73ffffffffffffffffffffffffffffffffffffffff16610d51611066565b73ffffffffffffffffffffffffffffffffffffffff1614610da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9e90612bff565b60405180910390fd5b610db16000611db6565b565b610dbb611dae565b73ffffffffffffffffffffffffffffffffffffffff16610dd9611066565b73ffffffffffffffffffffffffffffffffffffffff1614610e2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2690612bff565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b600e60009054906101000a900460ff16610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea190612bbf565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f90612b9f565b60405180910390fd5b80610f21610a7f565b610f2b9190612d7e565b600a541015610f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6690612c9f565b60405180910390fd5b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600c548282610fc29190612d7e565b1115611003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffa90612c5f565b60405180910390fd5b818161100f9190612d7e565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061105c3383611e7a565b5050565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461109e90612f18565b80601f01602080910402602001604051908101604052809291908181526020018280546110ca90612f18565b80156111175780601f106110ec57610100808354040283529160200191611117565b820191906000526020600020905b8154815290600101906020018083116110fa57829003601f168201915b5050505050905090565b60106020528060005260406000206000915090505481565b600d5481565b600e60009054906101000a900460ff1661118e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118590612bbf565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146111fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f390612b9f565b60405180910390fd5b80600d5461120a9190612dd4565b34101561124c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124390612c3f565b60405180910390fd5b80611255610a7f565b61125f9190612d7e565b60095410156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129a90612c1f565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600b5482826112f69190612d7e565b1115611337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132e90612c7f565b60405180910390fd5b81816113439190612d7e565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113903383611e7a565b5050565b61139c6119f7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611401576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061140e6119f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114bb6119f7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115009190612b42565b60405180910390a35050565b611517848484611a04565b60008373ffffffffffffffffffffffffffffffffffffffff163b146115795761154284848484611e98565b611578576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061158a826118ca565b6115c0576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006115ca611ff8565b90506000815114156115eb5760405180602001604052806000815250611616565b806115f58461208a565b604051602001611606929190612a97565b6040516020818303038152906040525b915050919050565b611626611dae565b73ffffffffffffffffffffffffffffffffffffffff16611644611066565b73ffffffffffffffffffffffffffffffffffffffff161461169a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169190612bff565b60405180910390fd5b6116a2610a7f565b816009546116b09190612e2e565b10156116f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e890612bdf565b60405180910390fd5b80600960008282546117039190612e2e565b9250508190555050565b60095481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900460ff1681565b6117c2611dae565b73ffffffffffffffffffffffffffffffffffffffff166117e0611066565b73ffffffffffffffffffffffffffffffffffffffff1614611836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182d90612bff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d90612b7f565b60405180910390fd5b6118af81611db6565b50565b60116020528060005260406000206000915090505481565b6000816118d56119ff565b111580156118e4575060015482105b8015611922575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600080829050806119386119ff565b116119c0576001548110156119bf5760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156119bd575b60008114156119b3576005600083600190039350838152602001908152602001600020549050611988565b80925050506119f2565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611a0f82611929565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611a76576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611a976119f7565b73ffffffffffffffffffffffffffffffffffffffff161480611ac65750611ac585611ac06119f7565b611713565b5b80611b0b5750611ad46119f7565b73ffffffffffffffffffffffffffffffffffffffff16611af38461085c565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611b44576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611bab576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bb885858560016120e4565b6007600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611cb5866120ea565b1717600560008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415611d3f576000600184019050600060056000838152602001908152602001600020541415611d3d576001548114611d3c578260056000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611da785858560016120f4565b5050505050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e948282604051806020016040528060008152506120fa565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ebe6119f7565b8786866040518563ffffffff1660e01b8152600401611ee09493929190612af6565b602060405180830381600087803b158015611efa57600080fd5b505af1925050508015611f2b57506040513d601f19601f82011682018060405250810190611f28919061277c565b60015b611fa5573d8060008114611f5b576040519150601f19603f3d011682016040523d82523d6000602084013e611f60565b606091505b50600081511415611f9d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f805461200790612f18565b80601f016020809104026020016040519081016040528092919081815260200182805461203390612f18565b80156120805780601f1061205557610100808354040283529160200191612080565b820191906000526020600020905b81548152906001019060200180831161206357829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156120d057600183039250600a81066030018353600a810490506120b0565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612168576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156121a3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121b060008583866120e4565b600160406001901b178302600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612215600185146123b0565b901b60a042901b612225866120ea565b1717600560008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612329575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122d96000878480600101955087611e98565b61230f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061226a57826001541461232457600080fd5b612394565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061232a575b8160018190555050506123aa60008583866120f4565b50505050565b6000819050919050565b8280546123c690612f18565b90600052602060002090601f0160209004810192826123e8576000855561242f565b82601f1061240157803560ff191683800117855561242f565b8280016001018555821561242f579182015b8281111561242e578235825591602001919060010190612413565b5b50905061243c9190612440565b5090565b5b80821115612459576000816000905550600101612441565b5090565b600061247061246b84612cff565b612cda565b90508281526020810184848401111561248c5761248b613017565b5b612497848285612ed6565b509392505050565b6000813590506124ae8161326f565b92915050565b6000813590506124c381613286565b92915050565b6000813590506124d88161329d565b92915050565b6000815190506124ed8161329d565b92915050565b600082601f8301126125085761250761300d565b5b813561251884826020860161245d565b91505092915050565b60008083601f8401126125375761253661300d565b5b8235905067ffffffffffffffff81111561255457612553613008565b5b6020830191508360018202830111156125705761256f613012565b5b9250929050565b600081359050612586816132b4565b92915050565b6000602082840312156125a2576125a1613021565b5b60006125b08482850161249f565b91505092915050565b600080604083850312156125d0576125cf613021565b5b60006125de8582860161249f565b92505060206125ef8582860161249f565b9150509250929050565b60008060006060848603121561261257612611613021565b5b60006126208682870161249f565b93505060206126318682870161249f565b925050604061264286828701612577565b9150509250925092565b6000806000806080858703121561266657612665613021565b5b60006126748782880161249f565b94505060206126858782880161249f565b935050604061269687828801612577565b925050606085013567ffffffffffffffff8111156126b7576126b661301c565b5b6126c3878288016124f3565b91505092959194509250565b600080604083850312156126e6576126e5613021565b5b60006126f48582860161249f565b9250506020612705858286016124b4565b9150509250929050565b6000806040838503121561272657612725613021565b5b60006127348582860161249f565b925050602061274585828601612577565b9150509250929050565b60006020828403121561276557612764613021565b5b6000612773848285016124c9565b91505092915050565b60006020828403121561279257612791613021565b5b60006127a0848285016124de565b91505092915050565b600080602083850312156127c0576127bf613021565b5b600083013567ffffffffffffffff8111156127de576127dd61301c565b5b6127ea85828601612521565b92509250509250929050565b60006020828403121561280c5761280b613021565b5b600061281a84828501612577565b91505092915050565b61282c81612e62565b82525050565b61283b81612e74565b82525050565b600061284c82612d30565b6128568185612d46565b9350612866818560208601612ee5565b61286f81613026565b840191505092915050565b600061288582612d3b565b61288f8185612d62565b935061289f818560208601612ee5565b6128a881613026565b840191505092915050565b60006128be82612d3b565b6128c88185612d73565b93506128d8818560208601612ee5565b80840191505092915050565b60006128f1602683612d62565b91506128fc82613037565b604082019050919050565b6000612914601c83612d62565b915061291f82613086565b602082019050919050565b6000612937601783612d62565b9150612942826130af565b602082019050919050565b600061295a602783612d62565b9150612965826130d8565b604082019050919050565b600061297d600583612d73565b915061298882613127565b600582019050919050565b60006129a0602083612d62565b91506129ab82613150565b602082019050919050565b60006129c3601383612d62565b91506129ce82613179565b602082019050919050565b60006129e6601283612d62565b91506129f1826131a2565b602082019050919050565b6000612a09600083612d57565b9150612a14826131cb565b600082019050919050565b6000612a2c602383612d62565b9150612a37826131ce565b604082019050919050565b6000612a4f601e83612d62565b9150612a5a8261321d565b602082019050919050565b6000612a72601883612d62565b9150612a7d82613246565b602082019050919050565b612a9181612ecc565b82525050565b6000612aa382856128b3565b9150612aaf82846128b3565b9150612aba82612970565b91508190509392505050565b6000612ad1826129fc565b9150819050919050565b6000602082019050612af06000830184612823565b92915050565b6000608082019050612b0b6000830187612823565b612b186020830186612823565b612b256040830185612a88565b8181036060830152612b378184612841565b905095945050505050565b6000602082019050612b576000830184612832565b92915050565b60006020820190508181036000830152612b77818461287a565b905092915050565b60006020820190508181036000830152612b98816128e4565b9050919050565b60006020820190508181036000830152612bb881612907565b9050919050565b60006020820190508181036000830152612bd88161292a565b9050919050565b60006020820190508181036000830152612bf88161294d565b9050919050565b60006020820190508181036000830152612c1881612993565b9050919050565b60006020820190508181036000830152612c38816129b6565b9050919050565b60006020820190508181036000830152612c58816129d9565b9050919050565b60006020820190508181036000830152612c7881612a1f565b9050919050565b60006020820190508181036000830152612c9881612a42565b9050919050565b60006020820190508181036000830152612cb881612a65565b9050919050565b6000602082019050612cd46000830184612a88565b92915050565b6000612ce4612cf5565b9050612cf08282612f4a565b919050565b6000604051905090565b600067ffffffffffffffff821115612d1a57612d19612fd9565b5b612d2382613026565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612d8982612ecc565b9150612d9483612ecc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612dc957612dc8612f7b565b5b828201905092915050565b6000612ddf82612ecc565b9150612dea83612ecc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e2357612e22612f7b565b5b828202905092915050565b6000612e3982612ecc565b9150612e4483612ecc565b925082821015612e5757612e56612f7b565b5b828203905092915050565b6000612e6d82612eac565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612f03578082015181840152602081019050612ee8565b83811115612f12576000848401525b50505050565b60006002820490506001821680612f3057607f821691505b60208210811415612f4457612f43612faa565b5b50919050565b612f5382613026565b810181811067ffffffffffffffff82111715612f7257612f71612fd9565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f43616c6c65722063616e6e6f74206265206120636f6e74726163742e00000000600082015250565b7f53616c65206973206e6f7420616374697665207965742e000000000000000000600082015250565b7f537570706c792063616e6e6f742066616c6c2062656c6f77206d696e7465642060008201527f746f6b656e732e00000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b7f496e73756666696369656e742046756e642e0000000000000000000000000000600082015250565b50565b7f45786365656473206d61782066726565206d696e74732070657220616464726560008201527f7373210000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178206d696e7473207065722061646472657373210000600082015250565b7f45786365656473206d6178206672656520737570706c792e0000000000000000600082015250565b61327881612e62565b811461328357600080fd5b50565b61328f81612e74565b811461329a57600080fd5b50565b6132a681612e80565b81146132b157600080fd5b50565b6132bd81612ecc565b81146132c857600080fd5b5056fea26469706673582212205cc11a294e2c17f856976b9dbe0624dd325ace85fc872b4a3cbf044b08ef087364736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101d85760003560e01c80637c928fe911610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c51461066a578063eb8d2444146106a7578063f2fde38b146106d2578063fbbf8cc3146106fb576101d8565b8063b88d4fde146105b0578063c87b56dd146105d9578063d595c33114610616578063d5abeb011461063f576101d8565b806396b10201116100d157806396b1020114610503578063a035b1fe14610540578063a0712d681461056b578063a22cb46514610587576101d8565b80637c928fe9146104595780638bc35c2f146104825780638da5cb5b146104ad57806395d89b41146104d8576101d8565b80633ccfd60b1161017a5780636352211e116101495780636352211e146103b157806370a08231146103ee578063715018a61461042b5780637ba5e62114610442576101d8565b80633ccfd60b1461032a57806342842e0e14610334578063475133341461035d57806355f804b314610388576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806318160ddd146102ab57806323b872dd146102d65780632e0fd6eb146102ff576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff919061274f565b610738565b6040516102119190612b42565b60405180910390f35b34801561022657600080fd5b5061022f6107ca565b60405161023c9190612b5d565b60405180910390f35b34801561025157600080fd5b5061026c600480360381019061026791906127f6565b61085c565b6040516102799190612adb565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a4919061270f565b6108d8565b005b3480156102b757600080fd5b506102c0610a7f565b6040516102cd9190612cbf565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f891906125f9565b610a96565b005b34801561030b57600080fd5b50610314610aa6565b6040516103219190612cbf565b60405180910390f35b610332610aac565b005b34801561034057600080fd5b5061035b600480360381019061035691906125f9565b610ba8565b005b34801561036957600080fd5b50610372610bc8565b60405161037f9190612cbf565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa91906127a9565b610bce565b005b3480156103bd57600080fd5b506103d860048036038101906103d391906127f6565b610c60565b6040516103e59190612adb565b60405180910390f35b3480156103fa57600080fd5b506104156004803603810190610410919061258c565b610c72565b6040516104229190612cbf565b60405180910390f35b34801561043757600080fd5b50610440610d2b565b005b34801561044e57600080fd5b50610457610db3565b005b34801561046557600080fd5b50610480600480360381019061047b91906127f6565b610e5b565b005b34801561048e57600080fd5b50610497611060565b6040516104a49190612cbf565b60405180910390f35b3480156104b957600080fd5b506104c2611066565b6040516104cf9190612adb565b60405180910390f35b3480156104e457600080fd5b506104ed61108f565b6040516104fa9190612b5d565b60405180910390f35b34801561050f57600080fd5b5061052a6004803603810190610525919061258c565b611121565b6040516105379190612cbf565b60405180910390f35b34801561054c57600080fd5b50610555611139565b6040516105629190612cbf565b60405180910390f35b610585600480360381019061058091906127f6565b61113f565b005b34801561059357600080fd5b506105ae60048036038101906105a991906126cf565b611394565b005b3480156105bc57600080fd5b506105d760048036038101906105d2919061264c565b61150c565b005b3480156105e557600080fd5b5061060060048036038101906105fb91906127f6565b61157f565b60405161060d9190612b5d565b60405180910390f35b34801561062257600080fd5b5061063d600480360381019061063891906127f6565b61161e565b005b34801561064b57600080fd5b5061065461170d565b6040516106619190612cbf565b60405180910390f35b34801561067657600080fd5b50610691600480360381019061068c91906125b9565b611713565b60405161069e9190612b42565b60405180910390f35b3480156106b357600080fd5b506106bc6117a7565b6040516106c99190612b42565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f4919061258c565b6117ba565b005b34801561070757600080fd5b50610722600480360381019061071d919061258c565b6118b2565b60405161072f9190612cbf565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061079357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107c35750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600380546107d990612f18565b80601f016020809104026020016040519081016040528092919081815260200182805461080590612f18565b80156108525780601f1061082757610100808354040283529160200191610852565b820191906000526020600020905b81548152906001019060200180831161083557829003601f168201915b5050505050905090565b6000610867826118ca565b61089d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108e382611929565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561094b576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661096a6119f7565b73ffffffffffffffffffffffffffffffffffffffff16146109cd57610996816109916119f7565b611713565b6109cc576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a896119ff565b6002546001540303905090565b610aa1838383611a04565b505050565b600c5481565b610ab4611dae565b73ffffffffffffffffffffffffffffffffffffffff16610ad2611066565b73ffffffffffffffffffffffffffffffffffffffff1614610b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1f90612bff565b60405180910390fd5b6000610b32611066565b73ffffffffffffffffffffffffffffffffffffffff1647604051610b5590612ac6565b60006040518083038185875af1925050503d8060008114610b92576040519150601f19603f3d011682016040523d82523d6000602084013e610b97565b606091505b5050905080610ba557600080fd5b50565b610bc38383836040518060200160405280600081525061150c565b505050565b600a5481565b610bd6611dae565b73ffffffffffffffffffffffffffffffffffffffff16610bf4611066565b73ffffffffffffffffffffffffffffffffffffffff1614610c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4190612bff565b60405180910390fd5b8181600f9190610c5b9291906123ba565b505050565b6000610c6b82611929565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cda576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610d33611dae565b73ffffffffffffffffffffffffffffffffffffffff16610d51611066565b73ffffffffffffffffffffffffffffffffffffffff1614610da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9e90612bff565b60405180910390fd5b610db16000611db6565b565b610dbb611dae565b73ffffffffffffffffffffffffffffffffffffffff16610dd9611066565b73ffffffffffffffffffffffffffffffffffffffff1614610e2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2690612bff565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b600e60009054906101000a900460ff16610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea190612bbf565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f90612b9f565b60405180910390fd5b80610f21610a7f565b610f2b9190612d7e565b600a541015610f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6690612c9f565b60405180910390fd5b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600c548282610fc29190612d7e565b1115611003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffa90612c5f565b60405180910390fd5b818161100f9190612d7e565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061105c3383611e7a565b5050565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461109e90612f18565b80601f01602080910402602001604051908101604052809291908181526020018280546110ca90612f18565b80156111175780601f106110ec57610100808354040283529160200191611117565b820191906000526020600020905b8154815290600101906020018083116110fa57829003601f168201915b5050505050905090565b60106020528060005260406000206000915090505481565b600d5481565b600e60009054906101000a900460ff1661118e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118590612bbf565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146111fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f390612b9f565b60405180910390fd5b80600d5461120a9190612dd4565b34101561124c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124390612c3f565b60405180910390fd5b80611255610a7f565b61125f9190612d7e565b60095410156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129a90612c1f565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600b5482826112f69190612d7e565b1115611337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132e90612c7f565b60405180910390fd5b81816113439190612d7e565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113903383611e7a565b5050565b61139c6119f7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611401576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061140e6119f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114bb6119f7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115009190612b42565b60405180910390a35050565b611517848484611a04565b60008373ffffffffffffffffffffffffffffffffffffffff163b146115795761154284848484611e98565b611578576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061158a826118ca565b6115c0576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006115ca611ff8565b90506000815114156115eb5760405180602001604052806000815250611616565b806115f58461208a565b604051602001611606929190612a97565b6040516020818303038152906040525b915050919050565b611626611dae565b73ffffffffffffffffffffffffffffffffffffffff16611644611066565b73ffffffffffffffffffffffffffffffffffffffff161461169a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169190612bff565b60405180910390fd5b6116a2610a7f565b816009546116b09190612e2e565b10156116f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e890612bdf565b60405180910390fd5b80600960008282546117039190612e2e565b9250508190555050565b60095481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900460ff1681565b6117c2611dae565b73ffffffffffffffffffffffffffffffffffffffff166117e0611066565b73ffffffffffffffffffffffffffffffffffffffff1614611836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182d90612bff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d90612b7f565b60405180910390fd5b6118af81611db6565b50565b60116020528060005260406000206000915090505481565b6000816118d56119ff565b111580156118e4575060015482105b8015611922575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600080829050806119386119ff565b116119c0576001548110156119bf5760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156119bd575b60008114156119b3576005600083600190039350838152602001908152602001600020549050611988565b80925050506119f2565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611a0f82611929565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611a76576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611a976119f7565b73ffffffffffffffffffffffffffffffffffffffff161480611ac65750611ac585611ac06119f7565b611713565b5b80611b0b5750611ad46119f7565b73ffffffffffffffffffffffffffffffffffffffff16611af38461085c565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611b44576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611bab576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bb885858560016120e4565b6007600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611cb5866120ea565b1717600560008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415611d3f576000600184019050600060056000838152602001908152602001600020541415611d3d576001548114611d3c578260056000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611da785858560016120f4565b5050505050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e948282604051806020016040528060008152506120fa565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ebe6119f7565b8786866040518563ffffffff1660e01b8152600401611ee09493929190612af6565b602060405180830381600087803b158015611efa57600080fd5b505af1925050508015611f2b57506040513d601f19601f82011682018060405250810190611f28919061277c565b60015b611fa5573d8060008114611f5b576040519150601f19603f3d011682016040523d82523d6000602084013e611f60565b606091505b50600081511415611f9d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f805461200790612f18565b80601f016020809104026020016040519081016040528092919081815260200182805461203390612f18565b80156120805780601f1061205557610100808354040283529160200191612080565b820191906000526020600020905b81548152906001019060200180831161206357829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156120d057600183039250600a81066030018353600a810490506120b0565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612168576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156121a3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121b060008583866120e4565b600160406001901b178302600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612215600185146123b0565b901b60a042901b612225866120ea565b1717600560008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612329575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122d96000878480600101955087611e98565b61230f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061226a57826001541461232457600080fd5b612394565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061232a575b8160018190555050506123aa60008583866120f4565b50505050565b6000819050919050565b8280546123c690612f18565b90600052602060002090601f0160209004810192826123e8576000855561242f565b82601f1061240157803560ff191683800117855561242f565b8280016001018555821561242f579182015b8281111561242e578235825591602001919060010190612413565b5b50905061243c9190612440565b5090565b5b80821115612459576000816000905550600101612441565b5090565b600061247061246b84612cff565b612cda565b90508281526020810184848401111561248c5761248b613017565b5b612497848285612ed6565b509392505050565b6000813590506124ae8161326f565b92915050565b6000813590506124c381613286565b92915050565b6000813590506124d88161329d565b92915050565b6000815190506124ed8161329d565b92915050565b600082601f8301126125085761250761300d565b5b813561251884826020860161245d565b91505092915050565b60008083601f8401126125375761253661300d565b5b8235905067ffffffffffffffff81111561255457612553613008565b5b6020830191508360018202830111156125705761256f613012565b5b9250929050565b600081359050612586816132b4565b92915050565b6000602082840312156125a2576125a1613021565b5b60006125b08482850161249f565b91505092915050565b600080604083850312156125d0576125cf613021565b5b60006125de8582860161249f565b92505060206125ef8582860161249f565b9150509250929050565b60008060006060848603121561261257612611613021565b5b60006126208682870161249f565b93505060206126318682870161249f565b925050604061264286828701612577565b9150509250925092565b6000806000806080858703121561266657612665613021565b5b60006126748782880161249f565b94505060206126858782880161249f565b935050604061269687828801612577565b925050606085013567ffffffffffffffff8111156126b7576126b661301c565b5b6126c3878288016124f3565b91505092959194509250565b600080604083850312156126e6576126e5613021565b5b60006126f48582860161249f565b9250506020612705858286016124b4565b9150509250929050565b6000806040838503121561272657612725613021565b5b60006127348582860161249f565b925050602061274585828601612577565b9150509250929050565b60006020828403121561276557612764613021565b5b6000612773848285016124c9565b91505092915050565b60006020828403121561279257612791613021565b5b60006127a0848285016124de565b91505092915050565b600080602083850312156127c0576127bf613021565b5b600083013567ffffffffffffffff8111156127de576127dd61301c565b5b6127ea85828601612521565b92509250509250929050565b60006020828403121561280c5761280b613021565b5b600061281a84828501612577565b91505092915050565b61282c81612e62565b82525050565b61283b81612e74565b82525050565b600061284c82612d30565b6128568185612d46565b9350612866818560208601612ee5565b61286f81613026565b840191505092915050565b600061288582612d3b565b61288f8185612d62565b935061289f818560208601612ee5565b6128a881613026565b840191505092915050565b60006128be82612d3b565b6128c88185612d73565b93506128d8818560208601612ee5565b80840191505092915050565b60006128f1602683612d62565b91506128fc82613037565b604082019050919050565b6000612914601c83612d62565b915061291f82613086565b602082019050919050565b6000612937601783612d62565b9150612942826130af565b602082019050919050565b600061295a602783612d62565b9150612965826130d8565b604082019050919050565b600061297d600583612d73565b915061298882613127565b600582019050919050565b60006129a0602083612d62565b91506129ab82613150565b602082019050919050565b60006129c3601383612d62565b91506129ce82613179565b602082019050919050565b60006129e6601283612d62565b91506129f1826131a2565b602082019050919050565b6000612a09600083612d57565b9150612a14826131cb565b600082019050919050565b6000612a2c602383612d62565b9150612a37826131ce565b604082019050919050565b6000612a4f601e83612d62565b9150612a5a8261321d565b602082019050919050565b6000612a72601883612d62565b9150612a7d82613246565b602082019050919050565b612a9181612ecc565b82525050565b6000612aa382856128b3565b9150612aaf82846128b3565b9150612aba82612970565b91508190509392505050565b6000612ad1826129fc565b9150819050919050565b6000602082019050612af06000830184612823565b92915050565b6000608082019050612b0b6000830187612823565b612b186020830186612823565b612b256040830185612a88565b8181036060830152612b378184612841565b905095945050505050565b6000602082019050612b576000830184612832565b92915050565b60006020820190508181036000830152612b77818461287a565b905092915050565b60006020820190508181036000830152612b98816128e4565b9050919050565b60006020820190508181036000830152612bb881612907565b9050919050565b60006020820190508181036000830152612bd88161292a565b9050919050565b60006020820190508181036000830152612bf88161294d565b9050919050565b60006020820190508181036000830152612c1881612993565b9050919050565b60006020820190508181036000830152612c38816129b6565b9050919050565b60006020820190508181036000830152612c58816129d9565b9050919050565b60006020820190508181036000830152612c7881612a1f565b9050919050565b60006020820190508181036000830152612c9881612a42565b9050919050565b60006020820190508181036000830152612cb881612a65565b9050919050565b6000602082019050612cd46000830184612a88565b92915050565b6000612ce4612cf5565b9050612cf08282612f4a565b919050565b6000604051905090565b600067ffffffffffffffff821115612d1a57612d19612fd9565b5b612d2382613026565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612d8982612ecc565b9150612d9483612ecc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612dc957612dc8612f7b565b5b828201905092915050565b6000612ddf82612ecc565b9150612dea83612ecc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e2357612e22612f7b565b5b828202905092915050565b6000612e3982612ecc565b9150612e4483612ecc565b925082821015612e5757612e56612f7b565b5b828203905092915050565b6000612e6d82612eac565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612f03578082015181840152602081019050612ee8565b83811115612f12576000848401525b50505050565b60006002820490506001821680612f3057607f821691505b60208210811415612f4457612f43612faa565b5b50919050565b612f5382613026565b810181811067ffffffffffffffff82111715612f7257612f71612fd9565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f43616c6c65722063616e6e6f74206265206120636f6e74726163742e00000000600082015250565b7f53616c65206973206e6f7420616374697665207965742e000000000000000000600082015250565b7f537570706c792063616e6e6f742066616c6c2062656c6f77206d696e7465642060008201527f746f6b656e732e00000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b7f496e73756666696369656e742046756e642e0000000000000000000000000000600082015250565b50565b7f45786365656473206d61782066726565206d696e74732070657220616464726560008201527f7373210000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178206d696e7473207065722061646472657373210000600082015250565b7f45786365656473206d6178206672656520737570706c792e0000000000000000600082015250565b61327881612e62565b811461328357600080fd5b50565b61328f81612e74565b811461329a57600080fd5b50565b6132a681612e80565b81146132b157600080fd5b50565b6132bd81612ecc565b81146132c857600080fd5b5056fea26469706673582212205cc11a294e2c17f856976b9dbe0624dd325ace85fc872b4a3cbf044b08ef087364736f6c63430008070033
Deployed Bytecode Sourcemap
132:2962:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4830:607:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9718:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11719:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11195:463;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3913:309;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12579:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;344:48:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2938:152;;;:::i;:::-;;12809:179:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;233:50:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2369:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9514:142:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5496:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:4;;;;;;;;;;;;;:::i;:::-;;2051:82:0;;;;;;;;;;;;;:::i;:::-;;1522:523;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;290:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1029:85:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9880:102:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;559:51:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;403:57;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;921:595;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11986:303:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13054:385;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2599:333:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2139:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;177:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12355:162:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;466:51:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;616:47:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4830:607:2;4915:4;5225:10;5210:25;;:11;:25;;;;:101;;;;5301:10;5286:25;;:11;:25;;;;5210:101;:177;;;;5377:10;5362:25;;:11;:25;;;;5210:177;5191:196;;4830:607;;;:::o;9718:98::-;9772:13;9804:5;9797:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9718:98;:::o;11719:200::-;11787:7;11811:16;11819:7;11811;:16::i;:::-;11806:64;;11836:34;;;;;;;;;;;;;;11806:64;11888:15;:24;11904:7;11888:24;;;;;;;;;;;;;;;;;;;;;11881:31;;11719:200;;;:::o;11195:463::-;11267:13;11299:27;11318:7;11299:18;:27::i;:::-;11267:61;;11348:5;11342:11;;:2;:11;;;11338:48;;;11362:24;;;;;;;;;;;;;;11338:48;11424:5;11401:28;;:19;:17;:19::i;:::-;:28;;;11397:172;;11448:44;11465:5;11472:19;:17;:19::i;:::-;11448:16;:44::i;:::-;11443:126;;11519:35;;;;;;;;;;;;;;11443:126;11397:172;11606:2;11579:15;:24;11595:7;11579:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11643:7;11639:2;11623:28;;11632:5;11623:28;;;;;;;;;;;;11257:401;11195:463;;:::o;3913:309::-;3966:7;4190:15;:13;:15::i;:::-;4175:12;;4159:13;;:28;:46;4152:53;;3913:309;:::o;12579:164::-;12708:28;12718:4;12724:2;12728:7;12708:9;:28::i;:::-;12579:164;;;:::o;344:48:0:-;;;;:::o;2938:152::-;1252:12:4;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2996:7:0::1;3017;:5;:7::i;:::-;3009:21;;3038;3009:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2995:69;;;3082:2;3074:11;;;::::0;::::1;;2985:105;2938:152::o:0;12809:179:2:-;12942:39;12959:4;12965:2;12969:7;12942:39;;;;;;;;;;;;:16;:39::i;:::-;12809:179;;;:::o;233:50:0:-;;;;:::o;2369:104::-;1252:12:4;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2459:7:0::1;;2443:13;:23;;;;;;;:::i;:::-;;2369:104:::0;;:::o;9514:142:2:-;9578:7;9620:27;9639:7;9620:18;:27::i;:::-;9597:52;;9514:142;;;:::o;5496:221::-;5560:7;5600:1;5583:19;;:5;:19;;;5579:60;;;5611:28;;;;;;;;;;;;;;5579:60;967:13;5656:18;:25;5675:5;5656:25;;;;;;;;;;;;;;;;:54;5649:61;;5496:221;;;:::o;1661:101:4:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;2051:82:0:-;1252:12:4;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2114:12:0::1;;;;;;;;;;;2113:13;2098:12;;:28;;;;;;;;;;;;;;;;;;2051:82::o:0;1522:523::-;783:12;;;;;;;;;;;775:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;854:10;841:23;;:9;:23;;;833:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;1649:9:::1;1633:13;:11;:13::i;:::-;:25;;;;:::i;:::-;1616:13;;:42;;1595:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;1718:25;1746:16;:28;1763:10;1746:28;;;;;;;;;;;;;;;;1718:56;;1838:27;;1825:9;1805:17;:29;;;;:::i;:::-;:60;;1784:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;1987:9;1967:17;:29;;;;:::i;:::-;1936:16;:28;1953:10;1936:28;;;;;;;;;;;;;;;:60;;;;2006:32;2016:10;2028:9;2006;:32::i;:::-;1585:460;1522:523:::0;:::o;290:48::-;;;;:::o;1029:85:4:-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;9880:102:2:-;9936:13;9968:7;9961:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9880:102;:::o;559:51:0:-;;;;;;;;;;;;;;;;;:::o;403:57::-;;;;:::o;921:595::-;783:12;;;;;;;;;;;775:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;854:10;841:23;;:9;:23;;;833:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;1040:9:::1;1032:5;;:17;;;;:::i;:::-;1019:9;:30;;998:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1153:9;1137:13;:11;:13::i;:::-;:25;;;;:::i;:::-;1124:9;;:38;;1103:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;1217:21;1241:12;:24;1254:10;1241:24;;;;;;;;;;;;;;;;1217:48;;1325:23;;1312:9;1296:13;:25;;;;:::i;:::-;:52;;1275:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;1458:9;1442:13;:25;;;;:::i;:::-;1415:12;:24;1428:10;1415:24;;;;;;;;;;;;;;;:52;;;;1477:32;1487:10;1499:9;1477;:32::i;:::-;988:528;921:595:::0;:::o;11986:303:2:-;12096:19;:17;:19::i;:::-;12084:31;;:8;:31;;;12080:61;;;12124:17;;;;;;;;;;;;;;12080:61;12204:8;12152:18;:39;12171:19;:17;:19::i;:::-;12152:39;;;;;;;;;;;;;;;:49;12192:8;12152:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;12263:8;12227:55;;12242:19;:17;:19::i;:::-;12227:55;;;12273:8;12227:55;;;;;;:::i;:::-;;;;;;;;11986:303;;:::o;13054:385::-;13215:28;13225:4;13231:2;13235:7;13215:9;:28::i;:::-;13275:1;13257:2;:14;;;:19;13253:180;;13295:56;13326:4;13332:2;13336:7;13345:5;13295:30;:56::i;:::-;13290:143;;13378:40;;;;;;;;;;;;;;13290:143;13253:180;13054:385;;;;:::o;2599:333:0:-;2672:13;2702:16;2710:7;2702;:16::i;:::-;2697:59;;2727:29;;;;;;;;;;;;;;2697:59;2772:21;2796:10;:8;:10::i;:::-;2772:34;;2854:1;2835:7;2829:21;:26;;:95;;;;;;;;;;;;;;;;;2882:7;2891:18;2901:7;2891:9;:18::i;:::-;2865:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2829:95;2822:102;;;2599:333;;;:::o;2139:224::-;1252:12:4;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2247:13:0::1;:11;:13::i;:::-;2236:7;2224:9;;:19;;;;:::i;:::-;:36;;2203:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;2349:7;2336:9;;:20;;;;;;;:::i;:::-;;;;;;;;2139:224:::0;:::o;177:50::-;;;;:::o;12355:162:2:-;12452:4;12475:18;:25;12494:5;12475:25;;;;;;;;;;;;;;;:35;12501:8;12475:35;;;;;;;;;;;;;;;;;;;;;;;;;12468:42;;12355:162;;;;:::o;466:51:0:-;;;;;;;;;;;;;:::o;1911:198:4:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;;;1991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;616:47:0:-;;;;;;;;;;;;;;;;;:::o;13685:268:2:-;13742:4;13796:7;13777:15;:13;:15::i;:::-;:26;;:65;;;;;13829:13;;13819:7;:23;13777:65;:150;;;;;13926:1;1719:8;13879:17;:26;13897:7;13879:26;;;;;;;;;;;;:43;:48;13777:150;13758:169;;13685:268;;;:::o;7091:1105::-;7158:7;7177:12;7192:7;7177:22;;7257:4;7238:15;:13;:15::i;:::-;:23;7234:898;;7290:13;;7283:4;:20;7279:853;;;7327:14;7344:17;:23;7362:4;7344:23;;;;;;;;;;;;7327:40;;7458:1;1719:8;7431:6;:23;:28;7427:687;;;7942:111;7959:1;7949:6;:11;7942:111;;;8001:17;:25;8019:6;;;;;;;8001:25;;;;;;;;;;;;7992:34;;7942:111;;;8085:6;8078:13;;;;;;7427:687;7305:827;7279:853;7234:898;8158:31;;;;;;;;;;;;;;7091:1105;;;;:::o;27310:103::-;27370:7;27396:10;27389:17;;27310:103;:::o;3452:90::-;3508:7;3452:90;:::o;18785:2460::-;18895:27;18925;18944:7;18925:18;:27::i;:::-;18895:57;;19008:4;18967:45;;18983:19;18967:45;;;18963:86;;19021:28;;;;;;;;;;;;;;18963:86;19060:22;19109:4;19086:27;;:19;:17;:19::i;:::-;:27;;;:86;;;;19129:43;19146:4;19152:19;:17;:19::i;:::-;19129:16;:43::i;:::-;19086:86;:145;;;;19212:19;:17;:19::i;:::-;19188:43;;:20;19200:7;19188:11;:20::i;:::-;:43;;;19086:145;19060:172;;19248:17;19243:66;;19274:35;;;;;;;;;;;;;;19243:66;19337:1;19323:16;;:2;:16;;;19319:52;;;19348:23;;;;;;;;;;;;;;19319:52;19382:43;19404:4;19410:2;19414:7;19423:1;19382:21;:43::i;:::-;19495:15;:24;19511:7;19495:24;;;;;;;;;;;;19488:31;;;;;;;;;;;19880:18;:24;19899:4;19880:24;;;;;;;;;;;;;;;;19878:26;;;;;;;;;;;;19948:18;:22;19967:2;19948:22;;;;;;;;;;;;;;;;19946:24;;;;;;;;;;;1995:8;1606:3;20320:15;:41;;20279:21;20297:2;20279:17;:21::i;:::-;:83;:126;20234:17;:26;20252:7;20234:26;;;;;;;;;;;:171;;;;20572:1;1995:8;20522:19;:46;:51;20518:616;;;20593:19;20625:1;20615:7;:11;20593:33;;20780:1;20746:17;:30;20764:11;20746:30;;;;;;;;;;;;:35;20742:378;;;20882:13;;20867:11;:28;20863:239;;21060:19;21027:17;:30;21045:11;21027:30;;;;;;;;;;;:52;;;;20863:239;20742:378;20575:559;20518:616;21178:7;21174:2;21159:27;;21168:4;21159:27;;;;;;;;;;;;21196:42;21217:4;21223:2;21227:7;21236:1;21196:20;:42::i;:::-;18885:2360;;18785:2460;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;2263:187:4:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;14032:102:2:-;14100:27;14110:2;14114:8;14100:27;;;;;;;;;;;;:9;:27::i;:::-;14032:102;;:::o;24850:697::-;25008:4;25053:2;25028:45;;;25074:19;:17;:19::i;:::-;25095:4;25101:7;25110:5;25028:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;25024:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25323:1;25306:6;:13;:18;25302:229;;;25351:40;;;;;;;;;;;;;;25302:229;25491:6;25485:13;25476:6;25472:2;25468:15;25461:38;25024:517;25194:54;;;25184:64;;;:6;:64;;;;25177:71;;;24850:697;;;;;;:::o;2479:112:0:-;2539:13;2571;2564:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2479:112;:::o;27514:1920:2:-;27571:17;27986:3;27979:4;27973:11;27969:21;27962:28;;28075:3;28069:4;28062:17;28178:3;28627:5;28755:1;28750:3;28746:11;28739:18;;28890:2;28884:4;28880:13;28876:2;28872:22;28867:3;28859:36;28930:2;28924:4;28920:13;28912:21;;28520:668;28948:4;28520:668;;;29119:1;29114:3;29110:11;29103:18;;29169:2;29163:4;29159:13;29155:2;29151:22;29146:3;29138:36;29042:2;29036:4;29032:13;29024:21;;28520:668;;;28524:423;29237:3;29232;29228:13;29350:2;29345:3;29341:12;29334:19;;29411:6;29406:3;29399:19;27609:1819;;27514:1920;;;:::o;26178:154::-;;;;;:::o;10774:144::-;10838:14;10897:5;10887:15;;10774:144;;;:::o;26973:153::-;;;;;:::o;14494:2184::-;14612:20;14635:13;;14612:36;;14676:1;14662:16;;:2;:16;;;14658:48;;;14687:19;;;;;;;;;;;;;;14658:48;14732:1;14720:8;:13;14716:44;;;14742:18;;;;;;;;;;;;;;14716:44;14771:61;14801:1;14805:2;14809:12;14823:8;14771:21;:61::i;:::-;15364:1;1101:2;15335:1;:25;;15334:31;15322:8;:44;15296:18;:22;15315:2;15296:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;1863:3;15755:29;15782:1;15770:8;:13;15755:14;:29::i;:::-;:56;;1606:3;15693:15;:41;;15652:21;15670:2;15652:17;:21::i;:::-;:83;:160;15602:17;:31;15620:12;15602:31;;;;;;;;;;;:210;;;;15827:20;15850:12;15827:35;;15876:11;15905:8;15890:12;:23;15876:37;;15950:1;15932:2;:14;;;:19;15928:622;;15971:308;16026:12;16022:2;16001:38;;16018:1;16001:38;;;;;;;;;;;;16066:69;16105:1;16109:2;16113:14;;;;;;16129:5;16066:30;:69::i;:::-;16061:172;;16170:40;;;;;;;;;;;;;;16061:172;16274:3;16259:12;:18;15971:308;;16358:12;16341:13;;:29;16337:43;;16372:8;;;16337:43;15928:622;;;16419:117;16474:14;;;;;;16470:2;16449:40;;16466:1;16449:40;;;;;;;;;;;;16531:3;16516:12;:18;16419:117;;15928:622;16579:12;16563:13;:28;;;;15079:1523;;16611:60;16640:1;16644:2;16648:12;16662:8;16611:20;:60::i;:::-;14602:2076;14494:2184;;;:::o;11000:138::-;11058:14;11117:5;11107:15;;11000:138;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:5:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:329::-;2131:6;2180:2;2168:9;2159:7;2155:23;2151:32;2148:119;;;2186:79;;:::i;:::-;2148:119;2306:1;2331:53;2376:7;2367:6;2356:9;2352:22;2331:53;:::i;:::-;2321:63;;2277:117;2072:329;;;;:::o;2407:474::-;2475:6;2483;2532:2;2520:9;2511:7;2507:23;2503:32;2500:119;;;2538:79;;:::i;:::-;2500:119;2658:1;2683:53;2728:7;2719:6;2708:9;2704:22;2683:53;:::i;:::-;2673:63;;2629:117;2785:2;2811:53;2856:7;2847:6;2836:9;2832:22;2811:53;:::i;:::-;2801:63;;2756:118;2407:474;;;;;:::o;2887:619::-;2964:6;2972;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;3410:2;3436:53;3481:7;3472:6;3461:9;3457:22;3436:53;:::i;:::-;3426:63;;3381:118;2887:619;;;;;:::o;3512:943::-;3607:6;3615;3623;3631;3680:3;3668:9;3659:7;3655:23;3651:33;3648:120;;;3687:79;;:::i;:::-;3648:120;3807:1;3832:53;3877:7;3868:6;3857:9;3853:22;3832:53;:::i;:::-;3822:63;;3778:117;3934:2;3960:53;4005:7;3996:6;3985:9;3981:22;3960:53;:::i;:::-;3950:63;;3905:118;4062:2;4088:53;4133:7;4124:6;4113:9;4109:22;4088:53;:::i;:::-;4078:63;;4033:118;4218:2;4207:9;4203:18;4190:32;4249:18;4241:6;4238:30;4235:117;;;4271:79;;:::i;:::-;4235:117;4376:62;4430:7;4421:6;4410:9;4406:22;4376:62;:::i;:::-;4366:72;;4161:287;3512:943;;;;;;;:::o;4461:468::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:50;4904:7;4895:6;4884:9;4880:22;4862:50;:::i;:::-;4852:60;;4807:115;4461:468;;;;;:::o;4935:474::-;5003:6;5011;5060:2;5048:9;5039:7;5035:23;5031:32;5028:119;;;5066:79;;:::i;:::-;5028:119;5186:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5157:117;5313:2;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5284:118;4935:474;;;;;:::o;5415:327::-;5473:6;5522:2;5510:9;5501:7;5497:23;5493:32;5490:119;;;5528:79;;:::i;:::-;5490:119;5648:1;5673:52;5717:7;5708:6;5697:9;5693:22;5673:52;:::i;:::-;5663:62;;5619:116;5415:327;;;;:::o;5748:349::-;5817:6;5866:2;5854:9;5845:7;5841:23;5837:32;5834:119;;;5872:79;;:::i;:::-;5834:119;5992:1;6017:63;6072:7;6063:6;6052:9;6048:22;6017:63;:::i;:::-;6007:73;;5963:127;5748:349;;;;:::o;6103:529::-;6174:6;6182;6231:2;6219:9;6210:7;6206:23;6202:32;6199:119;;;6237:79;;:::i;:::-;6199:119;6385:1;6374:9;6370:17;6357:31;6415:18;6407:6;6404:30;6401:117;;;6437:79;;:::i;:::-;6401:117;6550:65;6607:7;6598:6;6587:9;6583:22;6550:65;:::i;:::-;6532:83;;;;6328:297;6103:529;;;;;:::o;6638:329::-;6697:6;6746:2;6734:9;6725:7;6721:23;6717:32;6714:119;;;6752:79;;:::i;:::-;6714:119;6872:1;6897:53;6942:7;6933:6;6922:9;6918:22;6897:53;:::i;:::-;6887:63;;6843:117;6638:329;;;;:::o;6973:118::-;7060:24;7078:5;7060:24;:::i;:::-;7055:3;7048:37;6973:118;;:::o;7097:109::-;7178:21;7193:5;7178:21;:::i;:::-;7173:3;7166:34;7097:109;;:::o;7212:360::-;7298:3;7326:38;7358:5;7326:38;:::i;:::-;7380:70;7443:6;7438:3;7380:70;:::i;:::-;7373:77;;7459:52;7504:6;7499:3;7492:4;7485:5;7481:16;7459:52;:::i;:::-;7536:29;7558:6;7536:29;:::i;:::-;7531:3;7527:39;7520:46;;7302:270;7212:360;;;;:::o;7578:364::-;7666:3;7694:39;7727:5;7694:39;:::i;:::-;7749:71;7813:6;7808:3;7749:71;:::i;:::-;7742:78;;7829:52;7874:6;7869:3;7862:4;7855:5;7851:16;7829:52;:::i;:::-;7906:29;7928:6;7906:29;:::i;:::-;7901:3;7897:39;7890:46;;7670:272;7578:364;;;;:::o;7948:377::-;8054:3;8082:39;8115:5;8082:39;:::i;:::-;8137:89;8219:6;8214:3;8137:89;:::i;:::-;8130:96;;8235:52;8280:6;8275:3;8268:4;8261:5;8257:16;8235:52;:::i;:::-;8312:6;8307:3;8303:16;8296:23;;8058:267;7948:377;;;;:::o;8331:366::-;8473:3;8494:67;8558:2;8553:3;8494:67;:::i;:::-;8487:74;;8570:93;8659:3;8570:93;:::i;:::-;8688:2;8683:3;8679:12;8672:19;;8331:366;;;:::o;8703:::-;8845:3;8866:67;8930:2;8925:3;8866:67;:::i;:::-;8859:74;;8942:93;9031:3;8942:93;:::i;:::-;9060:2;9055:3;9051:12;9044:19;;8703:366;;;:::o;9075:::-;9217:3;9238:67;9302:2;9297:3;9238:67;:::i;:::-;9231:74;;9314:93;9403:3;9314:93;:::i;:::-;9432:2;9427:3;9423:12;9416:19;;9075:366;;;:::o;9447:::-;9589:3;9610:67;9674:2;9669:3;9610:67;:::i;:::-;9603:74;;9686:93;9775:3;9686:93;:::i;:::-;9804:2;9799:3;9795:12;9788:19;;9447:366;;;:::o;9819:400::-;9979:3;10000:84;10082:1;10077:3;10000:84;:::i;:::-;9993:91;;10093:93;10182:3;10093:93;:::i;:::-;10211:1;10206:3;10202:11;10195:18;;9819:400;;;:::o;10225:366::-;10367:3;10388:67;10452:2;10447:3;10388:67;:::i;:::-;10381:74;;10464:93;10553:3;10464:93;:::i;:::-;10582:2;10577:3;10573:12;10566:19;;10225:366;;;:::o;10597:::-;10739:3;10760:67;10824:2;10819:3;10760:67;:::i;:::-;10753:74;;10836:93;10925:3;10836:93;:::i;:::-;10954:2;10949:3;10945:12;10938:19;;10597:366;;;:::o;10969:::-;11111:3;11132:67;11196:2;11191:3;11132:67;:::i;:::-;11125:74;;11208:93;11297:3;11208:93;:::i;:::-;11326:2;11321:3;11317:12;11310:19;;10969:366;;;:::o;11341:398::-;11500:3;11521:83;11602:1;11597:3;11521:83;:::i;:::-;11514:90;;11613:93;11702:3;11613:93;:::i;:::-;11731:1;11726:3;11722:11;11715:18;;11341:398;;;:::o;11745:366::-;11887:3;11908:67;11972:2;11967:3;11908:67;:::i;:::-;11901:74;;11984:93;12073:3;11984:93;:::i;:::-;12102:2;12097:3;12093:12;12086:19;;11745:366;;;:::o;12117:::-;12259:3;12280:67;12344:2;12339:3;12280:67;:::i;:::-;12273:74;;12356:93;12445:3;12356:93;:::i;:::-;12474:2;12469:3;12465:12;12458:19;;12117:366;;;:::o;12489:::-;12631:3;12652:67;12716:2;12711:3;12652:67;:::i;:::-;12645:74;;12728:93;12817:3;12728:93;:::i;:::-;12846:2;12841:3;12837:12;12830:19;;12489:366;;;:::o;12861:118::-;12948:24;12966:5;12948:24;:::i;:::-;12943:3;12936:37;12861:118;;:::o;12985:701::-;13266:3;13288:95;13379:3;13370:6;13288:95;:::i;:::-;13281:102;;13400:95;13491:3;13482:6;13400:95;:::i;:::-;13393:102;;13512:148;13656:3;13512:148;:::i;:::-;13505:155;;13677:3;13670:10;;12985:701;;;;;:::o;13692:379::-;13876:3;13898:147;14041:3;13898:147;:::i;:::-;13891:154;;14062:3;14055:10;;13692:379;;;:::o;14077:222::-;14170:4;14208:2;14197:9;14193:18;14185:26;;14221:71;14289:1;14278:9;14274:17;14265:6;14221:71;:::i;:::-;14077:222;;;;:::o;14305:640::-;14500:4;14538:3;14527:9;14523:19;14515:27;;14552:71;14620:1;14609:9;14605:17;14596:6;14552:71;:::i;:::-;14633:72;14701:2;14690:9;14686:18;14677:6;14633:72;:::i;:::-;14715;14783:2;14772:9;14768:18;14759:6;14715:72;:::i;:::-;14834:9;14828:4;14824:20;14819:2;14808:9;14804:18;14797:48;14862:76;14933:4;14924:6;14862:76;:::i;:::-;14854:84;;14305:640;;;;;;;:::o;14951:210::-;15038:4;15076:2;15065:9;15061:18;15053:26;;15089:65;15151:1;15140:9;15136:17;15127:6;15089:65;:::i;:::-;14951:210;;;;:::o;15167:313::-;15280:4;15318:2;15307:9;15303:18;15295:26;;15367:9;15361:4;15357:20;15353:1;15342:9;15338:17;15331:47;15395:78;15468:4;15459:6;15395:78;:::i;:::-;15387:86;;15167:313;;;;:::o;15486:419::-;15652:4;15690:2;15679:9;15675:18;15667:26;;15739:9;15733:4;15729:20;15725:1;15714:9;15710:17;15703:47;15767:131;15893:4;15767:131;:::i;:::-;15759:139;;15486:419;;;:::o;15911:::-;16077:4;16115:2;16104:9;16100:18;16092:26;;16164:9;16158:4;16154:20;16150:1;16139:9;16135:17;16128:47;16192:131;16318:4;16192:131;:::i;:::-;16184:139;;15911:419;;;:::o;16336:::-;16502:4;16540:2;16529:9;16525:18;16517:26;;16589:9;16583:4;16579:20;16575:1;16564:9;16560:17;16553:47;16617:131;16743:4;16617:131;:::i;:::-;16609:139;;16336:419;;;:::o;16761:::-;16927:4;16965:2;16954:9;16950:18;16942:26;;17014:9;17008:4;17004:20;17000:1;16989:9;16985:17;16978:47;17042:131;17168:4;17042:131;:::i;:::-;17034:139;;16761:419;;;:::o;17186:::-;17352:4;17390:2;17379:9;17375:18;17367:26;;17439:9;17433:4;17429:20;17425:1;17414:9;17410:17;17403:47;17467:131;17593:4;17467:131;:::i;:::-;17459:139;;17186:419;;;:::o;17611:::-;17777:4;17815:2;17804:9;17800:18;17792:26;;17864:9;17858:4;17854:20;17850:1;17839:9;17835:17;17828:47;17892:131;18018:4;17892:131;:::i;:::-;17884:139;;17611:419;;;:::o;18036:::-;18202:4;18240:2;18229:9;18225:18;18217:26;;18289:9;18283:4;18279:20;18275:1;18264:9;18260:17;18253:47;18317:131;18443:4;18317:131;:::i;:::-;18309:139;;18036:419;;;:::o;18461:::-;18627:4;18665:2;18654:9;18650:18;18642:26;;18714:9;18708:4;18704:20;18700:1;18689:9;18685:17;18678:47;18742:131;18868:4;18742:131;:::i;:::-;18734:139;;18461:419;;;:::o;18886:::-;19052:4;19090:2;19079:9;19075:18;19067:26;;19139:9;19133:4;19129:20;19125:1;19114:9;19110:17;19103:47;19167:131;19293:4;19167:131;:::i;:::-;19159:139;;18886:419;;;:::o;19311:::-;19477:4;19515:2;19504:9;19500:18;19492:26;;19564:9;19558:4;19554:20;19550:1;19539:9;19535:17;19528:47;19592:131;19718:4;19592:131;:::i;:::-;19584:139;;19311:419;;;:::o;19736:222::-;19829:4;19867:2;19856:9;19852:18;19844:26;;19880:71;19948:1;19937:9;19933:17;19924:6;19880:71;:::i;:::-;19736:222;;;;:::o;19964:129::-;19998:6;20025:20;;:::i;:::-;20015:30;;20054:33;20082:4;20074:6;20054:33;:::i;:::-;19964:129;;;:::o;20099:75::-;20132:6;20165:2;20159:9;20149:19;;20099:75;:::o;20180:307::-;20241:4;20331:18;20323:6;20320:30;20317:56;;;20353:18;;:::i;:::-;20317:56;20391:29;20413:6;20391:29;:::i;:::-;20383:37;;20475:4;20469;20465:15;20457:23;;20180:307;;;:::o;20493:98::-;20544:6;20578:5;20572:12;20562:22;;20493:98;;;:::o;20597:99::-;20649:6;20683:5;20677:12;20667:22;;20597:99;;;:::o;20702:168::-;20785:11;20819:6;20814:3;20807:19;20859:4;20854:3;20850:14;20835:29;;20702:168;;;;:::o;20876:147::-;20977:11;21014:3;20999:18;;20876:147;;;;:::o;21029:169::-;21113:11;21147:6;21142:3;21135:19;21187:4;21182:3;21178:14;21163:29;;21029:169;;;;:::o;21204:148::-;21306:11;21343:3;21328:18;;21204:148;;;;:::o;21358:305::-;21398:3;21417:20;21435:1;21417:20;:::i;:::-;21412:25;;21451:20;21469:1;21451:20;:::i;:::-;21446:25;;21605:1;21537:66;21533:74;21530:1;21527:81;21524:107;;;21611:18;;:::i;:::-;21524:107;21655:1;21652;21648:9;21641:16;;21358:305;;;;:::o;21669:348::-;21709:7;21732:20;21750:1;21732:20;:::i;:::-;21727:25;;21766:20;21784:1;21766:20;:::i;:::-;21761:25;;21954:1;21886:66;21882:74;21879:1;21876:81;21871:1;21864:9;21857:17;21853:105;21850:131;;;21961:18;;:::i;:::-;21850:131;22009:1;22006;22002:9;21991:20;;21669:348;;;;:::o;22023:191::-;22063:4;22083:20;22101:1;22083:20;:::i;:::-;22078:25;;22117:20;22135:1;22117:20;:::i;:::-;22112:25;;22156:1;22153;22150:8;22147:34;;;22161:18;;:::i;:::-;22147:34;22206:1;22203;22199:9;22191:17;;22023:191;;;;:::o;22220:96::-;22257:7;22286:24;22304:5;22286:24;:::i;:::-;22275:35;;22220:96;;;:::o;22322:90::-;22356:7;22399:5;22392:13;22385:21;22374:32;;22322:90;;;:::o;22418:149::-;22454:7;22494:66;22487:5;22483:78;22472:89;;22418:149;;;:::o;22573:126::-;22610:7;22650:42;22643:5;22639:54;22628:65;;22573:126;;;:::o;22705:77::-;22742:7;22771:5;22760:16;;22705:77;;;:::o;22788:154::-;22872:6;22867:3;22862;22849:30;22934:1;22925:6;22920:3;22916:16;22909:27;22788:154;;;:::o;22948:307::-;23016:1;23026:113;23040:6;23037:1;23034:13;23026:113;;;23125:1;23120:3;23116:11;23110:18;23106:1;23101:3;23097:11;23090:39;23062:2;23059:1;23055:10;23050:15;;23026:113;;;23157:6;23154:1;23151:13;23148:101;;;23237:1;23228:6;23223:3;23219:16;23212:27;23148:101;22997:258;22948:307;;;:::o;23261:320::-;23305:6;23342:1;23336:4;23332:12;23322:22;;23389:1;23383:4;23379:12;23410:18;23400:81;;23466:4;23458:6;23454:17;23444:27;;23400:81;23528:2;23520:6;23517:14;23497:18;23494:38;23491:84;;;23547:18;;:::i;:::-;23491:84;23312:269;23261:320;;;:::o;23587:281::-;23670:27;23692:4;23670:27;:::i;:::-;23662:6;23658:40;23800:6;23788:10;23785:22;23764:18;23752:10;23749:34;23746:62;23743:88;;;23811:18;;:::i;:::-;23743:88;23851:10;23847:2;23840:22;23630:238;23587:281;;:::o;23874:180::-;23922:77;23919:1;23912:88;24019:4;24016:1;24009:15;24043:4;24040:1;24033:15;24060:180;24108:77;24105:1;24098:88;24205:4;24202:1;24195:15;24229:4;24226:1;24219:15;24246:180;24294:77;24291:1;24284:88;24391:4;24388:1;24381:15;24415:4;24412:1;24405:15;24432:117;24541:1;24538;24531:12;24555:117;24664:1;24661;24654:12;24678:117;24787:1;24784;24777:12;24801:117;24910:1;24907;24900:12;24924:117;25033:1;25030;25023:12;25047:117;25156:1;25153;25146:12;25170:102;25211:6;25262:2;25258:7;25253:2;25246:5;25242:14;25238:28;25228:38;;25170:102;;;:::o;25278:225::-;25418:34;25414:1;25406:6;25402:14;25395:58;25487:8;25482:2;25474:6;25470:15;25463:33;25278:225;:::o;25509:178::-;25649:30;25645:1;25637:6;25633:14;25626:54;25509:178;:::o;25693:173::-;25833:25;25829:1;25821:6;25817:14;25810:49;25693:173;:::o;25872:226::-;26012:34;26008:1;26000:6;25996:14;25989:58;26081:9;26076:2;26068:6;26064:15;26057:34;25872:226;:::o;26104:155::-;26244:7;26240:1;26232:6;26228:14;26221:31;26104:155;:::o;26265:182::-;26405:34;26401:1;26393:6;26389:14;26382:58;26265:182;:::o;26453:169::-;26593:21;26589:1;26581:6;26577:14;26570:45;26453:169;:::o;26628:168::-;26768:20;26764:1;26756:6;26752:14;26745:44;26628:168;:::o;26802:114::-;;:::o;26922:222::-;27062:34;27058:1;27050:6;27046:14;27039:58;27131:5;27126:2;27118:6;27114:15;27107:30;26922:222;:::o;27150:180::-;27290:32;27286:1;27278:6;27274:14;27267:56;27150:180;:::o;27336:174::-;27476:26;27472:1;27464:6;27460:14;27453:50;27336:174;:::o;27516:122::-;27589:24;27607:5;27589:24;:::i;:::-;27582:5;27579:35;27569:63;;27628:1;27625;27618:12;27569:63;27516:122;:::o;27644:116::-;27714:21;27729:5;27714:21;:::i;:::-;27707:5;27704:32;27694:60;;27750:1;27747;27740:12;27694:60;27644:116;:::o;27766:120::-;27838:23;27855:5;27838:23;:::i;:::-;27831:5;27828:34;27818:62;;27876:1;27873;27866:12;27818:62;27766:120;:::o;27892:122::-;27965:24;27983:5;27965:24;:::i;:::-;27958:5;27955:35;27945:63;;28004:1;28001;27994:12;27945:63;27892:122;:::o
Swarm Source
ipfs://5cc11a294e2c17f856976b9dbe0624dd325ace85fc872b4a3cbf044b08ef0873
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.