Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
7,777 RGP
Holders
2,400
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
8 RGPLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CallMeRuggiePie
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; import './ERC721A.sol'; import './Ownable.sol'; import './ReentrancyGuard.sol'; import './Strings.sol'; contract CallMeRuggiePie is ERC721A, Ownable, ReentrancyGuard { // ===== Variables ===== string public baseTokenURI; uint256 public mintPrice = 0.0 ether; uint256 public collectionSize = 7777; uint256 public maxItemsPerTx = 2; uint256 public maxWhitelistMint = 2; uint256 public whitelistMintPrice = 0.0 ether; bool public whiteListSale; bool public publicSale; address[] private whitelistedAddresses; address[] private stingAddresses; mapping(address => uint256) public walletMints; mapping(address => uint256) public totalStings; mapping(address => uint256) public totalWhitelistMint; mapping(address => bool) userAddr; // ===== Constructor ===== constructor() ERC721A("CallMeRuggiePie", "RGP") {} // ===== Modifier ===== function isOwner() internal view returns(bool) { return owner() == msg.sender; } // ===== Mint ===== function mint(uint256 _mintAmount) public payable nonReentrant { uint256 s = totalSupply(); require(publicSale, "Public Minting is on Pause"); require(_mintAmount > 0, "Cant mint 0"); require(_mintAmount <= maxItemsPerTx, "Maximum per transaction exceeded"); require(s + _mintAmount <= collectionSize, "Minting supply exceeded"); _safeMint(msg.sender, _mintAmount); walletMints[msg.sender] += _mintAmount; } function whitelistMint(uint256 _quantity) external payable nonReentrant { require(whiteListSale, "Whitelist Minting is on Pause"); require((totalSupply() + _quantity) <= collectionSize, "Cannot mint beyond max supply"); require((totalWhitelistMint[msg.sender] + _quantity) <= maxWhitelistMint, "Cannot mint beyond whitelist max mint!"); require(msg.value >= (whitelistMintPrice * _quantity), "Payment is below the price"); if (whitelistedAddresses.length > 0) { require(isAddressWhitelisted(msg.sender), "Not on the whitelist!"); } totalWhitelistMint[msg.sender] += _quantity; _safeMint(msg.sender, _quantity); } function isAddressWhitelisted(address _user) private view returns (bool) { uint i = 0; while (i < whitelistedAddresses.length) { if(whitelistedAddresses[i] == _user) { return true; } i++; } return false; } // ===== Setter (owner only) ===== function setMintPrice(uint256 _mintPrice) external onlyOwner { mintPrice = _mintPrice; } function setMaxItemsPerTx(uint256 _maxItemsPerTx) external onlyOwner { maxItemsPerTx = _maxItemsPerTx; } function setBaseTokenURI(string memory _baseTokenURI) external onlyOwner { baseTokenURI = _baseTokenURI; } function togglePublicSale() external onlyOwner{ publicSale = !publicSale; } function toggleWhitelistSale() external onlyOwner{ whiteListSale = !whiteListSale; } function setWhitelist(address[] calldata _addressArray) public onlyOwner { delete whitelistedAddresses; whitelistedAddresses = _addressArray; } function setStinglist(address[] calldata _addressArray) public onlyOwner { delete stingAddresses; stingAddresses = _addressArray; } function sting() external nonReentrant { uint256 stings = 80; require(totalStings[msg.sender] + stings <= stings, "Mosquito already stung!"); require(allowedToSting(msg.sender), "You can't sting!"); _safeMint(msg.sender, stings); totalStings[msg.sender] += stings; } function allowedToSting(address _user) private view returns (bool) { uint i = 0; while (i < stingAddresses.length) { if(stingAddresses[i] == _user) { return true; } i++; } return false; } function whitelistAddress (address[] calldata _users) public onlyOwner { for ( uint i = 0; i < _users.length; i++) { userAddr [_users[i]] = true; } } // ===== Withdraw to owner ===== function withdraw() public payable onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } // ===== View ===== function tokenURI(uint256 tokenId) public view override(ERC721A) returns (string memory) { return string(abi.encodePacked(baseTokenURI, Strings.toString(tokenId), ".json")); } }
// 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 // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721A.sol'; /** * @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 (_addressToUint256(owner) == 0) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; 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 (_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 for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (_addressToUint256(to) == 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 offset; do { emit Transfer(address(0), to, startTokenId + offset++); } while (offset < quantity); _currentIndex = startTokenId + quantity; } _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(); address approvedAddress = _tokenApprovals[tokenId]; bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || approvedAddress == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (_addressToUint256(to) == 0) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. if (_addressToUint256(approvedAddress) != 0) { 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)); address approvedAddress = _tokenApprovals[tokenId]; if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || approvedAddress == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. if (_addressToUint256(approvedAddress) != 0) { 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 // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); 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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
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":"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":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionSize","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":"maxItemsPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWhitelistMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxItemsPerTx","type":"uint256"}],"name":"setMaxItemsPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressArray","type":"address[]"}],"name":"setStinglist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressArray","type":"address[]"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sting","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":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhitelistSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalStings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalWhitelistMint","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":[{"internalType":"address","name":"","type":"address"}],"name":"walletMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526000600b55611e61600c556002600d556002600e556000600f553480156200002b57600080fd5b506040518060400160405280600f81526020017f43616c6c4d6552756767696550696500000000000000000000000000000000008152506040518060400160405280600381526020017f52475000000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000b0929190620001e3565b508060039080519060200190620000c9929190620001e3565b50620000da6200011060201b60201c565b600081905550505062000102620000f66200011560201b60201c565b6200011d60201b60201c565b6001600981905550620002f8565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001f19062000293565b90600052602060002090601f01602090048101928262000215576000855562000261565b82601f106200023057805160ff191683800117855562000261565b8280016001018555821562000261579182015b828111156200026057825182559160200191906001019062000243565b5b50905062000270919062000274565b5090565b5b808211156200028f57600081600090555060010162000275565b5090565b60006002820490506001821680620002ac57607f821691505b60208210811415620002c357620002c2620002c9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613b3e80620003086000396000f3fe60806040526004361061023b5760003560e01c8063715018a61161012e578063b88d4fde116100ab578063f0293fd31161006f578063f0293fd314610824578063f2fde38b14610861578063f3efbb151461088a578063f4217648146108a1578063f4a0a528146108ca5761023b565b8063b88d4fde1461073f578063c87b56dd14610768578063d547cfb7146107a5578063e222c7f9146107d0578063e985e9c5146107e75761023b565b80638eee5853116100f25780638eee58531461067d57806395d89b41146106a6578063a0712d68146106d1578063a22cb465146106ed578063b31d61b0146107165761023b565b8063715018a6146105cb5780637a4e5715146105e2578063868ff4a21461060b57806386a173ee146106275780638da5cb5b146106525761023b565b806333bc1c5c116101bc57806359eda1b51161018057806359eda1b5146104d25780636352211e146104e95780636817c76c146105265780636fb3b0a31461055157806370a082311461058e5761023b565b806333bc1c5c1461041e57806335c6aaf8146104495780633ccfd60b1461047457806342842e0e1461047e57806345c0f533146104a75761023b565b806318160ddd1161020357806318160ddd1461034b57806323b872dd1461037657806330176e131461039f57806330666a4d146103c8578063309a3686146103f35761023b565b806301ffc9a7146102405780630345e3cb1461027d57806306fdde03146102ba578063081812fc146102e5578063095ea7b314610322575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190612c38565b6108f3565b6040516102749190613132565b60405180910390f35b34801561028957600080fd5b506102a4600480360381019061029f9190612a28565b610985565b6040516102b1919061332f565b60405180910390f35b3480156102c657600080fd5b506102cf61099d565b6040516102dc919061314d565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190612cdb565b610a2f565b60405161031991906130cb565b60405180910390f35b34801561032e57600080fd5b5061034960048036038101906103449190612bab565b610aab565b005b34801561035757600080fd5b50610360610bec565b60405161036d919061332f565b60405180910390f35b34801561038257600080fd5b5061039d60048036038101906103989190612a95565b610c03565b005b3480156103ab57600080fd5b506103c660048036038101906103c19190612c92565b610c13565b005b3480156103d457600080fd5b506103dd610c35565b6040516103ea919061332f565b60405180910390f35b3480156103ff57600080fd5b50610408610c3b565b604051610415919061332f565b60405180910390f35b34801561042a57600080fd5b50610433610c41565b6040516104409190613132565b60405180910390f35b34801561045557600080fd5b5061045e610c54565b60405161046b919061332f565b60405180910390f35b61047c610c5a565b005b34801561048a57600080fd5b506104a560048036038101906104a09190612a95565b610ce2565b005b3480156104b357600080fd5b506104bc610d02565b6040516104c9919061332f565b60405180910390f35b3480156104de57600080fd5b506104e7610d08565b005b3480156104f557600080fd5b50610510600480360381019061050b9190612cdb565b610d3c565b60405161051d91906130cb565b60405180910390f35b34801561053257600080fd5b5061053b610d4e565b604051610548919061332f565b60405180910390f35b34801561055d57600080fd5b5061057860048036038101906105739190612a28565b610d54565b604051610585919061332f565b60405180910390f35b34801561059a57600080fd5b506105b560048036038101906105b09190612a28565b610d6c565b6040516105c2919061332f565b60405180910390f35b3480156105d757600080fd5b506105e0610e01565b005b3480156105ee57600080fd5b5061060960048036038101906106049190612cdb565b610e15565b005b61062560048036038101906106209190612cdb565b610e27565b005b34801561063357600080fd5b5061063c6110bc565b6040516106499190613132565b60405180910390f35b34801561065e57600080fd5b506106676110cf565b60405161067491906130cb565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f9190612beb565b6110f9565b005b3480156106b257600080fd5b506106bb611125565b6040516106c8919061314d565b60405180910390f35b6106eb60048036038101906106e69190612cdb565b6111b7565b005b3480156106f957600080fd5b50610714600480360381019061070f9190612b6b565b6113a4565b005b34801561072257600080fd5b5061073d60048036038101906107389190612beb565b61151c565b005b34801561074b57600080fd5b5061076660048036038101906107619190612ae8565b6115c9565b005b34801561077457600080fd5b5061078f600480360381019061078a9190612cdb565b61163c565b60405161079c919061314d565b60405180910390f35b3480156107b157600080fd5b506107ba611670565b6040516107c7919061314d565b60405180910390f35b3480156107dc57600080fd5b506107e56116fe565b005b3480156107f357600080fd5b5061080e60048036038101906108099190612a55565b611732565b60405161081b9190613132565b60405180910390f35b34801561083057600080fd5b5061084b60048036038101906108469190612a28565b6117c6565b604051610858919061332f565b60405180910390f35b34801561086d57600080fd5b5061088860048036038101906108839190612a28565b6117de565b005b34801561089657600080fd5b5061089f611862565b005b3480156108ad57600080fd5b506108c860048036038101906108c39190612beb565b6119f6565b005b3480156108d657600080fd5b506108f160048036038101906108ec9190612cdb565b611a22565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061094e57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061097e5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60156020528060005260406000206000915090505481565b6060600280546109ac906135ff565b80601f01602080910402602001604051908101604052809291908181526020018280546109d8906135ff565b8015610a255780601f106109fa57610100808354040283529160200191610a25565b820191906000526020600020905b815481529060010190602001808311610a0857829003601f168201915b5050505050905090565b6000610a3a82611a34565b610a70576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ab682611a93565b90508073ffffffffffffffffffffffffffffffffffffffff16610ad7611b61565b73ffffffffffffffffffffffffffffffffffffffff1614610b3a57610b0381610afe611b61565b611732565b610b39576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610bf6611b69565b6001546000540303905090565b610c0e838383611b6e565b505050565b610c1b611f36565b80600a9080519060200190610c31929190612725565b5050565b600d5481565b600e5481565b601060019054906101000a900460ff1681565b600f5481565b610c62611f36565b6000610c6c6110cf565b73ffffffffffffffffffffffffffffffffffffffff1647604051610c8f906130b6565b60006040518083038185875af1925050503d8060008114610ccc576040519150601f19603f3d011682016040523d82523d6000602084013e610cd1565b606091505b5050905080610cdf57600080fd5b50565b610cfd838383604051806020016040528060008152506115c9565b505050565b600c5481565b610d10611f36565b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b6000610d4782611a93565b9050919050565b600b5481565b60146020528060005260406000206000915090505481565b600080610d7883611fb4565b1415610db0576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e09611f36565b610e136000611fbe565b565b610e1d611f36565b80600d8190555050565b60026009541415610e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e64906132ef565b60405180910390fd5b6002600981905550601060009054906101000a900460ff16610ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebb9061322f565b60405180910390fd5b600c5481610ed0610bec565b610eda9190613434565b1115610f1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f129061318f565b60405180910390fd5b600e5481601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f699190613434565b1115610faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa19061330f565b60405180910390fd5b80600f54610fb891906134bb565b341015610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff19061320f565b60405180910390fd5b600060118054905011156110515761101133612084565b611050576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611047906131af565b60405180910390fd5b5b80601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110a09190613434565b925050819055506110b13382612133565b600160098190555050565b601060009054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611101611f36565b6012600061110f91906127ab565b8181601291906111209291906127cc565b505050565b606060038054611134906135ff565b80601f0160208091040260200160405190810160405280929190818152602001828054611160906135ff565b80156111ad5780601f10611182576101008083540402835291602001916111ad565b820191906000526020600020905b81548152906001019060200180831161119057829003601f168201915b5050505050905090565b600260095414156111fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f4906132ef565b60405180910390fd5b6002600981905550600061120f610bec565b9050601060019054906101000a900460ff16611260576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611257906131ef565b60405180910390fd5b600082116112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129a9061316f565b60405180910390fd5b600d548211156112e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112df9061324f565b60405180910390fd5b600c5482826112f79190613434565b1115611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f906132cf565b60405180910390fd5b6113423383612133565b81601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113919190613434565b9250508190555050600160098190555050565b6113ac611b61565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611411576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061141e611b61565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114cb611b61565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115109190613132565b60405180910390a35050565b611524611f36565b60005b828290508110156115c45760016016600085858581811061154b5761154a613769565b5b90506020020160208101906115609190612a28565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806115bc90613662565b915050611527565b505050565b6115d4848484611b6e565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611636576115ff84848484612151565b611635576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a611649836122b1565b60405160200161165a929190613087565b6040516020818303038152906040529050919050565b600a805461167d906135ff565b80601f01602080910402602001604051908101604052809291908181526020018280546116a9906135ff565b80156116f65780601f106116cb576101008083540402835291602001916116f6565b820191906000526020600020905b8154815290600101906020018083116116d957829003601f168201915b505050505081565b611706611f36565b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60136020528060005260406000206000915090505481565b6117e6611f36565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184d906131cf565b60405180910390fd5b61185f81611fbe565b50565b600260095414156118a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189f906132ef565b60405180910390fd5b60026009819055506000605090508081601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119029190613434565b1115611943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193a906132af565b60405180910390fd5b61194c33612412565b61198b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119829061328f565b60405180910390fd5b6119953382612133565b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119e49190613434565b92505081905550506001600981905550565b6119fe611f36565b60116000611a0c91906127ab565b818160119190611a1d9291906127cc565b505050565b611a2a611f36565b80600b8190555050565b600081611a3f611b69565b11158015611a4e575060005482105b8015611a8c575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611aa2611b69565b11611b2a57600054811015611b295760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611b27575b6000811415611b1d576004600083600190039350838152602001908152602001600020549050611af2565b8092505050611b5c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611b7982611a93565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611be0576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff16611c39611b61565b73ffffffffffffffffffffffffffffffffffffffff161480611c685750611c6786611c62611b61565b611732565b5b80611ca55750611c76611b61565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b905080611cde576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611ce986611fb4565b1415611d21576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d2e86868660016124c1565b6000611d3983611fb4565b14611d75576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611e3c87611fb4565b1717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611ec6576000600185019050600060046000838152602001908152602001600020541415611ec4576000548114611ec3578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f2e86868660016124c7565b505050505050565b611f3e6124cd565b73ffffffffffffffffffffffffffffffffffffffff16611f5c6110cf565b73ffffffffffffffffffffffffffffffffffffffff1614611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa99061326f565b60405180910390fd5b565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600090505b601180549050811015612128578273ffffffffffffffffffffffffffffffffffffffff16601182815481106120c4576120c3613769565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561211557600191505061212e565b808061212090613662565b91505061208c565b60009150505b919050565b61214d8282604051806020016040528060008152506124d5565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612177611b61565b8786866040518563ffffffff1660e01b815260040161219994939291906130e6565b602060405180830381600087803b1580156121b357600080fd5b505af19250505080156121e457506040513d601f19601f820116820180604052508101906121e19190612c65565b60015b61225e573d8060008114612214576040519150601f19603f3d011682016040523d82523d6000602084013e612219565b606091505b50600081511415612256576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008214156122f9576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061240d565b600082905060005b6000821461232b57808061231490613662565b915050600a82612324919061348a565b9150612301565b60008167ffffffffffffffff81111561234757612346613798565b5b6040519080825280601f01601f1916602001820160405280156123795781602001600182028036833780820191505090505b5090505b60008514612406576001826123929190613515565b9150600a856123a191906136ab565b60306123ad9190613434565b60f81b8183815181106123c3576123c2613769565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123ff919061348a565b945061237d565b8093505050505b919050565b600080600090505b6012805490508110156124b6578273ffffffffffffffffffffffffffffffffffffffff166012828154811061245257612451613769565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156124a35760019150506124bc565b80806124ae90613662565b91505061241a565b60009150505b919050565b50505050565b50505050565b600033905090565b6124df8383612572565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461256d57600080549050600083820390505b61251f6000868380600101945086612151565b612555576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061250c57816000541461256a57600080fd5b50505b505050565b600080549050600061258384611fb4565b14156125bb576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156125f6576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61260360008483856124c1565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16126686001841461271b565b901b60a042901b61267885611fb4565b1717600460008381526020019081526020016000208190555060005b8080600101915082018473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4828110612694578282016000819055505061271660008483856124c7565b505050565b6000819050919050565b828054612731906135ff565b90600052602060002090601f016020900481019282612753576000855561279a565b82601f1061276c57805160ff191683800117855561279a565b8280016001018555821561279a579182015b8281111561279957825182559160200191906001019061277e565b5b5090506127a7919061286c565b5090565b50805460008255906000526020600020908101906127c9919061286c565b50565b82805482825590600052602060002090810192821561285b579160200282015b8281111561285a57823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906127ec565b5b509050612868919061286c565b5090565b5b8082111561288557600081600090555060010161286d565b5090565b600061289c6128978461336f565b61334a565b9050828152602081018484840111156128b8576128b76137d6565b5b6128c38482856135bd565b509392505050565b60006128de6128d9846133a0565b61334a565b9050828152602081018484840111156128fa576128f96137d6565b5b6129058482856135bd565b509392505050565b60008135905061291c81613aac565b92915050565b60008083601f840112612938576129376137cc565b5b8235905067ffffffffffffffff811115612955576129546137c7565b5b602083019150836020820283011115612971576129706137d1565b5b9250929050565b60008135905061298781613ac3565b92915050565b60008135905061299c81613ada565b92915050565b6000815190506129b181613ada565b92915050565b600082601f8301126129cc576129cb6137cc565b5b81356129dc848260208601612889565b91505092915050565b600082601f8301126129fa576129f96137cc565b5b8135612a0a8482602086016128cb565b91505092915050565b600081359050612a2281613af1565b92915050565b600060208284031215612a3e57612a3d6137e0565b5b6000612a4c8482850161290d565b91505092915050565b60008060408385031215612a6c57612a6b6137e0565b5b6000612a7a8582860161290d565b9250506020612a8b8582860161290d565b9150509250929050565b600080600060608486031215612aae57612aad6137e0565b5b6000612abc8682870161290d565b9350506020612acd8682870161290d565b9250506040612ade86828701612a13565b9150509250925092565b60008060008060808587031215612b0257612b016137e0565b5b6000612b108782880161290d565b9450506020612b218782880161290d565b9350506040612b3287828801612a13565b925050606085013567ffffffffffffffff811115612b5357612b526137db565b5b612b5f878288016129b7565b91505092959194509250565b60008060408385031215612b8257612b816137e0565b5b6000612b908582860161290d565b9250506020612ba185828601612978565b9150509250929050565b60008060408385031215612bc257612bc16137e0565b5b6000612bd08582860161290d565b9250506020612be185828601612a13565b9150509250929050565b60008060208385031215612c0257612c016137e0565b5b600083013567ffffffffffffffff811115612c2057612c1f6137db565b5b612c2c85828601612922565b92509250509250929050565b600060208284031215612c4e57612c4d6137e0565b5b6000612c5c8482850161298d565b91505092915050565b600060208284031215612c7b57612c7a6137e0565b5b6000612c89848285016129a2565b91505092915050565b600060208284031215612ca857612ca76137e0565b5b600082013567ffffffffffffffff811115612cc657612cc56137db565b5b612cd2848285016129e5565b91505092915050565b600060208284031215612cf157612cf06137e0565b5b6000612cff84828501612a13565b91505092915050565b612d1181613549565b82525050565b612d208161355b565b82525050565b6000612d31826133e6565b612d3b81856133fc565b9350612d4b8185602086016135cc565b612d54816137e5565b840191505092915050565b6000612d6a826133f1565b612d748185613418565b9350612d848185602086016135cc565b612d8d816137e5565b840191505092915050565b6000612da3826133f1565b612dad8185613429565b9350612dbd8185602086016135cc565b80840191505092915050565b60008154612dd6816135ff565b612de08186613429565b94506001821660008114612dfb5760018114612e0c57612e3f565b60ff19831686528186019350612e3f565b612e15856133d1565b60005b83811015612e3757815481890152600182019150602081019050612e18565b838801955050505b50505092915050565b6000612e55600b83613418565b9150612e60826137f6565b602082019050919050565b6000612e78601d83613418565b9150612e838261381f565b602082019050919050565b6000612e9b601583613418565b9150612ea682613848565b602082019050919050565b6000612ebe602683613418565b9150612ec982613871565b604082019050919050565b6000612ee1601a83613418565b9150612eec826138c0565b602082019050919050565b6000612f04601a83613418565b9150612f0f826138e9565b602082019050919050565b6000612f27601d83613418565b9150612f3282613912565b602082019050919050565b6000612f4a602083613418565b9150612f558261393b565b602082019050919050565b6000612f6d600583613429565b9150612f7882613964565b600582019050919050565b6000612f90602083613418565b9150612f9b8261398d565b602082019050919050565b6000612fb3601083613418565b9150612fbe826139b6565b602082019050919050565b6000612fd6601783613418565b9150612fe1826139df565b602082019050919050565b6000612ff960008361340d565b915061300482613a08565b600082019050919050565b600061301c601783613418565b915061302782613a0b565b602082019050919050565b600061303f601f83613418565b915061304a82613a34565b602082019050919050565b6000613062602683613418565b915061306d82613a5d565b604082019050919050565b613081816135b3565b82525050565b60006130938285612dc9565b915061309f8284612d98565b91506130aa82612f60565b91508190509392505050565b60006130c182612fec565b9150819050919050565b60006020820190506130e06000830184612d08565b92915050565b60006080820190506130fb6000830187612d08565b6131086020830186612d08565b6131156040830185613078565b81810360608301526131278184612d26565b905095945050505050565b60006020820190506131476000830184612d17565b92915050565b600060208201905081810360008301526131678184612d5f565b905092915050565b6000602082019050818103600083015261318881612e48565b9050919050565b600060208201905081810360008301526131a881612e6b565b9050919050565b600060208201905081810360008301526131c881612e8e565b9050919050565b600060208201905081810360008301526131e881612eb1565b9050919050565b6000602082019050818103600083015261320881612ed4565b9050919050565b6000602082019050818103600083015261322881612ef7565b9050919050565b6000602082019050818103600083015261324881612f1a565b9050919050565b6000602082019050818103600083015261326881612f3d565b9050919050565b6000602082019050818103600083015261328881612f83565b9050919050565b600060208201905081810360008301526132a881612fa6565b9050919050565b600060208201905081810360008301526132c881612fc9565b9050919050565b600060208201905081810360008301526132e88161300f565b9050919050565b6000602082019050818103600083015261330881613032565b9050919050565b6000602082019050818103600083015261332881613055565b9050919050565b60006020820190506133446000830184613078565b92915050565b6000613354613365565b90506133608282613631565b919050565b6000604051905090565b600067ffffffffffffffff82111561338a57613389613798565b5b613393826137e5565b9050602081019050919050565b600067ffffffffffffffff8211156133bb576133ba613798565b5b6133c4826137e5565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061343f826135b3565b915061344a836135b3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561347f5761347e6136dc565b5b828201905092915050565b6000613495826135b3565b91506134a0836135b3565b9250826134b0576134af61370b565b5b828204905092915050565b60006134c6826135b3565b91506134d1836135b3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561350a576135096136dc565b5b828202905092915050565b6000613520826135b3565b915061352b836135b3565b92508282101561353e5761353d6136dc565b5b828203905092915050565b600061355482613593565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156135ea5780820151818401526020810190506135cf565b838111156135f9576000848401525b50505050565b6000600282049050600182168061361757607f821691505b6020821081141561362b5761362a61373a565b5b50919050565b61363a826137e5565b810181811067ffffffffffffffff8211171561365957613658613798565b5b80604052505050565b600061366d826135b3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136a05761369f6136dc565b5b600182019050919050565b60006136b6826135b3565b91506136c1836135b3565b9250826136d1576136d061370b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f43616e74206d696e742030000000000000000000000000000000000000000000600082015250565b7f43616e6e6f74206d696e74206265796f6e64206d617820737570706c79000000600082015250565b7f4e6f74206f6e207468652077686974656c697374210000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5075626c6963204d696e74696e67206973206f6e205061757365000000000000600082015250565b7f5061796d656e742069732062656c6f7720746865207072696365000000000000600082015250565b7f57686974656c697374204d696e74696e67206973206f6e205061757365000000600082015250565b7f4d6178696d756d20706572207472616e73616374696f6e206578636565646564600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f596f752063616e2774207374696e672100000000000000000000000000000000600082015250565b7f4d6f73717569746f20616c7265616479207374756e6721000000000000000000600082015250565b50565b7f4d696e74696e6720737570706c79206578636565646564000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f43616e6e6f74206d696e74206265796f6e642077686974656c697374206d617860008201527f206d696e74210000000000000000000000000000000000000000000000000000602082015250565b613ab581613549565b8114613ac057600080fd5b50565b613acc8161355b565b8114613ad757600080fd5b50565b613ae381613567565b8114613aee57600080fd5b50565b613afa816135b3565b8114613b0557600080fd5b5056fea26469706673582212203d28cc48b96278de43f0eb173174df2488f5c907f29911888f5ac8312dc3098c64736f6c63430008070033
Deployed Bytecode
0x60806040526004361061023b5760003560e01c8063715018a61161012e578063b88d4fde116100ab578063f0293fd31161006f578063f0293fd314610824578063f2fde38b14610861578063f3efbb151461088a578063f4217648146108a1578063f4a0a528146108ca5761023b565b8063b88d4fde1461073f578063c87b56dd14610768578063d547cfb7146107a5578063e222c7f9146107d0578063e985e9c5146107e75761023b565b80638eee5853116100f25780638eee58531461067d57806395d89b41146106a6578063a0712d68146106d1578063a22cb465146106ed578063b31d61b0146107165761023b565b8063715018a6146105cb5780637a4e5715146105e2578063868ff4a21461060b57806386a173ee146106275780638da5cb5b146106525761023b565b806333bc1c5c116101bc57806359eda1b51161018057806359eda1b5146104d25780636352211e146104e95780636817c76c146105265780636fb3b0a31461055157806370a082311461058e5761023b565b806333bc1c5c1461041e57806335c6aaf8146104495780633ccfd60b1461047457806342842e0e1461047e57806345c0f533146104a75761023b565b806318160ddd1161020357806318160ddd1461034b57806323b872dd1461037657806330176e131461039f57806330666a4d146103c8578063309a3686146103f35761023b565b806301ffc9a7146102405780630345e3cb1461027d57806306fdde03146102ba578063081812fc146102e5578063095ea7b314610322575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190612c38565b6108f3565b6040516102749190613132565b60405180910390f35b34801561028957600080fd5b506102a4600480360381019061029f9190612a28565b610985565b6040516102b1919061332f565b60405180910390f35b3480156102c657600080fd5b506102cf61099d565b6040516102dc919061314d565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190612cdb565b610a2f565b60405161031991906130cb565b60405180910390f35b34801561032e57600080fd5b5061034960048036038101906103449190612bab565b610aab565b005b34801561035757600080fd5b50610360610bec565b60405161036d919061332f565b60405180910390f35b34801561038257600080fd5b5061039d60048036038101906103989190612a95565b610c03565b005b3480156103ab57600080fd5b506103c660048036038101906103c19190612c92565b610c13565b005b3480156103d457600080fd5b506103dd610c35565b6040516103ea919061332f565b60405180910390f35b3480156103ff57600080fd5b50610408610c3b565b604051610415919061332f565b60405180910390f35b34801561042a57600080fd5b50610433610c41565b6040516104409190613132565b60405180910390f35b34801561045557600080fd5b5061045e610c54565b60405161046b919061332f565b60405180910390f35b61047c610c5a565b005b34801561048a57600080fd5b506104a560048036038101906104a09190612a95565b610ce2565b005b3480156104b357600080fd5b506104bc610d02565b6040516104c9919061332f565b60405180910390f35b3480156104de57600080fd5b506104e7610d08565b005b3480156104f557600080fd5b50610510600480360381019061050b9190612cdb565b610d3c565b60405161051d91906130cb565b60405180910390f35b34801561053257600080fd5b5061053b610d4e565b604051610548919061332f565b60405180910390f35b34801561055d57600080fd5b5061057860048036038101906105739190612a28565b610d54565b604051610585919061332f565b60405180910390f35b34801561059a57600080fd5b506105b560048036038101906105b09190612a28565b610d6c565b6040516105c2919061332f565b60405180910390f35b3480156105d757600080fd5b506105e0610e01565b005b3480156105ee57600080fd5b5061060960048036038101906106049190612cdb565b610e15565b005b61062560048036038101906106209190612cdb565b610e27565b005b34801561063357600080fd5b5061063c6110bc565b6040516106499190613132565b60405180910390f35b34801561065e57600080fd5b506106676110cf565b60405161067491906130cb565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f9190612beb565b6110f9565b005b3480156106b257600080fd5b506106bb611125565b6040516106c8919061314d565b60405180910390f35b6106eb60048036038101906106e69190612cdb565b6111b7565b005b3480156106f957600080fd5b50610714600480360381019061070f9190612b6b565b6113a4565b005b34801561072257600080fd5b5061073d60048036038101906107389190612beb565b61151c565b005b34801561074b57600080fd5b5061076660048036038101906107619190612ae8565b6115c9565b005b34801561077457600080fd5b5061078f600480360381019061078a9190612cdb565b61163c565b60405161079c919061314d565b60405180910390f35b3480156107b157600080fd5b506107ba611670565b6040516107c7919061314d565b60405180910390f35b3480156107dc57600080fd5b506107e56116fe565b005b3480156107f357600080fd5b5061080e60048036038101906108099190612a55565b611732565b60405161081b9190613132565b60405180910390f35b34801561083057600080fd5b5061084b60048036038101906108469190612a28565b6117c6565b604051610858919061332f565b60405180910390f35b34801561086d57600080fd5b5061088860048036038101906108839190612a28565b6117de565b005b34801561089657600080fd5b5061089f611862565b005b3480156108ad57600080fd5b506108c860048036038101906108c39190612beb565b6119f6565b005b3480156108d657600080fd5b506108f160048036038101906108ec9190612cdb565b611a22565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061094e57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061097e5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60156020528060005260406000206000915090505481565b6060600280546109ac906135ff565b80601f01602080910402602001604051908101604052809291908181526020018280546109d8906135ff565b8015610a255780601f106109fa57610100808354040283529160200191610a25565b820191906000526020600020905b815481529060010190602001808311610a0857829003601f168201915b5050505050905090565b6000610a3a82611a34565b610a70576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ab682611a93565b90508073ffffffffffffffffffffffffffffffffffffffff16610ad7611b61565b73ffffffffffffffffffffffffffffffffffffffff1614610b3a57610b0381610afe611b61565b611732565b610b39576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610bf6611b69565b6001546000540303905090565b610c0e838383611b6e565b505050565b610c1b611f36565b80600a9080519060200190610c31929190612725565b5050565b600d5481565b600e5481565b601060019054906101000a900460ff1681565b600f5481565b610c62611f36565b6000610c6c6110cf565b73ffffffffffffffffffffffffffffffffffffffff1647604051610c8f906130b6565b60006040518083038185875af1925050503d8060008114610ccc576040519150601f19603f3d011682016040523d82523d6000602084013e610cd1565b606091505b5050905080610cdf57600080fd5b50565b610cfd838383604051806020016040528060008152506115c9565b505050565b600c5481565b610d10611f36565b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b6000610d4782611a93565b9050919050565b600b5481565b60146020528060005260406000206000915090505481565b600080610d7883611fb4565b1415610db0576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e09611f36565b610e136000611fbe565b565b610e1d611f36565b80600d8190555050565b60026009541415610e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e64906132ef565b60405180910390fd5b6002600981905550601060009054906101000a900460ff16610ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebb9061322f565b60405180910390fd5b600c5481610ed0610bec565b610eda9190613434565b1115610f1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f129061318f565b60405180910390fd5b600e5481601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f699190613434565b1115610faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa19061330f565b60405180910390fd5b80600f54610fb891906134bb565b341015610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff19061320f565b60405180910390fd5b600060118054905011156110515761101133612084565b611050576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611047906131af565b60405180910390fd5b5b80601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110a09190613434565b925050819055506110b13382612133565b600160098190555050565b601060009054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611101611f36565b6012600061110f91906127ab565b8181601291906111209291906127cc565b505050565b606060038054611134906135ff565b80601f0160208091040260200160405190810160405280929190818152602001828054611160906135ff565b80156111ad5780601f10611182576101008083540402835291602001916111ad565b820191906000526020600020905b81548152906001019060200180831161119057829003601f168201915b5050505050905090565b600260095414156111fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f4906132ef565b60405180910390fd5b6002600981905550600061120f610bec565b9050601060019054906101000a900460ff16611260576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611257906131ef565b60405180910390fd5b600082116112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129a9061316f565b60405180910390fd5b600d548211156112e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112df9061324f565b60405180910390fd5b600c5482826112f79190613434565b1115611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f906132cf565b60405180910390fd5b6113423383612133565b81601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113919190613434565b9250508190555050600160098190555050565b6113ac611b61565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611411576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061141e611b61565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114cb611b61565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115109190613132565b60405180910390a35050565b611524611f36565b60005b828290508110156115c45760016016600085858581811061154b5761154a613769565b5b90506020020160208101906115609190612a28565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806115bc90613662565b915050611527565b505050565b6115d4848484611b6e565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611636576115ff84848484612151565b611635576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a611649836122b1565b60405160200161165a929190613087565b6040516020818303038152906040529050919050565b600a805461167d906135ff565b80601f01602080910402602001604051908101604052809291908181526020018280546116a9906135ff565b80156116f65780601f106116cb576101008083540402835291602001916116f6565b820191906000526020600020905b8154815290600101906020018083116116d957829003601f168201915b505050505081565b611706611f36565b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60136020528060005260406000206000915090505481565b6117e6611f36565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184d906131cf565b60405180910390fd5b61185f81611fbe565b50565b600260095414156118a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189f906132ef565b60405180910390fd5b60026009819055506000605090508081601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119029190613434565b1115611943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193a906132af565b60405180910390fd5b61194c33612412565b61198b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119829061328f565b60405180910390fd5b6119953382612133565b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119e49190613434565b92505081905550506001600981905550565b6119fe611f36565b60116000611a0c91906127ab565b818160119190611a1d9291906127cc565b505050565b611a2a611f36565b80600b8190555050565b600081611a3f611b69565b11158015611a4e575060005482105b8015611a8c575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611aa2611b69565b11611b2a57600054811015611b295760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611b27575b6000811415611b1d576004600083600190039350838152602001908152602001600020549050611af2565b8092505050611b5c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611b7982611a93565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611be0576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff16611c39611b61565b73ffffffffffffffffffffffffffffffffffffffff161480611c685750611c6786611c62611b61565b611732565b5b80611ca55750611c76611b61565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b905080611cde576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611ce986611fb4565b1415611d21576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d2e86868660016124c1565b6000611d3983611fb4565b14611d75576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611e3c87611fb4565b1717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611ec6576000600185019050600060046000838152602001908152602001600020541415611ec4576000548114611ec3578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f2e86868660016124c7565b505050505050565b611f3e6124cd565b73ffffffffffffffffffffffffffffffffffffffff16611f5c6110cf565b73ffffffffffffffffffffffffffffffffffffffff1614611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa99061326f565b60405180910390fd5b565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600090505b601180549050811015612128578273ffffffffffffffffffffffffffffffffffffffff16601182815481106120c4576120c3613769565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561211557600191505061212e565b808061212090613662565b91505061208c565b60009150505b919050565b61214d8282604051806020016040528060008152506124d5565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612177611b61565b8786866040518563ffffffff1660e01b815260040161219994939291906130e6565b602060405180830381600087803b1580156121b357600080fd5b505af19250505080156121e457506040513d601f19601f820116820180604052508101906121e19190612c65565b60015b61225e573d8060008114612214576040519150601f19603f3d011682016040523d82523d6000602084013e612219565b606091505b50600081511415612256576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008214156122f9576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061240d565b600082905060005b6000821461232b57808061231490613662565b915050600a82612324919061348a565b9150612301565b60008167ffffffffffffffff81111561234757612346613798565b5b6040519080825280601f01601f1916602001820160405280156123795781602001600182028036833780820191505090505b5090505b60008514612406576001826123929190613515565b9150600a856123a191906136ab565b60306123ad9190613434565b60f81b8183815181106123c3576123c2613769565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123ff919061348a565b945061237d565b8093505050505b919050565b600080600090505b6012805490508110156124b6578273ffffffffffffffffffffffffffffffffffffffff166012828154811061245257612451613769565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156124a35760019150506124bc565b80806124ae90613662565b91505061241a565b60009150505b919050565b50505050565b50505050565b600033905090565b6124df8383612572565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461256d57600080549050600083820390505b61251f6000868380600101945086612151565b612555576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061250c57816000541461256a57600080fd5b50505b505050565b600080549050600061258384611fb4565b14156125bb576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156125f6576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61260360008483856124c1565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16126686001841461271b565b901b60a042901b61267885611fb4565b1717600460008381526020019081526020016000208190555060005b8080600101915082018473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4828110612694578282016000819055505061271660008483856124c7565b505050565b6000819050919050565b828054612731906135ff565b90600052602060002090601f016020900481019282612753576000855561279a565b82601f1061276c57805160ff191683800117855561279a565b8280016001018555821561279a579182015b8281111561279957825182559160200191906001019061277e565b5b5090506127a7919061286c565b5090565b50805460008255906000526020600020908101906127c9919061286c565b50565b82805482825590600052602060002090810192821561285b579160200282015b8281111561285a57823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906127ec565b5b509050612868919061286c565b5090565b5b8082111561288557600081600090555060010161286d565b5090565b600061289c6128978461336f565b61334a565b9050828152602081018484840111156128b8576128b76137d6565b5b6128c38482856135bd565b509392505050565b60006128de6128d9846133a0565b61334a565b9050828152602081018484840111156128fa576128f96137d6565b5b6129058482856135bd565b509392505050565b60008135905061291c81613aac565b92915050565b60008083601f840112612938576129376137cc565b5b8235905067ffffffffffffffff811115612955576129546137c7565b5b602083019150836020820283011115612971576129706137d1565b5b9250929050565b60008135905061298781613ac3565b92915050565b60008135905061299c81613ada565b92915050565b6000815190506129b181613ada565b92915050565b600082601f8301126129cc576129cb6137cc565b5b81356129dc848260208601612889565b91505092915050565b600082601f8301126129fa576129f96137cc565b5b8135612a0a8482602086016128cb565b91505092915050565b600081359050612a2281613af1565b92915050565b600060208284031215612a3e57612a3d6137e0565b5b6000612a4c8482850161290d565b91505092915050565b60008060408385031215612a6c57612a6b6137e0565b5b6000612a7a8582860161290d565b9250506020612a8b8582860161290d565b9150509250929050565b600080600060608486031215612aae57612aad6137e0565b5b6000612abc8682870161290d565b9350506020612acd8682870161290d565b9250506040612ade86828701612a13565b9150509250925092565b60008060008060808587031215612b0257612b016137e0565b5b6000612b108782880161290d565b9450506020612b218782880161290d565b9350506040612b3287828801612a13565b925050606085013567ffffffffffffffff811115612b5357612b526137db565b5b612b5f878288016129b7565b91505092959194509250565b60008060408385031215612b8257612b816137e0565b5b6000612b908582860161290d565b9250506020612ba185828601612978565b9150509250929050565b60008060408385031215612bc257612bc16137e0565b5b6000612bd08582860161290d565b9250506020612be185828601612a13565b9150509250929050565b60008060208385031215612c0257612c016137e0565b5b600083013567ffffffffffffffff811115612c2057612c1f6137db565b5b612c2c85828601612922565b92509250509250929050565b600060208284031215612c4e57612c4d6137e0565b5b6000612c5c8482850161298d565b91505092915050565b600060208284031215612c7b57612c7a6137e0565b5b6000612c89848285016129a2565b91505092915050565b600060208284031215612ca857612ca76137e0565b5b600082013567ffffffffffffffff811115612cc657612cc56137db565b5b612cd2848285016129e5565b91505092915050565b600060208284031215612cf157612cf06137e0565b5b6000612cff84828501612a13565b91505092915050565b612d1181613549565b82525050565b612d208161355b565b82525050565b6000612d31826133e6565b612d3b81856133fc565b9350612d4b8185602086016135cc565b612d54816137e5565b840191505092915050565b6000612d6a826133f1565b612d748185613418565b9350612d848185602086016135cc565b612d8d816137e5565b840191505092915050565b6000612da3826133f1565b612dad8185613429565b9350612dbd8185602086016135cc565b80840191505092915050565b60008154612dd6816135ff565b612de08186613429565b94506001821660008114612dfb5760018114612e0c57612e3f565b60ff19831686528186019350612e3f565b612e15856133d1565b60005b83811015612e3757815481890152600182019150602081019050612e18565b838801955050505b50505092915050565b6000612e55600b83613418565b9150612e60826137f6565b602082019050919050565b6000612e78601d83613418565b9150612e838261381f565b602082019050919050565b6000612e9b601583613418565b9150612ea682613848565b602082019050919050565b6000612ebe602683613418565b9150612ec982613871565b604082019050919050565b6000612ee1601a83613418565b9150612eec826138c0565b602082019050919050565b6000612f04601a83613418565b9150612f0f826138e9565b602082019050919050565b6000612f27601d83613418565b9150612f3282613912565b602082019050919050565b6000612f4a602083613418565b9150612f558261393b565b602082019050919050565b6000612f6d600583613429565b9150612f7882613964565b600582019050919050565b6000612f90602083613418565b9150612f9b8261398d565b602082019050919050565b6000612fb3601083613418565b9150612fbe826139b6565b602082019050919050565b6000612fd6601783613418565b9150612fe1826139df565b602082019050919050565b6000612ff960008361340d565b915061300482613a08565b600082019050919050565b600061301c601783613418565b915061302782613a0b565b602082019050919050565b600061303f601f83613418565b915061304a82613a34565b602082019050919050565b6000613062602683613418565b915061306d82613a5d565b604082019050919050565b613081816135b3565b82525050565b60006130938285612dc9565b915061309f8284612d98565b91506130aa82612f60565b91508190509392505050565b60006130c182612fec565b9150819050919050565b60006020820190506130e06000830184612d08565b92915050565b60006080820190506130fb6000830187612d08565b6131086020830186612d08565b6131156040830185613078565b81810360608301526131278184612d26565b905095945050505050565b60006020820190506131476000830184612d17565b92915050565b600060208201905081810360008301526131678184612d5f565b905092915050565b6000602082019050818103600083015261318881612e48565b9050919050565b600060208201905081810360008301526131a881612e6b565b9050919050565b600060208201905081810360008301526131c881612e8e565b9050919050565b600060208201905081810360008301526131e881612eb1565b9050919050565b6000602082019050818103600083015261320881612ed4565b9050919050565b6000602082019050818103600083015261322881612ef7565b9050919050565b6000602082019050818103600083015261324881612f1a565b9050919050565b6000602082019050818103600083015261326881612f3d565b9050919050565b6000602082019050818103600083015261328881612f83565b9050919050565b600060208201905081810360008301526132a881612fa6565b9050919050565b600060208201905081810360008301526132c881612fc9565b9050919050565b600060208201905081810360008301526132e88161300f565b9050919050565b6000602082019050818103600083015261330881613032565b9050919050565b6000602082019050818103600083015261332881613055565b9050919050565b60006020820190506133446000830184613078565b92915050565b6000613354613365565b90506133608282613631565b919050565b6000604051905090565b600067ffffffffffffffff82111561338a57613389613798565b5b613393826137e5565b9050602081019050919050565b600067ffffffffffffffff8211156133bb576133ba613798565b5b6133c4826137e5565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061343f826135b3565b915061344a836135b3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561347f5761347e6136dc565b5b828201905092915050565b6000613495826135b3565b91506134a0836135b3565b9250826134b0576134af61370b565b5b828204905092915050565b60006134c6826135b3565b91506134d1836135b3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561350a576135096136dc565b5b828202905092915050565b6000613520826135b3565b915061352b836135b3565b92508282101561353e5761353d6136dc565b5b828203905092915050565b600061355482613593565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156135ea5780820151818401526020810190506135cf565b838111156135f9576000848401525b50505050565b6000600282049050600182168061361757607f821691505b6020821081141561362b5761362a61373a565b5b50919050565b61363a826137e5565b810181811067ffffffffffffffff8211171561365957613658613798565b5b80604052505050565b600061366d826135b3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136a05761369f6136dc565b5b600182019050919050565b60006136b6826135b3565b91506136c1836135b3565b9250826136d1576136d061370b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f43616e74206d696e742030000000000000000000000000000000000000000000600082015250565b7f43616e6e6f74206d696e74206265796f6e64206d617820737570706c79000000600082015250565b7f4e6f74206f6e207468652077686974656c697374210000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5075626c6963204d696e74696e67206973206f6e205061757365000000000000600082015250565b7f5061796d656e742069732062656c6f7720746865207072696365000000000000600082015250565b7f57686974656c697374204d696e74696e67206973206f6e205061757365000000600082015250565b7f4d6178696d756d20706572207472616e73616374696f6e206578636565646564600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f596f752063616e2774207374696e672100000000000000000000000000000000600082015250565b7f4d6f73717569746f20616c7265616479207374756e6721000000000000000000600082015250565b50565b7f4d696e74696e6720737570706c79206578636565646564000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f43616e6e6f74206d696e74206265796f6e642077686974656c697374206d617860008201527f206d696e74210000000000000000000000000000000000000000000000000000602082015250565b613ab581613549565b8114613ac057600080fd5b50565b613acc8161355b565b8114613ad757600080fd5b50565b613ae381613567565b8114613aee57600080fd5b50565b613afa816135b3565b8114613b0557600080fd5b5056fea26469706673582212203d28cc48b96278de43f0eb173174df2488f5c907f29911888f5ac8312dc3098c64736f6c63430008070033
Deployed Bytecode Sourcemap
162:4549:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4874:607:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;755:53:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9784:98:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11727:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11261:405;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3957:309;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12587:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2828:118:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;376:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;414:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;538:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;455:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4290:152;;;:::i;:::-;;12817:179:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;334:36:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3045:96;;;;;;;;;;;;;:::i;:::-;;9580:142:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;292:36:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;703:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5540:231:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1809:101:4;;;;;;;;;;;;;:::i;:::-;;2706:116:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1565:694;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;507:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1179:85:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3316:151:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9946:102:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1092:467:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11994:303:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4066:181:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13062:385:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4472:236:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;260:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2952:87;;;;;;;;;;;;;:::i;:::-;;12363:162:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;651:46:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2059:198:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3473:310:0;;;;;;;;;;;;;:::i;:::-;;3147:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2600:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4874:607:2;4959:4;5269:10;5254:25;;:11;:25;;;;:101;;;;5345:10;5330:25;;:11;:25;;;;5254:101;:177;;;;5421:10;5406:25;;:11;:25;;;;5254:177;5235:196;;4874:607;;;:::o;755:53:0:-;;;;;;;;;;;;;;;;;:::o;9784:98:2:-;9838:13;9870:5;9863:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9784:98;:::o;11727:200::-;11795:7;11819:16;11827:7;11819;:16::i;:::-;11814:64;;11844:34;;;;;;;;;;;;;;11814:64;11896:15;:24;11912:7;11896:24;;;;;;;;;;;;;;;;;;;;;11889:31;;11727:200;;;:::o;11261:405::-;11333:13;11365:27;11384:7;11365:18;:27::i;:::-;11333:61;;11432:5;11409:28;;:19;:17;:19::i;:::-;:28;;;11405:172;;11456:44;11473:5;11480:19;:17;:19::i;:::-;11456:16;:44::i;:::-;11451:126;;11527:35;;;;;;;;;;;;;;11451:126;11405:172;11614:2;11587:15;:24;11603:7;11587:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11651:7;11647:2;11631:28;;11640:5;11631:28;;;;;;;;;;;;11323:343;11261:405;;:::o;3957:309::-;4010:7;4234:15;:13;:15::i;:::-;4219:12;;4203:13;;:28;:46;4196:53;;3957:309;:::o;12587:164::-;12716:28;12726:4;12732:2;12736:7;12716:9;:28::i;:::-;12587:164;;;:::o;2828:118:0:-;1072:13:4;:11;:13::i;:::-;2926::0::1;2911:12;:28;;;;;;;;;;;;:::i;:::-;;2828:118:::0;:::o;376:32::-;;;;:::o;414:35::-;;;;:::o;538:22::-;;;;;;;;;;;;;:::o;455:45::-;;;;:::o;4290:152::-;1072:13:4;:11;:13::i;:::-;4346:7:0::1;4367;:5;:7::i;:::-;4359:21;;4388;4359:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4345:69;;;4432:2;4424:11;;;::::0;::::1;;4335:107;4290:152::o:0;12817:179:2:-;12950:39;12967:4;12973:2;12977:7;12950:39;;;;;;;;;;;;:16;:39::i;:::-;12817:179;;;:::o;334:36:0:-;;;;:::o;3045:96::-;1072:13:4;:11;:13::i;:::-;3121::0::1;;;;;;;;;;;3120:14;3104:13;;:30;;;;;;;;;;;;;;;;;;3045:96::o:0;9580:142:2:-;9644:7;9686:27;9705:7;9686:18;:27::i;:::-;9663:52;;9580:142;;;:::o;292:36:0:-;;;;:::o;703:46::-;;;;;;;;;;;;;;;;;:::o;5540:231:2:-;5604:7;5655:1;5627:24;5645:5;5627:17;:24::i;:::-;:29;5623:70;;;5665:28;;;;;;;;;;;;;;5623:70;1017:13;5710:18;:25;5729:5;5710:25;;;;;;;;;;;;;;;;:54;5703:61;;5540:231;;;:::o;1809:101:4:-;1072:13;:11;:13::i;:::-;1873:30:::1;1900:1;1873:18;:30::i;:::-;1809:101::o:0;2706:116:0:-;1072:13:4;:11;:13::i;:::-;2801:14:0::1;2785:13;:30;;;;2706:116:::0;:::o;1565:694::-;1744:1:5;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;1655:13:0::1;;;;;;;;;;;1647:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;1751:14;;1737:9;1721:13;:11;:13::i;:::-;:25;;;;:::i;:::-;1720:45;;1712:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1866:16;;1851:9;1818:18;:30;1837:10;1818:30;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;1817:65;;1809:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;1978:9;1957:18;;:30;;;;:::i;:::-;1943:9;:45;;1935:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;2064:1;2034:20;:27;;;;:31;2030:128;;;2089:32;2110:10;2089:20;:32::i;:::-;2081:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;2030:128;2201:9;2167:18;:30;2186:10;2167:30;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;2220:32;2230:10;2242:9;2220;:32::i;:::-;1701:1:5::0;2628:7;:22;;;;1565:694:0;:::o;507:25::-;;;;;;;;;;;;;:::o;1179:85:4:-;1225:7;1251:6;;;;;;;;;;;1244:13;;1179:85;:::o;3316:151:0:-;1072:13:4;:11;:13::i;:::-;3406:14:0::1;;3399:21;;;;:::i;:::-;3447:13;;3430:14;:30;;;;;;;:::i;:::-;;3316:151:::0;;:::o;9946:102:2:-;10002:13;10034:7;10027:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9946:102;:::o;1092:467:0:-;1744:1:5;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;1165:9:0::1;1177:13;:11;:13::i;:::-;1165:25;;1208:10;;;;;;;;;;;1200:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;1281:1;1267:11;:15;1259:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;1331:13;;1316:11;:28;;1308:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;1418:14;;1403:11;1399:1;:15;;;;:::i;:::-;:33;;1391:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;1470:34;1480:10;1492:11;1470:9;:34::i;:::-;1541:11;1514;:23;1526:10;1514:23;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;1155:404;1701:1:5::0;2628:7;:22;;;;1092:467:0;:::o;11994:303:2:-;12104:19;:17;:19::i;:::-;12092:31;;:8;:31;;;12088:61;;;12132:17;;;;;;;;;;;;;;12088:61;12212:8;12160:18;:39;12179:19;:17;:19::i;:::-;12160:39;;;;;;;;;;;;;;;:49;12200:8;12160:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;12271:8;12235:55;;12250:19;:17;:19::i;:::-;12235:55;;;12281:8;12235:55;;;;;;:::i;:::-;;;;;;;;11994:303;;:::o;4066:181:0:-;1072:13:4;:11;:13::i;:::-;4153:6:0::1;4147:94;4169:6;;:13;;4165:1;:17;4147:94;;;4226:4;4203:8;:20;4213:6;;4220:1;4213:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;4203:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;4184:3;;;;;:::i;:::-;;;;4147:94;;;;4066:181:::0;;:::o;13062:385:2:-;13223:28;13233:4;13239:2;13243:7;13223:9;:28::i;:::-;13283:1;13265:2;:14;;;:19;13261:180;;13303:56;13334:4;13340:2;13344:7;13353:5;13303:30;:56::i;:::-;13298:143;;13386:40;;;;;;;;;;;;;;13298:143;13261:180;13062:385;;;;:::o;4472:236:0:-;4578:13;4650:12;4664:25;4681:7;4664:16;:25::i;:::-;4633:67;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4607:94;;4472:236;;;:::o;260:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2952:87::-;1072:13:4;:11;:13::i;:::-;3022:10:0::1;;;;;;;;;;;3021:11;3008:10;;:24;;;;;;;;;;;;;;;;;;2952:87::o:0;12363:162:2:-;12460:4;12483:18;:25;12502:5;12483:25;;;;;;;;;;;;;;;:35;12509:8;12483:35;;;;;;;;;;;;;;;;;;;;;;;;;12476:42;;12363:162;;;;:::o;651:46:0:-;;;;;;;;;;;;;;;;;:::o;2059:198:4:-;1072:13;:11;:13::i;:::-;2167:1:::1;2147:22;;:8;:22;;;;2139:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2222:28;2241:8;2222:18;:28::i;:::-;2059:198:::0;:::o;3473:310:0:-;1744:1:5;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;3522:14:0::1;3539:2;3522:19;;3595:6;3585;3559:11;:23;3571:10;3559:23;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;:42;;3551:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;3647:26;3662:10;3647:14;:26::i;:::-;3639:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;3704:29;3714:10;3726:6;3704:9;:29::i;:::-;3770:6;3743:11;:23;3755:10;3743:23;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;3512:271;1701:1:5::0;2628:7;:22;;;;3473:310:0:o;3147:163::-;1072:13:4;:11;:13::i;:::-;3237:20:0::1;;3230:27;;;;:::i;:::-;3290:13;;3267:20;:36;;;;;;;:::i;:::-;;3147:163:::0;;:::o;2600:100::-;1072:13:4;:11;:13::i;:::-;2683:10:0::1;2671:9;:22;;;;2600:100:::0;:::o;13693:268:2:-;13750:4;13804:7;13785:15;:13;:15::i;:::-;:26;;:65;;;;;13837:13;;13827:7;:23;13785:65;:150;;;;;13934:1;1769:8;13887:17;:26;13905:7;13887:26;;;;;;;;;;;;:43;:48;13785:150;13766:169;;13693:268;;;:::o;7157:1105::-;7224:7;7243:12;7258:7;7243:22;;7323:4;7304:15;:13;:15::i;:::-;:23;7300:898;;7356:13;;7349:4;:20;7345:853;;;7393:14;7410:17;:23;7428:4;7410:23;;;;;;;;;;;;7393:40;;7524:1;1769:8;7497:6;:23;:28;7493:687;;;8008:111;8025:1;8015:6;:11;8008:111;;;8067:17;:25;8085:6;;;;;;;8067:25;;;;;;;;;;;;8058:34;;8008:111;;;8151:6;8144:13;;;;;;7493:687;7371:827;7345:853;7300:898;8224:31;;;;;;;;;;;;;;7157:1105;;;;:::o;26037:103::-;26097:7;26123:10;26116:17;;26037:103;:::o;3497:90::-;3553:7;3497:90;:::o;17254:2595::-;17364:27;17394;17413:7;17394:18;:27::i;:::-;17364:57;;17477:4;17436:45;;17452:19;17436:45;;;17432:86;;17490:28;;;;;;;;;;;;;;17432:86;17529:23;17555:15;:24;17571:7;17555:24;;;;;;;;;;;;;;;;;;;;;17529:50;;17590:22;17639:4;17616:27;;:19;:17;:19::i;:::-;:27;;;:86;;;;17659:43;17676:4;17682:19;:17;:19::i;:::-;17659:16;:43::i;:::-;17616:86;:140;;;;17737:19;:17;:19::i;:::-;17718:38;;:15;:38;;;17616:140;17590:167;;17773:17;17768:66;;17799:35;;;;;;;;;;;;;;17768:66;17873:1;17848:21;17866:2;17848:17;:21::i;:::-;:26;17844:62;;;17883:23;;;;;;;;;;;;;;17844:62;17917:43;17939:4;17945:2;17949:7;17958:1;17917:21;:43::i;:::-;18065:1;18027:34;18045:15;18027:17;:34::i;:::-;:39;18023:101;;18089:15;:24;18105:7;18089:24;;;;;;;;;;;;18082:31;;;;;;;;;;;18023:101;18484:18;:24;18503:4;18484:24;;;;;;;;;;;;;;;;18482:26;;;;;;;;;;;;18552:18;:22;18571:2;18552:22;;;;;;;;;;;;;;;;18550:24;;;;;;;;;;;2041:8;1656:3;18924:15;:41;;18883:21;18901:2;18883:17;:21::i;:::-;:83;:126;18838:17;:26;18856:7;18838:26;;;;;;;;;;;:171;;;;19176:1;2041:8;19126:19;:46;:51;19122:616;;;19197:19;19229:1;19219:7;:11;19197:33;;19384:1;19350:17;:30;19368:11;19350:30;;;;;;;;;;;;:35;19346:378;;;19486:13;;19471:11;:28;19467:239;;19664:19;19631:17;:30;19649:11;19631:30;;;;;;;;;;;:52;;;;19467:239;19346:378;19179:559;19122:616;19782:7;19778:2;19763:27;;19772:4;19763:27;;;;;;;;;;;;19800:42;19821:4;19827:2;19831:7;19840:1;19800:20;:42::i;:::-;17354:2495;;;17254:2595;;;:::o;1337:130:4:-;1411:12;:10;:12::i;:::-;1400:23;;:7;:5;:7::i;:::-;:23;;;1392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1337:130::o;10840:144:2:-;10904:14;10963:5;10953:15;;10840:144;;;:::o;2411:187:4:-;2484:16;2503:6;;;;;;;;;;;2484:25;;2528:8;2519:6;;:17;;;;;;;;;;;;;;;;;;2582:8;2551:40;;2572:8;2551:40;;;;;;;;;;;;2474:124;2411:187;:::o;2265:289:0:-;2332:4;2348:6;2357:1;2348:10;;2368:158;2379:20;:27;;;;2375:1;:31;2368:158;;;2452:5;2425:32;;:20;2446:1;2425:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:32;;;2422:81;;;2484:4;2477:11;;;;;2422:81;2512:3;;;;;:::i;:::-;;;;2368:158;;;2542:5;2535:12;;;2265:289;;;;:::o;14040:102:2:-;14108:27;14118:2;14122:8;14108:27;;;;;;;;;;;;:9;:27::i;:::-;14040:102;;:::o;23577:697::-;23735:4;23780:2;23755:45;;;23801:19;:17;:19::i;:::-;23822:4;23828:7;23837:5;23755:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;23751:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24050:1;24033:6;:13;:18;24029:229;;;24078:40;;;;;;;;;;;;;;24029:229;24218:6;24212:13;24203:6;24199:2;24195:15;24188:38;23751:517;23921:54;;;23911:64;;;:6;:64;;;;23904:71;;;23577:697;;;;;;:::o;377:703:6:-;433:13;659:1;650:5;:10;646:51;;;676:10;;;;;;;;;;;;;;;;;;;;;646:51;706:12;721:5;706:20;;736:14;760:75;775:1;767:4;:9;760:75;;792:8;;;;;:::i;:::-;;;;822:2;814:10;;;;;:::i;:::-;;;760:75;;;844:19;876:6;866:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;844:39;;893:150;909:1;900:5;:10;893:150;;936:1;926:11;;;;;:::i;:::-;;;1002:2;994:5;:10;;;;:::i;:::-;981:2;:24;;;;:::i;:::-;968:39;;951:6;958;951:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1030:2;1021:11;;;;;:::i;:::-;;;893:150;;;1066:6;1052:21;;;;;377:703;;;;:::o;3789:271:0:-;3850:4;3866:6;3875:1;3866:10;;3886:146;3897:14;:21;;;;3893:1;:25;3886:146;;;3958:5;3937:26;;:14;3952:1;3937:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:26;;;3934:75;;;3990:4;3983:11;;;;;3934:75;4018:3;;;;;:::i;:::-;;;;3886:146;;;4048:5;4041:12;;;3789:271;;;;:::o;24905:154:2:-;;;;;:::o;25700:153::-;;;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;14516:661:2:-;14634:19;14640:2;14644:8;14634:5;:19::i;:::-;14710:1;14692:2;:14;;;:19;14688:473;;14731:11;14745:13;;14731:27;;14776:13;14798:8;14792:3;:14;14776:30;;14824:229;14854:62;14893:1;14897:2;14901:7;;;;;;14910:5;14854:30;:62::i;:::-;14849:165;;14951:40;;;;;;;;;;;;;;14849:165;15048:3;15040:5;:11;14824:229;;15133:3;15116:13;;:20;15112:34;;15138:8;;;15112:34;14713:448;;14688:473;14516:661;;;:::o;15438:1574::-;15502:20;15525:13;;15502:36;;15577:1;15552:21;15570:2;15552:17;:21::i;:::-;:26;15548:58;;;15587:19;;;;;;;;;;;;;;15548:58;15632:1;15620:8;:13;15616:44;;;15642:18;;;;;;;;;;;;;;15616:44;15671:61;15701:1;15705:2;15709:12;15723:8;15671:21;:61::i;:::-;16264:1;1151:2;16235:1;:25;;16234:31;16222:8;:44;16196:18;:22;16215:2;16196:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;1909:3;16655:29;16682:1;16670:8;:13;16655:14;:29::i;:::-;:56;;1656:3;16593:15;:41;;16552:21;16570:2;16552:17;:21::i;:::-;:83;:160;16502:17;:31;16520:12;16502:31;;;;;;;;;;;:210;;;;16727:14;16755:117;16821:8;;;;;;16806:12;:23;16802:2;16781:49;;16798:1;16781:49;;;;;;;;;;;;16862:8;16853:6;:17;16755:117;;16917:8;16902:12;:23;16886:13;:39;;;;15979:957;16945:60;16974:1;16978:2;16982:12;16996:8;16945:20;:60::i;:::-;15492:1520;15438:1574;;:::o;11066:138::-;11124:14;11183:5;11173:15;;11066:138;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:7:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1761:5;1799:6;1786:20;1777:29;;1815:32;1841:5;1815:32;:::i;:::-;1716:137;;;;:::o;1859:141::-;1915:5;1946:6;1940:13;1931:22;;1962:32;1988:5;1962:32;:::i;:::-;1859:141;;;;:::o;2019:338::-;2074:5;2123:3;2116:4;2108:6;2104:17;2100:27;2090:122;;2131:79;;:::i;:::-;2090:122;2248:6;2235:20;2273:78;2347:3;2339:6;2332:4;2324:6;2320:17;2273:78;:::i;:::-;2264:87;;2080:277;2019:338;;;;:::o;2377:340::-;2433:5;2482:3;2475:4;2467:6;2463:17;2459:27;2449:122;;2490:79;;:::i;:::-;2449:122;2607:6;2594:20;2632:79;2707:3;2699:6;2692:4;2684:6;2680:17;2632:79;:::i;:::-;2623:88;;2439:278;2377:340;;;;:::o;2723:139::-;2769:5;2807:6;2794:20;2785:29;;2823:33;2850:5;2823:33;:::i;:::-;2723:139;;;;:::o;2868:329::-;2927:6;2976:2;2964:9;2955:7;2951:23;2947:32;2944:119;;;2982:79;;:::i;:::-;2944:119;3102:1;3127:53;3172:7;3163:6;3152:9;3148:22;3127:53;:::i;:::-;3117:63;;3073:117;2868:329;;;;:::o;3203:474::-;3271:6;3279;3328:2;3316:9;3307:7;3303:23;3299:32;3296:119;;;3334:79;;:::i;:::-;3296:119;3454:1;3479:53;3524:7;3515:6;3504:9;3500:22;3479:53;:::i;:::-;3469:63;;3425:117;3581:2;3607:53;3652:7;3643:6;3632:9;3628:22;3607:53;:::i;:::-;3597:63;;3552:118;3203:474;;;;;:::o;3683:619::-;3760:6;3768;3776;3825:2;3813:9;3804:7;3800:23;3796:32;3793:119;;;3831:79;;:::i;:::-;3793:119;3951:1;3976:53;4021:7;4012:6;4001:9;3997:22;3976:53;:::i;:::-;3966:63;;3922:117;4078:2;4104:53;4149:7;4140:6;4129:9;4125:22;4104:53;:::i;:::-;4094:63;;4049:118;4206:2;4232:53;4277:7;4268:6;4257:9;4253:22;4232:53;:::i;:::-;4222:63;;4177:118;3683:619;;;;;:::o;4308:943::-;4403:6;4411;4419;4427;4476:3;4464:9;4455:7;4451:23;4447:33;4444:120;;;4483:79;;:::i;:::-;4444:120;4603:1;4628:53;4673:7;4664:6;4653:9;4649:22;4628:53;:::i;:::-;4618:63;;4574:117;4730:2;4756:53;4801:7;4792:6;4781:9;4777:22;4756:53;:::i;:::-;4746:63;;4701:118;4858:2;4884:53;4929:7;4920:6;4909:9;4905:22;4884:53;:::i;:::-;4874:63;;4829:118;5014:2;5003:9;4999:18;4986:32;5045:18;5037:6;5034:30;5031:117;;;5067:79;;:::i;:::-;5031:117;5172:62;5226:7;5217:6;5206:9;5202:22;5172:62;:::i;:::-;5162:72;;4957:287;4308:943;;;;;;;:::o;5257:468::-;5322:6;5330;5379:2;5367:9;5358:7;5354:23;5350:32;5347:119;;;5385:79;;:::i;:::-;5347:119;5505:1;5530:53;5575:7;5566:6;5555:9;5551:22;5530:53;:::i;:::-;5520:63;;5476:117;5632:2;5658:50;5700:7;5691:6;5680:9;5676:22;5658:50;:::i;:::-;5648:60;;5603:115;5257:468;;;;;:::o;5731:474::-;5799:6;5807;5856:2;5844:9;5835:7;5831:23;5827:32;5824:119;;;5862:79;;:::i;:::-;5824:119;5982:1;6007:53;6052:7;6043:6;6032:9;6028:22;6007:53;:::i;:::-;5997:63;;5953:117;6109:2;6135:53;6180:7;6171:6;6160:9;6156:22;6135:53;:::i;:::-;6125:63;;6080:118;5731:474;;;;;:::o;6211:559::-;6297:6;6305;6354:2;6342:9;6333:7;6329:23;6325:32;6322:119;;;6360:79;;:::i;:::-;6322:119;6508:1;6497:9;6493:17;6480:31;6538:18;6530:6;6527:30;6524:117;;;6560:79;;:::i;:::-;6524:117;6673:80;6745:7;6736:6;6725:9;6721:22;6673:80;:::i;:::-;6655:98;;;;6451:312;6211:559;;;;;:::o;6776:327::-;6834:6;6883:2;6871:9;6862:7;6858:23;6854:32;6851:119;;;6889:79;;:::i;:::-;6851:119;7009:1;7034:52;7078:7;7069:6;7058:9;7054:22;7034:52;:::i;:::-;7024:62;;6980:116;6776:327;;;;:::o;7109:349::-;7178:6;7227:2;7215:9;7206:7;7202:23;7198:32;7195:119;;;7233:79;;:::i;:::-;7195:119;7353:1;7378:63;7433:7;7424:6;7413:9;7409:22;7378:63;:::i;:::-;7368:73;;7324:127;7109:349;;;;:::o;7464:509::-;7533:6;7582:2;7570:9;7561:7;7557:23;7553:32;7550:119;;;7588:79;;:::i;:::-;7550:119;7736:1;7725:9;7721:17;7708:31;7766:18;7758:6;7755:30;7752:117;;;7788:79;;:::i;:::-;7752:117;7893:63;7948:7;7939:6;7928:9;7924:22;7893:63;:::i;:::-;7883:73;;7679:287;7464:509;;;;:::o;7979:329::-;8038:6;8087:2;8075:9;8066:7;8062:23;8058:32;8055:119;;;8093:79;;:::i;:::-;8055:119;8213:1;8238:53;8283:7;8274:6;8263:9;8259:22;8238:53;:::i;:::-;8228:63;;8184:117;7979:329;;;;:::o;8314:118::-;8401:24;8419:5;8401:24;:::i;:::-;8396:3;8389:37;8314:118;;:::o;8438:109::-;8519:21;8534:5;8519:21;:::i;:::-;8514:3;8507:34;8438:109;;:::o;8553:360::-;8639:3;8667:38;8699:5;8667:38;:::i;:::-;8721:70;8784:6;8779:3;8721:70;:::i;:::-;8714:77;;8800:52;8845:6;8840:3;8833:4;8826:5;8822:16;8800:52;:::i;:::-;8877:29;8899:6;8877:29;:::i;:::-;8872:3;8868:39;8861:46;;8643:270;8553:360;;;;:::o;8919:364::-;9007:3;9035:39;9068:5;9035:39;:::i;:::-;9090:71;9154:6;9149:3;9090:71;:::i;:::-;9083:78;;9170:52;9215:6;9210:3;9203:4;9196:5;9192:16;9170:52;:::i;:::-;9247:29;9269:6;9247:29;:::i;:::-;9242:3;9238:39;9231:46;;9011:272;8919:364;;;;:::o;9289:377::-;9395:3;9423:39;9456:5;9423:39;:::i;:::-;9478:89;9560:6;9555:3;9478:89;:::i;:::-;9471:96;;9576:52;9621:6;9616:3;9609:4;9602:5;9598:16;9576:52;:::i;:::-;9653:6;9648:3;9644:16;9637:23;;9399:267;9289:377;;;;:::o;9696:845::-;9799:3;9836:5;9830:12;9865:36;9891:9;9865:36;:::i;:::-;9917:89;9999:6;9994:3;9917:89;:::i;:::-;9910:96;;10037:1;10026:9;10022:17;10053:1;10048:137;;;;10199:1;10194:341;;;;10015:520;;10048:137;10132:4;10128:9;10117;10113:25;10108:3;10101:38;10168:6;10163:3;10159:16;10152:23;;10048:137;;10194:341;10261:38;10293:5;10261:38;:::i;:::-;10321:1;10335:154;10349:6;10346:1;10343:13;10335:154;;;10423:7;10417:14;10413:1;10408:3;10404:11;10397:35;10473:1;10464:7;10460:15;10449:26;;10371:4;10368:1;10364:12;10359:17;;10335:154;;;10518:6;10513:3;10509:16;10502:23;;10201:334;;10015:520;;9803:738;;9696:845;;;;:::o;10547:366::-;10689:3;10710:67;10774:2;10769:3;10710:67;:::i;:::-;10703:74;;10786:93;10875:3;10786:93;:::i;:::-;10904:2;10899:3;10895:12;10888:19;;10547:366;;;:::o;10919:::-;11061:3;11082:67;11146:2;11141:3;11082:67;:::i;:::-;11075:74;;11158:93;11247:3;11158:93;:::i;:::-;11276:2;11271:3;11267:12;11260:19;;10919:366;;;:::o;11291:::-;11433:3;11454:67;11518:2;11513:3;11454:67;:::i;:::-;11447:74;;11530:93;11619:3;11530:93;:::i;:::-;11648:2;11643:3;11639:12;11632:19;;11291:366;;;:::o;11663:::-;11805:3;11826:67;11890:2;11885:3;11826:67;:::i;:::-;11819:74;;11902:93;11991:3;11902:93;:::i;:::-;12020:2;12015:3;12011:12;12004:19;;11663:366;;;:::o;12035:::-;12177:3;12198:67;12262:2;12257:3;12198:67;:::i;:::-;12191:74;;12274:93;12363:3;12274:93;:::i;:::-;12392:2;12387:3;12383:12;12376:19;;12035:366;;;:::o;12407:::-;12549:3;12570:67;12634:2;12629:3;12570:67;:::i;:::-;12563:74;;12646:93;12735:3;12646:93;:::i;:::-;12764:2;12759:3;12755:12;12748:19;;12407:366;;;:::o;12779:::-;12921:3;12942:67;13006:2;13001:3;12942:67;:::i;:::-;12935:74;;13018:93;13107:3;13018:93;:::i;:::-;13136:2;13131:3;13127:12;13120:19;;12779:366;;;:::o;13151:::-;13293:3;13314:67;13378:2;13373:3;13314:67;:::i;:::-;13307:74;;13390:93;13479:3;13390:93;:::i;:::-;13508:2;13503:3;13499:12;13492:19;;13151:366;;;:::o;13523:400::-;13683:3;13704:84;13786:1;13781:3;13704:84;:::i;:::-;13697:91;;13797:93;13886:3;13797:93;:::i;:::-;13915:1;13910:3;13906:11;13899:18;;13523:400;;;:::o;13929:366::-;14071:3;14092:67;14156:2;14151:3;14092:67;:::i;:::-;14085:74;;14168:93;14257:3;14168:93;:::i;:::-;14286:2;14281:3;14277:12;14270:19;;13929:366;;;:::o;14301:::-;14443:3;14464:67;14528:2;14523:3;14464:67;:::i;:::-;14457:74;;14540:93;14629:3;14540:93;:::i;:::-;14658:2;14653:3;14649:12;14642:19;;14301:366;;;:::o;14673:::-;14815:3;14836:67;14900:2;14895:3;14836:67;:::i;:::-;14829:74;;14912:93;15001:3;14912:93;:::i;:::-;15030:2;15025:3;15021:12;15014:19;;14673:366;;;:::o;15045:398::-;15204:3;15225:83;15306:1;15301:3;15225:83;:::i;:::-;15218:90;;15317:93;15406:3;15317:93;:::i;:::-;15435:1;15430:3;15426:11;15419:18;;15045:398;;;:::o;15449:366::-;15591:3;15612:67;15676:2;15671:3;15612:67;:::i;:::-;15605:74;;15688:93;15777:3;15688:93;:::i;:::-;15806:2;15801:3;15797:12;15790:19;;15449:366;;;:::o;15821:::-;15963:3;15984:67;16048:2;16043:3;15984:67;:::i;:::-;15977:74;;16060:93;16149:3;16060:93;:::i;:::-;16178:2;16173:3;16169:12;16162:19;;15821:366;;;:::o;16193:::-;16335:3;16356:67;16420:2;16415:3;16356:67;:::i;:::-;16349:74;;16432:93;16521:3;16432:93;:::i;:::-;16550:2;16545:3;16541:12;16534:19;;16193:366;;;:::o;16565:118::-;16652:24;16670:5;16652:24;:::i;:::-;16647:3;16640:37;16565:118;;:::o;16689:695::-;16967:3;16989:92;17077:3;17068:6;16989:92;:::i;:::-;16982:99;;17098:95;17189:3;17180:6;17098:95;:::i;:::-;17091:102;;17210:148;17354:3;17210:148;:::i;:::-;17203:155;;17375:3;17368:10;;16689:695;;;;;:::o;17390:379::-;17574:3;17596:147;17739:3;17596:147;:::i;:::-;17589:154;;17760:3;17753:10;;17390:379;;;:::o;17775:222::-;17868:4;17906:2;17895:9;17891:18;17883:26;;17919:71;17987:1;17976:9;17972:17;17963:6;17919:71;:::i;:::-;17775:222;;;;:::o;18003:640::-;18198:4;18236:3;18225:9;18221:19;18213:27;;18250:71;18318:1;18307:9;18303:17;18294:6;18250:71;:::i;:::-;18331:72;18399:2;18388:9;18384:18;18375:6;18331:72;:::i;:::-;18413;18481:2;18470:9;18466:18;18457:6;18413:72;:::i;:::-;18532:9;18526:4;18522:20;18517:2;18506:9;18502:18;18495:48;18560:76;18631:4;18622:6;18560:76;:::i;:::-;18552:84;;18003:640;;;;;;;:::o;18649:210::-;18736:4;18774:2;18763:9;18759:18;18751:26;;18787:65;18849:1;18838:9;18834:17;18825:6;18787:65;:::i;:::-;18649:210;;;;:::o;18865:313::-;18978:4;19016:2;19005:9;19001:18;18993:26;;19065:9;19059:4;19055:20;19051:1;19040:9;19036:17;19029:47;19093:78;19166:4;19157:6;19093:78;:::i;:::-;19085:86;;18865:313;;;;:::o;19184:419::-;19350:4;19388:2;19377:9;19373:18;19365:26;;19437:9;19431:4;19427:20;19423:1;19412:9;19408:17;19401:47;19465:131;19591:4;19465:131;:::i;:::-;19457:139;;19184:419;;;:::o;19609:::-;19775:4;19813:2;19802:9;19798:18;19790:26;;19862:9;19856:4;19852:20;19848:1;19837:9;19833:17;19826:47;19890:131;20016:4;19890:131;:::i;:::-;19882:139;;19609:419;;;:::o;20034:::-;20200:4;20238:2;20227:9;20223:18;20215:26;;20287:9;20281:4;20277:20;20273:1;20262:9;20258:17;20251:47;20315:131;20441:4;20315:131;:::i;:::-;20307:139;;20034:419;;;:::o;20459:::-;20625:4;20663:2;20652:9;20648:18;20640:26;;20712:9;20706:4;20702:20;20698:1;20687:9;20683:17;20676:47;20740:131;20866:4;20740:131;:::i;:::-;20732:139;;20459:419;;;:::o;20884:::-;21050:4;21088:2;21077:9;21073:18;21065:26;;21137:9;21131:4;21127:20;21123:1;21112:9;21108:17;21101:47;21165:131;21291:4;21165:131;:::i;:::-;21157:139;;20884:419;;;:::o;21309:::-;21475:4;21513:2;21502:9;21498:18;21490:26;;21562:9;21556:4;21552:20;21548:1;21537:9;21533:17;21526:47;21590:131;21716:4;21590:131;:::i;:::-;21582:139;;21309:419;;;:::o;21734:::-;21900:4;21938:2;21927:9;21923:18;21915:26;;21987:9;21981:4;21977:20;21973:1;21962:9;21958:17;21951:47;22015:131;22141:4;22015:131;:::i;:::-;22007:139;;21734:419;;;:::o;22159:::-;22325:4;22363:2;22352:9;22348:18;22340:26;;22412:9;22406:4;22402:20;22398:1;22387:9;22383:17;22376:47;22440:131;22566:4;22440:131;:::i;:::-;22432:139;;22159:419;;;:::o;22584:::-;22750:4;22788:2;22777:9;22773:18;22765:26;;22837:9;22831:4;22827:20;22823:1;22812:9;22808:17;22801:47;22865:131;22991:4;22865:131;:::i;:::-;22857:139;;22584:419;;;:::o;23009:::-;23175:4;23213:2;23202:9;23198:18;23190:26;;23262:9;23256:4;23252:20;23248:1;23237:9;23233:17;23226:47;23290:131;23416:4;23290:131;:::i;:::-;23282:139;;23009:419;;;:::o;23434:::-;23600:4;23638:2;23627:9;23623:18;23615:26;;23687:9;23681:4;23677:20;23673:1;23662:9;23658:17;23651:47;23715:131;23841:4;23715:131;:::i;:::-;23707:139;;23434:419;;;:::o;23859:::-;24025:4;24063:2;24052:9;24048:18;24040:26;;24112:9;24106:4;24102:20;24098:1;24087:9;24083:17;24076:47;24140:131;24266:4;24140:131;:::i;:::-;24132:139;;23859:419;;;:::o;24284:::-;24450:4;24488:2;24477:9;24473:18;24465:26;;24537:9;24531:4;24527:20;24523:1;24512:9;24508:17;24501:47;24565:131;24691:4;24565:131;:::i;:::-;24557:139;;24284:419;;;:::o;24709:::-;24875:4;24913:2;24902:9;24898:18;24890:26;;24962:9;24956:4;24952:20;24948:1;24937:9;24933:17;24926:47;24990:131;25116:4;24990:131;:::i;:::-;24982:139;;24709:419;;;:::o;25134:222::-;25227:4;25265:2;25254:9;25250:18;25242:26;;25278:71;25346:1;25335:9;25331:17;25322:6;25278:71;:::i;:::-;25134:222;;;;:::o;25362:129::-;25396:6;25423:20;;:::i;:::-;25413:30;;25452:33;25480:4;25472:6;25452:33;:::i;:::-;25362:129;;;:::o;25497:75::-;25530:6;25563:2;25557:9;25547:19;;25497:75;:::o;25578:307::-;25639:4;25729:18;25721:6;25718:30;25715:56;;;25751:18;;:::i;:::-;25715:56;25789:29;25811:6;25789:29;:::i;:::-;25781:37;;25873:4;25867;25863:15;25855:23;;25578:307;;;:::o;25891:308::-;25953:4;26043:18;26035:6;26032:30;26029:56;;;26065:18;;:::i;:::-;26029:56;26103:29;26125:6;26103:29;:::i;:::-;26095:37;;26187:4;26181;26177:15;26169:23;;25891:308;;;:::o;26205:141::-;26254:4;26277:3;26269:11;;26300:3;26297:1;26290:14;26334:4;26331:1;26321:18;26313:26;;26205:141;;;:::o;26352:98::-;26403:6;26437:5;26431:12;26421:22;;26352:98;;;:::o;26456:99::-;26508:6;26542:5;26536:12;26526:22;;26456:99;;;:::o;26561:168::-;26644:11;26678:6;26673:3;26666:19;26718:4;26713:3;26709:14;26694:29;;26561:168;;;;:::o;26735:147::-;26836:11;26873:3;26858:18;;26735:147;;;;:::o;26888:169::-;26972:11;27006:6;27001:3;26994:19;27046:4;27041:3;27037:14;27022:29;;26888:169;;;;:::o;27063:148::-;27165:11;27202:3;27187:18;;27063:148;;;;:::o;27217:305::-;27257:3;27276:20;27294:1;27276:20;:::i;:::-;27271:25;;27310:20;27328:1;27310:20;:::i;:::-;27305:25;;27464:1;27396:66;27392:74;27389:1;27386:81;27383:107;;;27470:18;;:::i;:::-;27383:107;27514:1;27511;27507:9;27500:16;;27217:305;;;;:::o;27528:185::-;27568:1;27585:20;27603:1;27585:20;:::i;:::-;27580:25;;27619:20;27637:1;27619:20;:::i;:::-;27614:25;;27658:1;27648:35;;27663:18;;:::i;:::-;27648:35;27705:1;27702;27698:9;27693:14;;27528:185;;;;:::o;27719:348::-;27759:7;27782:20;27800:1;27782:20;:::i;:::-;27777:25;;27816:20;27834:1;27816:20;:::i;:::-;27811:25;;28004:1;27936:66;27932:74;27929:1;27926:81;27921:1;27914:9;27907:17;27903:105;27900:131;;;28011:18;;:::i;:::-;27900:131;28059:1;28056;28052:9;28041:20;;27719:348;;;;:::o;28073:191::-;28113:4;28133:20;28151:1;28133:20;:::i;:::-;28128:25;;28167:20;28185:1;28167:20;:::i;:::-;28162:25;;28206:1;28203;28200:8;28197:34;;;28211:18;;:::i;:::-;28197:34;28256:1;28253;28249:9;28241:17;;28073:191;;;;:::o;28270:96::-;28307:7;28336:24;28354:5;28336:24;:::i;:::-;28325:35;;28270:96;;;:::o;28372:90::-;28406:7;28449:5;28442:13;28435:21;28424:32;;28372:90;;;:::o;28468:149::-;28504:7;28544:66;28537:5;28533:78;28522:89;;28468:149;;;:::o;28623:126::-;28660:7;28700:42;28693:5;28689:54;28678:65;;28623:126;;;:::o;28755:77::-;28792:7;28821:5;28810:16;;28755:77;;;:::o;28838:154::-;28922:6;28917:3;28912;28899:30;28984:1;28975:6;28970:3;28966:16;28959:27;28838:154;;;:::o;28998:307::-;29066:1;29076:113;29090:6;29087:1;29084:13;29076:113;;;29175:1;29170:3;29166:11;29160:18;29156:1;29151:3;29147:11;29140:39;29112:2;29109:1;29105:10;29100:15;;29076:113;;;29207:6;29204:1;29201:13;29198:101;;;29287:1;29278:6;29273:3;29269:16;29262:27;29198:101;29047:258;28998:307;;;:::o;29311:320::-;29355:6;29392:1;29386:4;29382:12;29372:22;;29439:1;29433:4;29429:12;29460:18;29450:81;;29516:4;29508:6;29504:17;29494:27;;29450:81;29578:2;29570:6;29567:14;29547:18;29544:38;29541:84;;;29597:18;;:::i;:::-;29541:84;29362:269;29311:320;;;:::o;29637:281::-;29720:27;29742:4;29720:27;:::i;:::-;29712:6;29708:40;29850:6;29838:10;29835:22;29814:18;29802:10;29799:34;29796:62;29793:88;;;29861:18;;:::i;:::-;29793:88;29901:10;29897:2;29890:22;29680:238;29637:281;;:::o;29924:233::-;29963:3;29986:24;30004:5;29986:24;:::i;:::-;29977:33;;30032:66;30025:5;30022:77;30019:103;;;30102:18;;:::i;:::-;30019:103;30149:1;30142:5;30138:13;30131:20;;29924:233;;;:::o;30163:176::-;30195:1;30212:20;30230:1;30212:20;:::i;:::-;30207:25;;30246:20;30264:1;30246:20;:::i;:::-;30241:25;;30285:1;30275:35;;30290:18;;:::i;:::-;30275:35;30331:1;30328;30324:9;30319:14;;30163:176;;;;:::o;30345:180::-;30393:77;30390:1;30383:88;30490:4;30487:1;30480:15;30514:4;30511:1;30504:15;30531:180;30579:77;30576:1;30569:88;30676:4;30673:1;30666:15;30700:4;30697:1;30690:15;30717:180;30765:77;30762:1;30755:88;30862:4;30859:1;30852:15;30886:4;30883:1;30876:15;30903:180;30951:77;30948:1;30941:88;31048:4;31045:1;31038:15;31072:4;31069:1;31062:15;31089:180;31137:77;31134:1;31127:88;31234:4;31231:1;31224:15;31258:4;31255:1;31248:15;31275:117;31384:1;31381;31374:12;31398:117;31507:1;31504;31497:12;31521:117;31630:1;31627;31620:12;31644:117;31753:1;31750;31743:12;31767:117;31876:1;31873;31866:12;31890:117;31999:1;31996;31989:12;32013:102;32054:6;32105:2;32101:7;32096:2;32089:5;32085:14;32081:28;32071:38;;32013:102;;;:::o;32121:161::-;32261:13;32257:1;32249:6;32245:14;32238:37;32121:161;:::o;32288:179::-;32428:31;32424:1;32416:6;32412:14;32405:55;32288:179;:::o;32473:171::-;32613:23;32609:1;32601:6;32597:14;32590:47;32473:171;:::o;32650:225::-;32790:34;32786:1;32778:6;32774:14;32767:58;32859:8;32854:2;32846:6;32842:15;32835:33;32650:225;:::o;32881:176::-;33021:28;33017:1;33009:6;33005:14;32998:52;32881:176;:::o;33063:::-;33203:28;33199:1;33191:6;33187:14;33180:52;33063:176;:::o;33245:179::-;33385:31;33381:1;33373:6;33369:14;33362:55;33245:179;:::o;33430:182::-;33570:34;33566:1;33558:6;33554:14;33547:58;33430:182;:::o;33618:155::-;33758:7;33754:1;33746:6;33742:14;33735:31;33618:155;:::o;33779:182::-;33919:34;33915:1;33907:6;33903:14;33896:58;33779:182;:::o;33967:166::-;34107:18;34103:1;34095:6;34091:14;34084:42;33967:166;:::o;34139:173::-;34279:25;34275:1;34267:6;34263:14;34256:49;34139:173;:::o;34318:114::-;;:::o;34438:173::-;34578:25;34574:1;34566:6;34562:14;34555:49;34438:173;:::o;34617:181::-;34757:33;34753:1;34745:6;34741:14;34734:57;34617:181;:::o;34804:225::-;34944:34;34940:1;34932:6;34928:14;34921:58;35013:8;35008:2;35000:6;34996:15;34989:33;34804:225;:::o;35035:122::-;35108:24;35126:5;35108:24;:::i;:::-;35101:5;35098:35;35088:63;;35147:1;35144;35137:12;35088:63;35035:122;:::o;35163:116::-;35233:21;35248:5;35233:21;:::i;:::-;35226:5;35223:32;35213:60;;35269:1;35266;35259:12;35213:60;35163:116;:::o;35285:120::-;35357:23;35374:5;35357:23;:::i;:::-;35350:5;35347:34;35337:62;;35395:1;35392;35385:12;35337:62;35285:120;:::o;35411:122::-;35484:24;35502:5;35484:24;:::i;:::-;35477:5;35474:35;35464:63;;35523:1;35520;35513:12;35464:63;35411:122;:::o
Swarm Source
ipfs://3d28cc48b96278de43f0eb173174df2488f5c907f29911888f5ac8312dc3098c
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.