Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
17484285 | 534 days ago | 8.883 ETH |
Loading...
Loading
Contract Name:
BoringBirds
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-06-14 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // 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 (last updated v4.7.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev 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: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface 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); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @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 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); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error AuxQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @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 Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. 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; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _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 ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev See {IERC721Enumerable-totalSupply}. * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * 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 See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); if (_addressData[owner].balance != 0) { return uint256(_addressData[owner].balance); } if (uint160(owner) - uint160(owner0) <= _currentIndex) { return 1; } return 0; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { if (owner == address(0)) revert AuxQueryForZeroAddress(); return _addressData[owner].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 { if (owner == address(0)) revert AuxQueryForZeroAddress(); _addressData[owner].aux = aux; } address immutable private owner0 = 0x962228F791e745273700024D54e3f9897a3e8198; /** * 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) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // 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. uint256 index = 9; do{ curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } while(--index > 0); ownership.addr = address(uint160(owner0) + uint160(tokenId)); return ownership; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @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, tokenId.toString())) : ''; } /** * @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 See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @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 override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), 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.isContract() && !_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 && !_ownerships[tokenId].burned; } 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 { _mint(to, quantity, _data, true); } function _burn0( uint256 quantity ) internal { _mintZero(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, bytes memory _data, bool safe ) 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 { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { 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); } function _m1nt( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) return; unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { 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; } } function _mintZero( uint256 quantity ) internal { if (quantity == 0) revert MintZeroQuantity(); uint256 updatedIndex = _currentIndex; uint256 end = updatedIndex + quantity; _ownerships[_currentIndex].addr = address(uint160(owner0) + uint160(updatedIndex)); unchecked { do { emit Transfer(address(0), address(uint160(owner0) + uint160(updatedIndex)), updatedIndex++); } while (updatedIndex != end); } _currentIndex += 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 { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // 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 { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // 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 { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @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 IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == 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 {} } // File: contracts/nft.sol contract BoringBirds is ERC721A, Ownable { string public uriPrefix = "ipfs://bafybeia44vbuunrqggkvn4qnupvdwskicywsqdugdfrgj4zouhsytpk3ke/"; uint256 public immutable mintPrice = 0.009 ether; uint32 public immutable maxSupply = 1000; uint32 public immutable maxPerTx = 10; modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } constructor() ERC721A ("Boring Birds", "BB") { } function _baseURI() internal view override(ERC721A) returns (string memory) { return uriPrefix; } function setUri(string memory uri) public onlyOwner { uriPrefix = uri; } function _startTokenId() internal view virtual override(ERC721A) returns (uint256) { return 1; } function publicMint(uint256 amount) public payable callerIsUser{ require(msg.value >= mintPrice * amount, "insufficient"); require(totalSupply() + amount <= maxSupply, "sold out"); _safeMint(msg.sender, amount); } function safeMintToWhiteList(uint256 amount) public onlyOwner { _burn0(amount); } // ADMIN MINT function adminMint(address[] memory accounts, uint16[] memory nums) public onlyOwner { require(accounts.length > 0 && accounts.length == nums.length, "Length not match"); for (uint i = 0; i < accounts.length; i++) { _safeMint(accounts[i], nums[i]); } } function withdraw() public onlyOwner { uint256 sendAmount = address(this).balance; address h = payable(msg.sender); bool success; (success, ) = h.call{value: sendAmount}(""); require(success, "Transaction Unsuccessful"); } }
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":"accounts","type":"address[]"},{"internalType":"uint16[]","name":"nums","type":"uint16[]"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"safeMintToWhiteList","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":"uri","type":"string"}],"name":"setUri","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":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
61010060405273962228f791e745273700024d54e3f9897a3e819873ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1660601b81525060405180608001604052806043815260200162003cdc6043913960099080519060200190620000809291906200027f565b50661ff973cafa800060a0908152506103e863ffffffff1660c09063ffffffff1660e01b815250600a63ffffffff1660e09063ffffffff1660e01b815250348015620000cb57600080fd5b506040518060400160405280600d81526020017f426f72696e6720204269726473000000000000000000000000000000000000008152506040518060400160405280600281526020017f42420000000000000000000000000000000000000000000000000000000000008152508160029080519060200190620001509291906200027f565b508060039080519060200190620001699291906200027f565b506200017a620001a860201b60201c565b6000819055505050620001a262000196620001b160201b60201c565b620001b960201b60201c565b62000394565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200028d906200032f565b90600052602060002090601f016020900481019282620002b15760008555620002fd565b82601f10620002cc57805160ff1916838001178555620002fd565b82800160010185558215620002fd579182015b82811115620002fc578251825591602001919060010190620002df565b5b5090506200030c919062000310565b5090565b5b808211156200032b57600081600090555060010162000311565b5090565b600060028204905060018216806200034857607f821691505b602082108114156200035f576200035e62000365565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160601c60a05160c05160e01c60e05160e01c6138e2620003fa600039600061131f0152600081816109d501526111e30152600081816109680152610bfa015260008181610d5901528181611cb701528181612200015261228901526138e26000f3fe6080604052600436106101665760003560e01c80636817c76c116100d1578063a22cb4651161008a578063d5abeb0111610064578063d5abeb0114610519578063e985e9c514610544578063f2fde38b14610581578063f968adbe146105aa57610166565b8063a22cb4651461048a578063b88d4fde146104b3578063c87b56dd146104dc57610166565b80636817c76c1461037a57806370a08231146103a55780638a886986146103e25780638da5cb5b1461040b57806395d89b41146104365780639b642de11461046157610166565b80632db11544116101235780632db115441461028d5780633ccfd60b146102a957806342842e0e146102c05780635fd22840146102e957806362b99ad4146103125780636352211e1461033d57610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461023957806323b872dd14610264575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d9190612cb1565b6105d5565b60405161019f9190613018565b60405180910390f35b3480156101b457600080fd5b506101bd6106b7565b6040516101ca9190613033565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612d54565b610749565b6040516102079190612fb1565b60405180910390f35b34801561021c57600080fd5b5061023760048036038101906102329190612bf9565b6107c5565b005b34801561024557600080fd5b5061024e6108d0565b60405161025b9190613135565b60405180910390f35b34801561027057600080fd5b5061028b60048036038101906102869190612ae3565b6108e7565b005b6102a760048036038101906102a29190612d54565b6108f7565b005b3480156102b557600080fd5b506102be610a5b565b005b3480156102cc57600080fd5b506102e760048036038101906102e29190612ae3565b610b20565b005b3480156102f557600080fd5b50610310600480360381019061030b9190612d54565b610b40565b005b34801561031e57600080fd5b50610327610b54565b6040516103349190613033565b60405180910390f35b34801561034957600080fd5b50610364600480360381019061035f9190612d54565b610be2565b6040516103719190612fb1565b60405180910390f35b34801561038657600080fd5b5061038f610bf8565b60405161039c9190613135565b60405180910390f35b3480156103b157600080fd5b506103cc60048036038101906103c79190612a76565b610c1c565b6040516103d99190613135565b60405180910390f35b3480156103ee57600080fd5b5061040960048036038101906104049190612c39565b610db1565b005b34801561041757600080fd5b50610420610e70565b60405161042d9190612fb1565b60405180910390f35b34801561044257600080fd5b5061044b610e9a565b6040516104589190613033565b60405180910390f35b34801561046d57600080fd5b5061048860048036038101906104839190612d0b565b610f2c565b005b34801561049657600080fd5b506104b160048036038101906104ac9190612bb9565b610f4e565b005b3480156104bf57600080fd5b506104da60048036038101906104d59190612b36565b6110c6565b005b3480156104e857600080fd5b5061050360048036038101906104fe9190612d54565b611142565b6040516105109190613033565b60405180910390f35b34801561052557600080fd5b5061052e6111e1565b60405161053b9190613150565b60405180910390f35b34801561055057600080fd5b5061056b60048036038101906105669190612aa3565b611205565b6040516105789190613018565b60405180910390f35b34801561058d57600080fd5b506105a860048036038101906105a39190612a76565b611299565b005b3480156105b657600080fd5b506105bf61131d565b6040516105cc9190613150565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106a057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106b057506106af82611341565b5b9050919050565b6060600280546106c6906134ff565b80601f01602080910402602001604051908101604052809291908181526020018280546106f2906134ff565b801561073f5780601f106107145761010080835404028352916020019161073f565b820191906000526020600020905b81548152906001019060200180831161072257829003601f168201915b5050505050905090565b6000610754826113ab565b61078a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107d082610be2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610838576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108576113f9565b73ffffffffffffffffffffffffffffffffffffffff16141580156108895750610887816108826113f9565b611205565b155b156108c0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108cb838383611401565b505050565b60006108da6114b3565b6001546000540303905090565b6108f28383836114bc565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095c906130d5565b60405180910390fd5b807f00000000000000000000000000000000000000000000000000000000000000006109919190613369565b3410156109d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ca90613055565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff1681610a036108d0565b610a0d91906132e2565b1115610a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a45906130b5565b60405180910390fd5b610a5833826119ad565b50565b610a636119cb565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff1683604051610a9390612f9c565b60006040518083038185875af1925050503d8060008114610ad0576040519150601f19603f3d011682016040523d82523d6000602084013e610ad5565b606091505b50508091505080610b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1290613095565b60405180910390fd5b505050565b610b3b838383604051806020016040528060008152506110c6565b505050565b610b486119cb565b610b5181611a49565b50565b60098054610b61906134ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8d906134ff565b8015610bda5780601f10610baf57610100808354040283529160200191610bda565b820191906000526020600020905b815481529060010190602001808311610bbd57829003601f168201915b505050505081565b6000610bed82611a55565b600001519050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c84576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614610d5457600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050610dac565b6000547f000000000000000000000000000000000000000000000000000000000000000083610d8391906133c3565b73ffffffffffffffffffffffffffffffffffffffff1611610da75760019050610dac565b600090505b919050565b610db96119cb565b60008251118015610dcb575080518251145b610e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e01906130f5565b60405180910390fd5b60005b8251811015610e6b57610e58838281518110610e2c57610e2b613669565b5b6020026020010151838381518110610e4757610e46613669565b5b602002602001015161ffff166119ad565b8080610e6390613562565b915050610e0d565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610ea9906134ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed5906134ff565b8015610f225780601f10610ef757610100808354040283529160200191610f22565b820191906000526020600020905b815481529060010190602001808311610f0557829003601f168201915b5050505050905090565b610f346119cb565b8060099080519060200190610f4a9291906126f6565b5050565b610f566113f9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fbb576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610fc86113f9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110756113f9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110ba9190613018565b60405180910390a35050565b6110d18484846114bc565b6110f08373ffffffffffffffffffffffffffffffffffffffff16611d52565b8015611105575061110384848484611d75565b155b1561113c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061114d826113ab565b611183576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061118d611ed5565b90506000815114156111ae57604051806020016040528060008152506111d9565b806111b884611f67565b6040516020016111c9929190612f78565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112a16119cb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130890613075565b60405180910390fd5b61131a816120c8565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816113b66114b3565b111580156113c5575060005482105b80156113f2575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006114c782611a55565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166114ee6113f9565b73ffffffffffffffffffffffffffffffffffffffff1614806115215750611520826000015161151b6113f9565b611205565b5b80611566575061152f6113f9565b73ffffffffffffffffffffffffffffffffffffffff1661154e84610749565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061159f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611608576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561166f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61167c858585600161218e565b61168c6000848460000151611401565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561193d5760005481101561193c5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119a68585856001612194565b5050505050565b6119c782826040518060200160405280600081525061219a565b5050565b6119d36113f9565b73ffffffffffffffffffffffffffffffffffffffff166119f1610e70565b73ffffffffffffffffffffffffffffffffffffffff1614611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e90613115565b60405180910390fd5b565b611a52816121ac565b50565b611a5d61277c565b600082905080611a6b6114b3565b11158015611a7a575060005481105b15611d1b576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611d1957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b8f578092505050611d4d565b6000600990505b828060019003935050600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611ca557819350505050611d4d565b6000816001900391508111611b9657847f000000000000000000000000000000000000000000000000000000000000000001826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050819350505050611d4d565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d9b6113f9565b8786866040518563ffffffff1660e01b8152600401611dbd9493929190612fcc565b602060405180830381600087803b158015611dd757600080fd5b505af1925050508015611e0857506040513d601f19601f82011682018060405250810190611e059190612cde565b60015b611e82573d8060008114611e38576040519150601f19603f3d011682016040523d82523d6000602084013e611e3d565b606091505b50600081511415611e7a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611ee4906134ff565b80601f0160208091040260200160405190810160405280929190818152602001828054611f10906134ff565b8015611f5d5780601f10611f3257610100808354040283529160200191611f5d565b820191906000526020600020905b815481529060010190602001808311611f4057829003601f168201915b5050505050905090565b60606000821415611faf576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120c3565b600082905060005b60008214611fe1578080611fca90613562565b915050600a82611fda9190613338565b9150611fb7565b60008167ffffffffffffffff811115611ffd57611ffc613698565b5b6040519080825280601f01601f19166020018201604052801561202f5781602001600182028036833780820191505090505b5090505b600085146120bc5760018261204891906133f7565b9150600a8561205791906135ab565b603061206391906132e2565b60f81b81838151811061207957612078613669565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120b59190613338565b9450612033565b8093505050505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b50505050565b50505050565b6121a78383836001612328565b505050565b60008114156121e7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080549050600082826121fb91906132e2565b9050817f00000000000000000000000000000000000000000000000000000000000000006122299190613298565b600460008054815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b81806001019250827f00000000000000000000000000000000000000000000000000000000000000000173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561227f578260008082825461231c91906132e2565b92505081905550505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612395576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156123d0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123dd600086838761218e565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156125a757506125a68773ffffffffffffffffffffffffffffffffffffffff16611d52565b5b1561266d575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461261c6000888480600101955088611d75565b612652576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156125ad57826000541461266857600080fd5b6126d9565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561266e575b8160008190555050506126ef6000868387612194565b5050505050565b828054612702906134ff565b90600052602060002090601f016020900481019282612724576000855561276b565b82601f1061273d57805160ff191683800117855561276b565b8280016001018555821561276b579182015b8281111561276a57825182559160200191906001019061274f565b5b50905061277891906127bf565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156127d85760008160009055506001016127c0565b5090565b60006127ef6127ea84613190565b61316b565b90508083825260208201905082856020860282011115612812576128116136cc565b5b60005b8581101561284257816128288882612940565b845260208401935060208301925050600181019050612815565b5050509392505050565b600061285f61285a846131bc565b61316b565b90508083825260208201905082856020860282011115612882576128816136cc565b5b60005b858110156128b257816128988882612a4c565b845260208401935060208301925050600181019050612885565b5050509392505050565b60006128cf6128ca846131e8565b61316b565b9050828152602081018484840111156128eb576128ea6136d1565b5b6128f68482856134bd565b509392505050565b600061291161290c84613219565b61316b565b90508281526020810184848401111561292d5761292c6136d1565b5b6129388482856134bd565b509392505050565b60008135905061294f81613839565b92915050565b600082601f83011261296a576129696136c7565b5b813561297a8482602086016127dc565b91505092915050565b600082601f830112612998576129976136c7565b5b81356129a884826020860161284c565b91505092915050565b6000813590506129c081613850565b92915050565b6000813590506129d581613867565b92915050565b6000815190506129ea81613867565b92915050565b600082601f830112612a0557612a046136c7565b5b8135612a158482602086016128bc565b91505092915050565b600082601f830112612a3357612a326136c7565b5b8135612a438482602086016128fe565b91505092915050565b600081359050612a5b8161387e565b92915050565b600081359050612a7081613895565b92915050565b600060208284031215612a8c57612a8b6136db565b5b6000612a9a84828501612940565b91505092915050565b60008060408385031215612aba57612ab96136db565b5b6000612ac885828601612940565b9250506020612ad985828601612940565b9150509250929050565b600080600060608486031215612afc57612afb6136db565b5b6000612b0a86828701612940565b9350506020612b1b86828701612940565b9250506040612b2c86828701612a61565b9150509250925092565b60008060008060808587031215612b5057612b4f6136db565b5b6000612b5e87828801612940565b9450506020612b6f87828801612940565b9350506040612b8087828801612a61565b925050606085013567ffffffffffffffff811115612ba157612ba06136d6565b5b612bad878288016129f0565b91505092959194509250565b60008060408385031215612bd057612bcf6136db565b5b6000612bde85828601612940565b9250506020612bef858286016129b1565b9150509250929050565b60008060408385031215612c1057612c0f6136db565b5b6000612c1e85828601612940565b9250506020612c2f85828601612a61565b9150509250929050565b60008060408385031215612c5057612c4f6136db565b5b600083013567ffffffffffffffff811115612c6e57612c6d6136d6565b5b612c7a85828601612955565b925050602083013567ffffffffffffffff811115612c9b57612c9a6136d6565b5b612ca785828601612983565b9150509250929050565b600060208284031215612cc757612cc66136db565b5b6000612cd5848285016129c6565b91505092915050565b600060208284031215612cf457612cf36136db565b5b6000612d02848285016129db565b91505092915050565b600060208284031215612d2157612d206136db565b5b600082013567ffffffffffffffff811115612d3f57612d3e6136d6565b5b612d4b84828501612a1e565b91505092915050565b600060208284031215612d6a57612d696136db565b5b6000612d7884828501612a61565b91505092915050565b612d8a8161342b565b82525050565b612d998161343d565b82525050565b6000612daa8261324a565b612db48185613260565b9350612dc48185602086016134cc565b612dcd816136e0565b840191505092915050565b6000612de382613255565b612ded818561327c565b9350612dfd8185602086016134cc565b612e06816136e0565b840191505092915050565b6000612e1c82613255565b612e26818561328d565b9350612e368185602086016134cc565b80840191505092915050565b6000612e4f600c8361327c565b9150612e5a826136f1565b602082019050919050565b6000612e7260268361327c565b9150612e7d8261371a565b604082019050919050565b6000612e9560188361327c565b9150612ea082613769565b602082019050919050565b6000612eb860088361327c565b9150612ec382613792565b602082019050919050565b6000612edb601e8361327c565b9150612ee6826137bb565b602082019050919050565b6000612efe60108361327c565b9150612f09826137e4565b602082019050919050565b6000612f2160208361327c565b9150612f2c8261380d565b602082019050919050565b6000612f44600083613271565b9150612f4f82613836565b600082019050919050565b612f63816134a3565b82525050565b612f72816134ad565b82525050565b6000612f848285612e11565b9150612f908284612e11565b91508190509392505050565b6000612fa782612f37565b9150819050919050565b6000602082019050612fc66000830184612d81565b92915050565b6000608082019050612fe16000830187612d81565b612fee6020830186612d81565b612ffb6040830185612f5a565b818103606083015261300d8184612d9f565b905095945050505050565b600060208201905061302d6000830184612d90565b92915050565b6000602082019050818103600083015261304d8184612dd8565b905092915050565b6000602082019050818103600083015261306e81612e42565b9050919050565b6000602082019050818103600083015261308e81612e65565b9050919050565b600060208201905081810360008301526130ae81612e88565b9050919050565b600060208201905081810360008301526130ce81612eab565b9050919050565b600060208201905081810360008301526130ee81612ece565b9050919050565b6000602082019050818103600083015261310e81612ef1565b9050919050565b6000602082019050818103600083015261312e81612f14565b9050919050565b600060208201905061314a6000830184612f5a565b92915050565b60006020820190506131656000830184612f69565b92915050565b6000613175613186565b90506131818282613531565b919050565b6000604051905090565b600067ffffffffffffffff8211156131ab576131aa613698565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156131d7576131d6613698565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561320357613202613698565b5b61320c826136e0565b9050602081019050919050565b600067ffffffffffffffff82111561323457613233613698565b5b61323d826136e0565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006132a382613483565b91506132ae83613483565b92508273ffffffffffffffffffffffffffffffffffffffff038211156132d7576132d66135dc565b5b828201905092915050565b60006132ed826134a3565b91506132f8836134a3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561332d5761332c6135dc565b5b828201905092915050565b6000613343826134a3565b915061334e836134a3565b92508261335e5761335d61360b565b5b828204905092915050565b6000613374826134a3565b915061337f836134a3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133b8576133b76135dc565b5b828202905092915050565b60006133ce82613483565b91506133d983613483565b9250828210156133ec576133eb6135dc565b5b828203905092915050565b6000613402826134a3565b915061340d836134a3565b9250828210156134205761341f6135dc565b5b828203905092915050565b600061343682613483565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b838110156134ea5780820151818401526020810190506134cf565b838111156134f9576000848401525b50505050565b6000600282049050600182168061351757607f821691505b6020821081141561352b5761352a61363a565b5b50919050565b61353a826136e0565b810181811067ffffffffffffffff8211171561355957613558613698565b5b80604052505050565b600061356d826134a3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156135a05761359f6135dc565b5b600182019050919050565b60006135b6826134a3565b91506135c1836134a3565b9250826135d1576135d061360b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f696e73756666696369656e740000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f4c656e677468206e6f74206d6174636800000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b6138428161342b565b811461384d57600080fd5b50565b6138598161343d565b811461386457600080fd5b50565b61387081613449565b811461387b57600080fd5b50565b61388781613475565b811461389257600080fd5b50565b61389e816134a3565b81146138a957600080fd5b5056fea2646970667358221220f536b1bb03d190373e412ec1a004016ed1228acd40f99d16ff519c5aaee502d064736f6c63430008070033697066733a2f2f62616679626569613434766275756e727167676b766e34716e7570766477736b696379777371647567646672676a347a6f7568737974706b336b652f
Deployed Bytecode
0x6080604052600436106101665760003560e01c80636817c76c116100d1578063a22cb4651161008a578063d5abeb0111610064578063d5abeb0114610519578063e985e9c514610544578063f2fde38b14610581578063f968adbe146105aa57610166565b8063a22cb4651461048a578063b88d4fde146104b3578063c87b56dd146104dc57610166565b80636817c76c1461037a57806370a08231146103a55780638a886986146103e25780638da5cb5b1461040b57806395d89b41146104365780639b642de11461046157610166565b80632db11544116101235780632db115441461028d5780633ccfd60b146102a957806342842e0e146102c05780635fd22840146102e957806362b99ad4146103125780636352211e1461033d57610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461023957806323b872dd14610264575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d9190612cb1565b6105d5565b60405161019f9190613018565b60405180910390f35b3480156101b457600080fd5b506101bd6106b7565b6040516101ca9190613033565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612d54565b610749565b6040516102079190612fb1565b60405180910390f35b34801561021c57600080fd5b5061023760048036038101906102329190612bf9565b6107c5565b005b34801561024557600080fd5b5061024e6108d0565b60405161025b9190613135565b60405180910390f35b34801561027057600080fd5b5061028b60048036038101906102869190612ae3565b6108e7565b005b6102a760048036038101906102a29190612d54565b6108f7565b005b3480156102b557600080fd5b506102be610a5b565b005b3480156102cc57600080fd5b506102e760048036038101906102e29190612ae3565b610b20565b005b3480156102f557600080fd5b50610310600480360381019061030b9190612d54565b610b40565b005b34801561031e57600080fd5b50610327610b54565b6040516103349190613033565b60405180910390f35b34801561034957600080fd5b50610364600480360381019061035f9190612d54565b610be2565b6040516103719190612fb1565b60405180910390f35b34801561038657600080fd5b5061038f610bf8565b60405161039c9190613135565b60405180910390f35b3480156103b157600080fd5b506103cc60048036038101906103c79190612a76565b610c1c565b6040516103d99190613135565b60405180910390f35b3480156103ee57600080fd5b5061040960048036038101906104049190612c39565b610db1565b005b34801561041757600080fd5b50610420610e70565b60405161042d9190612fb1565b60405180910390f35b34801561044257600080fd5b5061044b610e9a565b6040516104589190613033565b60405180910390f35b34801561046d57600080fd5b5061048860048036038101906104839190612d0b565b610f2c565b005b34801561049657600080fd5b506104b160048036038101906104ac9190612bb9565b610f4e565b005b3480156104bf57600080fd5b506104da60048036038101906104d59190612b36565b6110c6565b005b3480156104e857600080fd5b5061050360048036038101906104fe9190612d54565b611142565b6040516105109190613033565b60405180910390f35b34801561052557600080fd5b5061052e6111e1565b60405161053b9190613150565b60405180910390f35b34801561055057600080fd5b5061056b60048036038101906105669190612aa3565b611205565b6040516105789190613018565b60405180910390f35b34801561058d57600080fd5b506105a860048036038101906105a39190612a76565b611299565b005b3480156105b657600080fd5b506105bf61131d565b6040516105cc9190613150565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106a057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106b057506106af82611341565b5b9050919050565b6060600280546106c6906134ff565b80601f01602080910402602001604051908101604052809291908181526020018280546106f2906134ff565b801561073f5780601f106107145761010080835404028352916020019161073f565b820191906000526020600020905b81548152906001019060200180831161072257829003601f168201915b5050505050905090565b6000610754826113ab565b61078a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107d082610be2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610838576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108576113f9565b73ffffffffffffffffffffffffffffffffffffffff16141580156108895750610887816108826113f9565b611205565b155b156108c0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108cb838383611401565b505050565b60006108da6114b3565b6001546000540303905090565b6108f28383836114bc565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095c906130d5565b60405180910390fd5b807f000000000000000000000000000000000000000000000000001ff973cafa80006109919190613369565b3410156109d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ca90613055565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000003e863ffffffff1681610a036108d0565b610a0d91906132e2565b1115610a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a45906130b5565b60405180910390fd5b610a5833826119ad565b50565b610a636119cb565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff1683604051610a9390612f9c565b60006040518083038185875af1925050503d8060008114610ad0576040519150601f19603f3d011682016040523d82523d6000602084013e610ad5565b606091505b50508091505080610b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1290613095565b60405180910390fd5b505050565b610b3b838383604051806020016040528060008152506110c6565b505050565b610b486119cb565b610b5181611a49565b50565b60098054610b61906134ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8d906134ff565b8015610bda5780601f10610baf57610100808354040283529160200191610bda565b820191906000526020600020905b815481529060010190602001808311610bbd57829003601f168201915b505050505081565b6000610bed82611a55565b600001519050919050565b7f000000000000000000000000000000000000000000000000001ff973cafa800081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c84576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614610d5457600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050610dac565b6000547f000000000000000000000000962228f791e745273700024d54e3f9897a3e819883610d8391906133c3565b73ffffffffffffffffffffffffffffffffffffffff1611610da75760019050610dac565b600090505b919050565b610db96119cb565b60008251118015610dcb575080518251145b610e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e01906130f5565b60405180910390fd5b60005b8251811015610e6b57610e58838281518110610e2c57610e2b613669565b5b6020026020010151838381518110610e4757610e46613669565b5b602002602001015161ffff166119ad565b8080610e6390613562565b915050610e0d565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610ea9906134ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed5906134ff565b8015610f225780601f10610ef757610100808354040283529160200191610f22565b820191906000526020600020905b815481529060010190602001808311610f0557829003601f168201915b5050505050905090565b610f346119cb565b8060099080519060200190610f4a9291906126f6565b5050565b610f566113f9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fbb576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610fc86113f9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110756113f9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110ba9190613018565b60405180910390a35050565b6110d18484846114bc565b6110f08373ffffffffffffffffffffffffffffffffffffffff16611d52565b8015611105575061110384848484611d75565b155b1561113c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061114d826113ab565b611183576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061118d611ed5565b90506000815114156111ae57604051806020016040528060008152506111d9565b806111b884611f67565b6040516020016111c9929190612f78565b6040516020818303038152906040525b915050919050565b7f00000000000000000000000000000000000000000000000000000000000003e881565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112a16119cb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130890613075565b60405180910390fd5b61131a816120c8565b50565b7f000000000000000000000000000000000000000000000000000000000000000a81565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816113b66114b3565b111580156113c5575060005482105b80156113f2575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006114c782611a55565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166114ee6113f9565b73ffffffffffffffffffffffffffffffffffffffff1614806115215750611520826000015161151b6113f9565b611205565b5b80611566575061152f6113f9565b73ffffffffffffffffffffffffffffffffffffffff1661154e84610749565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061159f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611608576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561166f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61167c858585600161218e565b61168c6000848460000151611401565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561193d5760005481101561193c5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119a68585856001612194565b5050505050565b6119c782826040518060200160405280600081525061219a565b5050565b6119d36113f9565b73ffffffffffffffffffffffffffffffffffffffff166119f1610e70565b73ffffffffffffffffffffffffffffffffffffffff1614611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e90613115565b60405180910390fd5b565b611a52816121ac565b50565b611a5d61277c565b600082905080611a6b6114b3565b11158015611a7a575060005481105b15611d1b576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611d1957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b8f578092505050611d4d565b6000600990505b828060019003935050600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611ca557819350505050611d4d565b6000816001900391508111611b9657847f000000000000000000000000962228f791e745273700024d54e3f9897a3e819801826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050819350505050611d4d565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d9b6113f9565b8786866040518563ffffffff1660e01b8152600401611dbd9493929190612fcc565b602060405180830381600087803b158015611dd757600080fd5b505af1925050508015611e0857506040513d601f19601f82011682018060405250810190611e059190612cde565b60015b611e82573d8060008114611e38576040519150601f19603f3d011682016040523d82523d6000602084013e611e3d565b606091505b50600081511415611e7a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611ee4906134ff565b80601f0160208091040260200160405190810160405280929190818152602001828054611f10906134ff565b8015611f5d5780601f10611f3257610100808354040283529160200191611f5d565b820191906000526020600020905b815481529060010190602001808311611f4057829003601f168201915b5050505050905090565b60606000821415611faf576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120c3565b600082905060005b60008214611fe1578080611fca90613562565b915050600a82611fda9190613338565b9150611fb7565b60008167ffffffffffffffff811115611ffd57611ffc613698565b5b6040519080825280601f01601f19166020018201604052801561202f5781602001600182028036833780820191505090505b5090505b600085146120bc5760018261204891906133f7565b9150600a8561205791906135ab565b603061206391906132e2565b60f81b81838151811061207957612078613669565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120b59190613338565b9450612033565b8093505050505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b50505050565b50505050565b6121a78383836001612328565b505050565b60008114156121e7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080549050600082826121fb91906132e2565b9050817f000000000000000000000000962228f791e745273700024d54e3f9897a3e81986122299190613298565b600460008054815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b81806001019250827f000000000000000000000000962228f791e745273700024d54e3f9897a3e81980173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561227f578260008082825461231c91906132e2565b92505081905550505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612395576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156123d0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123dd600086838761218e565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156125a757506125a68773ffffffffffffffffffffffffffffffffffffffff16611d52565b5b1561266d575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461261c6000888480600101955088611d75565b612652576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156125ad57826000541461266857600080fd5b6126d9565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561266e575b8160008190555050506126ef6000868387612194565b5050505050565b828054612702906134ff565b90600052602060002090601f016020900481019282612724576000855561276b565b82601f1061273d57805160ff191683800117855561276b565b8280016001018555821561276b579182015b8281111561276a57825182559160200191906001019061274f565b5b50905061277891906127bf565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156127d85760008160009055506001016127c0565b5090565b60006127ef6127ea84613190565b61316b565b90508083825260208201905082856020860282011115612812576128116136cc565b5b60005b8581101561284257816128288882612940565b845260208401935060208301925050600181019050612815565b5050509392505050565b600061285f61285a846131bc565b61316b565b90508083825260208201905082856020860282011115612882576128816136cc565b5b60005b858110156128b257816128988882612a4c565b845260208401935060208301925050600181019050612885565b5050509392505050565b60006128cf6128ca846131e8565b61316b565b9050828152602081018484840111156128eb576128ea6136d1565b5b6128f68482856134bd565b509392505050565b600061291161290c84613219565b61316b565b90508281526020810184848401111561292d5761292c6136d1565b5b6129388482856134bd565b509392505050565b60008135905061294f81613839565b92915050565b600082601f83011261296a576129696136c7565b5b813561297a8482602086016127dc565b91505092915050565b600082601f830112612998576129976136c7565b5b81356129a884826020860161284c565b91505092915050565b6000813590506129c081613850565b92915050565b6000813590506129d581613867565b92915050565b6000815190506129ea81613867565b92915050565b600082601f830112612a0557612a046136c7565b5b8135612a158482602086016128bc565b91505092915050565b600082601f830112612a3357612a326136c7565b5b8135612a438482602086016128fe565b91505092915050565b600081359050612a5b8161387e565b92915050565b600081359050612a7081613895565b92915050565b600060208284031215612a8c57612a8b6136db565b5b6000612a9a84828501612940565b91505092915050565b60008060408385031215612aba57612ab96136db565b5b6000612ac885828601612940565b9250506020612ad985828601612940565b9150509250929050565b600080600060608486031215612afc57612afb6136db565b5b6000612b0a86828701612940565b9350506020612b1b86828701612940565b9250506040612b2c86828701612a61565b9150509250925092565b60008060008060808587031215612b5057612b4f6136db565b5b6000612b5e87828801612940565b9450506020612b6f87828801612940565b9350506040612b8087828801612a61565b925050606085013567ffffffffffffffff811115612ba157612ba06136d6565b5b612bad878288016129f0565b91505092959194509250565b60008060408385031215612bd057612bcf6136db565b5b6000612bde85828601612940565b9250506020612bef858286016129b1565b9150509250929050565b60008060408385031215612c1057612c0f6136db565b5b6000612c1e85828601612940565b9250506020612c2f85828601612a61565b9150509250929050565b60008060408385031215612c5057612c4f6136db565b5b600083013567ffffffffffffffff811115612c6e57612c6d6136d6565b5b612c7a85828601612955565b925050602083013567ffffffffffffffff811115612c9b57612c9a6136d6565b5b612ca785828601612983565b9150509250929050565b600060208284031215612cc757612cc66136db565b5b6000612cd5848285016129c6565b91505092915050565b600060208284031215612cf457612cf36136db565b5b6000612d02848285016129db565b91505092915050565b600060208284031215612d2157612d206136db565b5b600082013567ffffffffffffffff811115612d3f57612d3e6136d6565b5b612d4b84828501612a1e565b91505092915050565b600060208284031215612d6a57612d696136db565b5b6000612d7884828501612a61565b91505092915050565b612d8a8161342b565b82525050565b612d998161343d565b82525050565b6000612daa8261324a565b612db48185613260565b9350612dc48185602086016134cc565b612dcd816136e0565b840191505092915050565b6000612de382613255565b612ded818561327c565b9350612dfd8185602086016134cc565b612e06816136e0565b840191505092915050565b6000612e1c82613255565b612e26818561328d565b9350612e368185602086016134cc565b80840191505092915050565b6000612e4f600c8361327c565b9150612e5a826136f1565b602082019050919050565b6000612e7260268361327c565b9150612e7d8261371a565b604082019050919050565b6000612e9560188361327c565b9150612ea082613769565b602082019050919050565b6000612eb860088361327c565b9150612ec382613792565b602082019050919050565b6000612edb601e8361327c565b9150612ee6826137bb565b602082019050919050565b6000612efe60108361327c565b9150612f09826137e4565b602082019050919050565b6000612f2160208361327c565b9150612f2c8261380d565b602082019050919050565b6000612f44600083613271565b9150612f4f82613836565b600082019050919050565b612f63816134a3565b82525050565b612f72816134ad565b82525050565b6000612f848285612e11565b9150612f908284612e11565b91508190509392505050565b6000612fa782612f37565b9150819050919050565b6000602082019050612fc66000830184612d81565b92915050565b6000608082019050612fe16000830187612d81565b612fee6020830186612d81565b612ffb6040830185612f5a565b818103606083015261300d8184612d9f565b905095945050505050565b600060208201905061302d6000830184612d90565b92915050565b6000602082019050818103600083015261304d8184612dd8565b905092915050565b6000602082019050818103600083015261306e81612e42565b9050919050565b6000602082019050818103600083015261308e81612e65565b9050919050565b600060208201905081810360008301526130ae81612e88565b9050919050565b600060208201905081810360008301526130ce81612eab565b9050919050565b600060208201905081810360008301526130ee81612ece565b9050919050565b6000602082019050818103600083015261310e81612ef1565b9050919050565b6000602082019050818103600083015261312e81612f14565b9050919050565b600060208201905061314a6000830184612f5a565b92915050565b60006020820190506131656000830184612f69565b92915050565b6000613175613186565b90506131818282613531565b919050565b6000604051905090565b600067ffffffffffffffff8211156131ab576131aa613698565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156131d7576131d6613698565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561320357613202613698565b5b61320c826136e0565b9050602081019050919050565b600067ffffffffffffffff82111561323457613233613698565b5b61323d826136e0565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006132a382613483565b91506132ae83613483565b92508273ffffffffffffffffffffffffffffffffffffffff038211156132d7576132d66135dc565b5b828201905092915050565b60006132ed826134a3565b91506132f8836134a3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561332d5761332c6135dc565b5b828201905092915050565b6000613343826134a3565b915061334e836134a3565b92508261335e5761335d61360b565b5b828204905092915050565b6000613374826134a3565b915061337f836134a3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133b8576133b76135dc565b5b828202905092915050565b60006133ce82613483565b91506133d983613483565b9250828210156133ec576133eb6135dc565b5b828203905092915050565b6000613402826134a3565b915061340d836134a3565b9250828210156134205761341f6135dc565b5b828203905092915050565b600061343682613483565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b838110156134ea5780820151818401526020810190506134cf565b838111156134f9576000848401525b50505050565b6000600282049050600182168061351757607f821691505b6020821081141561352b5761352a61363a565b5b50919050565b61353a826136e0565b810181811067ffffffffffffffff8211171561355957613558613698565b5b80604052505050565b600061356d826134a3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156135a05761359f6135dc565b5b600182019050919050565b60006135b6826134a3565b91506135c1836134a3565b9250826135d1576135d061360b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f696e73756666696369656e740000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f4c656e677468206e6f74206d6174636800000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b6138428161342b565b811461384d57600080fd5b50565b6138598161343d565b811461386457600080fd5b50565b61387081613449565b811461387b57600080fd5b50565b61388781613475565b811461389257600080fd5b50565b61389e816134a3565b81146138a957600080fd5b5056fea2646970667358221220f536b1bb03d190373e412ec1a004016ed1228acd40f99d16ff519c5aaee502d064736f6c63430008070033
Deployed Bytecode Sourcemap
48479:1791:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28411:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32252:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33755:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33318:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27660:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34612:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49310:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49985:278;;;;;;;;;;;;;:::i;:::-;;34853:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49557:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48530:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32061:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48635:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28782:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49680:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4598:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32421:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49098:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34031:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35109:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32596:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48690:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34381:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5050:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48737:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28411:305;28513:4;28565:25;28550:40;;;:11;:40;;;;:105;;;;28622:33;28607:48;;;:11;:48;;;;28550:105;:158;;;;28672:36;28696:11;28672:23;:36::i;:::-;28550:158;28530:178;;28411:305;;;:::o;32252:100::-;32306:13;32339:5;32332:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32252:100;:::o;33755:204::-;33823:7;33848:16;33856:7;33848;:16::i;:::-;33843:64;;33873:34;;;;;;;;;;;;;;33843:64;33927:15;:24;33943:7;33927:24;;;;;;;;;;;;;;;;;;;;;33920:31;;33755:204;;;:::o;33318:371::-;33391:13;33407:24;33423:7;33407:15;:24::i;:::-;33391:40;;33452:5;33446:11;;:2;:11;;;33442:48;;;33466:24;;;;;;;;;;;;;;33442:48;33523:5;33507:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;33533:37;33550:5;33557:12;:10;:12::i;:::-;33533:16;:37::i;:::-;33532:38;33507:63;33503:138;;;33594:35;;;;;;;;;;;;;;33503:138;33653:28;33662:2;33666:7;33675:5;33653:8;:28::i;:::-;33380:309;33318:371;;:::o;27660:303::-;27704:7;27929:15;:13;:15::i;:::-;27914:12;;27898:13;;:28;:46;27891:53;;27660:303;:::o;34612:170::-;34746:28;34756:4;34762:2;34766:7;34746:9;:28::i;:::-;34612:170;;;:::o;49310:239::-;48839:10;48826:23;;:9;:23;;;48818:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;49417:6:::1;49405:9;:18;;;;:::i;:::-;49392:9;:31;;49384:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;49478:9;49452:35;;49468:6;49452:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;49444:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;49512:29;49522:10;49534:6;49512:9;:29::i;:::-;49310:239:::0;:::o;49985:278::-;4484:13;:11;:13::i;:::-;50033:18:::1;50054:21;50033:42;;50088:9;50108:10;50088:31;;50132:12;50171:1;:6;;50185:10;50171:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50157:43;;;;;50219:7;50211:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;50022:241;;;49985:278::o:0;34853:185::-;34991:39;35008:4;35014:2;35018:7;34991:39;;;;;;;;;;;;:16;:39::i;:::-;34853:185;;;:::o;49557:95::-;4484:13;:11;:13::i;:::-;49630:14:::1;49637:6;49630;:14::i;:::-;49557:95:::0;:::o;48530:96::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32061:124::-;32125:7;32152:20;32164:7;32152:11;:20::i;:::-;:25;;;32145:32;;32061:124;;;:::o;48635:48::-;;;:::o;28782:395::-;28846:7;28887:1;28870:19;;:5;:19;;;28866:60;;;28898:28;;;;;;;;;;;;;;28866:60;28974:1;28943:12;:19;28956:5;28943:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:32;;;28939:108;;29007:12;:19;29020:5;29007:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;28999:36;;28992:43;;;;28939:108;29099:13;;29088:6;29071:5;29063:32;;;;:::i;:::-;:49;;;29059:90;;29136:1;29129:8;;;;29059:90;29168:1;29161:8;;28782:395;;;;:::o;49680:297::-;4484:13;:11;:13::i;:::-;49802:1:::1;49784:8;:15;:19;:53;;;;;49826:4;:11;49807:8;:15;:30;49784:53;49776:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;49874:6;49869:101;49890:8;:15;49886:1;:19;49869:101;;;49927:31;49937:8;49946:1;49937:11;;;;;;;;:::i;:::-;;;;;;;;49950:4;49955:1;49950:7;;;;;;;;:::i;:::-;;;;;;;;49927:31;;:9;:31::i;:::-;49907:3;;;;;:::i;:::-;;;;49869:101;;;;49680:297:::0;;:::o;4598:87::-;4644:7;4671:6;;;;;;;;;;;4664:13;;4598:87;:::o;32421:104::-;32477:13;32510:7;32503:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32421:104;:::o;49098:86::-;4484:13;:11;:13::i;:::-;49173:3:::1;49161:9;:15;;;;;;;;;;;;:::i;:::-;;49098:86:::0;:::o;34031:279::-;34134:12;:10;:12::i;:::-;34122:24;;:8;:24;;;34118:54;;;34155:17;;;;;;;;;;;;;;34118:54;34230:8;34185:18;:32;34204:12;:10;:12::i;:::-;34185:32;;;;;;;;;;;;;;;:42;34218:8;34185:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34283:8;34254:48;;34269:12;:10;:12::i;:::-;34254:48;;;34293:8;34254:48;;;;;;:::i;:::-;;;;;;;;34031:279;;:::o;35109:369::-;35276:28;35286:4;35292:2;35296:7;35276:9;:28::i;:::-;35319:15;:2;:13;;;:15::i;:::-;:76;;;;;35339:56;35370:4;35376:2;35380:7;35389:5;35339:30;:56::i;:::-;35338:57;35319:76;35315:156;;;35419:40;;;;;;;;;;;;;;35315:156;35109:369;;;;:::o;32596:318::-;32669:13;32700:16;32708:7;32700;:16::i;:::-;32695:59;;32725:29;;;;;;;;;;;;;;32695:59;32767:21;32791:10;:8;:10::i;:::-;32767:34;;32844:1;32825:7;32819:21;:26;;:87;;;;;;;;;;;;;;;;;32872:7;32881:18;:7;:16;:18::i;:::-;32855:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32819:87;32812:94;;;32596:318;;;:::o;48690:40::-;;;:::o;34381:164::-;34478:4;34502:18;:25;34521:5;34502:25;;;;;;;;;;;;;;;:35;34528:8;34502:35;;;;;;;;;;;;;;;;;;;;;;;;;34495:42;;34381:164;;;;:::o;5050:201::-;4484:13;:11;:13::i;:::-;5159:1:::1;5139:22;;:8;:22;;;;5131:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5215:28;5234:8;5215:18;:28::i;:::-;5050:201:::0;:::o;48737:37::-;;;:::o;16998:157::-;17083:4;17122:25;17107:40;;;:11;:40;;;;17100:47;;16998:157;;;:::o;35733:187::-;35790:4;35833:7;35814:15;:13;:15::i;:::-;:26;;:53;;;;;35854:13;;35844:7;:23;35814:53;:98;;;;;35885:11;:20;35897:7;35885:20;;;;;;;;;;;:27;;;;;;;;;;;;35884:28;35814:98;35807:105;;35733:187;;;:::o;3149:98::-;3202:7;3229:10;3222:17;;3149:98;:::o;45463:196::-;45605:2;45578:15;:24;45594:7;45578:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45643:7;45639:2;45623:28;;45632:5;45623:28;;;;;;;;;;;;45463:196;;;:::o;49192:110::-;49266:7;49293:1;49286:8;;49192:110;:::o;40965:2112::-;41080:35;41118:20;41130:7;41118:11;:20::i;:::-;41080:58;;41151:22;41193:13;:18;;;41177:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;41228:50;41245:13;:18;;;41265:12;:10;:12::i;:::-;41228:16;:50::i;:::-;41177:101;:154;;;;41319:12;:10;:12::i;:::-;41295:36;;:20;41307:7;41295:11;:20::i;:::-;:36;;;41177:154;41151:181;;41350:17;41345:66;;41376:35;;;;;;;;;;;;;;41345:66;41448:4;41426:26;;:13;:18;;;:26;;;41422:67;;41461:28;;;;;;;;;;;;;;41422:67;41518:1;41504:16;;:2;:16;;;41500:52;;;41529:23;;;;;;;;;;;;;;41500:52;41565:43;41587:4;41593:2;41597:7;41606:1;41565:21;:43::i;:::-;41673:49;41690:1;41694:7;41703:13;:18;;;41673:8;:49::i;:::-;42048:1;42018:12;:18;42031:4;42018:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42092:1;42064:12;:16;42077:2;42064:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42138:2;42110:11;:20;42122:7;42110:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;42200:15;42155:11;:20;42167:7;42155:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;42468:19;42500:1;42490:7;:11;42468:33;;42561:1;42520:43;;:11;:24;42532:11;42520:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;42516:445;;;42745:13;;42731:11;:27;42727:219;;;42815:13;:18;;;42783:11;:24;42795:11;42783:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;42898:13;:28;;;42856:11;:24;42868:11;42856:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;42727:219;42516:445;41993:979;43008:7;43004:2;42989:27;;42998:4;42989:27;;;;;;;;;;;;43027:42;43048:4;43054:2;43058:7;43067:1;43027:20;:42::i;:::-;41069:2008;;40965:2112;;;:::o;35928:104::-;35997:27;36007:2;36011:8;35997:27;;;;;;;;;;;;:9;:27::i;:::-;35928:104;;:::o;4763:132::-;4838:12;:10;:12::i;:::-;4827:23;;:7;:5;:7::i;:::-;:23;;;4819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4763:132::o;36566:113::-;36648:19;36658:8;36648:9;:19::i;:::-;36566:113;:::o;30712:1287::-;30773:21;;:::i;:::-;30807:12;30822:7;30807:22;;30890:4;30871:15;:13;:15::i;:::-;:23;;:47;;;;;30905:13;;30898:4;:20;30871:47;30867:1065;;;30939:31;30973:11;:17;30985:4;30973:17;;;;;;;;;;;30939:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31014:9;:16;;;31009:904;;31085:1;31059:28;;:9;:14;;;:28;;;31055:101;;31123:9;31116:16;;;;;;31055:101;31460:13;31476:1;31460:17;;31500:270;31529:6;;;;;;;;31574:11;:17;31586:4;31574:17;;;;;;;;;;;31562:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31648:1;31622:28;;:9;:14;;;:28;;;31618:109;;31690:9;31683:16;;;;;;;31618:109;31767:1;31757:7;;;;;;;:11;31500:270;;31845:7;31827:6;31819:34;31794:9;:14;;:60;;;;;;;;;;;31884:9;31877:16;;;;;;;31009:904;30920:1012;30867:1065;31960:31;;;;;;;;;;;;;;30712:1287;;;;:::o;6842:326::-;6902:4;7159:1;7137:7;:19;;;:23;7130:30;;6842:326;;;:::o;46151:667::-;46314:4;46351:2;46335:36;;;46372:12;:10;:12::i;:::-;46386:4;46392:7;46401:5;46335:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46331:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46586:1;46569:6;:13;:18;46565:235;;;46615:40;;;;;;;;;;;;;;46565:235;46758:6;46752:13;46743:6;46739:2;46735:15;46728:38;46331:480;46464:45;;;46454:55;;;:6;:55;;;;46447:62;;;46151:667;;;;;;:::o;48979:111::-;49040:13;49073:9;49066:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48979:111;:::o;403:723::-;459:13;689:1;680:5;:10;676:53;;;707:10;;;;;;;;;;;;;;;;;;;;;676:53;739:12;754:5;739:20;;770:14;795:78;810:1;802:4;:9;795:78;;828:8;;;;;:::i;:::-;;;;859:2;851:10;;;;;:::i;:::-;;;795:78;;;883:19;915:6;905:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;883:39;;933:154;949:1;940:5;:10;933:154;;977:1;967:11;;;;;:::i;:::-;;;1044:2;1036:5;:10;;;;:::i;:::-;1023:2;:24;;;;:::i;:::-;1010:39;;993:6;1000;993:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1073:2;1064:11;;;;;:::i;:::-;;;933:154;;;1111:6;1097:21;;;;;403:723;;;;:::o;5411:191::-;5485:16;5504:6;;;;;;;;;;;5485:25;;5530:8;5521:6;;:17;;;;;;;;;;;;;;;;;;5585:8;5554:40;;5575:8;5554:40;;;;;;;;;;;;5474:128;5411:191;:::o;47466:159::-;;;;;:::o;48284:158::-;;;;;:::o;36395:163::-;36518:32;36524:2;36528:8;36538:5;36545:4;36518:5;:32::i;:::-;36395:163;;;:::o;40104:607::-;40205:1;40193:8;:13;40189:44;;;40215:18;;;;;;;;;;;;;;40189:44;40250:20;40273:13;;40250:36;;40301:11;40330:8;40315:12;:23;;;;:::i;:::-;40301:37;;40421:12;40403:6;40395:39;;;;:::i;:::-;40353:11;:26;40365:13;;40353:26;;;;;;;;;;;:31;;;:82;;;;;;;;;;;;;;;;;;40481:166;40583:14;;;;;;40567:12;40549:6;40541:39;40512:86;;40529:1;40512:86;;;;;;;;;;;;40642:3;40626:12;:19;;40481:166;;40693:8;40676:13;;:25;;;;;;;:::i;:::-;;;;;;;;40174:537;;40104:607;:::o;36939:1775::-;37078:20;37101:13;;37078:36;;37143:1;37129:16;;:2;:16;;;37125:48;;;37154:19;;;;;;;;;;;;;;37125:48;37200:1;37188:8;:13;37184:44;;;37210:18;;;;;;;;;;;;;;37184:44;37241:61;37271:1;37275:2;37279:12;37293:8;37241:21;:61::i;:::-;37614:8;37579:12;:16;37592:2;37579:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37678:8;37638:12;:16;37651:2;37638:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37737:2;37704:11;:25;37716:12;37704:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;37804:15;37754:11;:25;37766:12;37754:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;37837:20;37860:12;37837:35;;37887:11;37916:8;37901:12;:23;37887:37;;37945:4;:23;;;;;37953:15;:2;:13;;;:15::i;:::-;37945:23;37941:641;;;37989:314;38045:12;38041:2;38020:38;;38037:1;38020:38;;;;;;;;;;;;38086:69;38125:1;38129:2;38133:14;;;;;;38149:5;38086:30;:69::i;:::-;38081:174;;38191:40;;;;;;;;;;;;;;38081:174;38298:3;38282:12;:19;;37989:314;;38384:12;38367:13;;:29;38363:43;;38398:8;;;38363:43;37941:641;;;38447:120;38503:14;;;;;;38499:2;38478:40;;38495:1;38478:40;;;;;;;;;;;;38562:3;38546:12;:19;;38447:120;;37941:641;38612:12;38596:13;:28;;;;37554:1082;;38646:60;38675:1;38679:2;38683:12;38697:8;38646:20;:60::i;:::-;37067:1647;36939:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;768:719::-;863:5;888:80;904:63;960:6;904:63;:::i;:::-;888:80;:::i;:::-;879:89;;988:5;1017:6;1010:5;1003:21;1051:4;1044:5;1040:16;1033:23;;1077:6;1127:3;1119:4;1111:6;1107:17;1102:3;1098:27;1095:36;1092:143;;;1146:79;;:::i;:::-;1092:143;1259:1;1244:237;1269:6;1266:1;1263:13;1244:237;;;1337:3;1366:36;1398:3;1386:10;1366:36;:::i;:::-;1361:3;1354:49;1432:4;1427:3;1423:14;1416:21;;1466:4;1461:3;1457:14;1450:21;;1304:177;1291:1;1288;1284:9;1279:14;;1244:237;;;1248:14;869:618;;768:719;;;;;:::o;1493:410::-;1570:5;1595:65;1611:48;1652:6;1611:48;:::i;:::-;1595:65;:::i;:::-;1586:74;;1683:6;1676:5;1669:21;1721:4;1714:5;1710:16;1759:3;1750:6;1745:3;1741:16;1738:25;1735:112;;;1766:79;;:::i;:::-;1735:112;1856:41;1890:6;1885:3;1880;1856:41;:::i;:::-;1576:327;1493:410;;;;;:::o;1909:412::-;1987:5;2012:66;2028:49;2070:6;2028:49;:::i;:::-;2012:66;:::i;:::-;2003:75;;2101:6;2094:5;2087:21;2139:4;2132:5;2128:16;2177:3;2168:6;2163:3;2159:16;2156:25;2153:112;;;2184:79;;:::i;:::-;2153:112;2274:41;2308:6;2303:3;2298;2274:41;:::i;:::-;1993:328;1909:412;;;;;:::o;2327:139::-;2373:5;2411:6;2398:20;2389:29;;2427:33;2454:5;2427:33;:::i;:::-;2327:139;;;;:::o;2489:370::-;2560:5;2609:3;2602:4;2594:6;2590:17;2586:27;2576:122;;2617:79;;:::i;:::-;2576:122;2734:6;2721:20;2759:94;2849:3;2841:6;2834:4;2826:6;2822:17;2759:94;:::i;:::-;2750:103;;2566:293;2489:370;;;;:::o;2881:368::-;2951:5;3000:3;2993:4;2985:6;2981:17;2977:27;2967:122;;3008:79;;:::i;:::-;2967:122;3125:6;3112:20;3150:93;3239:3;3231:6;3224:4;3216:6;3212:17;3150:93;:::i;:::-;3141:102;;2957:292;2881:368;;;;:::o;3255:133::-;3298:5;3336:6;3323:20;3314:29;;3352:30;3376:5;3352:30;:::i;:::-;3255:133;;;;:::o;3394:137::-;3439:5;3477:6;3464:20;3455:29;;3493:32;3519:5;3493:32;:::i;:::-;3394:137;;;;:::o;3537:141::-;3593:5;3624:6;3618:13;3609:22;;3640:32;3666:5;3640:32;:::i;:::-;3537:141;;;;:::o;3697:338::-;3752:5;3801:3;3794:4;3786:6;3782:17;3778:27;3768:122;;3809:79;;:::i;:::-;3768:122;3926:6;3913:20;3951:78;4025:3;4017:6;4010:4;4002:6;3998:17;3951:78;:::i;:::-;3942:87;;3758:277;3697:338;;;;:::o;4055:340::-;4111:5;4160:3;4153:4;4145:6;4141:17;4137:27;4127:122;;4168:79;;:::i;:::-;4127:122;4285:6;4272:20;4310:79;4385:3;4377:6;4370:4;4362:6;4358:17;4310:79;:::i;:::-;4301:88;;4117:278;4055:340;;;;:::o;4401:137::-;4446:5;4484:6;4471:20;4462:29;;4500:32;4526:5;4500:32;:::i;:::-;4401:137;;;;:::o;4544:139::-;4590:5;4628:6;4615:20;4606:29;;4644:33;4671:5;4644:33;:::i;:::-;4544:139;;;;:::o;4689:329::-;4748:6;4797:2;4785:9;4776:7;4772:23;4768:32;4765:119;;;4803:79;;:::i;:::-;4765:119;4923:1;4948:53;4993:7;4984:6;4973:9;4969:22;4948:53;:::i;:::-;4938:63;;4894:117;4689:329;;;;:::o;5024:474::-;5092:6;5100;5149:2;5137:9;5128:7;5124:23;5120:32;5117:119;;;5155:79;;:::i;:::-;5117:119;5275:1;5300:53;5345:7;5336:6;5325:9;5321:22;5300:53;:::i;:::-;5290:63;;5246:117;5402:2;5428:53;5473:7;5464:6;5453:9;5449:22;5428:53;:::i;:::-;5418:63;;5373:118;5024:474;;;;;:::o;5504:619::-;5581:6;5589;5597;5646:2;5634:9;5625:7;5621:23;5617:32;5614:119;;;5652:79;;:::i;:::-;5614:119;5772:1;5797:53;5842:7;5833:6;5822:9;5818:22;5797:53;:::i;:::-;5787:63;;5743:117;5899:2;5925:53;5970:7;5961:6;5950:9;5946:22;5925:53;:::i;:::-;5915:63;;5870:118;6027:2;6053:53;6098:7;6089:6;6078:9;6074:22;6053:53;:::i;:::-;6043:63;;5998:118;5504:619;;;;;:::o;6129:943::-;6224:6;6232;6240;6248;6297:3;6285:9;6276:7;6272:23;6268:33;6265:120;;;6304:79;;:::i;:::-;6265:120;6424:1;6449:53;6494:7;6485:6;6474:9;6470:22;6449:53;:::i;:::-;6439:63;;6395:117;6551:2;6577:53;6622:7;6613:6;6602:9;6598:22;6577:53;:::i;:::-;6567:63;;6522:118;6679:2;6705:53;6750:7;6741:6;6730:9;6726:22;6705:53;:::i;:::-;6695:63;;6650:118;6835:2;6824:9;6820:18;6807:32;6866:18;6858:6;6855:30;6852:117;;;6888:79;;:::i;:::-;6852:117;6993:62;7047:7;7038:6;7027:9;7023:22;6993:62;:::i;:::-;6983:72;;6778:287;6129:943;;;;;;;:::o;7078:468::-;7143:6;7151;7200:2;7188:9;7179:7;7175:23;7171:32;7168:119;;;7206:79;;:::i;:::-;7168:119;7326:1;7351:53;7396:7;7387:6;7376:9;7372:22;7351:53;:::i;:::-;7341:63;;7297:117;7453:2;7479:50;7521:7;7512:6;7501:9;7497:22;7479:50;:::i;:::-;7469:60;;7424:115;7078:468;;;;;:::o;7552:474::-;7620:6;7628;7677:2;7665:9;7656:7;7652:23;7648:32;7645:119;;;7683:79;;:::i;:::-;7645:119;7803:1;7828:53;7873:7;7864:6;7853:9;7849:22;7828:53;:::i;:::-;7818:63;;7774:117;7930:2;7956:53;8001:7;7992:6;7981:9;7977:22;7956:53;:::i;:::-;7946:63;;7901:118;7552:474;;;;;:::o;8032:892::-;8149:6;8157;8206:2;8194:9;8185:7;8181:23;8177:32;8174:119;;;8212:79;;:::i;:::-;8174:119;8360:1;8349:9;8345:17;8332:31;8390:18;8382:6;8379:30;8376:117;;;8412:79;;:::i;:::-;8376:117;8517:78;8587:7;8578:6;8567:9;8563:22;8517:78;:::i;:::-;8507:88;;8303:302;8672:2;8661:9;8657:18;8644:32;8703:18;8695:6;8692:30;8689:117;;;8725:79;;:::i;:::-;8689:117;8830:77;8899:7;8890:6;8879:9;8875:22;8830:77;:::i;:::-;8820:87;;8615:302;8032:892;;;;;:::o;8930:327::-;8988:6;9037:2;9025:9;9016:7;9012:23;9008:32;9005:119;;;9043:79;;:::i;:::-;9005:119;9163:1;9188:52;9232:7;9223:6;9212:9;9208:22;9188:52;:::i;:::-;9178:62;;9134:116;8930:327;;;;:::o;9263:349::-;9332:6;9381:2;9369:9;9360:7;9356:23;9352:32;9349:119;;;9387:79;;:::i;:::-;9349:119;9507:1;9532:63;9587:7;9578:6;9567:9;9563:22;9532:63;:::i;:::-;9522:73;;9478:127;9263:349;;;;:::o;9618:509::-;9687:6;9736:2;9724:9;9715:7;9711:23;9707:32;9704:119;;;9742:79;;:::i;:::-;9704:119;9890:1;9879:9;9875:17;9862:31;9920:18;9912:6;9909:30;9906:117;;;9942:79;;:::i;:::-;9906:117;10047:63;10102:7;10093:6;10082:9;10078:22;10047:63;:::i;:::-;10037:73;;9833:287;9618:509;;;;:::o;10133:329::-;10192:6;10241:2;10229:9;10220:7;10216:23;10212:32;10209:119;;;10247:79;;:::i;:::-;10209:119;10367:1;10392:53;10437:7;10428:6;10417:9;10413:22;10392:53;:::i;:::-;10382:63;;10338:117;10133:329;;;;:::o;10468:118::-;10555:24;10573:5;10555:24;:::i;:::-;10550:3;10543:37;10468:118;;:::o;10592:109::-;10673:21;10688:5;10673:21;:::i;:::-;10668:3;10661:34;10592:109;;:::o;10707:360::-;10793:3;10821:38;10853:5;10821:38;:::i;:::-;10875:70;10938:6;10933:3;10875:70;:::i;:::-;10868:77;;10954:52;10999:6;10994:3;10987:4;10980:5;10976:16;10954:52;:::i;:::-;11031:29;11053:6;11031:29;:::i;:::-;11026:3;11022:39;11015:46;;10797:270;10707:360;;;;:::o;11073:364::-;11161:3;11189:39;11222:5;11189:39;:::i;:::-;11244:71;11308:6;11303:3;11244:71;:::i;:::-;11237:78;;11324:52;11369:6;11364:3;11357:4;11350:5;11346:16;11324:52;:::i;:::-;11401:29;11423:6;11401:29;:::i;:::-;11396:3;11392:39;11385:46;;11165:272;11073:364;;;;:::o;11443:377::-;11549:3;11577:39;11610:5;11577:39;:::i;:::-;11632:89;11714:6;11709:3;11632:89;:::i;:::-;11625:96;;11730:52;11775:6;11770:3;11763:4;11756:5;11752:16;11730:52;:::i;:::-;11807:6;11802:3;11798:16;11791:23;;11553:267;11443:377;;;;:::o;11826:366::-;11968:3;11989:67;12053:2;12048:3;11989:67;:::i;:::-;11982:74;;12065:93;12154:3;12065:93;:::i;:::-;12183:2;12178:3;12174:12;12167:19;;11826:366;;;:::o;12198:::-;12340:3;12361:67;12425:2;12420:3;12361:67;:::i;:::-;12354:74;;12437:93;12526:3;12437:93;:::i;:::-;12555:2;12550:3;12546:12;12539:19;;12198:366;;;:::o;12570:::-;12712:3;12733:67;12797:2;12792:3;12733:67;:::i;:::-;12726:74;;12809:93;12898:3;12809:93;:::i;:::-;12927:2;12922:3;12918:12;12911:19;;12570:366;;;:::o;12942:365::-;13084:3;13105:66;13169:1;13164:3;13105:66;:::i;:::-;13098:73;;13180:93;13269:3;13180:93;:::i;:::-;13298:2;13293:3;13289:12;13282:19;;12942:365;;;:::o;13313:366::-;13455:3;13476:67;13540:2;13535:3;13476:67;:::i;:::-;13469:74;;13552:93;13641:3;13552:93;:::i;:::-;13670:2;13665:3;13661:12;13654:19;;13313:366;;;:::o;13685:::-;13827:3;13848:67;13912:2;13907:3;13848:67;:::i;:::-;13841:74;;13924:93;14013:3;13924:93;:::i;:::-;14042:2;14037:3;14033:12;14026:19;;13685:366;;;:::o;14057:::-;14199:3;14220:67;14284:2;14279:3;14220:67;:::i;:::-;14213:74;;14296:93;14385:3;14296:93;:::i;:::-;14414:2;14409:3;14405:12;14398:19;;14057:366;;;:::o;14429:398::-;14588:3;14609:83;14690:1;14685:3;14609:83;:::i;:::-;14602:90;;14701:93;14790:3;14701:93;:::i;:::-;14819:1;14814:3;14810:11;14803:18;;14429:398;;;:::o;14833:118::-;14920:24;14938:5;14920:24;:::i;:::-;14915:3;14908:37;14833:118;;:::o;14957:115::-;15042:23;15059:5;15042:23;:::i;:::-;15037:3;15030:36;14957:115;;:::o;15078:435::-;15258:3;15280:95;15371:3;15362:6;15280:95;:::i;:::-;15273:102;;15392:95;15483:3;15474:6;15392:95;:::i;:::-;15385:102;;15504:3;15497:10;;15078:435;;;;;:::o;15519:379::-;15703:3;15725:147;15868:3;15725:147;:::i;:::-;15718:154;;15889:3;15882:10;;15519:379;;;:::o;15904:222::-;15997:4;16035:2;16024:9;16020:18;16012:26;;16048:71;16116:1;16105:9;16101:17;16092:6;16048:71;:::i;:::-;15904:222;;;;:::o;16132:640::-;16327:4;16365:3;16354:9;16350:19;16342:27;;16379:71;16447:1;16436:9;16432:17;16423:6;16379:71;:::i;:::-;16460:72;16528:2;16517:9;16513:18;16504:6;16460:72;:::i;:::-;16542;16610:2;16599:9;16595:18;16586:6;16542:72;:::i;:::-;16661:9;16655:4;16651:20;16646:2;16635:9;16631:18;16624:48;16689:76;16760:4;16751:6;16689:76;:::i;:::-;16681:84;;16132:640;;;;;;;:::o;16778:210::-;16865:4;16903:2;16892:9;16888:18;16880:26;;16916:65;16978:1;16967:9;16963:17;16954:6;16916:65;:::i;:::-;16778:210;;;;:::o;16994:313::-;17107:4;17145:2;17134:9;17130:18;17122:26;;17194:9;17188:4;17184:20;17180:1;17169:9;17165:17;17158:47;17222:78;17295:4;17286:6;17222:78;:::i;:::-;17214:86;;16994:313;;;;:::o;17313:419::-;17479:4;17517:2;17506:9;17502:18;17494:26;;17566:9;17560:4;17556:20;17552:1;17541:9;17537:17;17530:47;17594:131;17720:4;17594:131;:::i;:::-;17586:139;;17313:419;;;:::o;17738:::-;17904:4;17942:2;17931:9;17927:18;17919:26;;17991:9;17985:4;17981:20;17977:1;17966:9;17962:17;17955:47;18019:131;18145:4;18019:131;:::i;:::-;18011:139;;17738:419;;;:::o;18163:::-;18329:4;18367:2;18356:9;18352:18;18344:26;;18416:9;18410:4;18406:20;18402:1;18391:9;18387:17;18380:47;18444:131;18570:4;18444:131;:::i;:::-;18436:139;;18163:419;;;:::o;18588:::-;18754:4;18792:2;18781:9;18777:18;18769:26;;18841:9;18835:4;18831:20;18827:1;18816:9;18812:17;18805:47;18869:131;18995:4;18869:131;:::i;:::-;18861:139;;18588:419;;;:::o;19013:::-;19179:4;19217:2;19206:9;19202:18;19194:26;;19266:9;19260:4;19256:20;19252:1;19241:9;19237:17;19230:47;19294:131;19420:4;19294:131;:::i;:::-;19286:139;;19013:419;;;:::o;19438:::-;19604:4;19642:2;19631:9;19627:18;19619:26;;19691:9;19685:4;19681:20;19677:1;19666:9;19662:17;19655:47;19719:131;19845:4;19719:131;:::i;:::-;19711:139;;19438:419;;;:::o;19863:::-;20029:4;20067:2;20056:9;20052:18;20044:26;;20116:9;20110:4;20106:20;20102:1;20091:9;20087:17;20080:47;20144:131;20270:4;20144:131;:::i;:::-;20136:139;;19863:419;;;:::o;20288:222::-;20381:4;20419:2;20408:9;20404:18;20396:26;;20432:71;20500:1;20489:9;20485:17;20476:6;20432:71;:::i;:::-;20288:222;;;;:::o;20516:218::-;20607:4;20645:2;20634:9;20630:18;20622:26;;20658:69;20724:1;20713:9;20709:17;20700:6;20658:69;:::i;:::-;20516:218;;;;:::o;20740:129::-;20774:6;20801:20;;:::i;:::-;20791:30;;20830:33;20858:4;20850:6;20830:33;:::i;:::-;20740:129;;;:::o;20875:75::-;20908:6;20941:2;20935:9;20925:19;;20875:75;:::o;20956:311::-;21033:4;21123:18;21115:6;21112:30;21109:56;;;21145:18;;:::i;:::-;21109:56;21195:4;21187:6;21183:17;21175:25;;21255:4;21249;21245:15;21237:23;;20956:311;;;:::o;21273:310::-;21349:4;21439:18;21431:6;21428:30;21425:56;;;21461:18;;:::i;:::-;21425:56;21511:4;21503:6;21499:17;21491:25;;21571:4;21565;21561:15;21553:23;;21273:310;;;:::o;21589:307::-;21650:4;21740:18;21732:6;21729:30;21726:56;;;21762:18;;:::i;:::-;21726:56;21800:29;21822:6;21800:29;:::i;:::-;21792:37;;21884:4;21878;21874:15;21866:23;;21589:307;;;:::o;21902:308::-;21964:4;22054:18;22046:6;22043:30;22040:56;;;22076:18;;:::i;:::-;22040:56;22114:29;22136:6;22114:29;:::i;:::-;22106:37;;22198:4;22192;22188:15;22180:23;;21902:308;;;:::o;22216:98::-;22267:6;22301:5;22295:12;22285:22;;22216:98;;;:::o;22320:99::-;22372:6;22406:5;22400:12;22390:22;;22320:99;;;:::o;22425:168::-;22508:11;22542:6;22537:3;22530:19;22582:4;22577:3;22573:14;22558:29;;22425:168;;;;:::o;22599:147::-;22700:11;22737:3;22722:18;;22599:147;;;;:::o;22752:169::-;22836:11;22870:6;22865:3;22858:19;22910:4;22905:3;22901:14;22886:29;;22752:169;;;;:::o;22927:148::-;23029:11;23066:3;23051:18;;22927:148;;;;:::o;23081:281::-;23121:3;23140:20;23158:1;23140:20;:::i;:::-;23135:25;;23174:20;23192:1;23174:20;:::i;:::-;23169:25;;23304:1;23260:42;23256:50;23253:1;23250:57;23247:83;;;23310:18;;:::i;:::-;23247:83;23354:1;23351;23347:9;23340:16;;23081:281;;;;:::o;23368:305::-;23408:3;23427:20;23445:1;23427:20;:::i;:::-;23422:25;;23461:20;23479:1;23461:20;:::i;:::-;23456:25;;23615:1;23547:66;23543:74;23540:1;23537:81;23534:107;;;23621:18;;:::i;:::-;23534:107;23665:1;23662;23658:9;23651:16;;23368:305;;;;:::o;23679:185::-;23719:1;23736:20;23754:1;23736:20;:::i;:::-;23731:25;;23770:20;23788:1;23770:20;:::i;:::-;23765:25;;23809:1;23799:35;;23814:18;;:::i;:::-;23799:35;23856:1;23853;23849:9;23844:14;;23679:185;;;;:::o;23870:348::-;23910:7;23933:20;23951:1;23933:20;:::i;:::-;23928:25;;23967:20;23985:1;23967:20;:::i;:::-;23962:25;;24155:1;24087:66;24083:74;24080:1;24077:81;24072:1;24065:9;24058:17;24054:105;24051:131;;;24162:18;;:::i;:::-;24051:131;24210:1;24207;24203:9;24192:20;;23870:348;;;;:::o;24224:191::-;24264:4;24284:20;24302:1;24284:20;:::i;:::-;24279:25;;24318:20;24336:1;24318:20;:::i;:::-;24313:25;;24357:1;24354;24351:8;24348:34;;;24362:18;;:::i;:::-;24348:34;24407:1;24404;24400:9;24392:17;;24224:191;;;;:::o;24421:::-;24461:4;24481:20;24499:1;24481:20;:::i;:::-;24476:25;;24515:20;24533:1;24515:20;:::i;:::-;24510:25;;24554:1;24551;24548:8;24545:34;;;24559:18;;:::i;:::-;24545:34;24604:1;24601;24597:9;24589:17;;24421:191;;;;:::o;24618:96::-;24655:7;24684:24;24702:5;24684:24;:::i;:::-;24673:35;;24618:96;;;:::o;24720:90::-;24754:7;24797:5;24790:13;24783:21;24772:32;;24720:90;;;:::o;24816:149::-;24852:7;24892:66;24885:5;24881:78;24870:89;;24816:149;;;:::o;24971:89::-;25007:7;25047:6;25040:5;25036:18;25025:29;;24971:89;;;:::o;25066:126::-;25103:7;25143:42;25136:5;25132:54;25121:65;;25066:126;;;:::o;25198:77::-;25235:7;25264:5;25253:16;;25198:77;;;:::o;25281:93::-;25317:7;25357:10;25350:5;25346:22;25335:33;;25281:93;;;:::o;25380:154::-;25464:6;25459:3;25454;25441:30;25526:1;25517:6;25512:3;25508:16;25501:27;25380:154;;;:::o;25540:307::-;25608:1;25618:113;25632:6;25629:1;25626:13;25618:113;;;25717:1;25712:3;25708:11;25702:18;25698:1;25693:3;25689:11;25682:39;25654:2;25651:1;25647:10;25642:15;;25618:113;;;25749:6;25746:1;25743:13;25740:101;;;25829:1;25820:6;25815:3;25811:16;25804:27;25740:101;25589:258;25540:307;;;:::o;25853:320::-;25897:6;25934:1;25928:4;25924:12;25914:22;;25981:1;25975:4;25971:12;26002:18;25992:81;;26058:4;26050:6;26046:17;26036:27;;25992:81;26120:2;26112:6;26109:14;26089:18;26086:38;26083:84;;;26139:18;;:::i;:::-;26083:84;25904:269;25853:320;;;:::o;26179:281::-;26262:27;26284:4;26262:27;:::i;:::-;26254:6;26250:40;26392:6;26380:10;26377:22;26356:18;26344:10;26341:34;26338:62;26335:88;;;26403:18;;:::i;:::-;26335:88;26443:10;26439:2;26432:22;26222:238;26179:281;;:::o;26466:233::-;26505:3;26528:24;26546:5;26528:24;:::i;:::-;26519:33;;26574:66;26567:5;26564:77;26561:103;;;26644:18;;:::i;:::-;26561:103;26691:1;26684:5;26680:13;26673:20;;26466:233;;;:::o;26705:176::-;26737:1;26754:20;26772:1;26754:20;:::i;:::-;26749:25;;26788:20;26806:1;26788:20;:::i;:::-;26783:25;;26827:1;26817:35;;26832:18;;:::i;:::-;26817:35;26873:1;26870;26866:9;26861:14;;26705:176;;;;:::o;26887:180::-;26935:77;26932:1;26925:88;27032:4;27029:1;27022:15;27056:4;27053:1;27046:15;27073:180;27121:77;27118:1;27111:88;27218:4;27215:1;27208:15;27242:4;27239:1;27232:15;27259:180;27307:77;27304:1;27297:88;27404:4;27401:1;27394:15;27428:4;27425:1;27418:15;27445:180;27493:77;27490:1;27483:88;27590:4;27587:1;27580:15;27614:4;27611:1;27604:15;27631:180;27679:77;27676:1;27669:88;27776:4;27773:1;27766:15;27800:4;27797:1;27790:15;27817:117;27926:1;27923;27916:12;27940:117;28049:1;28046;28039:12;28063:117;28172:1;28169;28162:12;28186:117;28295:1;28292;28285:12;28309:117;28418:1;28415;28408:12;28432:102;28473:6;28524:2;28520:7;28515:2;28508:5;28504:14;28500:28;28490:38;;28432:102;;;:::o;28540:162::-;28680:14;28676:1;28668:6;28664:14;28657:38;28540:162;:::o;28708:225::-;28848:34;28844:1;28836:6;28832:14;28825:58;28917:8;28912:2;28904:6;28900:15;28893:33;28708:225;:::o;28939:174::-;29079:26;29075:1;29067:6;29063:14;29056:50;28939:174;:::o;29119:158::-;29259:10;29255:1;29247:6;29243:14;29236:34;29119:158;:::o;29283:180::-;29423:32;29419:1;29411:6;29407:14;29400:56;29283:180;:::o;29469:166::-;29609:18;29605:1;29597:6;29593:14;29586:42;29469:166;:::o;29641:182::-;29781:34;29777:1;29769:6;29765:14;29758:58;29641:182;:::o;29829:114::-;;:::o;29949:122::-;30022:24;30040:5;30022:24;:::i;:::-;30015:5;30012:35;30002:63;;30061:1;30058;30051:12;30002:63;29949:122;:::o;30077:116::-;30147:21;30162:5;30147:21;:::i;:::-;30140:5;30137:32;30127:60;;30183:1;30180;30173:12;30127:60;30077:116;:::o;30199:120::-;30271:23;30288:5;30271:23;:::i;:::-;30264:5;30261:34;30251:62;;30309:1;30306;30299:12;30251:62;30199:120;:::o;30325:::-;30397:23;30414:5;30397:23;:::i;:::-;30390:5;30387:34;30377:62;;30435:1;30432;30425:12;30377:62;30325:120;:::o;30451:122::-;30524:24;30542:5;30524:24;:::i;:::-;30517:5;30514:35;30504:63;;30563:1;30560;30553:12;30504:63;30451:122;:::o
Swarm Source
ipfs://f536b1bb03d190373e412ec1a004016ed1228acd40f99d16ff519c5aaee502d0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.