More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 1,495 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 21117777 | 15 days ago | IN | 0 ETH | 0.00014921 | ||||
Set Approval For... | 20319442 | 126 days ago | IN | 0 ETH | 0.00037275 | ||||
Set Approval For... | 19801805 | 198 days ago | IN | 0 ETH | 0.00021069 | ||||
Set Approval For... | 19302830 | 268 days ago | IN | 0 ETH | 0.0005784 | ||||
Set Approval For... | 18910566 | 323 days ago | IN | 0 ETH | 0.00046714 | ||||
Set Approval For... | 18359073 | 401 days ago | IN | 0 ETH | 0.00023354 | ||||
Set Approval For... | 18332644 | 404 days ago | IN | 0 ETH | 0.0003029 | ||||
Mint HB | 18298670 | 409 days ago | IN | 0 ETH | 0.00043908 | ||||
Mint HB | 18298669 | 409 days ago | IN | 0 ETH | 0.00042803 | ||||
Mint HB | 18298666 | 409 days ago | IN | 0 ETH | 0.00041126 | ||||
Set Approval For... | 18247797 | 416 days ago | IN | 0 ETH | 0.00031156 | ||||
Set Approval For... | 18226020 | 419 days ago | IN | 0 ETH | 0.00032934 | ||||
Mint HB | 18219295 | 420 days ago | IN | 0 ETH | 0.00149207 | ||||
Mint HB | 18210347 | 422 days ago | IN | 0 ETH | 0.00062175 | ||||
Mint HB | 18210233 | 422 days ago | IN | 0 ETH | 0.00060914 | ||||
Mint HB | 18209719 | 422 days ago | IN | 0 ETH | 0.00063432 | ||||
Mint HB | 18209647 | 422 days ago | IN | 0 ETH | 0.00058014 | ||||
Mint HB | 18209538 | 422 days ago | IN | 0 ETH | 0.00058165 | ||||
Mint HB | 18209535 | 422 days ago | IN | 0 ETH | 0.0005709 | ||||
Mint HB | 18209534 | 422 days ago | IN | 0 ETH | 0.00065476 | ||||
Mint HB | 18209534 | 422 days ago | IN | 0 ETH | 0.00065476 | ||||
Mint HB | 18209534 | 422 days ago | IN | 0 ETH | 0.00065476 | ||||
Mint HB | 18209533 | 422 days ago | IN | 0 ETH | 0.00066771 | ||||
Mint HB | 18209533 | 422 days ago | IN | 0 ETH | 0.00066771 | ||||
Mint HB | 18209533 | 422 days ago | IN | 0 ETH | 0.00066771 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
15070410 | 870 days ago | 0.387 ETH |
Loading...
Loading
Contract Name:
HunnyBunny
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-02 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/IERC721A.sol // 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(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: contracts/erc721a.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The 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 auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (_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 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (_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 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); 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) } } } // File: contracts/hunny_bunny.sol //SPDX-License-Identifier: MIT // pragma solidity ^0.8.9; pragma solidity >=0.7.0 <0.9.0; contract HunnyBunny is ERC721A, Ownable { using Strings for uint256; uint256 public constant FREE_SUPPLY = 2000; uint256 public constant SALE_SUPPLY = 8000; uint256 public constant MAX_PER_MINT = 1; uint256 public constant MAX_PRE_SALE = 3; uint256 public salePrice = 0.002 ether; uint256 public freeMintCount; bool public isStartFreeMint; bool public isStartSaleMint; string public baseURI; mapping(address => uint256) public allowFreeMintPerWallet; constructor() ERC721A("Hunny Bunny", "HB") {} /** * @notice token start from id 1 */ function _startTokenId() internal view virtual override returns (uint256) { return 1; } /** * @notice mint hunny bunny */ function mintHB(uint256 _quantity) external payable { require(isStartSaleMint, "Event have not start"); require(totalSupply() + _quantity < SALE_SUPPLY + FREE_SUPPLY, "Exceeds max supply"); require(_quantity <= MAX_PRE_SALE, "3 mint per transaction"); require(msg.value >= salePrice * _quantity, "Not enough ETH to mint"); _safeMint(msg.sender, _quantity); } /** * @notice free mint hunny bunny */ function freeMintHB(uint256 _quantity) external payable { require(isStartFreeMint, "Event have not start"); require(freeMintCount + _quantity <= FREE_SUPPLY, "Free mint supply finish"); require(_quantity + allowFreeMintPerWallet[msg.sender] <= MAX_PER_MINT, "Only 1 free mints per wallet"); freeMintCount += _quantity; allowFreeMintPerWallet[msg.sender] += _quantity; _safeMint(msg.sender, _quantity); } /** * @notice set sale price */ function setSalePrice(uint256 _salePrice) public onlyOwner { salePrice = _salePrice; } /** * @notice set base uri */ function setBaseURI(string memory uri) public onlyOwner { baseURI = uri; } /** * @notice switch sales status */ function switchSalesStatus() public onlyOwner { isStartSaleMint = !isStartSaleMint; } /** * @notice switch free mint status */ function switchFreeStatus() public onlyOwner { isStartFreeMint = !isStartFreeMint; } /** * @notice token URI */ function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token"); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _tokenId.toString())) : ''; } /** * @notice transfer funds */ function withdrawal() external onlyOwner { uint256 balance = address(this).balance; payable(msg.sender).transfer(balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FREE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PRE_SALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowFreeMintPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"freeMintHB","outputs":[],"stateMutability":"payable","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":"isStartFreeMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isStartSaleMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mintHB","outputs":[],"stateMutability":"payable","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"setSalePrice","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":"switchFreeStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"switchSalesStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405266071afd498d00006009553480156200001c57600080fd5b506040518060400160405280600b81526020017f48756e6e792042756e6e790000000000000000000000000000000000000000008152506040518060400160405280600281526020017f48420000000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000a1929190620001d0565b508060039080519060200190620000ba929190620001d0565b50620000cb620000f960201b60201c565b6000819055505050620000f3620000e76200010260201b60201c565b6200010a60201b60201c565b620002e5565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001de9062000280565b90600052602060002090601f0160209004810192826200020257600085556200024e565b82601f106200021d57805160ff19168380011785556200024e565b828001600101855582156200024e579182015b828111156200024d57825182559160200191906001019062000230565b5b5090506200025d919062000261565b5090565b5b808211156200027c57600081600090555060010162000262565b5090565b600060028204905060018216806200029957607f821691505b60208210811415620002b057620002af620002b6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6133c680620002f56000396000f3fe6080604052600436106101f95760003560e01c8063715018a61161010d578063b343eda8116100a0578063d4e932921161006f578063d4e93292146106e1578063e55f58bb146106f8578063e985e9c514610723578063f2fde38b14610760578063f51f96dd14610789576101f9565b8063b343eda814610634578063b88d4fde14610650578063c87b56dd14610679578063cbf6fff9146106b6576101f9565b80639858cf19116100dc5780639858cf191461059e5780639ad34f89146105c95780639e5cbec7146105f4578063a22cb4651461060b576101f9565b8063715018a6146105155780638da5cb5b1461052c57806390ff201a1461055757806395d89b4114610573576101f9565b80632b82e6091161019057806355f804b31161015f57806355f804b31461041c5780636352211e1461044557806366b2ccaa146104825780636c0360eb146104ad57806370a08231146104d8576101f9565b80632b82e6091461037457806334bbe1d01461038b5780633bf3a455146103c857806342842e0e146103f3576101f9565b806309d42b30116101cc57806309d42b30146102cc57806318160ddd146102f75780631919fed71461032257806323b872dd1461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612783565b6107b4565b6040516102329190612b68565b60405180910390f35b34801561024757600080fd5b50610250610846565b60405161025d9190612b83565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190612826565b6108d8565b60405161029a9190612b01565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190612743565b610954565b005b3480156102d857600080fd5b506102e1610afb565b6040516102ee9190612cc5565b60405180910390f35b34801561030357600080fd5b5061030c610b00565b6040516103199190612cc5565b60405180910390f35b34801561032e57600080fd5b5061034960048036038101906103449190612826565b610b17565b005b34801561035757600080fd5b50610372600480360381019061036d919061262d565b610b9d565b005b34801561038057600080fd5b50610389610bad565b005b34801561039757600080fd5b506103b260048036038101906103ad91906125c0565b610c55565b6040516103bf9190612cc5565b60405180910390f35b3480156103d457600080fd5b506103dd610c6d565b6040516103ea9190612cc5565b60405180910390f35b3480156103ff57600080fd5b5061041a6004803603810190610415919061262d565b610c72565b005b34801561042857600080fd5b50610443600480360381019061043e91906127dd565b610c92565b005b34801561045157600080fd5b5061046c60048036038101906104679190612826565b610d28565b6040516104799190612b01565b60405180910390f35b34801561048e57600080fd5b50610497610d3a565b6040516104a49190612b68565b60405180910390f35b3480156104b957600080fd5b506104c2610d4d565b6040516104cf9190612b83565b60405180910390f35b3480156104e457600080fd5b506104ff60048036038101906104fa91906125c0565b610ddb565b60405161050c9190612cc5565b60405180910390f35b34801561052157600080fd5b5061052a610e70565b005b34801561053857600080fd5b50610541610ef8565b60405161054e9190612b01565b60405180910390f35b610571600480360381019061056c9190612826565b610f22565b005b34801561057f57600080fd5b506105886110cd565b6040516105959190612b83565b60405180910390f35b3480156105aa57600080fd5b506105b361115f565b6040516105c09190612cc5565b60405180910390f35b3480156105d557600080fd5b506105de611165565b6040516105eb9190612b68565b60405180910390f35b34801561060057600080fd5b50610609611178565b005b34801561061757600080fd5b50610632600480360381019061062d9190612703565b611220565b005b61064e60048036038101906106499190612826565b611398565b005b34801561065c57600080fd5b5061067760048036038101906106729190612680565b6114eb565b005b34801561068557600080fd5b506106a0600480360381019061069b9190612826565b61155e565b6040516106ad9190612b83565b60405180910390f35b3480156106c257600080fd5b506106cb611607565b6040516106d89190612cc5565b60405180910390f35b3480156106ed57600080fd5b506106f661160d565b005b34801561070457600080fd5b5061070d6116d8565b60405161071a9190612cc5565b60405180910390f35b34801561072f57600080fd5b5061074a600480360381019061074591906125ed565b6116de565b6040516107579190612b68565b60405180910390f35b34801561076c57600080fd5b50610787600480360381019061078291906125c0565b611772565b005b34801561079557600080fd5b5061079e61186a565b6040516107ab9190612cc5565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061080f57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061083f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461085590612f8a565b80601f016020809104026020016040519081016040528092919081815260200182805461088190612f8a565b80156108ce5780601f106108a3576101008083540402835291602001916108ce565b820191906000526020600020905b8154815290600101906020018083116108b157829003601f168201915b5050505050905090565b60006108e382611870565b610919576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061095f826118cf565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109c7576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109e661199d565b73ffffffffffffffffffffffffffffffffffffffff1614610a4957610a1281610a0d61199d565b6116de565b610a48576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600181565b6000610b0a6119a5565b6001546000540303905090565b610b1f6119ae565b73ffffffffffffffffffffffffffffffffffffffff16610b3d610ef8565b73ffffffffffffffffffffffffffffffffffffffff1614610b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8a90612c65565b60405180910390fd5b8060098190555050565b610ba88383836119b6565b505050565b610bb56119ae565b73ffffffffffffffffffffffffffffffffffffffff16610bd3610ef8565b73ffffffffffffffffffffffffffffffffffffffff1614610c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2090612c65565b60405180910390fd5b600b60019054906101000a900460ff1615600b60016101000a81548160ff021916908315150217905550565b600d6020528060005260406000206000915090505481565b600381565b610c8d838383604051806020016040528060008152506114eb565b505050565b610c9a6119ae565b73ffffffffffffffffffffffffffffffffffffffff16610cb8610ef8565b73ffffffffffffffffffffffffffffffffffffffff1614610d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0590612c65565b60405180910390fd5b80600c9080519060200190610d249291906123d4565b5050565b6000610d33826118cf565b9050919050565b600b60009054906101000a900460ff1681565b600c8054610d5a90612f8a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8690612f8a565b8015610dd35780601f10610da857610100808354040283529160200191610dd3565b820191906000526020600020905b815481529060010190602001808311610db657829003601f168201915b505050505081565b600080610de783611d7e565b1415610e1f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e786119ae565b73ffffffffffffffffffffffffffffffffffffffff16610e96610ef8565b73ffffffffffffffffffffffffffffffffffffffff1614610eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee390612c65565b60405180910390fd5b610ef66000611d88565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900460ff16610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890612c25565b60405180910390fd5b6107d081600a54610f829190612dbf565b1115610fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fba90612ca5565b60405180910390fd5b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826110109190612dbf565b1115611051576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104890612ba5565b60405180910390fd5b80600a60008282546110639190612dbf565b9250508190555080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110b99190612dbf565b925050819055506110ca3382611e4e565b50565b6060600380546110dc90612f8a565b80601f016020809104026020016040519081016040528092919081815260200182805461110890612f8a565b80156111555780601f1061112a57610100808354040283529160200191611155565b820191906000526020600020905b81548152906001019060200180831161113857829003601f168201915b5050505050905090565b6107d081565b600b60019054906101000a900460ff1681565b6111806119ae565b73ffffffffffffffffffffffffffffffffffffffff1661119e610ef8565b73ffffffffffffffffffffffffffffffffffffffff16146111f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111eb90612c65565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b61122861199d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561128d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061129a61199d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661134761199d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161138c9190612b68565b60405180910390a35050565b600b60019054906101000a900460ff166113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113de90612c25565b60405180910390fd5b6107d0611f406113f79190612dbf565b81611400610b00565b61140a9190612dbf565b1061144a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144190612c45565b60405180910390fd5b600381111561148e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148590612c05565b60405180910390fd5b8060095461149c9190612e46565b3410156114de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d590612be5565b60405180910390fd5b6114e83382611e4e565b50565b6114f68484846119b6565b60008373ffffffffffffffffffffffffffffffffffffffff163b146115585761152184848484611e6c565b611557576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061156982611870565b6115a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159f90612c85565b60405180910390fd5b6000600c80546115b790612f8a565b905014156115d45760405180602001604052806000815250611600565b600c6115df83611fcc565b6040516020016115f0929190612add565b6040516020818303038152906040525b9050919050565b611f4081565b6116156119ae565b73ffffffffffffffffffffffffffffffffffffffff16611633610ef8565b73ffffffffffffffffffffffffffffffffffffffff1614611689576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168090612c65565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156116d4573d6000803e3d6000fd5b5050565b600a5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61177a6119ae565b73ffffffffffffffffffffffffffffffffffffffff16611798610ef8565b73ffffffffffffffffffffffffffffffffffffffff16146117ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e590612c65565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561185e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185590612bc5565b60405180910390fd5b61186781611d88565b50565b60095481565b60008161187b6119a5565b1115801561188a575060005482105b80156118c8575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806118de6119a5565b11611966576000548110156119655760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611963575b600081141561195957600460008360019003935083815260200190815260200160002054905061192e565b8092505050611998565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b600033905090565b60006119c1826118cf565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611a28576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff16611a8161199d565b73ffffffffffffffffffffffffffffffffffffffff161480611ab05750611aaf86611aaa61199d565b6116de565b5b80611aed5750611abe61199d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b905080611b26576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611b3186611d7e565b1415611b69576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b76868686600161212d565b6000611b8183611d7e565b14611bbd576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611c8487611d7e565b1717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611d0e576000600185019050600060046000838152602001908152602001600020541415611d0c576000548114611d0b578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d768686866001612133565b505050505050565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e68828260405180602001604052806000815250612139565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e9261199d565b8786866040518563ffffffff1660e01b8152600401611eb49493929190612b1c565b602060405180830381600087803b158015611ece57600080fd5b505af1925050508015611eff57506040513d601f19601f82011682018060405250810190611efc91906127b0565b60015b611f79573d8060008114611f2f576040519150601f19603f3d011682016040523d82523d6000602084013e611f34565b606091505b50600081511415611f71576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612014576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612128565b600082905060005b6000821461204657808061202f90612fed565b915050600a8261203f9190612e15565b915061201c565b60008167ffffffffffffffff81111561206257612061613123565b5b6040519080825280601f01601f1916602001820160405280156120945781602001600182028036833780820191505090505b5090505b60008514612121576001826120ad9190612ea0565b9150600a856120bc9190613036565b60306120c89190612dbf565b60f81b8183815181106120de576120dd6130f4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561211a9190612e15565b9450612098565b8093505050505b919050565b50505050565b50505050565b600080549050600061214a85611d7e565b1415612182576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156121bd576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121ca600085838661212d565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161222f600185146123ca565b901b60a042901b61223f86611d7e565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612343575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122f36000878480600101955087611e6c565b612329576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061228457826000541461233e57600080fd5b6123ae565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612344575b8160008190555050506123c46000858386612133565b50505050565b6000819050919050565b8280546123e090612f8a565b90600052602060002090601f0160209004810192826124025760008555612449565b82601f1061241b57805160ff1916838001178555612449565b82800160010185558215612449579182015b8281111561244857825182559160200191906001019061242d565b5b509050612456919061245a565b5090565b5b8082111561247357600081600090555060010161245b565b5090565b600061248a61248584612d05565b612ce0565b9050828152602081018484840111156124a6576124a5613157565b5b6124b1848285612f48565b509392505050565b60006124cc6124c784612d36565b612ce0565b9050828152602081018484840111156124e8576124e7613157565b5b6124f3848285612f48565b509392505050565b60008135905061250a81613334565b92915050565b60008135905061251f8161334b565b92915050565b60008135905061253481613362565b92915050565b60008151905061254981613362565b92915050565b600082601f83011261256457612563613152565b5b8135612574848260208601612477565b91505092915050565b600082601f83011261259257612591613152565b5b81356125a28482602086016124b9565b91505092915050565b6000813590506125ba81613379565b92915050565b6000602082840312156125d6576125d5613161565b5b60006125e4848285016124fb565b91505092915050565b6000806040838503121561260457612603613161565b5b6000612612858286016124fb565b9250506020612623858286016124fb565b9150509250929050565b60008060006060848603121561264657612645613161565b5b6000612654868287016124fb565b9350506020612665868287016124fb565b9250506040612676868287016125ab565b9150509250925092565b6000806000806080858703121561269a57612699613161565b5b60006126a8878288016124fb565b94505060206126b9878288016124fb565b93505060406126ca878288016125ab565b925050606085013567ffffffffffffffff8111156126eb576126ea61315c565b5b6126f78782880161254f565b91505092959194509250565b6000806040838503121561271a57612719613161565b5b6000612728858286016124fb565b925050602061273985828601612510565b9150509250929050565b6000806040838503121561275a57612759613161565b5b6000612768858286016124fb565b9250506020612779858286016125ab565b9150509250929050565b60006020828403121561279957612798613161565b5b60006127a784828501612525565b91505092915050565b6000602082840312156127c6576127c5613161565b5b60006127d48482850161253a565b91505092915050565b6000602082840312156127f3576127f2613161565b5b600082013567ffffffffffffffff8111156128115761281061315c565b5b61281d8482850161257d565b91505092915050565b60006020828403121561283c5761283b613161565b5b600061284a848285016125ab565b91505092915050565b61285c81612ed4565b82525050565b61286b81612ee6565b82525050565b600061287c82612d7c565b6128868185612d92565b9350612896818560208601612f57565b61289f81613166565b840191505092915050565b60006128b582612d87565b6128bf8185612da3565b93506128cf818560208601612f57565b6128d881613166565b840191505092915050565b60006128ee82612d87565b6128f88185612db4565b9350612908818560208601612f57565b80840191505092915050565b6000815461292181612f8a565b61292b8186612db4565b9450600182166000811461294657600181146129575761298a565b60ff1983168652818601935061298a565b61296085612d67565b60005b8381101561298257815481890152600182019150602081019050612963565b838801955050505b50505092915050565b60006129a0601c83612da3565b91506129ab82613177565b602082019050919050565b60006129c3602683612da3565b91506129ce826131a0565b604082019050919050565b60006129e6601683612da3565b91506129f1826131ef565b602082019050919050565b6000612a09601683612da3565b9150612a1482613218565b602082019050919050565b6000612a2c601483612da3565b9150612a3782613241565b602082019050919050565b6000612a4f601283612da3565b9150612a5a8261326a565b602082019050919050565b6000612a72602083612da3565b9150612a7d82613293565b602082019050919050565b6000612a95602f83612da3565b9150612aa0826132bc565b604082019050919050565b6000612ab8601783612da3565b9150612ac38261330b565b602082019050919050565b612ad781612f3e565b82525050565b6000612ae98285612914565b9150612af582846128e3565b91508190509392505050565b6000602082019050612b166000830184612853565b92915050565b6000608082019050612b316000830187612853565b612b3e6020830186612853565b612b4b6040830185612ace565b8181036060830152612b5d8184612871565b905095945050505050565b6000602082019050612b7d6000830184612862565b92915050565b60006020820190508181036000830152612b9d81846128aa565b905092915050565b60006020820190508181036000830152612bbe81612993565b9050919050565b60006020820190508181036000830152612bde816129b6565b9050919050565b60006020820190508181036000830152612bfe816129d9565b9050919050565b60006020820190508181036000830152612c1e816129fc565b9050919050565b60006020820190508181036000830152612c3e81612a1f565b9050919050565b60006020820190508181036000830152612c5e81612a42565b9050919050565b60006020820190508181036000830152612c7e81612a65565b9050919050565b60006020820190508181036000830152612c9e81612a88565b9050919050565b60006020820190508181036000830152612cbe81612aab565b9050919050565b6000602082019050612cda6000830184612ace565b92915050565b6000612cea612cfb565b9050612cf68282612fbc565b919050565b6000604051905090565b600067ffffffffffffffff821115612d2057612d1f613123565b5b612d2982613166565b9050602081019050919050565b600067ffffffffffffffff821115612d5157612d50613123565b5b612d5a82613166565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612dca82612f3e565b9150612dd583612f3e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e0a57612e09613067565b5b828201905092915050565b6000612e2082612f3e565b9150612e2b83612f3e565b925082612e3b57612e3a613096565b5b828204905092915050565b6000612e5182612f3e565b9150612e5c83612f3e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e9557612e94613067565b5b828202905092915050565b6000612eab82612f3e565b9150612eb683612f3e565b925082821015612ec957612ec8613067565b5b828203905092915050565b6000612edf82612f1e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612f75578082015181840152602081019050612f5a565b83811115612f84576000848401525b50505050565b60006002820490506001821680612fa257607f821691505b60208210811415612fb657612fb56130c5565b5b50919050565b612fc582613166565b810181811067ffffffffffffffff82111715612fe457612fe3613123565b5b80604052505050565b6000612ff882612f3e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561302b5761302a613067565b5b600182019050919050565b600061304182612f3e565b915061304c83612f3e565b92508261305c5761305b613096565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f6e6c7920312066726565206d696e7473207065722077616c6c657400000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682045544820746f206d696e7400000000000000000000600082015250565b7f33206d696e7420706572207472616e73616374696f6e00000000000000000000600082015250565b7f4576656e742068617665206e6f74207374617274000000000000000000000000600082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f46726565206d696e7420737570706c792066696e697368000000000000000000600082015250565b61333d81612ed4565b811461334857600080fd5b50565b61335481612ee6565b811461335f57600080fd5b50565b61336b81612ef2565b811461337657600080fd5b50565b61338281612f3e565b811461338d57600080fd5b5056fea2646970667358221220d43f29bc82dc0db5ce29da9aa7df05c0a58d45988f1e273d9583c97d435e541d64736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101f95760003560e01c8063715018a61161010d578063b343eda8116100a0578063d4e932921161006f578063d4e93292146106e1578063e55f58bb146106f8578063e985e9c514610723578063f2fde38b14610760578063f51f96dd14610789576101f9565b8063b343eda814610634578063b88d4fde14610650578063c87b56dd14610679578063cbf6fff9146106b6576101f9565b80639858cf19116100dc5780639858cf191461059e5780639ad34f89146105c95780639e5cbec7146105f4578063a22cb4651461060b576101f9565b8063715018a6146105155780638da5cb5b1461052c57806390ff201a1461055757806395d89b4114610573576101f9565b80632b82e6091161019057806355f804b31161015f57806355f804b31461041c5780636352211e1461044557806366b2ccaa146104825780636c0360eb146104ad57806370a08231146104d8576101f9565b80632b82e6091461037457806334bbe1d01461038b5780633bf3a455146103c857806342842e0e146103f3576101f9565b806309d42b30116101cc57806309d42b30146102cc57806318160ddd146102f75780631919fed71461032257806323b872dd1461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612783565b6107b4565b6040516102329190612b68565b60405180910390f35b34801561024757600080fd5b50610250610846565b60405161025d9190612b83565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190612826565b6108d8565b60405161029a9190612b01565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190612743565b610954565b005b3480156102d857600080fd5b506102e1610afb565b6040516102ee9190612cc5565b60405180910390f35b34801561030357600080fd5b5061030c610b00565b6040516103199190612cc5565b60405180910390f35b34801561032e57600080fd5b5061034960048036038101906103449190612826565b610b17565b005b34801561035757600080fd5b50610372600480360381019061036d919061262d565b610b9d565b005b34801561038057600080fd5b50610389610bad565b005b34801561039757600080fd5b506103b260048036038101906103ad91906125c0565b610c55565b6040516103bf9190612cc5565b60405180910390f35b3480156103d457600080fd5b506103dd610c6d565b6040516103ea9190612cc5565b60405180910390f35b3480156103ff57600080fd5b5061041a6004803603810190610415919061262d565b610c72565b005b34801561042857600080fd5b50610443600480360381019061043e91906127dd565b610c92565b005b34801561045157600080fd5b5061046c60048036038101906104679190612826565b610d28565b6040516104799190612b01565b60405180910390f35b34801561048e57600080fd5b50610497610d3a565b6040516104a49190612b68565b60405180910390f35b3480156104b957600080fd5b506104c2610d4d565b6040516104cf9190612b83565b60405180910390f35b3480156104e457600080fd5b506104ff60048036038101906104fa91906125c0565b610ddb565b60405161050c9190612cc5565b60405180910390f35b34801561052157600080fd5b5061052a610e70565b005b34801561053857600080fd5b50610541610ef8565b60405161054e9190612b01565b60405180910390f35b610571600480360381019061056c9190612826565b610f22565b005b34801561057f57600080fd5b506105886110cd565b6040516105959190612b83565b60405180910390f35b3480156105aa57600080fd5b506105b361115f565b6040516105c09190612cc5565b60405180910390f35b3480156105d557600080fd5b506105de611165565b6040516105eb9190612b68565b60405180910390f35b34801561060057600080fd5b50610609611178565b005b34801561061757600080fd5b50610632600480360381019061062d9190612703565b611220565b005b61064e60048036038101906106499190612826565b611398565b005b34801561065c57600080fd5b5061067760048036038101906106729190612680565b6114eb565b005b34801561068557600080fd5b506106a0600480360381019061069b9190612826565b61155e565b6040516106ad9190612b83565b60405180910390f35b3480156106c257600080fd5b506106cb611607565b6040516106d89190612cc5565b60405180910390f35b3480156106ed57600080fd5b506106f661160d565b005b34801561070457600080fd5b5061070d6116d8565b60405161071a9190612cc5565b60405180910390f35b34801561072f57600080fd5b5061074a600480360381019061074591906125ed565b6116de565b6040516107579190612b68565b60405180910390f35b34801561076c57600080fd5b50610787600480360381019061078291906125c0565b611772565b005b34801561079557600080fd5b5061079e61186a565b6040516107ab9190612cc5565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061080f57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061083f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461085590612f8a565b80601f016020809104026020016040519081016040528092919081815260200182805461088190612f8a565b80156108ce5780601f106108a3576101008083540402835291602001916108ce565b820191906000526020600020905b8154815290600101906020018083116108b157829003601f168201915b5050505050905090565b60006108e382611870565b610919576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061095f826118cf565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109c7576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109e661199d565b73ffffffffffffffffffffffffffffffffffffffff1614610a4957610a1281610a0d61199d565b6116de565b610a48576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600181565b6000610b0a6119a5565b6001546000540303905090565b610b1f6119ae565b73ffffffffffffffffffffffffffffffffffffffff16610b3d610ef8565b73ffffffffffffffffffffffffffffffffffffffff1614610b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8a90612c65565b60405180910390fd5b8060098190555050565b610ba88383836119b6565b505050565b610bb56119ae565b73ffffffffffffffffffffffffffffffffffffffff16610bd3610ef8565b73ffffffffffffffffffffffffffffffffffffffff1614610c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2090612c65565b60405180910390fd5b600b60019054906101000a900460ff1615600b60016101000a81548160ff021916908315150217905550565b600d6020528060005260406000206000915090505481565b600381565b610c8d838383604051806020016040528060008152506114eb565b505050565b610c9a6119ae565b73ffffffffffffffffffffffffffffffffffffffff16610cb8610ef8565b73ffffffffffffffffffffffffffffffffffffffff1614610d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0590612c65565b60405180910390fd5b80600c9080519060200190610d249291906123d4565b5050565b6000610d33826118cf565b9050919050565b600b60009054906101000a900460ff1681565b600c8054610d5a90612f8a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8690612f8a565b8015610dd35780601f10610da857610100808354040283529160200191610dd3565b820191906000526020600020905b815481529060010190602001808311610db657829003601f168201915b505050505081565b600080610de783611d7e565b1415610e1f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e786119ae565b73ffffffffffffffffffffffffffffffffffffffff16610e96610ef8565b73ffffffffffffffffffffffffffffffffffffffff1614610eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee390612c65565b60405180910390fd5b610ef66000611d88565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900460ff16610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890612c25565b60405180910390fd5b6107d081600a54610f829190612dbf565b1115610fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fba90612ca5565b60405180910390fd5b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826110109190612dbf565b1115611051576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104890612ba5565b60405180910390fd5b80600a60008282546110639190612dbf565b9250508190555080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110b99190612dbf565b925050819055506110ca3382611e4e565b50565b6060600380546110dc90612f8a565b80601f016020809104026020016040519081016040528092919081815260200182805461110890612f8a565b80156111555780601f1061112a57610100808354040283529160200191611155565b820191906000526020600020905b81548152906001019060200180831161113857829003601f168201915b5050505050905090565b6107d081565b600b60019054906101000a900460ff1681565b6111806119ae565b73ffffffffffffffffffffffffffffffffffffffff1661119e610ef8565b73ffffffffffffffffffffffffffffffffffffffff16146111f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111eb90612c65565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b61122861199d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561128d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061129a61199d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661134761199d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161138c9190612b68565b60405180910390a35050565b600b60019054906101000a900460ff166113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113de90612c25565b60405180910390fd5b6107d0611f406113f79190612dbf565b81611400610b00565b61140a9190612dbf565b1061144a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144190612c45565b60405180910390fd5b600381111561148e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148590612c05565b60405180910390fd5b8060095461149c9190612e46565b3410156114de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d590612be5565b60405180910390fd5b6114e83382611e4e565b50565b6114f68484846119b6565b60008373ffffffffffffffffffffffffffffffffffffffff163b146115585761152184848484611e6c565b611557576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061156982611870565b6115a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159f90612c85565b60405180910390fd5b6000600c80546115b790612f8a565b905014156115d45760405180602001604052806000815250611600565b600c6115df83611fcc565b6040516020016115f0929190612add565b6040516020818303038152906040525b9050919050565b611f4081565b6116156119ae565b73ffffffffffffffffffffffffffffffffffffffff16611633610ef8565b73ffffffffffffffffffffffffffffffffffffffff1614611689576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168090612c65565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156116d4573d6000803e3d6000fd5b5050565b600a5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61177a6119ae565b73ffffffffffffffffffffffffffffffffffffffff16611798610ef8565b73ffffffffffffffffffffffffffffffffffffffff16146117ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e590612c65565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561185e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185590612bc5565b60405180910390fd5b61186781611d88565b50565b60095481565b60008161187b6119a5565b1115801561188a575060005482105b80156118c8575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806118de6119a5565b11611966576000548110156119655760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611963575b600081141561195957600460008360019003935083815260200190815260200160002054905061192e565b8092505050611998565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b600033905090565b60006119c1826118cf565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611a28576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff16611a8161199d565b73ffffffffffffffffffffffffffffffffffffffff161480611ab05750611aaf86611aaa61199d565b6116de565b5b80611aed5750611abe61199d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b905080611b26576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611b3186611d7e565b1415611b69576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b76868686600161212d565b6000611b8183611d7e565b14611bbd576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611c8487611d7e565b1717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611d0e576000600185019050600060046000838152602001908152602001600020541415611d0c576000548114611d0b578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d768686866001612133565b505050505050565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e68828260405180602001604052806000815250612139565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e9261199d565b8786866040518563ffffffff1660e01b8152600401611eb49493929190612b1c565b602060405180830381600087803b158015611ece57600080fd5b505af1925050508015611eff57506040513d601f19601f82011682018060405250810190611efc91906127b0565b60015b611f79573d8060008114611f2f576040519150601f19603f3d011682016040523d82523d6000602084013e611f34565b606091505b50600081511415611f71576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612014576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612128565b600082905060005b6000821461204657808061202f90612fed565b915050600a8261203f9190612e15565b915061201c565b60008167ffffffffffffffff81111561206257612061613123565b5b6040519080825280601f01601f1916602001820160405280156120945781602001600182028036833780820191505090505b5090505b60008514612121576001826120ad9190612ea0565b9150600a856120bc9190613036565b60306120c89190612dbf565b60f81b8183815181106120de576120dd6130f4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561211a9190612e15565b9450612098565b8093505050505b919050565b50505050565b50505050565b600080549050600061214a85611d7e565b1415612182576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156121bd576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121ca600085838661212d565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161222f600185146123ca565b901b60a042901b61223f86611d7e565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612343575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122f36000878480600101955087611e6c565b612329576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061228457826000541461233e57600080fd5b6123ae565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612344575b8160008190555050506123c46000858386612133565b50505050565b6000819050919050565b8280546123e090612f8a565b90600052602060002090601f0160209004810192826124025760008555612449565b82601f1061241b57805160ff1916838001178555612449565b82800160010185558215612449579182015b8281111561244857825182559160200191906001019061242d565b5b509050612456919061245a565b5090565b5b8082111561247357600081600090555060010161245b565b5090565b600061248a61248584612d05565b612ce0565b9050828152602081018484840111156124a6576124a5613157565b5b6124b1848285612f48565b509392505050565b60006124cc6124c784612d36565b612ce0565b9050828152602081018484840111156124e8576124e7613157565b5b6124f3848285612f48565b509392505050565b60008135905061250a81613334565b92915050565b60008135905061251f8161334b565b92915050565b60008135905061253481613362565b92915050565b60008151905061254981613362565b92915050565b600082601f83011261256457612563613152565b5b8135612574848260208601612477565b91505092915050565b600082601f83011261259257612591613152565b5b81356125a28482602086016124b9565b91505092915050565b6000813590506125ba81613379565b92915050565b6000602082840312156125d6576125d5613161565b5b60006125e4848285016124fb565b91505092915050565b6000806040838503121561260457612603613161565b5b6000612612858286016124fb565b9250506020612623858286016124fb565b9150509250929050565b60008060006060848603121561264657612645613161565b5b6000612654868287016124fb565b9350506020612665868287016124fb565b9250506040612676868287016125ab565b9150509250925092565b6000806000806080858703121561269a57612699613161565b5b60006126a8878288016124fb565b94505060206126b9878288016124fb565b93505060406126ca878288016125ab565b925050606085013567ffffffffffffffff8111156126eb576126ea61315c565b5b6126f78782880161254f565b91505092959194509250565b6000806040838503121561271a57612719613161565b5b6000612728858286016124fb565b925050602061273985828601612510565b9150509250929050565b6000806040838503121561275a57612759613161565b5b6000612768858286016124fb565b9250506020612779858286016125ab565b9150509250929050565b60006020828403121561279957612798613161565b5b60006127a784828501612525565b91505092915050565b6000602082840312156127c6576127c5613161565b5b60006127d48482850161253a565b91505092915050565b6000602082840312156127f3576127f2613161565b5b600082013567ffffffffffffffff8111156128115761281061315c565b5b61281d8482850161257d565b91505092915050565b60006020828403121561283c5761283b613161565b5b600061284a848285016125ab565b91505092915050565b61285c81612ed4565b82525050565b61286b81612ee6565b82525050565b600061287c82612d7c565b6128868185612d92565b9350612896818560208601612f57565b61289f81613166565b840191505092915050565b60006128b582612d87565b6128bf8185612da3565b93506128cf818560208601612f57565b6128d881613166565b840191505092915050565b60006128ee82612d87565b6128f88185612db4565b9350612908818560208601612f57565b80840191505092915050565b6000815461292181612f8a565b61292b8186612db4565b9450600182166000811461294657600181146129575761298a565b60ff1983168652818601935061298a565b61296085612d67565b60005b8381101561298257815481890152600182019150602081019050612963565b838801955050505b50505092915050565b60006129a0601c83612da3565b91506129ab82613177565b602082019050919050565b60006129c3602683612da3565b91506129ce826131a0565b604082019050919050565b60006129e6601683612da3565b91506129f1826131ef565b602082019050919050565b6000612a09601683612da3565b9150612a1482613218565b602082019050919050565b6000612a2c601483612da3565b9150612a3782613241565b602082019050919050565b6000612a4f601283612da3565b9150612a5a8261326a565b602082019050919050565b6000612a72602083612da3565b9150612a7d82613293565b602082019050919050565b6000612a95602f83612da3565b9150612aa0826132bc565b604082019050919050565b6000612ab8601783612da3565b9150612ac38261330b565b602082019050919050565b612ad781612f3e565b82525050565b6000612ae98285612914565b9150612af582846128e3565b91508190509392505050565b6000602082019050612b166000830184612853565b92915050565b6000608082019050612b316000830187612853565b612b3e6020830186612853565b612b4b6040830185612ace565b8181036060830152612b5d8184612871565b905095945050505050565b6000602082019050612b7d6000830184612862565b92915050565b60006020820190508181036000830152612b9d81846128aa565b905092915050565b60006020820190508181036000830152612bbe81612993565b9050919050565b60006020820190508181036000830152612bde816129b6565b9050919050565b60006020820190508181036000830152612bfe816129d9565b9050919050565b60006020820190508181036000830152612c1e816129fc565b9050919050565b60006020820190508181036000830152612c3e81612a1f565b9050919050565b60006020820190508181036000830152612c5e81612a42565b9050919050565b60006020820190508181036000830152612c7e81612a65565b9050919050565b60006020820190508181036000830152612c9e81612a88565b9050919050565b60006020820190508181036000830152612cbe81612aab565b9050919050565b6000602082019050612cda6000830184612ace565b92915050565b6000612cea612cfb565b9050612cf68282612fbc565b919050565b6000604051905090565b600067ffffffffffffffff821115612d2057612d1f613123565b5b612d2982613166565b9050602081019050919050565b600067ffffffffffffffff821115612d5157612d50613123565b5b612d5a82613166565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612dca82612f3e565b9150612dd583612f3e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e0a57612e09613067565b5b828201905092915050565b6000612e2082612f3e565b9150612e2b83612f3e565b925082612e3b57612e3a613096565b5b828204905092915050565b6000612e5182612f3e565b9150612e5c83612f3e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e9557612e94613067565b5b828202905092915050565b6000612eab82612f3e565b9150612eb683612f3e565b925082821015612ec957612ec8613067565b5b828203905092915050565b6000612edf82612f1e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612f75578082015181840152602081019050612f5a565b83811115612f84576000848401525b50505050565b60006002820490506001821680612fa257607f821691505b60208210811415612fb657612fb56130c5565b5b50919050565b612fc582613166565b810181811067ffffffffffffffff82111715612fe457612fe3613123565b5b80604052505050565b6000612ff882612f3e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561302b5761302a613067565b5b600182019050919050565b600061304182612f3e565b915061304c83612f3e565b92508261305c5761305b613096565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f6e6c7920312066726565206d696e7473207065722077616c6c657400000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682045544820746f206d696e7400000000000000000000600082015250565b7f33206d696e7420706572207472616e73616374696f6e00000000000000000000600082015250565b7f4576656e742068617665206e6f74207374617274000000000000000000000000600082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f46726565206d696e7420737570706c792066696e697368000000000000000000600082015250565b61333d81612ed4565b811461334857600080fd5b50565b61335481612ee6565b811461335f57600080fd5b50565b61336b81612ef2565b811461337657600080fd5b50565b61338281612f3e565b811461338d57600080fd5b5056fea2646970667358221220d43f29bc82dc0db5ce29da9aa7df05c0a58d45988f1e273d9583c97d435e541d64736f6c63430008070033
Deployed Bytecode Sourcemap
44309:2959:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18602:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23625:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25693:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25153:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44486:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17656:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46100:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26579:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46405:99;;;;;;;;;;;;;:::i;:::-;;44762:57;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44533:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26820:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46255:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23414:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44662:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44732:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19281:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4730:103;;;;;;;;;;;;;:::i;:::-;;4079:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45575:464;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23794:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44388:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44696:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46570:98;;;;;;;;;;;;;:::i;:::-;;25969:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45101:410;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27076:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46720:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44437:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47118:147;;;;;;;;;;;;;:::i;:::-;;44625:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26348:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4988:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44580:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18602:615;18687:4;19002:10;18987:25;;:11;:25;;;;:102;;;;19079:10;19064:25;;:11;:25;;;;18987:102;:179;;;;19156:10;19141:25;;:11;:25;;;;18987:179;18967:199;;18602:615;;;:::o;23625:100::-;23679:13;23712:5;23705:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23625:100;:::o;25693:204::-;25761:7;25786:16;25794:7;25786;:16::i;:::-;25781:64;;25811:34;;;;;;;;;;;;;;25781:64;25865:15;:24;25881:7;25865:24;;;;;;;;;;;;;;;;;;;;;25858:31;;25693:204;;;:::o;25153:474::-;25226:13;25258:27;25277:7;25258:18;:27::i;:::-;25226:61;;25308:5;25302:11;;:2;:11;;;25298:48;;;25322:24;;;;;;;;;;;;;;25298:48;25386:5;25363:28;;:19;:17;:19::i;:::-;:28;;;25359:175;;25411:44;25428:5;25435:19;:17;:19::i;:::-;25411:16;:44::i;:::-;25406:128;;25483:35;;;;;;;;;;;;;;25406:128;25359:175;25573:2;25546:15;:24;25562:7;25546:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;25611:7;25607:2;25591:28;;25600:5;25591:28;;;;;;;;;;;;25215:412;25153:474;;:::o;44486:40::-;44525:1;44486:40;:::o;17656:315::-;17709:7;17937:15;:13;:15::i;:::-;17922:12;;17906:13;;:28;:46;17899:53;;17656:315;:::o;46100:100::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46182:10:::1;46170:9;:22;;;;46100:100:::0;:::o;26579:170::-;26713:28;26723:4;26729:2;26733:7;26713:9;:28::i;:::-;26579:170;;;:::o;46405:99::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46481:15:::1;;;;;;;;;;;46480:16;46462:15;;:34;;;;;;;;;;;;;;;;;;46405:99::o:0;44762:57::-;;;;;;;;;;;;;;;;;:::o;44533:40::-;44572:1;44533:40;:::o;26820:185::-;26958:39;26975:4;26981:2;26985:7;26958:39;;;;;;;;;;;;:16;:39::i;:::-;26820:185;;;:::o;46255:88::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46332:3:::1;46322:7;:13;;;;;;;;;;;;:::i;:::-;;46255:88:::0;:::o;23414:144::-;23478:7;23521:27;23540:7;23521:18;:27::i;:::-;23498:52;;23414:144;;;:::o;44662:27::-;;;;;;;;;;;;;:::o;44732:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19281:234::-;19345:7;19397:1;19369:24;19387:5;19369:17;:24::i;:::-;:29;19365:70;;;19407:28;;;;;;;;;;;;;;19365:70;14620:13;19453:18;:25;19472:5;19453:25;;;;;;;;;;;;;;;;:54;19446:61;;19281:234;;;:::o;4730:103::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4795:30:::1;4822:1;4795:18;:30::i;:::-;4730:103::o:0;4079:87::-;4125:7;4152:6;;;;;;;;;;;4145:13;;4079:87;:::o;45575:464::-;45650:15;;;;;;;;;;;45642:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;44426:4;45725:9;45709:13;;:25;;;;:::i;:::-;:40;;45701:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;44525:1;45808:22;:34;45831:10;45808:34;;;;;;;;;;;;;;;;45796:9;:46;;;;:::i;:::-;:62;;45788:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;45921:9;45904:13;;:26;;;;;;;:::i;:::-;;;;;;;;45979:9;45941:22;:34;45964:10;45941:34;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;45999:32;46009:10;46021:9;45999;:32::i;:::-;45575:464;:::o;23794:104::-;23850:13;23883:7;23876:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23794:104;:::o;44388:42::-;44426:4;44388:42;:::o;44696:27::-;;;;;;;;;;;;;:::o;46570:98::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46645:15:::1;;;;;;;;;;;46644:16;46626:15;;:34;;;;;;;;;;;;;;;;;;46570:98::o:0;25969:308::-;26080:19;:17;:19::i;:::-;26068:31;;:8;:31;;;26064:61;;;26108:17;;;;;;;;;;;;;;26064:61;26190:8;26138:18;:39;26157:19;:17;:19::i;:::-;26138:39;;;;;;;;;;;;;;;:49;26178:8;26138:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26250:8;26214:55;;26229:19;:17;:19::i;:::-;26214:55;;;26260:8;26214:55;;;;;;:::i;:::-;;;;;;;;25969:308;;:::o;45101:410::-;45172:15;;;;;;;;;;;45164:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;44426:4;44475;45259:25;;;;:::i;:::-;45247:9;45231:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:53;45223:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;44572:1;45326:9;:25;;45318:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;45422:9;45410;;:21;;;;:::i;:::-;45397:9;:34;;45389:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;45471:32;45481:10;45493:9;45471;:32::i;:::-;45101:410;:::o;27076:396::-;27243:28;27253:4;27259:2;27263:7;27243:9;:28::i;:::-;27304:1;27286:2;:14;;;:19;27282:183;;27325:56;27356:4;27362:2;27366:7;27375:5;27325:30;:56::i;:::-;27320:145;;27409:40;;;;;;;;;;;;;;27320:145;27282:183;27076:396;;;;:::o;46720:341::-;46839:13;46878:17;46886:8;46878:7;:17::i;:::-;46870:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;46990:1;46971:7;46965:21;;;;;:::i;:::-;;;:26;;:88;;;;;;;;;;;;;;;;;47018:7;47027:19;:8;:17;:19::i;:::-;47001:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46965:88;46958:95;;46720:341;;;:::o;44437:42::-;44475:4;44437:42;:::o;47118:147::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47170:15:::1;47188:21;47170:39;;47228:10;47220:28;;:37;47249:7;47220:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;47159:106;47118:147::o:0;44625:28::-;;;;:::o;26348:164::-;26445:4;26469:18;:25;26488:5;26469:25;;;;;;;;;;;;;;;:35;26495:8;26469:35;;;;;;;;;;;;;;;;;;;;;;;;;26462:42;;26348:164;;;;:::o;4988:201::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5097:1:::1;5077:22;;:8;:22;;;;5069:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5153:28;5172:8;5153:18;:28::i;:::-;4988:201:::0;:::o;44580:38::-;;;;:::o;27727:273::-;27784:4;27840:7;27821:15;:13;:15::i;:::-;:26;;:66;;;;;27874:13;;27864:7;:23;27821:66;:152;;;;;27972:1;15390:8;27925:17;:26;27943:7;27925:26;;;;;;;;;;;;:43;:48;27821:152;27801:172;;27727:273;;;:::o;20929:1129::-;20996:7;21016:12;21031:7;21016:22;;21099:4;21080:15;:13;:15::i;:::-;:23;21076:915;;21133:13;;21126:4;:20;21122:869;;;21171:14;21188:17;:23;21206:4;21188:23;;;;;;;;;;;;21171:40;;21304:1;15390:8;21277:6;:23;:28;21273:699;;;21796:113;21813:1;21803:6;:11;21796:113;;;21856:17;:25;21874:6;;;;;;;21856:25;;;;;;;;;;;;21847:34;;21796:113;;;21942:6;21935:13;;;;;;21273:699;21148:843;21122:869;21076:915;22019:31;;;;;;;;;;;;;;20929:1129;;;;:::o;41995:105::-;42055:7;42082:10;42075:17;;41995:105;:::o;44937:101::-;45002:7;45029:1;45022:8;;44937:101;:::o;2803:98::-;2856:7;2883:10;2876:17;;2803:98;:::o;32986:2654::-;33101:27;33131;33150:7;33131:18;:27::i;:::-;33101:57;;33216:4;33175:45;;33191:19;33175:45;;;33171:86;;33229:28;;;;;;;;;;;;;;33171:86;33270:23;33296:15;:24;33312:7;33296:24;;;;;;;;;;;;;;;;;;;;;33270:50;;33333:22;33382:4;33359:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;33403:43;33420:4;33426:19;:17;:19::i;:::-;33403:16;:43::i;:::-;33359:87;:142;;;;33482:19;:17;:19::i;:::-;33463:38;;:15;:38;;;33359:142;33333:169;;33520:17;33515:66;;33546:35;;;;;;;;;;;;;;33515:66;33621:1;33596:21;33614:2;33596:17;:21::i;:::-;:26;33592:62;;;33631:23;;;;;;;;;;;;;;33592:62;33667:43;33689:4;33695:2;33699:7;33708:1;33667:21;:43::i;:::-;33818:1;33780:34;33798:15;33780:17;:34::i;:::-;:39;33776:103;;33843:15;:24;33859:7;33843:24;;;;;;;;;;;;33836:31;;;;;;;;;;;33776:103;34246:18;:24;34265:4;34246:24;;;;;;;;;;;;;;;;34244:26;;;;;;;;;;;;34315:18;:22;34334:2;34315:22;;;;;;;;;;;;;;;;34313:24;;;;;;;;;;;15672:8;15274:3;34696:15;:41;;34654:21;34672:2;34654:17;:21::i;:::-;:84;:128;34608:17;:26;34626:7;34608:26;;;;;;;;;;;:174;;;;34952:1;15672:8;34902:19;:46;:51;34898:626;;;34974:19;35006:1;34996:7;:11;34974:33;;35163:1;35129:17;:30;35147:11;35129:30;;;;;;;;;;;;:35;35125:384;;;35267:13;;35252:11;:28;35248:242;;35447:19;35414:17;:30;35432:11;35414:30;;;;;;;;;;;:52;;;;35248:242;35125:384;34955:569;34898:626;35571:7;35567:2;35552:27;;35561:4;35552:27;;;;;;;;;;;;35590:42;35611:4;35617:2;35621:7;35630:1;35590:20;:42::i;:::-;33090:2550;;;32986:2654;;;:::o;24714:148::-;24778:14;24839:5;24829:15;;24714:148;;;:::o;5349:191::-;5423:16;5442:6;;;;;;;;;;;5423:25;;5468:8;5459:6;;:17;;;;;;;;;;;;;;;;;;5523:8;5492:40;;5513:8;5492:40;;;;;;;;;;;;5412:128;5349:191;:::o;28084:104::-;28153:27;28163:2;28167:8;28153:27;;;;;;;;;;;;:9;:27::i;:::-;28084:104;;:::o;39464:716::-;39627:4;39673:2;39648:45;;;39694:19;:17;:19::i;:::-;39715:4;39721:7;39730:5;39648:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39644:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39948:1;39931:6;:13;:18;39927:235;;;39977:40;;;;;;;;;;;;;;39927:235;40120:6;40114:13;40105:6;40101:2;40097:15;40090:38;39644:529;39817:54;;;39807:64;;;:6;:64;;;;39800:71;;;39464:716;;;;;;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;40828:159::-;;;;;:::o;41646:158::-;;;;;:::o;28561:2246::-;28684:20;28707:13;;28684:36;;28760:1;28735:21;28753:2;28735:17;:21::i;:::-;:26;28731:58;;;28770:19;;;;;;;;;;;;;;28731:58;28816:1;28804:8;:13;28800:44;;;28826:18;;;;;;;;;;;;;;28800:44;28857:61;28887:1;28891:2;28895:12;28909:8;28857:21;:61::i;:::-;29461:1;14757:2;29432:1;:25;;29431:31;29419:8;:44;29393:18;:22;29412:2;29393:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;15537:3;29862:29;29889:1;29877:8;:13;29862:14;:29::i;:::-;:56;;15274:3;29799:15;:41;;29757:21;29775:2;29757:17;:21::i;:::-;:84;:162;29706:17;:31;29724:12;29706:31;;;;;;;;;;;:213;;;;29936:20;29959:12;29936:35;;29986:11;30015:8;30000:12;:23;29986:37;;30062:1;30044:2;:14;;;:19;30040:635;;30084:313;30140:12;30136:2;30115:38;;30132:1;30115:38;;;;;;;;;;;;30181:69;30220:1;30224:2;30228:14;;;;;;30244:5;30181:30;:69::i;:::-;30176:174;;30286:40;;;;;;;;;;;;;;30176:174;30392:3;30377:12;:18;30084:313;;30478:12;30461:13;;:29;30457:43;;30492:8;;;30457:43;30040:635;;;30541:119;30597:14;;;;;;30593:2;30572:40;;30589:1;30572:40;;;;;;;;;;;;30655:3;30640:12;:18;30541:119;;30040:635;30705:12;30689:13;:28;;;;29170:1559;;30739:60;30768:1;30772:2;30776:12;30790:8;30739:20;:60::i;:::-;28673:2134;28561:2246;;;:::o;24949:142::-;25007:14;25068:5;25058:15;;24949:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8540:845::-;8643:3;8680:5;8674:12;8709:36;8735:9;8709:36;:::i;:::-;8761:89;8843:6;8838:3;8761:89;:::i;:::-;8754:96;;8881:1;8870:9;8866:17;8897:1;8892:137;;;;9043:1;9038:341;;;;8859:520;;8892:137;8976:4;8972:9;8961;8957:25;8952:3;8945:38;9012:6;9007:3;9003:16;8996:23;;8892:137;;9038:341;9105:38;9137:5;9105:38;:::i;:::-;9165:1;9179:154;9193:6;9190:1;9187:13;9179:154;;;9267:7;9261:14;9257:1;9252:3;9248:11;9241:35;9317:1;9308:7;9304:15;9293:26;;9215:4;9212:1;9208:12;9203:17;;9179:154;;;9362:6;9357:3;9353:16;9346:23;;9045:334;;8859:520;;8647:738;;8540:845;;;;:::o;9391:366::-;9533:3;9554:67;9618:2;9613:3;9554:67;:::i;:::-;9547:74;;9630:93;9719:3;9630:93;:::i;:::-;9748:2;9743:3;9739:12;9732:19;;9391:366;;;:::o;9763:::-;9905:3;9926:67;9990:2;9985:3;9926:67;:::i;:::-;9919:74;;10002:93;10091:3;10002:93;:::i;:::-;10120:2;10115:3;10111:12;10104:19;;9763:366;;;:::o;10135:::-;10277:3;10298:67;10362:2;10357:3;10298:67;:::i;:::-;10291:74;;10374:93;10463:3;10374:93;:::i;:::-;10492:2;10487:3;10483:12;10476:19;;10135:366;;;:::o;10507:::-;10649:3;10670:67;10734:2;10729:3;10670:67;:::i;:::-;10663:74;;10746:93;10835:3;10746:93;:::i;:::-;10864:2;10859:3;10855:12;10848:19;;10507:366;;;:::o;10879:::-;11021:3;11042:67;11106:2;11101:3;11042:67;:::i;:::-;11035:74;;11118:93;11207:3;11118:93;:::i;:::-;11236:2;11231:3;11227:12;11220:19;;10879:366;;;:::o;11251:::-;11393:3;11414:67;11478:2;11473:3;11414:67;:::i;:::-;11407:74;;11490:93;11579:3;11490:93;:::i;:::-;11608:2;11603:3;11599:12;11592:19;;11251:366;;;:::o;11623:::-;11765:3;11786:67;11850:2;11845:3;11786:67;:::i;:::-;11779:74;;11862:93;11951:3;11862:93;:::i;:::-;11980:2;11975:3;11971:12;11964:19;;11623:366;;;:::o;11995:::-;12137:3;12158:67;12222:2;12217:3;12158:67;:::i;:::-;12151:74;;12234:93;12323:3;12234:93;:::i;:::-;12352:2;12347:3;12343:12;12336:19;;11995:366;;;:::o;12367:::-;12509:3;12530:67;12594:2;12589:3;12530:67;:::i;:::-;12523:74;;12606:93;12695:3;12606:93;:::i;:::-;12724:2;12719:3;12715:12;12708:19;;12367:366;;;:::o;12739:118::-;12826:24;12844:5;12826:24;:::i;:::-;12821:3;12814:37;12739:118;;:::o;12863:429::-;13040:3;13062:92;13150:3;13141:6;13062:92;:::i;:::-;13055:99;;13171:95;13262:3;13253:6;13171:95;:::i;:::-;13164:102;;13283:3;13276:10;;12863:429;;;;;:::o;13298:222::-;13391:4;13429:2;13418:9;13414:18;13406:26;;13442:71;13510:1;13499:9;13495:17;13486:6;13442:71;:::i;:::-;13298:222;;;;:::o;13526:640::-;13721:4;13759:3;13748:9;13744:19;13736:27;;13773:71;13841:1;13830:9;13826:17;13817:6;13773:71;:::i;:::-;13854:72;13922:2;13911:9;13907:18;13898:6;13854:72;:::i;:::-;13936;14004:2;13993:9;13989:18;13980:6;13936:72;:::i;:::-;14055:9;14049:4;14045:20;14040:2;14029:9;14025:18;14018:48;14083:76;14154:4;14145:6;14083:76;:::i;:::-;14075:84;;13526:640;;;;;;;:::o;14172:210::-;14259:4;14297:2;14286:9;14282:18;14274:26;;14310:65;14372:1;14361:9;14357:17;14348:6;14310:65;:::i;:::-;14172:210;;;;:::o;14388:313::-;14501:4;14539:2;14528:9;14524:18;14516:26;;14588:9;14582:4;14578:20;14574:1;14563:9;14559:17;14552:47;14616:78;14689:4;14680:6;14616:78;:::i;:::-;14608:86;;14388:313;;;;:::o;14707:419::-;14873:4;14911:2;14900:9;14896:18;14888:26;;14960:9;14954:4;14950:20;14946:1;14935:9;14931:17;14924:47;14988:131;15114:4;14988:131;:::i;:::-;14980:139;;14707:419;;;:::o;15132:::-;15298:4;15336:2;15325:9;15321:18;15313:26;;15385:9;15379:4;15375:20;15371:1;15360:9;15356:17;15349:47;15413:131;15539:4;15413:131;:::i;:::-;15405:139;;15132:419;;;:::o;15557:::-;15723:4;15761:2;15750:9;15746:18;15738:26;;15810:9;15804:4;15800:20;15796:1;15785:9;15781:17;15774:47;15838:131;15964:4;15838:131;:::i;:::-;15830:139;;15557:419;;;:::o;15982:::-;16148:4;16186:2;16175:9;16171:18;16163:26;;16235:9;16229:4;16225:20;16221:1;16210:9;16206:17;16199:47;16263:131;16389:4;16263:131;:::i;:::-;16255:139;;15982:419;;;:::o;16407:::-;16573:4;16611:2;16600:9;16596:18;16588:26;;16660:9;16654:4;16650:20;16646:1;16635:9;16631:17;16624:47;16688:131;16814:4;16688:131;:::i;:::-;16680:139;;16407:419;;;:::o;16832:::-;16998:4;17036:2;17025:9;17021:18;17013:26;;17085:9;17079:4;17075:20;17071:1;17060:9;17056:17;17049:47;17113:131;17239:4;17113:131;:::i;:::-;17105:139;;16832:419;;;:::o;17257:::-;17423:4;17461:2;17450:9;17446:18;17438:26;;17510:9;17504:4;17500:20;17496:1;17485:9;17481:17;17474:47;17538:131;17664:4;17538:131;:::i;:::-;17530:139;;17257:419;;;:::o;17682:::-;17848:4;17886:2;17875:9;17871:18;17863:26;;17935:9;17929:4;17925:20;17921:1;17910:9;17906:17;17899:47;17963:131;18089:4;17963:131;:::i;:::-;17955:139;;17682:419;;;:::o;18107:::-;18273:4;18311:2;18300:9;18296:18;18288:26;;18360:9;18354:4;18350:20;18346:1;18335:9;18331:17;18324:47;18388:131;18514:4;18388:131;:::i;:::-;18380:139;;18107:419;;;:::o;18532:222::-;18625:4;18663:2;18652:9;18648:18;18640:26;;18676:71;18744:1;18733:9;18729:17;18720:6;18676:71;:::i;:::-;18532:222;;;;:::o;18760:129::-;18794:6;18821:20;;:::i;:::-;18811:30;;18850:33;18878:4;18870:6;18850:33;:::i;:::-;18760:129;;;:::o;18895:75::-;18928:6;18961:2;18955:9;18945:19;;18895:75;:::o;18976:307::-;19037:4;19127:18;19119:6;19116:30;19113:56;;;19149:18;;:::i;:::-;19113:56;19187:29;19209:6;19187:29;:::i;:::-;19179:37;;19271:4;19265;19261:15;19253:23;;18976:307;;;:::o;19289:308::-;19351:4;19441:18;19433:6;19430:30;19427:56;;;19463:18;;:::i;:::-;19427:56;19501:29;19523:6;19501:29;:::i;:::-;19493:37;;19585:4;19579;19575:15;19567:23;;19289:308;;;:::o;19603:141::-;19652:4;19675:3;19667:11;;19698:3;19695:1;19688:14;19732:4;19729:1;19719:18;19711:26;;19603:141;;;:::o;19750:98::-;19801:6;19835:5;19829:12;19819:22;;19750:98;;;:::o;19854:99::-;19906:6;19940:5;19934:12;19924:22;;19854:99;;;:::o;19959:168::-;20042:11;20076:6;20071:3;20064:19;20116:4;20111:3;20107:14;20092:29;;19959:168;;;;:::o;20133:169::-;20217:11;20251:6;20246:3;20239:19;20291:4;20286:3;20282:14;20267:29;;20133:169;;;;:::o;20308:148::-;20410:11;20447:3;20432:18;;20308:148;;;;:::o;20462:305::-;20502:3;20521:20;20539:1;20521:20;:::i;:::-;20516:25;;20555:20;20573:1;20555:20;:::i;:::-;20550:25;;20709:1;20641:66;20637:74;20634:1;20631:81;20628:107;;;20715:18;;:::i;:::-;20628:107;20759:1;20756;20752:9;20745:16;;20462:305;;;;:::o;20773:185::-;20813:1;20830:20;20848:1;20830:20;:::i;:::-;20825:25;;20864:20;20882:1;20864:20;:::i;:::-;20859:25;;20903:1;20893:35;;20908:18;;:::i;:::-;20893:35;20950:1;20947;20943:9;20938:14;;20773:185;;;;:::o;20964:348::-;21004:7;21027:20;21045:1;21027:20;:::i;:::-;21022:25;;21061:20;21079:1;21061:20;:::i;:::-;21056:25;;21249:1;21181:66;21177:74;21174:1;21171:81;21166:1;21159:9;21152:17;21148:105;21145:131;;;21256:18;;:::i;:::-;21145:131;21304:1;21301;21297:9;21286:20;;20964:348;;;;:::o;21318:191::-;21358:4;21378:20;21396:1;21378:20;:::i;:::-;21373:25;;21412:20;21430:1;21412:20;:::i;:::-;21407:25;;21451:1;21448;21445:8;21442:34;;;21456:18;;:::i;:::-;21442:34;21501:1;21498;21494:9;21486:17;;21318:191;;;;:::o;21515:96::-;21552:7;21581:24;21599:5;21581:24;:::i;:::-;21570:35;;21515:96;;;:::o;21617:90::-;21651:7;21694:5;21687:13;21680:21;21669:32;;21617:90;;;:::o;21713:149::-;21749:7;21789:66;21782:5;21778:78;21767:89;;21713:149;;;:::o;21868:126::-;21905:7;21945:42;21938:5;21934:54;21923:65;;21868:126;;;:::o;22000:77::-;22037:7;22066:5;22055:16;;22000:77;;;:::o;22083:154::-;22167:6;22162:3;22157;22144:30;22229:1;22220:6;22215:3;22211:16;22204:27;22083:154;;;:::o;22243:307::-;22311:1;22321:113;22335:6;22332:1;22329:13;22321:113;;;22420:1;22415:3;22411:11;22405:18;22401:1;22396:3;22392:11;22385:39;22357:2;22354:1;22350:10;22345:15;;22321:113;;;22452:6;22449:1;22446:13;22443:101;;;22532:1;22523:6;22518:3;22514:16;22507:27;22443:101;22292:258;22243:307;;;:::o;22556:320::-;22600:6;22637:1;22631:4;22627:12;22617:22;;22684:1;22678:4;22674:12;22705:18;22695:81;;22761:4;22753:6;22749:17;22739:27;;22695:81;22823:2;22815:6;22812:14;22792:18;22789:38;22786:84;;;22842:18;;:::i;:::-;22786:84;22607:269;22556:320;;;:::o;22882:281::-;22965:27;22987:4;22965:27;:::i;:::-;22957:6;22953:40;23095:6;23083:10;23080:22;23059:18;23047:10;23044:34;23041:62;23038:88;;;23106:18;;:::i;:::-;23038:88;23146:10;23142:2;23135:22;22925:238;22882:281;;:::o;23169:233::-;23208:3;23231:24;23249:5;23231:24;:::i;:::-;23222:33;;23277:66;23270:5;23267:77;23264:103;;;23347:18;;:::i;:::-;23264:103;23394:1;23387:5;23383:13;23376:20;;23169:233;;;:::o;23408:176::-;23440:1;23457:20;23475:1;23457:20;:::i;:::-;23452:25;;23491:20;23509:1;23491:20;:::i;:::-;23486:25;;23530:1;23520:35;;23535:18;;:::i;:::-;23520:35;23576:1;23573;23569:9;23564:14;;23408:176;;;;:::o;23590:180::-;23638:77;23635:1;23628:88;23735:4;23732:1;23725:15;23759:4;23756:1;23749:15;23776:180;23824:77;23821:1;23814:88;23921:4;23918:1;23911:15;23945:4;23942:1;23935:15;23962:180;24010:77;24007:1;24000:88;24107:4;24104:1;24097:15;24131:4;24128:1;24121:15;24148:180;24196:77;24193:1;24186:88;24293:4;24290:1;24283:15;24317:4;24314:1;24307:15;24334:180;24382:77;24379:1;24372:88;24479:4;24476:1;24469:15;24503:4;24500:1;24493:15;24520:117;24629:1;24626;24619:12;24643:117;24752:1;24749;24742:12;24766:117;24875:1;24872;24865:12;24889:117;24998:1;24995;24988:12;25012:102;25053:6;25104:2;25100:7;25095:2;25088:5;25084:14;25080:28;25070:38;;25012:102;;;:::o;25120:178::-;25260:30;25256:1;25248:6;25244:14;25237:54;25120:178;:::o;25304:225::-;25444:34;25440:1;25432:6;25428:14;25421:58;25513:8;25508:2;25500:6;25496:15;25489:33;25304:225;:::o;25535:172::-;25675:24;25671:1;25663:6;25659:14;25652:48;25535:172;:::o;25713:::-;25853:24;25849:1;25841:6;25837:14;25830:48;25713:172;:::o;25891:170::-;26031:22;26027:1;26019:6;26015:14;26008:46;25891:170;:::o;26067:168::-;26207:20;26203:1;26195:6;26191:14;26184:44;26067:168;:::o;26241:182::-;26381:34;26377:1;26369:6;26365:14;26358:58;26241:182;:::o;26429:234::-;26569:34;26565:1;26557:6;26553:14;26546:58;26638:17;26633:2;26625:6;26621:15;26614:42;26429:234;:::o;26669:173::-;26809:25;26805:1;26797:6;26793:14;26786:49;26669:173;:::o;26848:122::-;26921:24;26939:5;26921:24;:::i;:::-;26914:5;26911:35;26901:63;;26960:1;26957;26950:12;26901:63;26848:122;:::o;26976:116::-;27046:21;27061:5;27046:21;:::i;:::-;27039:5;27036:32;27026:60;;27082:1;27079;27072:12;27026:60;26976:116;:::o;27098:120::-;27170:23;27187:5;27170:23;:::i;:::-;27163:5;27160:34;27150:62;;27208:1;27205;27198:12;27150:62;27098:120;:::o;27224:122::-;27297:24;27315:5;27297:24;:::i;:::-;27290:5;27287:35;27277:63;;27336:1;27333;27326:12;27277:63;27224:122;:::o
Swarm Source
ipfs://d43f29bc82dc0db5ce29da9aa7df05c0a58d45988f1e273d9583c97d435e541d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.