ERC-721
Overview
Max Total Supply
520 DB
Holders
136
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
6 DBLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Digibutts
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-12-08 */ // 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: erc721a/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: erc721a/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 (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: DIGIBUTTS.sol pragma solidity ^0.8.11; interface CryptoDickButts{ function balanceOf(address owner) external view returns(uint256); } contract Digibutts is ERC721A, Ownable{ using Strings for uint; mapping(address=>uint256) public maxCanMint; mapping(address=>uint256) public numberMinted; string private _baseURIextended = "ipfs://QmV4Mpu7wmWZqJrhik6evwM5wNzQXNfVTfunmJXTi11GXq/"; string private beforeRevealUri = ""; bool revealed = false; bool paused = false; uint256 tokenCount; uint256 whiteListPeriod; CryptoDickButts cryptoDickButts; constructor() ERC721A("Digibutts", "DB") { whiteListPeriod = block.timestamp + 30 minutes; //test 0x358AA13c52544ECCEF6B0ADD0f801012ADAD5eE3 _safeMint(address(this), 1); cryptoDickButts = CryptoDickButts(0x42069ABFE407C60cf4ae4112bEDEaD391dBa1cdB); } function setBaseURI(string memory baseURI_) external onlyOwner() { _baseURIextended = baseURI_; } function _baseURI() internal view virtual override returns (string memory) { return _baseURIextended; } function mint(uint256 quantity) external payable { require(quantity <= 10, "Maximum mint is 10"); uint256 tokensMinted = tokenCount; address owner = owner(); uint256 amount = 0.0069 ether * quantity; if(tokensMinted >= 200 || block.timestamp > whiteListPeriod){ require(msg.value == amount, "Mint amount too low"); }else{ require(cryptoDickButts.balanceOf(msg.sender) > 0, "You're not whitelisted"); } require(numberMinted[msg.sender] < 10, "You've reached your maximum mint limit"); require(paused == false, "Paused Minting"); payable(owner).transfer(msg.value); numberMinted[msg.sender] += quantity; tokenCount += 1; _safeMint(msg.sender, quantity); } function reveal() external onlyOwner() { revealed = true; } function pause() external onlyOwner() { paused = true; } function unpause() external onlyOwner() { paused = false; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); if(revealed == true){ return bytes(baseURI).length > 0 ? string( abi.encodePacked(baseURI, Strings.toString(tokenId), ".json")) : ""; }else{ return bytes(baseURI).length > 0 ? beforeRevealUri : ""; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":[{"internalType":"address","name":"","type":"address"}],"name":"maxCanMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180606001604052806036815260200162003ff160369139600b90816200002e9190620009bf565b5060405180602001604052806000815250600c90816200004f9190620009bf565b506000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055503480156200009357600080fd5b506040518060400160405280600981526020017f44696769627574747300000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f44420000000000000000000000000000000000000000000000000000000000008152508160029081620001119190620009bf565b508060039081620001239190620009bf565b5062000134620001e060201b60201c565b60008190555050506200015c62000150620001e560201b60201c565b620001ed60201b60201c565b610708426200016c919062000ad5565b600f8190555062000185306001620002b360201b60201c565b7342069abfe407c60cf4ae4112bedead391dba1cdb601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000ce8565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002d5828260405180602001604052806000815250620002d960201b60201c565b5050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160362000346576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000830362000381576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620003966000858386620005bc60201b60201c565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16200040360018514620005c260201b60201c565b901b60a042901b6200041b86620005cc60201b60201c565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146200052c575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4620004d86000878480600101955087620005d660201b60201c565b6200050f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210620004615782600054146200052657600080fd5b62000598565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106200052d575b816000819055505050620005b660008583866200073760201b60201c565b50505050565b50505050565b6000819050919050565b6000819050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006046200073d60201b60201c565b8786866040518563ffffffff1660e01b815260040162000628949392919062000c00565b6020604051808303816000875af19250505080156200066757506040513d601f19601f8201168201806040525081019062000664919062000cb6565b60015b620006e4573d80600081146200069a576040519150601f19603f3d011682016040523d82523d6000602084013e6200069f565b606091505b506000815103620006dc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b600033905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007c757607f821691505b602082108103620007dd57620007dc6200077f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008477fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000808565b62000853868362000808565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620008a06200089a62000894846200086b565b62000875565b6200086b565b9050919050565b6000819050919050565b620008bc836200087f565b620008d4620008cb82620008a7565b84845462000815565b825550505050565b600090565b620008eb620008dc565b620008f8818484620008b1565b505050565b5b81811015620009205762000914600082620008e1565b600181019050620008fe565b5050565b601f8211156200096f576200093981620007e3565b6200094484620007f8565b8101602085101562000954578190505b6200096c6200096385620007f8565b830182620008fd565b50505b505050565b600082821c905092915050565b6000620009946000198460080262000974565b1980831691505092915050565b6000620009af838362000981565b9150826002028217905092915050565b620009ca8262000745565b67ffffffffffffffff811115620009e657620009e562000750565b5b620009f28254620007ae565b620009ff82828562000924565b600060209050601f83116001811462000a37576000841562000a22578287015190505b62000a2e8582620009a1565b86555062000a9e565b601f19841662000a4786620007e3565b60005b8281101562000a715784890151825560018201915060208501945060208101905062000a4a565b8683101562000a91578489015162000a8d601f89168262000981565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ae2826200086b565b915062000aef836200086b565b925082820190508082111562000b0a5762000b0962000aa6565b5b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000b3d8262000b10565b9050919050565b62000b4f8162000b30565b82525050565b62000b60816200086b565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101562000ba257808201518184015260208101905062000b85565b60008484015250505050565b6000601f19601f8301169050919050565b600062000bcc8262000b66565b62000bd8818562000b71565b935062000bea81856020860162000b82565b62000bf58162000bae565b840191505092915050565b600060808201905062000c17600083018762000b44565b62000c26602083018662000b44565b62000c35604083018562000b55565b818103606083015262000c49818462000bbf565b905095945050505050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000c908162000c59565b811462000c9c57600080fd5b50565b60008151905062000cb08162000c85565b92915050565b60006020828403121562000ccf5762000cce62000c54565b5b600062000cdf8482850162000c9f565b91505092915050565b6132f98062000cf86000396000f3fe60806040526004361061014b5760003560e01c80638456cb59116100b6578063a475b5dd1161006f578063a475b5dd1461045b578063b88d4fde14610472578063c87b56dd1461049b578063dc33e681146104d8578063e985e9c514610515578063f2fde38b146105525761014b565b80638456cb591461036c5780638aaeba6a146103835780638da5cb5b146103c057806395d89b41146103eb578063a0712d6814610416578063a22cb465146104325761014b565b80633f4ba83a116101085780633f4ba83a1461027257806342842e0e1461028957806355f804b3146102b25780636352211e146102db57806370a0823114610318578063715018a6146103555761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f557806318160ddd1461021e57806323b872dd14610249575b600080fd5b34801561015c57600080fd5b506101776004803603810190610172919061221e565b61057b565b6040516101849190612266565b60405180910390f35b34801561019957600080fd5b506101a261060d565b6040516101af9190612311565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da9190612369565b61069f565b6040516101ec91906123d7565b60405180910390f35b34801561020157600080fd5b5061021c6004803603810190610217919061241e565b61071b565b005b34801561022a57600080fd5b506102336108c1565b604051610240919061246d565b60405180910390f35b34801561025557600080fd5b50610270600480360381019061026b9190612488565b6108d8565b005b34801561027e57600080fd5b506102876108e8565b005b34801561029557600080fd5b506102b060048036038101906102ab9190612488565b610981565b005b3480156102be57600080fd5b506102d960048036038101906102d49190612610565b6109a1565b005b3480156102e757600080fd5b5061030260048036038101906102fd9190612369565b610a30565b60405161030f91906123d7565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a9190612659565b610a42565b60405161034c919061246d565b60405180910390f35b34801561036157600080fd5b5061036a610afa565b005b34801561037857600080fd5b50610381610b82565b005b34801561038f57600080fd5b506103aa60048036038101906103a59190612659565b610c1b565b6040516103b7919061246d565b60405180910390f35b3480156103cc57600080fd5b506103d5610c33565b6040516103e291906123d7565b60405180910390f35b3480156103f757600080fd5b50610400610c5d565b60405161040d9190612311565b60405180910390f35b610430600480360381019061042b9190612369565b610cef565b005b34801561043e57600080fd5b50610459600480360381019061045491906126b2565b611037565b005b34801561046757600080fd5b506104706111ae565b005b34801561047e57600080fd5b5061049960048036038101906104949190612793565b611247565b005b3480156104a757600080fd5b506104c260048036038101906104bd9190612369565b6112ba565b6040516104cf9190612311565b60405180910390f35b3480156104e457600080fd5b506104ff60048036038101906104fa9190612659565b61142f565b60405161050c919061246d565b60405180910390f35b34801561052157600080fd5b5061053c60048036038101906105379190612816565b611447565b6040516105499190612266565b60405180910390f35b34801561055e57600080fd5b5061057960048036038101906105749190612659565b6114db565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105d657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106065750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461061c90612885565b80601f016020809104026020016040519081016040528092919081815260200182805461064890612885565b80156106955780601f1061066a57610100808354040283529160200191610695565b820191906000526020600020905b81548152906001019060200180831161067857829003601f168201915b5050505050905090565b60006106aa826115d2565b6106e0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061072682611631565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361078d576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107ac6116fd565b73ffffffffffffffffffffffffffffffffffffffff161461080f576107d8816107d36116fd565b611447565b61080e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006108cb611705565b6001546000540303905090565b6108e383838361170a565b505050565b6108f0611ab1565b73ffffffffffffffffffffffffffffffffffffffff1661090e610c33565b73ffffffffffffffffffffffffffffffffffffffff1614610964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095b90612902565b60405180910390fd5b6000600d60016101000a81548160ff021916908315150217905550565b61099c83838360405180602001604052806000815250611247565b505050565b6109a9611ab1565b73ffffffffffffffffffffffffffffffffffffffff166109c7610c33565b73ffffffffffffffffffffffffffffffffffffffff1614610a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1490612902565b60405180910390fd5b80600b9081610a2c9190612ace565b5050565b6000610a3b82611631565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610aa9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610b02611ab1565b73ffffffffffffffffffffffffffffffffffffffff16610b20610c33565b73ffffffffffffffffffffffffffffffffffffffff1614610b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6d90612902565b60405180910390fd5b610b806000611ab9565b565b610b8a611ab1565b73ffffffffffffffffffffffffffffffffffffffff16610ba8610c33565b73ffffffffffffffffffffffffffffffffffffffff1614610bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf590612902565b60405180910390fd5b6001600d60016101000a81548160ff021916908315150217905550565b60096020528060005260406000206000915090505481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610c6c90612885565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9890612885565b8015610ce55780601f10610cba57610100808354040283529160200191610ce5565b820191906000526020600020905b815481529060010190602001808311610cc857829003601f168201915b5050505050905090565b600a811115610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a90612bec565b60405180910390fd5b6000600e5490506000610d44610c33565b90506000836618838370f34000610d5b9190612c3b565b905060c883101580610d6e5750600f5442115b15610dba57803414610db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dac90612cc9565b60405180910390fd5b610e99565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610e1791906123d7565b602060405180830381865afa158015610e34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e589190612cfe565b11610e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8f90612d77565b60405180910390fd5b5b600a8060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1190612e09565b60405180910390fd5b60001515600d60019054906101000a900460ff16151514610f70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6790612e75565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610fb6573d6000803e3d6000fd5b5083600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110069190612e95565b925050819055506001600e60008282546110209190612e95565b925050819055506110313385611b7f565b50505050565b61103f6116fd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110a3576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006110b06116fd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661115d6116fd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111a29190612266565b60405180910390a35050565b6111b6611ab1565b73ffffffffffffffffffffffffffffffffffffffff166111d4610c33565b73ffffffffffffffffffffffffffffffffffffffff161461122a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122190612902565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b61125284848461170a565b60008373ffffffffffffffffffffffffffffffffffffffff163b146112b45761127d84848484611b9d565b6112b3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606112c5826115d2565b611304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fb90612f3b565b60405180910390fd5b600061130e611ced565b905060011515600d60009054906101000a900460ff1615150361137c5760008151116113495760405180602001604052806000815250611374565b8061135384611d7f565b604051602001611364929190612fe3565b6040516020818303038152906040525b91505061142a565b600081511161139a5760405180602001604052806000815250611426565b600c80546113a790612885565b80601f01602080910402602001604051908101604052809291908181526020018280546113d390612885565b80156114205780601f106113f557610100808354040283529160200191611420565b820191906000526020600020905b81548152906001019060200180831161140357829003601f168201915b50505050505b9150505b919050565b600a6020528060005260406000206000915090505481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114e3611ab1565b73ffffffffffffffffffffffffffffffffffffffff16611501610c33565b73ffffffffffffffffffffffffffffffffffffffff1614611557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154e90612902565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bd90613084565b60405180910390fd5b6115cf81611ab9565b50565b6000816115dd611705565b111580156115ec575060005482105b801561162a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611640611705565b116116c6576000548110156116c55760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036116c3575b600081036116b957600460008360019003935083815260200190815260200160002054905061168f565b80925050506116f8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b600061171582611631565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461177c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661179d6116fd565b73ffffffffffffffffffffffffffffffffffffffff1614806117cc57506117cb856117c66116fd565b611447565b5b8061181157506117da6116fd565b73ffffffffffffffffffffffffffffffffffffffff166117f98461069f565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061184a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036118b0576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118bd8585856001611edf565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6119ba86611ee5565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831603611a425760006001840190506000600460008381526020019081526020016000205403611a40576000548114611a3f578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611aaa8585856001611eef565b5050505050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611b99828260405180602001604052806000815250611ef5565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611bc36116fd565b8786866040518563ffffffff1660e01b8152600401611be594939291906130f9565b6020604051808303816000875af1925050508015611c2157506040513d601f19601f82011682018060405250810190611c1e919061315a565b60015b611c9a573d8060008114611c51576040519150601f19603f3d011682016040523d82523d6000602084013e611c56565b606091505b506000815103611c92576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b8054611cfc90612885565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2890612885565b8015611d755780601f10611d4a57610100808354040283529160200191611d75565b820191906000526020600020905b815481529060010190602001808311611d5857829003601f168201915b5050505050905090565b606060008203611dc6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611eda565b600082905060005b60008214611df8578080611de190613187565b915050600a82611df191906131fe565b9150611dce565b60008167ffffffffffffffff811115611e1457611e136124e5565b5b6040519080825280601f01601f191660200182016040528015611e465781602001600182028036833780820191505090505b5090505b60008514611ed357600182611e5f919061322f565b9150600a85611e6e9190613263565b6030611e7a9190612e95565b60f81b818381518110611e9057611e8f613294565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ecc91906131fe565b9450611e4a565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611f61576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303611f9b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fa86000858386611edf565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161200d600185146121a8565b901b60a042901b61201d86611ee5565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612121575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120d16000878480600101955087611b9d565b612107576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061206257826000541461211c57600080fd5b61218c565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612122575b8160008190555050506121a26000858386611eef565b50505050565b6000819050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6121fb816121c6565b811461220657600080fd5b50565b600081359050612218816121f2565b92915050565b600060208284031215612234576122336121bc565b5b600061224284828501612209565b91505092915050565b60008115159050919050565b6122608161224b565b82525050565b600060208201905061227b6000830184612257565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122bb5780820151818401526020810190506122a0565b60008484015250505050565b6000601f19601f8301169050919050565b60006122e382612281565b6122ed818561228c565b93506122fd81856020860161229d565b612306816122c7565b840191505092915050565b6000602082019050818103600083015261232b81846122d8565b905092915050565b6000819050919050565b61234681612333565b811461235157600080fd5b50565b6000813590506123638161233d565b92915050565b60006020828403121561237f5761237e6121bc565b5b600061238d84828501612354565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123c182612396565b9050919050565b6123d1816123b6565b82525050565b60006020820190506123ec60008301846123c8565b92915050565b6123fb816123b6565b811461240657600080fd5b50565b600081359050612418816123f2565b92915050565b60008060408385031215612435576124346121bc565b5b600061244385828601612409565b925050602061245485828601612354565b9150509250929050565b61246781612333565b82525050565b6000602082019050612482600083018461245e565b92915050565b6000806000606084860312156124a1576124a06121bc565b5b60006124af86828701612409565b93505060206124c086828701612409565b92505060406124d186828701612354565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61251d826122c7565b810181811067ffffffffffffffff8211171561253c5761253b6124e5565b5b80604052505050565b600061254f6121b2565b905061255b8282612514565b919050565b600067ffffffffffffffff82111561257b5761257a6124e5565b5b612584826122c7565b9050602081019050919050565b82818337600083830152505050565b60006125b36125ae84612560565b612545565b9050828152602081018484840111156125cf576125ce6124e0565b5b6125da848285612591565b509392505050565b600082601f8301126125f7576125f66124db565b5b81356126078482602086016125a0565b91505092915050565b600060208284031215612626576126256121bc565b5b600082013567ffffffffffffffff811115612644576126436121c1565b5b612650848285016125e2565b91505092915050565b60006020828403121561266f5761266e6121bc565b5b600061267d84828501612409565b91505092915050565b61268f8161224b565b811461269a57600080fd5b50565b6000813590506126ac81612686565b92915050565b600080604083850312156126c9576126c86121bc565b5b60006126d785828601612409565b92505060206126e88582860161269d565b9150509250929050565b600067ffffffffffffffff82111561270d5761270c6124e5565b5b612716826122c7565b9050602081019050919050565b6000612736612731846126f2565b612545565b905082815260208101848484011115612752576127516124e0565b5b61275d848285612591565b509392505050565b600082601f83011261277a576127796124db565b5b813561278a848260208601612723565b91505092915050565b600080600080608085870312156127ad576127ac6121bc565b5b60006127bb87828801612409565b94505060206127cc87828801612409565b93505060406127dd87828801612354565b925050606085013567ffffffffffffffff8111156127fe576127fd6121c1565b5b61280a87828801612765565b91505092959194509250565b6000806040838503121561282d5761282c6121bc565b5b600061283b85828601612409565b925050602061284c85828601612409565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061289d57607f821691505b6020821081036128b0576128af612856565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006128ec60208361228c565b91506128f7826128b6565b602082019050919050565b6000602082019050818103600083015261291b816128df565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026129847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612947565b61298e8683612947565b95508019841693508086168417925050509392505050565b6000819050919050565b60006129cb6129c66129c184612333565b6129a6565b612333565b9050919050565b6000819050919050565b6129e5836129b0565b6129f96129f1826129d2565b848454612954565b825550505050565b600090565b612a0e612a01565b612a198184846129dc565b505050565b5b81811015612a3d57612a32600082612a06565b600181019050612a1f565b5050565b601f821115612a8257612a5381612922565b612a5c84612937565b81016020851015612a6b578190505b612a7f612a7785612937565b830182612a1e565b50505b505050565b600082821c905092915050565b6000612aa560001984600802612a87565b1980831691505092915050565b6000612abe8383612a94565b9150826002028217905092915050565b612ad782612281565b67ffffffffffffffff811115612af057612aef6124e5565b5b612afa8254612885565b612b05828285612a41565b600060209050601f831160018114612b385760008415612b26578287015190505b612b308582612ab2565b865550612b98565b601f198416612b4686612922565b60005b82811015612b6e57848901518255600182019150602085019450602081019050612b49565b86831015612b8b5784890151612b87601f891682612a94565b8355505b6001600288020188555050505b505050505050565b7f4d6178696d756d206d696e742069732031300000000000000000000000000000600082015250565b6000612bd660128361228c565b9150612be182612ba0565b602082019050919050565b60006020820190508181036000830152612c0581612bc9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612c4682612333565b9150612c5183612333565b9250828202612c5f81612333565b91508282048414831517612c7657612c75612c0c565b5b5092915050565b7f4d696e7420616d6f756e7420746f6f206c6f7700000000000000000000000000600082015250565b6000612cb360138361228c565b9150612cbe82612c7d565b602082019050919050565b60006020820190508181036000830152612ce281612ca6565b9050919050565b600081519050612cf88161233d565b92915050565b600060208284031215612d1457612d136121bc565b5b6000612d2284828501612ce9565b91505092915050565b7f596f75277265206e6f742077686974656c697374656400000000000000000000600082015250565b6000612d6160168361228c565b9150612d6c82612d2b565b602082019050919050565b60006020820190508181036000830152612d9081612d54565b9050919050565b7f596f75277665207265616368656420796f7572206d6178696d756d206d696e7460008201527f206c696d69740000000000000000000000000000000000000000000000000000602082015250565b6000612df360268361228c565b9150612dfe82612d97565b604082019050919050565b60006020820190508181036000830152612e2281612de6565b9050919050565b7f506175736564204d696e74696e67000000000000000000000000000000000000600082015250565b6000612e5f600e8361228c565b9150612e6a82612e29565b602082019050919050565b60006020820190508181036000830152612e8e81612e52565b9050919050565b6000612ea082612333565b9150612eab83612333565b9250828201905080821115612ec357612ec2612c0c565b5b92915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000612f25602f8361228c565b9150612f3082612ec9565b604082019050919050565b60006020820190508181036000830152612f5481612f18565b9050919050565b600081905092915050565b6000612f7182612281565b612f7b8185612f5b565b9350612f8b81856020860161229d565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000612fcd600583612f5b565b9150612fd882612f97565b600582019050919050565b6000612fef8285612f66565b9150612ffb8284612f66565b915061300682612fc0565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061306e60268361228c565b915061307982613012565b604082019050919050565b6000602082019050818103600083015261309d81613061565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006130cb826130a4565b6130d581856130af565b93506130e581856020860161229d565b6130ee816122c7565b840191505092915050565b600060808201905061310e60008301876123c8565b61311b60208301866123c8565b613128604083018561245e565b818103606083015261313a81846130c0565b905095945050505050565b600081519050613154816121f2565b92915050565b6000602082840312156131705761316f6121bc565b5b600061317e84828501613145565b91505092915050565b600061319282612333565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036131c4576131c3612c0c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061320982612333565b915061321483612333565b925082613224576132236131cf565b5b828204905092915050565b600061323a82612333565b915061324583612333565b925082820390508181111561325d5761325c612c0c565b5b92915050565b600061326e82612333565b915061327983612333565b925082613289576132886131cf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212207ba4b02a5307e2f43ea54412be6879191b8fdd52f71522cfca3e5d8b4da44a5d64736f6c63430008110033697066733a2f2f516d56344d707537776d575a714a7268696b366576774d35774e7a51584e66565466756e6d4a58546931314758712f
Deployed Bytecode
0x60806040526004361061014b5760003560e01c80638456cb59116100b6578063a475b5dd1161006f578063a475b5dd1461045b578063b88d4fde14610472578063c87b56dd1461049b578063dc33e681146104d8578063e985e9c514610515578063f2fde38b146105525761014b565b80638456cb591461036c5780638aaeba6a146103835780638da5cb5b146103c057806395d89b41146103eb578063a0712d6814610416578063a22cb465146104325761014b565b80633f4ba83a116101085780633f4ba83a1461027257806342842e0e1461028957806355f804b3146102b25780636352211e146102db57806370a0823114610318578063715018a6146103555761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f557806318160ddd1461021e57806323b872dd14610249575b600080fd5b34801561015c57600080fd5b506101776004803603810190610172919061221e565b61057b565b6040516101849190612266565b60405180910390f35b34801561019957600080fd5b506101a261060d565b6040516101af9190612311565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da9190612369565b61069f565b6040516101ec91906123d7565b60405180910390f35b34801561020157600080fd5b5061021c6004803603810190610217919061241e565b61071b565b005b34801561022a57600080fd5b506102336108c1565b604051610240919061246d565b60405180910390f35b34801561025557600080fd5b50610270600480360381019061026b9190612488565b6108d8565b005b34801561027e57600080fd5b506102876108e8565b005b34801561029557600080fd5b506102b060048036038101906102ab9190612488565b610981565b005b3480156102be57600080fd5b506102d960048036038101906102d49190612610565b6109a1565b005b3480156102e757600080fd5b5061030260048036038101906102fd9190612369565b610a30565b60405161030f91906123d7565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a9190612659565b610a42565b60405161034c919061246d565b60405180910390f35b34801561036157600080fd5b5061036a610afa565b005b34801561037857600080fd5b50610381610b82565b005b34801561038f57600080fd5b506103aa60048036038101906103a59190612659565b610c1b565b6040516103b7919061246d565b60405180910390f35b3480156103cc57600080fd5b506103d5610c33565b6040516103e291906123d7565b60405180910390f35b3480156103f757600080fd5b50610400610c5d565b60405161040d9190612311565b60405180910390f35b610430600480360381019061042b9190612369565b610cef565b005b34801561043e57600080fd5b50610459600480360381019061045491906126b2565b611037565b005b34801561046757600080fd5b506104706111ae565b005b34801561047e57600080fd5b5061049960048036038101906104949190612793565b611247565b005b3480156104a757600080fd5b506104c260048036038101906104bd9190612369565b6112ba565b6040516104cf9190612311565b60405180910390f35b3480156104e457600080fd5b506104ff60048036038101906104fa9190612659565b61142f565b60405161050c919061246d565b60405180910390f35b34801561052157600080fd5b5061053c60048036038101906105379190612816565b611447565b6040516105499190612266565b60405180910390f35b34801561055e57600080fd5b5061057960048036038101906105749190612659565b6114db565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105d657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106065750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461061c90612885565b80601f016020809104026020016040519081016040528092919081815260200182805461064890612885565b80156106955780601f1061066a57610100808354040283529160200191610695565b820191906000526020600020905b81548152906001019060200180831161067857829003601f168201915b5050505050905090565b60006106aa826115d2565b6106e0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061072682611631565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361078d576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107ac6116fd565b73ffffffffffffffffffffffffffffffffffffffff161461080f576107d8816107d36116fd565b611447565b61080e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006108cb611705565b6001546000540303905090565b6108e383838361170a565b505050565b6108f0611ab1565b73ffffffffffffffffffffffffffffffffffffffff1661090e610c33565b73ffffffffffffffffffffffffffffffffffffffff1614610964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095b90612902565b60405180910390fd5b6000600d60016101000a81548160ff021916908315150217905550565b61099c83838360405180602001604052806000815250611247565b505050565b6109a9611ab1565b73ffffffffffffffffffffffffffffffffffffffff166109c7610c33565b73ffffffffffffffffffffffffffffffffffffffff1614610a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1490612902565b60405180910390fd5b80600b9081610a2c9190612ace565b5050565b6000610a3b82611631565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610aa9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610b02611ab1565b73ffffffffffffffffffffffffffffffffffffffff16610b20610c33565b73ffffffffffffffffffffffffffffffffffffffff1614610b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6d90612902565b60405180910390fd5b610b806000611ab9565b565b610b8a611ab1565b73ffffffffffffffffffffffffffffffffffffffff16610ba8610c33565b73ffffffffffffffffffffffffffffffffffffffff1614610bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf590612902565b60405180910390fd5b6001600d60016101000a81548160ff021916908315150217905550565b60096020528060005260406000206000915090505481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610c6c90612885565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9890612885565b8015610ce55780601f10610cba57610100808354040283529160200191610ce5565b820191906000526020600020905b815481529060010190602001808311610cc857829003601f168201915b5050505050905090565b600a811115610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a90612bec565b60405180910390fd5b6000600e5490506000610d44610c33565b90506000836618838370f34000610d5b9190612c3b565b905060c883101580610d6e5750600f5442115b15610dba57803414610db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dac90612cc9565b60405180910390fd5b610e99565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610e1791906123d7565b602060405180830381865afa158015610e34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e589190612cfe565b11610e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8f90612d77565b60405180910390fd5b5b600a8060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1190612e09565b60405180910390fd5b60001515600d60019054906101000a900460ff16151514610f70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6790612e75565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610fb6573d6000803e3d6000fd5b5083600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110069190612e95565b925050819055506001600e60008282546110209190612e95565b925050819055506110313385611b7f565b50505050565b61103f6116fd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110a3576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006110b06116fd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661115d6116fd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111a29190612266565b60405180910390a35050565b6111b6611ab1565b73ffffffffffffffffffffffffffffffffffffffff166111d4610c33565b73ffffffffffffffffffffffffffffffffffffffff161461122a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122190612902565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b61125284848461170a565b60008373ffffffffffffffffffffffffffffffffffffffff163b146112b45761127d84848484611b9d565b6112b3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606112c5826115d2565b611304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fb90612f3b565b60405180910390fd5b600061130e611ced565b905060011515600d60009054906101000a900460ff1615150361137c5760008151116113495760405180602001604052806000815250611374565b8061135384611d7f565b604051602001611364929190612fe3565b6040516020818303038152906040525b91505061142a565b600081511161139a5760405180602001604052806000815250611426565b600c80546113a790612885565b80601f01602080910402602001604051908101604052809291908181526020018280546113d390612885565b80156114205780601f106113f557610100808354040283529160200191611420565b820191906000526020600020905b81548152906001019060200180831161140357829003601f168201915b50505050505b9150505b919050565b600a6020528060005260406000206000915090505481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114e3611ab1565b73ffffffffffffffffffffffffffffffffffffffff16611501610c33565b73ffffffffffffffffffffffffffffffffffffffff1614611557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154e90612902565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bd90613084565b60405180910390fd5b6115cf81611ab9565b50565b6000816115dd611705565b111580156115ec575060005482105b801561162a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611640611705565b116116c6576000548110156116c55760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036116c3575b600081036116b957600460008360019003935083815260200190815260200160002054905061168f565b80925050506116f8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b600061171582611631565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461177c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661179d6116fd565b73ffffffffffffffffffffffffffffffffffffffff1614806117cc57506117cb856117c66116fd565b611447565b5b8061181157506117da6116fd565b73ffffffffffffffffffffffffffffffffffffffff166117f98461069f565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061184a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036118b0576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118bd8585856001611edf565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6119ba86611ee5565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831603611a425760006001840190506000600460008381526020019081526020016000205403611a40576000548114611a3f578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611aaa8585856001611eef565b5050505050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611b99828260405180602001604052806000815250611ef5565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611bc36116fd565b8786866040518563ffffffff1660e01b8152600401611be594939291906130f9565b6020604051808303816000875af1925050508015611c2157506040513d601f19601f82011682018060405250810190611c1e919061315a565b60015b611c9a573d8060008114611c51576040519150601f19603f3d011682016040523d82523d6000602084013e611c56565b606091505b506000815103611c92576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b8054611cfc90612885565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2890612885565b8015611d755780601f10611d4a57610100808354040283529160200191611d75565b820191906000526020600020905b815481529060010190602001808311611d5857829003601f168201915b5050505050905090565b606060008203611dc6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611eda565b600082905060005b60008214611df8578080611de190613187565b915050600a82611df191906131fe565b9150611dce565b60008167ffffffffffffffff811115611e1457611e136124e5565b5b6040519080825280601f01601f191660200182016040528015611e465781602001600182028036833780820191505090505b5090505b60008514611ed357600182611e5f919061322f565b9150600a85611e6e9190613263565b6030611e7a9190612e95565b60f81b818381518110611e9057611e8f613294565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ecc91906131fe565b9450611e4a565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611f61576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303611f9b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fa86000858386611edf565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161200d600185146121a8565b901b60a042901b61201d86611ee5565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612121575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120d16000878480600101955087611b9d565b612107576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061206257826000541461211c57600080fd5b61218c565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612122575b8160008190555050506121a26000858386611eef565b50505050565b6000819050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6121fb816121c6565b811461220657600080fd5b50565b600081359050612218816121f2565b92915050565b600060208284031215612234576122336121bc565b5b600061224284828501612209565b91505092915050565b60008115159050919050565b6122608161224b565b82525050565b600060208201905061227b6000830184612257565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122bb5780820151818401526020810190506122a0565b60008484015250505050565b6000601f19601f8301169050919050565b60006122e382612281565b6122ed818561228c565b93506122fd81856020860161229d565b612306816122c7565b840191505092915050565b6000602082019050818103600083015261232b81846122d8565b905092915050565b6000819050919050565b61234681612333565b811461235157600080fd5b50565b6000813590506123638161233d565b92915050565b60006020828403121561237f5761237e6121bc565b5b600061238d84828501612354565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123c182612396565b9050919050565b6123d1816123b6565b82525050565b60006020820190506123ec60008301846123c8565b92915050565b6123fb816123b6565b811461240657600080fd5b50565b600081359050612418816123f2565b92915050565b60008060408385031215612435576124346121bc565b5b600061244385828601612409565b925050602061245485828601612354565b9150509250929050565b61246781612333565b82525050565b6000602082019050612482600083018461245e565b92915050565b6000806000606084860312156124a1576124a06121bc565b5b60006124af86828701612409565b93505060206124c086828701612409565b92505060406124d186828701612354565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61251d826122c7565b810181811067ffffffffffffffff8211171561253c5761253b6124e5565b5b80604052505050565b600061254f6121b2565b905061255b8282612514565b919050565b600067ffffffffffffffff82111561257b5761257a6124e5565b5b612584826122c7565b9050602081019050919050565b82818337600083830152505050565b60006125b36125ae84612560565b612545565b9050828152602081018484840111156125cf576125ce6124e0565b5b6125da848285612591565b509392505050565b600082601f8301126125f7576125f66124db565b5b81356126078482602086016125a0565b91505092915050565b600060208284031215612626576126256121bc565b5b600082013567ffffffffffffffff811115612644576126436121c1565b5b612650848285016125e2565b91505092915050565b60006020828403121561266f5761266e6121bc565b5b600061267d84828501612409565b91505092915050565b61268f8161224b565b811461269a57600080fd5b50565b6000813590506126ac81612686565b92915050565b600080604083850312156126c9576126c86121bc565b5b60006126d785828601612409565b92505060206126e88582860161269d565b9150509250929050565b600067ffffffffffffffff82111561270d5761270c6124e5565b5b612716826122c7565b9050602081019050919050565b6000612736612731846126f2565b612545565b905082815260208101848484011115612752576127516124e0565b5b61275d848285612591565b509392505050565b600082601f83011261277a576127796124db565b5b813561278a848260208601612723565b91505092915050565b600080600080608085870312156127ad576127ac6121bc565b5b60006127bb87828801612409565b94505060206127cc87828801612409565b93505060406127dd87828801612354565b925050606085013567ffffffffffffffff8111156127fe576127fd6121c1565b5b61280a87828801612765565b91505092959194509250565b6000806040838503121561282d5761282c6121bc565b5b600061283b85828601612409565b925050602061284c85828601612409565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061289d57607f821691505b6020821081036128b0576128af612856565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006128ec60208361228c565b91506128f7826128b6565b602082019050919050565b6000602082019050818103600083015261291b816128df565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026129847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612947565b61298e8683612947565b95508019841693508086168417925050509392505050565b6000819050919050565b60006129cb6129c66129c184612333565b6129a6565b612333565b9050919050565b6000819050919050565b6129e5836129b0565b6129f96129f1826129d2565b848454612954565b825550505050565b600090565b612a0e612a01565b612a198184846129dc565b505050565b5b81811015612a3d57612a32600082612a06565b600181019050612a1f565b5050565b601f821115612a8257612a5381612922565b612a5c84612937565b81016020851015612a6b578190505b612a7f612a7785612937565b830182612a1e565b50505b505050565b600082821c905092915050565b6000612aa560001984600802612a87565b1980831691505092915050565b6000612abe8383612a94565b9150826002028217905092915050565b612ad782612281565b67ffffffffffffffff811115612af057612aef6124e5565b5b612afa8254612885565b612b05828285612a41565b600060209050601f831160018114612b385760008415612b26578287015190505b612b308582612ab2565b865550612b98565b601f198416612b4686612922565b60005b82811015612b6e57848901518255600182019150602085019450602081019050612b49565b86831015612b8b5784890151612b87601f891682612a94565b8355505b6001600288020188555050505b505050505050565b7f4d6178696d756d206d696e742069732031300000000000000000000000000000600082015250565b6000612bd660128361228c565b9150612be182612ba0565b602082019050919050565b60006020820190508181036000830152612c0581612bc9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612c4682612333565b9150612c5183612333565b9250828202612c5f81612333565b91508282048414831517612c7657612c75612c0c565b5b5092915050565b7f4d696e7420616d6f756e7420746f6f206c6f7700000000000000000000000000600082015250565b6000612cb360138361228c565b9150612cbe82612c7d565b602082019050919050565b60006020820190508181036000830152612ce281612ca6565b9050919050565b600081519050612cf88161233d565b92915050565b600060208284031215612d1457612d136121bc565b5b6000612d2284828501612ce9565b91505092915050565b7f596f75277265206e6f742077686974656c697374656400000000000000000000600082015250565b6000612d6160168361228c565b9150612d6c82612d2b565b602082019050919050565b60006020820190508181036000830152612d9081612d54565b9050919050565b7f596f75277665207265616368656420796f7572206d6178696d756d206d696e7460008201527f206c696d69740000000000000000000000000000000000000000000000000000602082015250565b6000612df360268361228c565b9150612dfe82612d97565b604082019050919050565b60006020820190508181036000830152612e2281612de6565b9050919050565b7f506175736564204d696e74696e67000000000000000000000000000000000000600082015250565b6000612e5f600e8361228c565b9150612e6a82612e29565b602082019050919050565b60006020820190508181036000830152612e8e81612e52565b9050919050565b6000612ea082612333565b9150612eab83612333565b9250828201905080821115612ec357612ec2612c0c565b5b92915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000612f25602f8361228c565b9150612f3082612ec9565b604082019050919050565b60006020820190508181036000830152612f5481612f18565b9050919050565b600081905092915050565b6000612f7182612281565b612f7b8185612f5b565b9350612f8b81856020860161229d565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000612fcd600583612f5b565b9150612fd882612f97565b600582019050919050565b6000612fef8285612f66565b9150612ffb8284612f66565b915061300682612fc0565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061306e60268361228c565b915061307982613012565b604082019050919050565b6000602082019050818103600083015261309d81613061565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006130cb826130a4565b6130d581856130af565b93506130e581856020860161229d565b6130ee816122c7565b840191505092915050565b600060808201905061310e60008301876123c8565b61311b60208301866123c8565b613128604083018561245e565b818103606083015261313a81846130c0565b905095945050505050565b600081519050613154816121f2565b92915050565b6000602082840312156131705761316f6121bc565b5b600061317e84828501613145565b91505092915050565b600061319282612333565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036131c4576131c3612c0c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061320982612333565b915061321483612333565b925082613224576132236131cf565b5b828204905092915050565b600061323a82612333565b915061324583612333565b925082820390508181111561325d5761325c612c0c565b5b92915050565b600061326e82612333565b915061327983612333565b925082613289576132886131cf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212207ba4b02a5307e2f43ea54412be6879191b8fdd52f71522cfca3e5d8b4da44a5d64736f6c63430008110033
Deployed Bytecode Sourcemap
44065:2610:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18620:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23633:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25701:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25161:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17674:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26587:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46096:72;;;;;;;;;;;;;:::i;:::-;;26828:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44834:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23422:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19299:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4730:103;;;;;;;;;;;;;:::i;:::-;;46008:76;;;;;;;;;;;;;:::i;:::-;;44140:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4079:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23802:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45081:815;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25977:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45913:76;;;;;;;;;;;;;:::i;:::-;;27084:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46180:484;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44190:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26356:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4988:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18620:615;18705:4;19020:10;19005:25;;:11;:25;;;;:102;;;;19097:10;19082:25;;:11;:25;;;;19005:102;:179;;;;19174:10;19159:25;;:11;:25;;;;19005:179;18985:199;;18620:615;;;:::o;23633:100::-;23687:13;23720:5;23713:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23633:100;:::o;25701:204::-;25769:7;25794:16;25802:7;25794;:16::i;:::-;25789:64;;25819:34;;;;;;;;;;;;;;25789:64;25873:15;:24;25889:7;25873:24;;;;;;;;;;;;;;;;;;;;;25866:31;;25701:204;;;:::o;25161:474::-;25234:13;25266:27;25285:7;25266:18;:27::i;:::-;25234:61;;25316:5;25310:11;;:2;:11;;;25306:48;;25330:24;;;;;;;;;;;;;;25306:48;25394:5;25371:28;;:19;:17;:19::i;:::-;:28;;;25367:175;;25419:44;25436:5;25443:19;:17;:19::i;:::-;25419:16;:44::i;:::-;25414:128;;25491:35;;;;;;;;;;;;;;25414:128;25367:175;25581:2;25554:15;:24;25570:7;25554:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;25619:7;25615:2;25599:28;;25608:5;25599:28;;;;;;;;;;;;25223:412;25161:474;;:::o;17674:315::-;17727:7;17955:15;:13;:15::i;:::-;17940:12;;17924:13;;:28;:46;17917:53;;17674:315;:::o;26587:170::-;26721:28;26731:4;26737:2;26741:7;26721:9;:28::i;:::-;26587:170;;;:::o;46096:72::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46154:5:::1;46145:6;;:14;;;;;;;;;;;;;;;;;;46096:72::o:0;26828:185::-;26966:39;26983:4;26989:2;26993:7;26966:39;;;;;;;;;;;;:16;:39::i;:::-;26828:185;;;:::o;44834:111::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44929:8:::1;44910:16;:27;;;;;;:::i;:::-;;44834:111:::0;:::o;23422:144::-;23486:7;23529:27;23548:7;23529:18;:27::i;:::-;23506:52;;23422:144;;;:::o;19299:224::-;19363:7;19404:1;19387:19;;:5;:19;;;19383:60;;19415:28;;;;;;;;;;;;;;19383:60;14638:13;19461:18;:25;19480:5;19461:25;;;;;;;;;;;;;;;;:54;19454:61;;19299:224;;;:::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;46008:76::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46064:4:::1;46055:6;;:13;;;;;;;;;;;;;;;;;;46008:76::o:0;44140:43::-;;;;;;;;;;;;;;;;;:::o;4079:87::-;4125:7;4152:6;;;;;;;;;;;4145:13;;4079:87;:::o;23802:104::-;23858:13;23891:7;23884:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23802:104;:::o;45081:815::-;45161:2;45149:8;:14;;45141:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;45199:20;45222:10;;45199:33;;45243:13;45259:7;:5;:7::i;:::-;45243:23;;45277:14;45310:8;45295:12;:23;;;;:::i;:::-;45277:41;;45348:3;45332:12;:19;;:56;;;;45373:15;;45355;:33;45332:56;45329:245;;;45425:6;45412:9;:19;45404:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;45329:245;;;45534:1;45494:15;;;;;;;;;;;:25;;;45520:10;45494:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;45486:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;45329:245;45619:2;45592:12;:24;45605:10;45592:24;;;;;;;;;;;;;;;;:29;45584:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;45693:5;45683:15;;:6;;;;;;;;;;;:15;;;45675:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;45736:5;45728:23;;:34;45752:9;45728:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45801:8;45773:12;:24;45786:10;45773:24;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;45834:1;45820:10;;:15;;;;;;;:::i;:::-;;;;;;;;45846:31;45856:10;45868:8;45846:9;:31::i;:::-;45130:766;;;45081:815;:::o;25977:308::-;26088:19;:17;:19::i;:::-;26076:31;;:8;:31;;;26072:61;;26116:17;;;;;;;;;;;;;;26072:61;26198:8;26146:18;:39;26165:19;:17;:19::i;:::-;26146:39;;;;;;;;;;;;;;;:49;26186:8;26146:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26258:8;26222:55;;26237:19;:17;:19::i;:::-;26222:55;;;26268:8;26222:55;;;;;;:::i;:::-;;;;;;;;25977:308;;:::o;45913:76::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45977:4:::1;45966:8;;:15;;;;;;;;;;;;;;;;;;45913:76::o:0;27084:396::-;27251:28;27261:4;27267:2;27271:7;27251:9;:28::i;:::-;27312:1;27294:2;:14;;;:19;27290:183;;27333:56;27364:4;27370:2;27374:7;27383:5;27333:30;:56::i;:::-;27328:145;;27417:40;;;;;;;;;;;;;;27328:145;27290:183;27084:396;;;;:::o;46180:484::-;46253:13;46287:16;46295:7;46287;:16::i;:::-;46279:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;46368:21;46392:10;:8;:10::i;:::-;46368:34;;46428:4;46416:16;;:8;;;;;;;;;;;:16;;;46413:244;;46480:1;46462:7;46456:21;:25;:103;;;;;;;;;;;;;;;;;46509:7;46518:25;46535:7;46518:16;:25::i;:::-;46492:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46456:103;46449:110;;;;;46413:244;46621:1;46603:7;46597:21;:25;:48;;;;;;;;;;;;;;;;;46625:15;46597:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46590:55;;;46180:484;;;;:::o;44190:45::-;;;;;;;;;;;;;;;;;:::o;26356:164::-;26453:4;26477:18;:25;26496:5;26477:25;;;;;;;;;;;;;;;:35;26503:8;26477:35;;;;;;;;;;;;;;;;;;;;;;;;;26470:42;;26356: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;;::::0;5069:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5153:28;5172:8;5153:18;:28::i;:::-;4988:201:::0;:::o;27735:273::-;27792:4;27848:7;27829:15;:13;:15::i;:::-;:26;;:66;;;;;27882:13;;27872:7;:23;27829:66;:152;;;;;27980:1;15408:8;27933:17;:26;27951:7;27933:26;;;;;;;;;;;;:43;:48;27829:152;27809:172;;27735:273;;;:::o;20937:1129::-;21004:7;21024:12;21039:7;21024:22;;21107:4;21088:15;:13;:15::i;:::-;:23;21084:915;;21141:13;;21134:4;:20;21130:869;;;21179:14;21196:17;:23;21214:4;21196:23;;;;;;;;;;;;21179:40;;21312:1;15408:8;21285:6;:23;:28;21281:699;;21804:113;21821:1;21811:6;:11;21804:113;;21864:17;:25;21882:6;;;;;;;21864:25;;;;;;;;;;;;21855:34;;21804:113;;;21950:6;21943:13;;;;;;21281:699;21156:843;21130:869;21084:915;22027:31;;;;;;;;;;;;;;20937:1129;;;;:::o;41717:105::-;41777:7;41804:10;41797:17;;41717:105;:::o;17197:92::-;17253:7;17197:92;:::o;32974:2515::-;33089:27;33119;33138:7;33119:18;:27::i;:::-;33089:57;;33204:4;33163:45;;33179:19;33163:45;;;33159:86;;33217:28;;;;;;;;;;;;;;33159:86;33258:22;33307:4;33284:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;33328:43;33345:4;33351:19;:17;:19::i;:::-;33328:16;:43::i;:::-;33284:87;:147;;;;33412:19;:17;:19::i;:::-;33388:43;;:20;33400:7;33388:11;:20::i;:::-;:43;;;33284:147;33258:174;;33450:17;33445:66;;33476:35;;;;;;;;;;;;;;33445:66;33540:1;33526:16;;:2;:16;;;33522:52;;33551:23;;;;;;;;;;;;;;33522:52;33587:43;33609:4;33615:2;33619:7;33628:1;33587:21;:43::i;:::-;33703:15;:24;33719:7;33703:24;;;;;;;;;;;;33696:31;;;;;;;;;;;34095:18;:24;34114:4;34095:24;;;;;;;;;;;;;;;;34093:26;;;;;;;;;;;;34164:18;:22;34183:2;34164:22;;;;;;;;;;;;;;;;34162:24;;;;;;;;;;;15690:8;15292:3;34545:15;:41;;34503:21;34521:2;34503:17;:21::i;:::-;:84;:128;34457:17;:26;34475:7;34457:26;;;;;;;;;;;:174;;;;34801:1;15690:8;34751:19;:46;:51;34747:626;;34823:19;34855:1;34845:7;:11;34823:33;;35012:1;34978:17;:30;34996:11;34978:30;;;;;;;;;;;;:35;34974:384;;35116:13;;35101:11;:28;35097:242;;35296:19;35263:17;:30;35281:11;35263:30;;;;;;;;;;;:52;;;;35097:242;34974:384;34804:569;34747:626;35420:7;35416:2;35401:27;;35410:4;35401:27;;;;;;;;;;;;35439:42;35460:4;35466:2;35470:7;35479:1;35439:20;:42::i;:::-;33078:2411;;32974:2515;;;:::o;2803:98::-;2856:7;2883:10;2876:17;;2803:98;:::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;28092:104::-;28161:27;28171:2;28175:8;28161:27;;;;;;;;;;;;:9;:27::i;:::-;28092:104;;:::o;39186:716::-;39349:4;39395:2;39370:45;;;39416:19;:17;:19::i;:::-;39437:4;39443:7;39452:5;39370:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39366:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39670:1;39653:6;:13;:18;39649:235;;39699:40;;;;;;;;;;;;;;39649:235;39842:6;39836:13;39827:6;39823:2;39819:15;39812:38;39366:529;39539:54;;;39529:64;;;:6;:64;;;;39522:71;;;39186:716;;;;;;:::o;44954:117::-;45014:13;45047:16;45040:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44954:117;:::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;40550:159::-;;;;;:::o;24722:148::-;24786:14;24847:5;24837:15;;24722:148;;;:::o;41368:158::-;;;;;:::o;28569:2236::-;28692:20;28715:13;;28692:36;;28757:1;28743:16;;:2;:16;;;28739:48;;28768:19;;;;;;;;;;;;;;28739:48;28814:1;28802:8;:13;28798:44;;28824:18;;;;;;;;;;;;;;28798:44;28855:61;28885:1;28889:2;28893:12;28907:8;28855:21;:61::i;:::-;29459:1;14775:2;29430:1;:25;;29429:31;29417:8;:44;29391:18;:22;29410:2;29391:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;15555:3;29860:29;29887:1;29875:8;:13;29860:14;:29::i;:::-;:56;;15292:3;29797:15;:41;;29755:21;29773:2;29755:17;:21::i;:::-;:84;:162;29704:17;:31;29722:12;29704:31;;;;;;;;;;;:213;;;;29934:20;29957:12;29934:35;;29984:11;30013:8;29998:12;:23;29984:37;;30060:1;30042:2;:14;;;:19;30038:635;;30082:313;30138:12;30134:2;30113:38;;30130:1;30113:38;;;;;;;;;;;;30179:69;30218:1;30222:2;30226:14;;;;;;30242:5;30179:30;:69::i;:::-;30174:174;;30284:40;;;;;;;;;;;;;;30174:174;30390:3;30375:12;:18;30082:313;;30476:12;30459:13;;:29;30455:43;;30490:8;;;30455:43;30038:635;;;30539:119;30595:14;;;;;;30591:2;30570:40;;30587:1;30570:40;;;;;;;;;;;;30653:3;30638:12;:18;30539:119;;30038:635;30703:12;30687:13;:28;;;;29168:1559;;30737:60;30766:1;30770:2;30774:12;30788:8;30737:20;:60::i;:::-;28681:2124;28569:2236;;;:::o;24957:142::-;25015:14;25076:5;25066:15;;24957:142;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:117::-;5976:1;5973;5966:12;5990:117;6099:1;6096;6089:12;6113:180;6161:77;6158:1;6151:88;6258:4;6255:1;6248:15;6282:4;6279:1;6272:15;6299:281;6382:27;6404:4;6382:27;:::i;:::-;6374:6;6370:40;6512:6;6500:10;6497:22;6476:18;6464:10;6461:34;6458:62;6455:88;;;6523:18;;:::i;:::-;6455:88;6563:10;6559:2;6552:22;6342:238;6299:281;;:::o;6586:129::-;6620:6;6647:20;;:::i;:::-;6637:30;;6676:33;6704:4;6696:6;6676:33;:::i;:::-;6586:129;;;:::o;6721:308::-;6783:4;6873:18;6865:6;6862:30;6859:56;;;6895:18;;:::i;:::-;6859:56;6933:29;6955:6;6933:29;:::i;:::-;6925:37;;7017:4;7011;7007:15;6999:23;;6721:308;;;:::o;7035:146::-;7132:6;7127:3;7122;7109:30;7173:1;7164:6;7159:3;7155:16;7148:27;7035:146;;;:::o;7187:425::-;7265:5;7290:66;7306:49;7348:6;7306:49;:::i;:::-;7290:66;:::i;:::-;7281:75;;7379:6;7372:5;7365:21;7417:4;7410:5;7406:16;7455:3;7446:6;7441:3;7437:16;7434:25;7431:112;;;7462:79;;:::i;:::-;7431:112;7552:54;7599:6;7594:3;7589;7552:54;:::i;:::-;7271:341;7187:425;;;;;:::o;7632:340::-;7688:5;7737:3;7730:4;7722:6;7718:17;7714:27;7704:122;;7745:79;;:::i;:::-;7704:122;7862:6;7849:20;7887:79;7962:3;7954:6;7947:4;7939:6;7935:17;7887:79;:::i;:::-;7878:88;;7694:278;7632:340;;;;:::o;7978:509::-;8047:6;8096:2;8084:9;8075:7;8071:23;8067:32;8064:119;;;8102:79;;:::i;:::-;8064:119;8250:1;8239:9;8235:17;8222:31;8280:18;8272:6;8269:30;8266:117;;;8302:79;;:::i;:::-;8266:117;8407:63;8462:7;8453:6;8442:9;8438:22;8407:63;:::i;:::-;8397:73;;8193:287;7978:509;;;;:::o;8493:329::-;8552:6;8601:2;8589:9;8580:7;8576:23;8572:32;8569:119;;;8607:79;;:::i;:::-;8569:119;8727:1;8752:53;8797:7;8788:6;8777:9;8773:22;8752:53;:::i;:::-;8742:63;;8698:117;8493:329;;;;:::o;8828:116::-;8898:21;8913:5;8898:21;:::i;:::-;8891:5;8888:32;8878:60;;8934:1;8931;8924:12;8878:60;8828:116;:::o;8950:133::-;8993:5;9031:6;9018:20;9009:29;;9047:30;9071:5;9047:30;:::i;:::-;8950:133;;;;:::o;9089:468::-;9154:6;9162;9211:2;9199:9;9190:7;9186:23;9182:32;9179:119;;;9217:79;;:::i;:::-;9179:119;9337:1;9362:53;9407:7;9398:6;9387:9;9383:22;9362:53;:::i;:::-;9352:63;;9308:117;9464:2;9490:50;9532:7;9523:6;9512:9;9508:22;9490:50;:::i;:::-;9480:60;;9435:115;9089:468;;;;;:::o;9563:307::-;9624:4;9714:18;9706:6;9703:30;9700:56;;;9736:18;;:::i;:::-;9700:56;9774:29;9796:6;9774:29;:::i;:::-;9766:37;;9858:4;9852;9848:15;9840:23;;9563:307;;;:::o;9876:423::-;9953:5;9978:65;9994:48;10035:6;9994:48;:::i;:::-;9978:65;:::i;:::-;9969:74;;10066:6;10059:5;10052:21;10104:4;10097:5;10093:16;10142:3;10133:6;10128:3;10124:16;10121:25;10118:112;;;10149:79;;:::i;:::-;10118:112;10239:54;10286:6;10281:3;10276;10239:54;:::i;:::-;9959:340;9876:423;;;;;:::o;10318:338::-;10373:5;10422:3;10415:4;10407:6;10403:17;10399:27;10389:122;;10430:79;;:::i;:::-;10389:122;10547:6;10534:20;10572:78;10646:3;10638:6;10631:4;10623:6;10619:17;10572:78;:::i;:::-;10563:87;;10379:277;10318:338;;;;:::o;10662:943::-;10757:6;10765;10773;10781;10830:3;10818:9;10809:7;10805:23;10801:33;10798:120;;;10837:79;;:::i;:::-;10798:120;10957:1;10982:53;11027:7;11018:6;11007:9;11003:22;10982:53;:::i;:::-;10972:63;;10928:117;11084:2;11110:53;11155:7;11146:6;11135:9;11131:22;11110:53;:::i;:::-;11100:63;;11055:118;11212:2;11238:53;11283:7;11274:6;11263:9;11259:22;11238:53;:::i;:::-;11228:63;;11183:118;11368:2;11357:9;11353:18;11340:32;11399:18;11391:6;11388:30;11385:117;;;11421:79;;:::i;:::-;11385:117;11526:62;11580:7;11571:6;11560:9;11556:22;11526:62;:::i;:::-;11516:72;;11311:287;10662:943;;;;;;;:::o;11611:474::-;11679:6;11687;11736:2;11724:9;11715:7;11711:23;11707:32;11704:119;;;11742:79;;:::i;:::-;11704:119;11862:1;11887:53;11932:7;11923:6;11912:9;11908:22;11887:53;:::i;:::-;11877:63;;11833:117;11989:2;12015:53;12060:7;12051:6;12040:9;12036:22;12015:53;:::i;:::-;12005:63;;11960:118;11611:474;;;;;:::o;12091:180::-;12139:77;12136:1;12129:88;12236:4;12233:1;12226:15;12260:4;12257:1;12250:15;12277:320;12321:6;12358:1;12352:4;12348:12;12338:22;;12405:1;12399:4;12395:12;12426:18;12416:81;;12482:4;12474:6;12470:17;12460:27;;12416:81;12544:2;12536:6;12533:14;12513:18;12510:38;12507:84;;12563:18;;:::i;:::-;12507:84;12328:269;12277:320;;;:::o;12603:182::-;12743:34;12739:1;12731:6;12727:14;12720:58;12603:182;:::o;12791:366::-;12933:3;12954:67;13018:2;13013:3;12954:67;:::i;:::-;12947:74;;13030:93;13119:3;13030:93;:::i;:::-;13148:2;13143:3;13139:12;13132:19;;12791:366;;;:::o;13163:419::-;13329:4;13367:2;13356:9;13352:18;13344:26;;13416:9;13410:4;13406:20;13402:1;13391:9;13387:17;13380:47;13444:131;13570:4;13444:131;:::i;:::-;13436:139;;13163:419;;;:::o;13588:141::-;13637:4;13660:3;13652:11;;13683:3;13680:1;13673:14;13717:4;13714:1;13704:18;13696:26;;13588:141;;;:::o;13735:93::-;13772:6;13819:2;13814;13807:5;13803:14;13799:23;13789:33;;13735:93;;;:::o;13834:107::-;13878:8;13928:5;13922:4;13918:16;13897:37;;13834:107;;;;:::o;13947:393::-;14016:6;14066:1;14054:10;14050:18;14089:97;14119:66;14108:9;14089:97;:::i;:::-;14207:39;14237:8;14226:9;14207:39;:::i;:::-;14195:51;;14279:4;14275:9;14268:5;14264:21;14255:30;;14328:4;14318:8;14314:19;14307:5;14304:30;14294:40;;14023:317;;13947:393;;;;;:::o;14346:60::-;14374:3;14395:5;14388:12;;14346:60;;;:::o;14412:142::-;14462:9;14495:53;14513:34;14522:24;14540:5;14522:24;:::i;:::-;14513:34;:::i;:::-;14495:53;:::i;:::-;14482:66;;14412:142;;;:::o;14560:75::-;14603:3;14624:5;14617:12;;14560:75;;;:::o;14641:269::-;14751:39;14782:7;14751:39;:::i;:::-;14812:91;14861:41;14885:16;14861:41;:::i;:::-;14853:6;14846:4;14840:11;14812:91;:::i;:::-;14806:4;14799:105;14717:193;14641:269;;;:::o;14916:73::-;14961:3;14916:73;:::o;14995:189::-;15072:32;;:::i;:::-;15113:65;15171:6;15163;15157:4;15113:65;:::i;:::-;15048:136;14995:189;;:::o;15190:186::-;15250:120;15267:3;15260:5;15257:14;15250:120;;;15321:39;15358:1;15351:5;15321:39;:::i;:::-;15294:1;15287:5;15283:13;15274:22;;15250:120;;;15190:186;;:::o;15382:543::-;15483:2;15478:3;15475:11;15472:446;;;15517:38;15549:5;15517:38;:::i;:::-;15601:29;15619:10;15601:29;:::i;:::-;15591:8;15587:44;15784:2;15772:10;15769:18;15766:49;;;15805:8;15790:23;;15766:49;15828:80;15884:22;15902:3;15884:22;:::i;:::-;15874:8;15870:37;15857:11;15828:80;:::i;:::-;15487:431;;15472:446;15382:543;;;:::o;15931:117::-;15985:8;16035:5;16029:4;16025:16;16004:37;;15931:117;;;;:::o;16054:169::-;16098:6;16131:51;16179:1;16175:6;16167:5;16164:1;16160:13;16131:51;:::i;:::-;16127:56;16212:4;16206;16202:15;16192:25;;16105:118;16054:169;;;;:::o;16228:295::-;16304:4;16450:29;16475:3;16469:4;16450:29;:::i;:::-;16442:37;;16512:3;16509:1;16505:11;16499:4;16496:21;16488:29;;16228:295;;;;:::o;16528:1395::-;16645:37;16678:3;16645:37;:::i;:::-;16747:18;16739:6;16736:30;16733:56;;;16769:18;;:::i;:::-;16733:56;16813:38;16845:4;16839:11;16813:38;:::i;:::-;16898:67;16958:6;16950;16944:4;16898:67;:::i;:::-;16992:1;17016:4;17003:17;;17048:2;17040:6;17037:14;17065:1;17060:618;;;;17722:1;17739:6;17736:77;;;17788:9;17783:3;17779:19;17773:26;17764:35;;17736:77;17839:67;17899:6;17892:5;17839:67;:::i;:::-;17833:4;17826:81;17695:222;17030:887;;17060:618;17112:4;17108:9;17100:6;17096:22;17146:37;17178:4;17146:37;:::i;:::-;17205:1;17219:208;17233:7;17230:1;17227:14;17219:208;;;17312:9;17307:3;17303:19;17297:26;17289:6;17282:42;17363:1;17355:6;17351:14;17341:24;;17410:2;17399:9;17395:18;17382:31;;17256:4;17253:1;17249:12;17244:17;;17219:208;;;17455:6;17446:7;17443:19;17440:179;;;17513:9;17508:3;17504:19;17498:26;17556:48;17598:4;17590:6;17586:17;17575:9;17556:48;:::i;:::-;17548:6;17541:64;17463:156;17440:179;17665:1;17661;17653:6;17649:14;17645:22;17639:4;17632:36;17067:611;;;17030:887;;16620:1303;;;16528:1395;;:::o;17929:168::-;18069:20;18065:1;18057:6;18053:14;18046:44;17929:168;:::o;18103:366::-;18245:3;18266:67;18330:2;18325:3;18266:67;:::i;:::-;18259:74;;18342:93;18431:3;18342:93;:::i;:::-;18460:2;18455:3;18451:12;18444:19;;18103:366;;;:::o;18475:419::-;18641:4;18679:2;18668:9;18664:18;18656:26;;18728:9;18722:4;18718:20;18714:1;18703:9;18699:17;18692:47;18756:131;18882:4;18756:131;:::i;:::-;18748:139;;18475:419;;;:::o;18900:180::-;18948:77;18945:1;18938:88;19045:4;19042:1;19035:15;19069:4;19066:1;19059:15;19086:410;19126:7;19149:20;19167:1;19149:20;:::i;:::-;19144:25;;19183:20;19201:1;19183:20;:::i;:::-;19178:25;;19238:1;19235;19231:9;19260:30;19278:11;19260:30;:::i;:::-;19249:41;;19439:1;19430:7;19426:15;19423:1;19420:22;19400:1;19393:9;19373:83;19350:139;;19469:18;;:::i;:::-;19350:139;19134:362;19086:410;;;;:::o;19502:169::-;19642:21;19638:1;19630:6;19626:14;19619:45;19502:169;:::o;19677:366::-;19819:3;19840:67;19904:2;19899:3;19840:67;:::i;:::-;19833:74;;19916:93;20005:3;19916:93;:::i;:::-;20034:2;20029:3;20025:12;20018:19;;19677:366;;;:::o;20049:419::-;20215:4;20253:2;20242:9;20238:18;20230:26;;20302:9;20296:4;20292:20;20288:1;20277:9;20273:17;20266:47;20330:131;20456:4;20330:131;:::i;:::-;20322:139;;20049:419;;;:::o;20474:143::-;20531:5;20562:6;20556:13;20547:22;;20578:33;20605:5;20578:33;:::i;:::-;20474:143;;;;:::o;20623:351::-;20693:6;20742:2;20730:9;20721:7;20717:23;20713:32;20710:119;;;20748:79;;:::i;:::-;20710:119;20868:1;20893:64;20949:7;20940:6;20929:9;20925:22;20893:64;:::i;:::-;20883:74;;20839:128;20623:351;;;;:::o;20980:172::-;21120:24;21116:1;21108:6;21104:14;21097:48;20980:172;:::o;21158:366::-;21300:3;21321:67;21385:2;21380:3;21321:67;:::i;:::-;21314:74;;21397:93;21486:3;21397:93;:::i;:::-;21515:2;21510:3;21506:12;21499:19;;21158:366;;;:::o;21530:419::-;21696:4;21734:2;21723:9;21719:18;21711:26;;21783:9;21777:4;21773:20;21769:1;21758:9;21754:17;21747:47;21811:131;21937:4;21811:131;:::i;:::-;21803:139;;21530:419;;;:::o;21955:225::-;22095:34;22091:1;22083:6;22079:14;22072:58;22164:8;22159:2;22151:6;22147:15;22140:33;21955:225;:::o;22186:366::-;22328:3;22349:67;22413:2;22408:3;22349:67;:::i;:::-;22342:74;;22425:93;22514:3;22425:93;:::i;:::-;22543:2;22538:3;22534:12;22527:19;;22186:366;;;:::o;22558:419::-;22724:4;22762:2;22751:9;22747:18;22739:26;;22811:9;22805:4;22801:20;22797:1;22786:9;22782:17;22775:47;22839:131;22965:4;22839:131;:::i;:::-;22831:139;;22558:419;;;:::o;22983:164::-;23123:16;23119:1;23111:6;23107:14;23100:40;22983:164;:::o;23153:366::-;23295:3;23316:67;23380:2;23375:3;23316:67;:::i;:::-;23309:74;;23392:93;23481:3;23392:93;:::i;:::-;23510:2;23505:3;23501:12;23494:19;;23153:366;;;:::o;23525:419::-;23691:4;23729:2;23718:9;23714:18;23706:26;;23778:9;23772:4;23768:20;23764:1;23753:9;23749:17;23742:47;23806:131;23932:4;23806:131;:::i;:::-;23798:139;;23525:419;;;:::o;23950:191::-;23990:3;24009:20;24027:1;24009:20;:::i;:::-;24004:25;;24043:20;24061:1;24043:20;:::i;:::-;24038:25;;24086:1;24083;24079:9;24072:16;;24107:3;24104:1;24101:10;24098:36;;;24114:18;;:::i;:::-;24098:36;23950:191;;;;:::o;24147:234::-;24287:34;24283:1;24275:6;24271:14;24264:58;24356:17;24351:2;24343:6;24339:15;24332:42;24147:234;:::o;24387:366::-;24529:3;24550:67;24614:2;24609:3;24550:67;:::i;:::-;24543:74;;24626:93;24715:3;24626:93;:::i;:::-;24744:2;24739:3;24735:12;24728:19;;24387:366;;;:::o;24759:419::-;24925:4;24963:2;24952:9;24948:18;24940:26;;25012:9;25006:4;25002:20;24998:1;24987:9;24983:17;24976:47;25040:131;25166:4;25040:131;:::i;:::-;25032:139;;24759:419;;;:::o;25184:148::-;25286:11;25323:3;25308:18;;25184:148;;;;:::o;25338:390::-;25444:3;25472:39;25505:5;25472:39;:::i;:::-;25527:89;25609:6;25604:3;25527:89;:::i;:::-;25520:96;;25625:65;25683:6;25678:3;25671:4;25664:5;25660:16;25625:65;:::i;:::-;25715:6;25710:3;25706:16;25699:23;;25448:280;25338:390;;;;:::o;25734:155::-;25874:7;25870:1;25862:6;25858:14;25851:31;25734:155;:::o;25895:400::-;26055:3;26076:84;26158:1;26153:3;26076:84;:::i;:::-;26069:91;;26169:93;26258:3;26169:93;:::i;:::-;26287:1;26282:3;26278:11;26271:18;;25895:400;;;:::o;26301:701::-;26582:3;26604:95;26695:3;26686:6;26604:95;:::i;:::-;26597:102;;26716:95;26807:3;26798:6;26716:95;:::i;:::-;26709:102;;26828:148;26972:3;26828:148;:::i;:::-;26821:155;;26993:3;26986:10;;26301:701;;;;;:::o;27008:225::-;27148:34;27144:1;27136:6;27132:14;27125:58;27217:8;27212:2;27204:6;27200:15;27193:33;27008:225;:::o;27239:366::-;27381:3;27402:67;27466:2;27461:3;27402:67;:::i;:::-;27395:74;;27478:93;27567:3;27478:93;:::i;:::-;27596:2;27591:3;27587:12;27580:19;;27239:366;;;:::o;27611:419::-;27777:4;27815:2;27804:9;27800:18;27792:26;;27864:9;27858:4;27854:20;27850:1;27839:9;27835:17;27828:47;27892:131;28018:4;27892:131;:::i;:::-;27884:139;;27611:419;;;:::o;28036:98::-;28087:6;28121:5;28115:12;28105:22;;28036:98;;;:::o;28140:168::-;28223:11;28257:6;28252:3;28245:19;28297:4;28292:3;28288:14;28273:29;;28140:168;;;;:::o;28314:373::-;28400:3;28428:38;28460:5;28428:38;:::i;:::-;28482:70;28545:6;28540:3;28482:70;:::i;:::-;28475:77;;28561:65;28619:6;28614:3;28607:4;28600:5;28596:16;28561:65;:::i;:::-;28651:29;28673:6;28651:29;:::i;:::-;28646:3;28642:39;28635:46;;28404:283;28314:373;;;;:::o;28693:640::-;28888:4;28926:3;28915:9;28911:19;28903:27;;28940:71;29008:1;28997:9;28993:17;28984:6;28940:71;:::i;:::-;29021:72;29089:2;29078:9;29074:18;29065:6;29021:72;:::i;:::-;29103;29171:2;29160:9;29156:18;29147:6;29103:72;:::i;:::-;29222:9;29216:4;29212:20;29207:2;29196:9;29192:18;29185:48;29250:76;29321:4;29312:6;29250:76;:::i;:::-;29242:84;;28693:640;;;;;;;:::o;29339:141::-;29395:5;29426:6;29420:13;29411:22;;29442:32;29468:5;29442:32;:::i;:::-;29339:141;;;;:::o;29486:349::-;29555:6;29604:2;29592:9;29583:7;29579:23;29575:32;29572:119;;;29610:79;;:::i;:::-;29572:119;29730:1;29755:63;29810:7;29801:6;29790:9;29786:22;29755:63;:::i;:::-;29745:73;;29701:127;29486:349;;;;:::o;29841:233::-;29880:3;29903:24;29921:5;29903:24;:::i;:::-;29894:33;;29949:66;29942:5;29939:77;29936:103;;30019:18;;:::i;:::-;29936:103;30066:1;30059:5;30055:13;30048:20;;29841:233;;;:::o;30080:180::-;30128:77;30125:1;30118:88;30225:4;30222:1;30215:15;30249:4;30246:1;30239:15;30266:185;30306:1;30323:20;30341:1;30323:20;:::i;:::-;30318:25;;30357:20;30375:1;30357:20;:::i;:::-;30352:25;;30396:1;30386:35;;30401:18;;:::i;:::-;30386:35;30443:1;30440;30436:9;30431:14;;30266:185;;;;:::o;30457:194::-;30497:4;30517:20;30535:1;30517:20;:::i;:::-;30512:25;;30551:20;30569:1;30551:20;:::i;:::-;30546:25;;30595:1;30592;30588:9;30580:17;;30619:1;30613:4;30610:11;30607:37;;;30624:18;;:::i;:::-;30607:37;30457:194;;;;:::o;30657:176::-;30689:1;30706:20;30724:1;30706:20;:::i;:::-;30701:25;;30740:20;30758:1;30740:20;:::i;:::-;30735:25;;30779:1;30769:35;;30784:18;;:::i;:::-;30769:35;30825:1;30822;30818:9;30813:14;;30657:176;;;;:::o;30839:180::-;30887:77;30884:1;30877:88;30984:4;30981:1;30974:15;31008:4;31005:1;30998:15
Swarm Source
ipfs://7ba4b02a5307e2f43ea54412be6879191b8fdd52f71522cfca3e5d8b4da44a5d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.