ERC-721
Overview
Max Total Supply
1,322 CMB
Holders
424
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 CMBLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CosaMonstraBoss
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-11 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Strings.sol // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol // File: contracts/cityboss.sol /** *Submitted for verification at Etherscan.io on 2022-09-06 */ // File: @openzeppelin/contracts/utils/Strings.sol // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (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 `IERC721.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 v4.4.1 (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`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; } // 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: https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); 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 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(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { 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) { 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) { 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 { _addressData[owner].aux = aux; } /** * 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. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { 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 virtual 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); } /** * @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); } /** * @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); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // 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; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.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; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is equivalent to _burn(tokenId, false) */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // 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 storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.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; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev 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 {} } pragma solidity >=0.8.9 <0.9.0; contract CosaMonstraBoss is Ownable, ERC721A { uint public totalMinted = 0; string public baseURI; uint public maxPerTransaction = 500; uint public collectionSize = 1322; address private com = 0x439fCAe2ac5020c64a14DA26D1277F4C0BD53dE9; constructor() ERC721A("CosaMonstraBoss", "CMB"){ // mint first to company _safeMint(0x439fCAe2ac5020c64a14DA26D1277F4C0BD53dE9,1); totalMinted +=1; } // airdrop boss to multiple wallets function airdrop(address[] memory _wallets) public onlyOwner{ require(_wallets.length <= maxPerTransaction, "Max per transaction limit reached"); require(totalMinted + _wallets.length <= collectionSize, "not enough tokens left"); for(uint i = 0; i < _wallets.length; i++){ _safeMint(_wallets[i], 1); totalMinted += 1; } } // airdrop to one wallet function airdropToWallet(address wallet, uint count) public onlyOwner{ require(count > 0, "mint at least one token"); require(count <= maxPerTransaction, "Max per transaction limit reached"); require(totalMinted + count <= collectionSize, "not enough tokens left"); _safeMint(wallet, count); totalMinted += count; } //burn boss function burn(uint tokenId) public { require(_msgSender() == ownerOf(tokenId), "Caller is not owner nor approved"); _burn(tokenId); totalMinted -=1; } //burn boss by big boss function burnByBoss(uint tokenId) public onlyOwner{ _burn(tokenId); totalMinted -=1; } // set per transaction token limit function setTransactionLimit(uint _limit) external onlyOwner{ maxPerTransaction = _limit; } // get per transaction token limit function getTransactionLimit() public view returns(uint){ return maxPerTransaction; } // set collection supply function setCollectionSize(uint supply) external onlyOwner { collectionSize = supply; } // get collection supply function getCollectionSize() public view returns(uint){ return collectionSize; } // set base URI function setBaseUri(string memory _uri) external onlyOwner { baseURI = _uri; } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function setCOMWallet(address adrs) external onlyOwner{ com = adrs; } // take out function withdraw() external onlyOwner { payable(com).transfer(address(this).balance); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A) returns (bool) { return super.supportsInterface(interfaceId); } }
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":"_wallets","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"airdropToWallet","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnByBoss","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransactionLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"maxPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adrs","type":"address"}],"name":"setCOMWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setCollectionSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setTransactionLimit","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":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260006009556101f4600b5561052a600c5573439fcae2ac5020c64a14da26d1277f4c0bd53de9600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200007757600080fd5b506040518060400160405280600f81526020017f436f73614d6f6e73747261426f737300000000000000000000000000000000008152506040518060400160405280600381526020017f434d42000000000000000000000000000000000000000000000000000000000081525062000104620000f86200019760201b60201c565b6200019f60201b60201c565b81600390805190602001906200011c92919062000846565b5080600490805190602001906200013592919062000846565b50620001466200026360201b60201c565b60018190555050506200017573439fcae2ac5020c64a14da26d1277f4c0bd53de960016200026860201b60201c565b6001600960008282546200018a91906200092f565b9250508190555062000bd3565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b6200028a8282604051806020016040528060008152506200028e60201b60201c565b5050565b620002a38383836001620002a860201b60201c565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141562000317576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141562000353576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620003686000868387620006a560201b60201c565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156200054057506200053f8773ffffffffffffffffffffffffffffffffffffffff16620006ab60201b620016cd1760201c565b5b1562000613575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4620005be6000888480600101955088620006ce60201b60201c565b620005f5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415620005475782600154146200060d57600080fd5b62000680565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141562000614575b8160018190555050506200069e60008683876200084060201b60201c565b5050505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006fc6200019760201b60201c565b8786866040518563ffffffff1660e01b815260040162000720949392919062000a86565b602060405180830381600087803b1580156200073b57600080fd5b505af19250505080156200076f57506040513d601f19601f820116820180604052508101906200076c919062000b3c565b60015b620007ed573d8060008114620007a2576040519150601f19603f3d011682016040523d82523d6000602084013e620007a7565b606091505b50600081511415620007e5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b828054620008549062000b9d565b90600052602060002090601f016020900481019282620008785760008555620008c4565b82601f106200089357805160ff1916838001178555620008c4565b82800160010185558215620008c4579182015b82811115620008c3578251825591602001919060010190620008a6565b5b509050620008d39190620008d7565b5090565b5b80821115620008f2576000816000905550600101620008d8565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200093c82620008f6565b91506200094983620008f6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000981576200098062000900565b5b828201905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009b9826200098c565b9050919050565b620009cb81620009ac565b82525050565b620009dc81620008f6565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101562000a1e57808201518184015260208101905062000a01565b8381111562000a2e576000848401525b50505050565b6000601f19601f8301169050919050565b600062000a5282620009e2565b62000a5e8185620009ed565b935062000a70818560208601620009fe565b62000a7b8162000a34565b840191505092915050565b600060808201905062000a9d6000830187620009c0565b62000aac6020830186620009c0565b62000abb6040830185620009d1565b818103606083015262000acf818462000a45565b905095945050505050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000b168162000adf565b811462000b2257600080fd5b50565b60008151905062000b368162000b0b565b92915050565b60006020828403121562000b555762000b5462000ada565b5b600062000b658482850162000b25565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000bb657607f821691505b6020821081141562000bcd5762000bcc62000b6e565b5b50919050565b613bc28062000be36000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f578063a2309ff8116100a2578063c87b56dd11610071578063c87b56dd14610545578063da47f76714610575578063e985e9c514610591578063f2fde38b146105c1576101f0565b8063a2309ff8146104d1578063aca8ffe7146104ef578063b88d4fde1461050b578063c3743cff14610527576101f0565b80638da5cb5b116100de5780638da5cb5b1461045d57806395d89b411461047b578063a0bcfc7f14610499578063a22cb465146104b5576101f0565b806370a08231146103e9578063715018a6146104195780637155c1ea14610423578063729ad39e14610441576101f0565b80633ccfd60b116101875780634b980d67116101565780634b980d67146103615780636352211e1461037f57806364bfa546146103af5780636c0360eb146103cb576101f0565b80633ccfd60b1461030157806342842e0e1461030b57806342966c681461032757806345c0f53314610343576101f0565b80630c6ea51c116101c35780630c6ea51c1461028f57806318160ddd146102ab57806323b872dd146102c957806323d98917146102e5576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360381019061020a9190612e00565b6105dd565b60405161021c9190612e48565b60405180910390f35b61022d6105ef565b60405161023a9190612efc565b60405180910390f35b61025d60048036038101906102589190612f54565b610681565b60405161026a9190612fc2565b60405180910390f35b61028d60048036038101906102889190613009565b6106fd565b005b6102a960048036038101906102a49190612f54565b610808565b005b6102b36108aa565b6040516102c09190613058565b60405180910390f35b6102e360048036038101906102de9190613073565b6108c1565b005b6102ff60048036038101906102fa9190613009565b6108d1565b005b610309610a4e565b005b61032560048036038101906103209190613073565b610b35565b005b610341600480360381019061033c9190612f54565b610b55565b005b61034b610bf8565b6040516103589190613058565b60405180910390f35b610369610bfe565b6040516103769190613058565b60405180910390f35b61039960048036038101906103949190612f54565b610c04565b6040516103a69190612fc2565b60405180910390f35b6103c960048036038101906103c49190612f54565b610c1a565b005b6103d3610ca0565b6040516103e09190612efc565b60405180910390f35b61040360048036038101906103fe91906130c6565b610d2e565b6040516104109190613058565b60405180910390f35b610421610dfe565b005b61042b610e86565b6040516104389190613058565b60405180910390f35b61045b6004803603810190610456919061323b565b610e90565b005b610465611007565b6040516104729190612fc2565b60405180910390f35b610483611030565b6040516104909190612efc565b60405180910390f35b6104b360048036038101906104ae9190613339565b6110c2565b005b6104cf60048036038101906104ca91906133ae565b611158565b005b6104d96112d0565b6040516104e69190613058565b60405180910390f35b61050960048036038101906105049190612f54565b6112d6565b005b6105256004803603810190610520919061348f565b61135c565b005b61052f6113d8565b60405161053c9190613058565b60405180910390f35b61055f600480360381019061055a9190612f54565b6113e2565b60405161056c9190612efc565b60405180910390f35b61058f600480360381019061058a91906130c6565b611481565b005b6105ab60048036038101906105a69190613512565b611541565b6040516105b89190612e48565b60405180910390f35b6105db60048036038101906105d691906130c6565b6115d5565b005b60006105e8826116f0565b9050919050565b6060600380546105fe90613581565b80601f016020809104026020016040519081016040528092919081815260200182805461062a90613581565b80156106775780601f1061064c57610100808354040283529160200191610677565b820191906000526020600020905b81548152906001019060200180831161065a57829003601f168201915b5050505050905090565b600061068c826117d2565b6106c2576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061070882610c04565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610770576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661078f611820565b73ffffffffffffffffffffffffffffffffffffffff16141580156107c157506107bf816107ba611820565b611541565b155b156107f8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610803838383611828565b505050565b610810611820565b73ffffffffffffffffffffffffffffffffffffffff1661082e611007565b73ffffffffffffffffffffffffffffffffffffffff1614610884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087b906135ff565b60405180910390fd5b61088d816118da565b6001600960008282546108a0919061364e565b9250508190555050565b60006108b46118e8565b6002546001540303905090565b6108cc8383836118ed565b505050565b6108d9611820565b73ffffffffffffffffffffffffffffffffffffffff166108f7611007565b73ffffffffffffffffffffffffffffffffffffffff161461094d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610944906135ff565b60405180910390fd5b60008111610990576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610987906136ce565b60405180910390fd5b600b548111156109d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cc90613760565b60405180910390fd5b600c54816009546109e69190613780565b1115610a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1e90613822565b60405180910390fd5b610a318282611da3565b8060096000828254610a439190613780565b925050819055505050565b610a56611820565b73ffffffffffffffffffffffffffffffffffffffff16610a74611007565b73ffffffffffffffffffffffffffffffffffffffff1614610aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac1906135ff565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610b32573d6000803e3d6000fd5b50565b610b508383836040518060200160405280600081525061135c565b505050565b610b5e81610c04565b73ffffffffffffffffffffffffffffffffffffffff16610b7c611820565b73ffffffffffffffffffffffffffffffffffffffff1614610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc99061388e565b60405180910390fd5b610bdb816118da565b600160096000828254610bee919061364e565b9250508190555050565b600c5481565b600b5481565b6000610c0f82611dc1565b600001519050919050565b610c22611820565b73ffffffffffffffffffffffffffffffffffffffff16610c40611007565b73ffffffffffffffffffffffffffffffffffffffff1614610c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8d906135ff565b60405180910390fd5b80600b8190555050565b600a8054610cad90613581565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd990613581565b8015610d265780601f10610cfb57610100808354040283529160200191610d26565b820191906000526020600020905b815481529060010190602001808311610d0957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d96576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610e06611820565b73ffffffffffffffffffffffffffffffffffffffff16610e24611007565b73ffffffffffffffffffffffffffffffffffffffff1614610e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e71906135ff565b60405180910390fd5b610e846000612050565b565b6000600c54905090565b610e98611820565b73ffffffffffffffffffffffffffffffffffffffff16610eb6611007565b73ffffffffffffffffffffffffffffffffffffffff1614610f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f03906135ff565b60405180910390fd5b600b5481511115610f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4990613760565b60405180910390fd5b600c548151600954610f649190613780565b1115610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90613822565b60405180910390fd5b60005b815181101561100357610fd6828281518110610fc757610fc66138ae565b5b60200260200101516001611da3565b600160096000828254610fe99190613780565b925050819055508080610ffb906138dd565b915050610fa8565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461103f90613581565b80601f016020809104026020016040519081016040528092919081815260200182805461106b90613581565b80156110b85780601f1061108d576101008083540402835291602001916110b8565b820191906000526020600020905b81548152906001019060200180831161109b57829003601f168201915b5050505050905090565b6110ca611820565b73ffffffffffffffffffffffffffffffffffffffff166110e8611007565b73ffffffffffffffffffffffffffffffffffffffff161461113e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611135906135ff565b60405180910390fd5b80600a9080519060200190611154929190612cae565b5050565b611160611820565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111c5576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006111d2611820565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661127f611820565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112c49190612e48565b60405180910390a35050565b60095481565b6112de611820565b73ffffffffffffffffffffffffffffffffffffffff166112fc611007565b73ffffffffffffffffffffffffffffffffffffffff1614611352576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611349906135ff565b60405180910390fd5b80600c8190555050565b6113678484846118ed565b6113868373ffffffffffffffffffffffffffffffffffffffff166116cd565b801561139b575061139984848484612114565b155b156113d2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000600b54905090565b60606113ed826117d2565b611423576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061142d612274565b905060008151141561144e5760405180602001604052806000815250611479565b8061145884612306565b604051602001611469929190613962565b6040516020818303038152906040525b915050919050565b611489611820565b73ffffffffffffffffffffffffffffffffffffffff166114a7611007565b73ffffffffffffffffffffffffffffffffffffffff16146114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f4906135ff565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115dd611820565b73ffffffffffffffffffffffffffffffffffffffff166115fb611007565b73ffffffffffffffffffffffffffffffffffffffff1614611651576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611648906135ff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b8906139f8565b60405180910390fd5b6116ca81612050565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117bb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806117cb57506117ca82612467565b5b9050919050565b6000816117dd6118e8565b111580156117ec575060015482105b8015611819575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6118e58160006124d1565b50565b600090565b60006118f882611dc1565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611963576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611984611820565b73ffffffffffffffffffffffffffffffffffffffff1614806119b357506119b2856119ad611820565b611541565b5b806119f857506119c1611820565b73ffffffffffffffffffffffffffffffffffffffff166119e084610681565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611a31576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611a98576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611aa585858560016128c1565b611ab160008487611828565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d31576001548214611d3057878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d9c85858560016128c7565b5050505050565b611dbd8282604051806020016040528060008152506128cd565b5050565b611dc9612d34565b600082905080611dd76118e8565b11158015611de6575060015481105b15612019576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161201757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611efb57809250505061204b565b5b60011561201657818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461201157809250505061204b565b611efc565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261213a611820565b8786866040518563ffffffff1660e01b815260040161215c9493929190613a6d565b602060405180830381600087803b15801561217657600080fd5b505af19250505080156121a757506040513d601f19601f820116820180604052508101906121a49190613ace565b60015b612221573d80600081146121d7576040519150601f19603f3d011682016040523d82523d6000602084013e6121dc565b606091505b50600081511415612219576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a805461228390613581565b80601f01602080910402602001604051908101604052809291908181526020018280546122af90613581565b80156122fc5780601f106122d1576101008083540402835291602001916122fc565b820191906000526020600020905b8154815290600101906020018083116122df57829003601f168201915b5050505050905090565b6060600082141561234e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612462565b600082905060005b60008214612380578080612369906138dd565b915050600a826123799190613b2a565b9150612356565b60008167ffffffffffffffff81111561239c5761239b6130f8565b5b6040519080825280601f01601f1916602001820160405280156123ce5781602001600182028036833780820191505090505b5090505b6000851461245b576001826123e7919061364e565b9150600a856123f69190613b5b565b60306124029190613780565b60f81b818381518110612418576124176138ae565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124549190613b2a565b94506123d2565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006124dc83611dc1565b905060008160000151905082156125bd5760008173ffffffffffffffffffffffffffffffffffffffff1661250e611820565b73ffffffffffffffffffffffffffffffffffffffff16148061253d575061253c82612537611820565b611541565b5b80612582575061254b611820565b73ffffffffffffffffffffffffffffffffffffffff1661256a86610681565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806125bb576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6125cb8160008660016128c1565b6125d760008583611828565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060018160000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008781526020019081526020016000209050828160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff02191690831515021790555060006001870190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561283b57600154821461283a57848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128a98160008660016128c7565b60026000815480929190600101919050555050505050565b50505050565b50505050565b6128da83838360016128df565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561294d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612988576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61299560008683876128c1565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612b5f5750612b5e8773ffffffffffffffffffffffffffffffffffffffff166116cd565b5b15612c25575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bd46000888480600101955088612114565b612c0a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612b65578260015414612c2057600080fd5b612c91565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612c26575b816001819055505050612ca760008683876128c7565b5050505050565b828054612cba90613581565b90600052602060002090601f016020900481019282612cdc5760008555612d23565b82601f10612cf557805160ff1916838001178555612d23565b82800160010185558215612d23579182015b82811115612d22578251825591602001919060010190612d07565b5b509050612d309190612d77565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612d90576000816000905550600101612d78565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ddd81612da8565b8114612de857600080fd5b50565b600081359050612dfa81612dd4565b92915050565b600060208284031215612e1657612e15612d9e565b5b6000612e2484828501612deb565b91505092915050565b60008115159050919050565b612e4281612e2d565b82525050565b6000602082019050612e5d6000830184612e39565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e9d578082015181840152602081019050612e82565b83811115612eac576000848401525b50505050565b6000601f19601f8301169050919050565b6000612ece82612e63565b612ed88185612e6e565b9350612ee8818560208601612e7f565b612ef181612eb2565b840191505092915050565b60006020820190508181036000830152612f168184612ec3565b905092915050565b6000819050919050565b612f3181612f1e565b8114612f3c57600080fd5b50565b600081359050612f4e81612f28565b92915050565b600060208284031215612f6a57612f69612d9e565b5b6000612f7884828501612f3f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fac82612f81565b9050919050565b612fbc81612fa1565b82525050565b6000602082019050612fd76000830184612fb3565b92915050565b612fe681612fa1565b8114612ff157600080fd5b50565b60008135905061300381612fdd565b92915050565b600080604083850312156130205761301f612d9e565b5b600061302e85828601612ff4565b925050602061303f85828601612f3f565b9150509250929050565b61305281612f1e565b82525050565b600060208201905061306d6000830184613049565b92915050565b60008060006060848603121561308c5761308b612d9e565b5b600061309a86828701612ff4565b93505060206130ab86828701612ff4565b92505060406130bc86828701612f3f565b9150509250925092565b6000602082840312156130dc576130db612d9e565b5b60006130ea84828501612ff4565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61313082612eb2565b810181811067ffffffffffffffff8211171561314f5761314e6130f8565b5b80604052505050565b6000613162612d94565b905061316e8282613127565b919050565b600067ffffffffffffffff82111561318e5761318d6130f8565b5b602082029050602081019050919050565b600080fd5b60006131b76131b284613173565b613158565b905080838252602082019050602084028301858111156131da576131d961319f565b5b835b8181101561320357806131ef8882612ff4565b8452602084019350506020810190506131dc565b5050509392505050565b600082601f830112613222576132216130f3565b5b81356132328482602086016131a4565b91505092915050565b60006020828403121561325157613250612d9e565b5b600082013567ffffffffffffffff81111561326f5761326e612da3565b5b61327b8482850161320d565b91505092915050565b600080fd5b600067ffffffffffffffff8211156132a4576132a36130f8565b5b6132ad82612eb2565b9050602081019050919050565b82818337600083830152505050565b60006132dc6132d784613289565b613158565b9050828152602081018484840111156132f8576132f7613284565b5b6133038482856132ba565b509392505050565b600082601f8301126133205761331f6130f3565b5b81356133308482602086016132c9565b91505092915050565b60006020828403121561334f5761334e612d9e565b5b600082013567ffffffffffffffff81111561336d5761336c612da3565b5b6133798482850161330b565b91505092915050565b61338b81612e2d565b811461339657600080fd5b50565b6000813590506133a881613382565b92915050565b600080604083850312156133c5576133c4612d9e565b5b60006133d385828601612ff4565b92505060206133e485828601613399565b9150509250929050565b600067ffffffffffffffff821115613409576134086130f8565b5b61341282612eb2565b9050602081019050919050565b600061343261342d846133ee565b613158565b90508281526020810184848401111561344e5761344d613284565b5b6134598482856132ba565b509392505050565b600082601f830112613476576134756130f3565b5b813561348684826020860161341f565b91505092915050565b600080600080608085870312156134a9576134a8612d9e565b5b60006134b787828801612ff4565b94505060206134c887828801612ff4565b93505060406134d987828801612f3f565b925050606085013567ffffffffffffffff8111156134fa576134f9612da3565b5b61350687828801613461565b91505092959194509250565b6000806040838503121561352957613528612d9e565b5b600061353785828601612ff4565b925050602061354885828601612ff4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061359957607f821691505b602082108114156135ad576135ac613552565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135e9602083612e6e565b91506135f4826135b3565b602082019050919050565b60006020820190508181036000830152613618816135dc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061365982612f1e565b915061366483612f1e565b9250828210156136775761367661361f565b5b828203905092915050565b7f6d696e74206174206c65617374206f6e6520746f6b656e000000000000000000600082015250565b60006136b8601783612e6e565b91506136c382613682565b602082019050919050565b600060208201905081810360008301526136e7816136ab565b9050919050565b7f4d617820706572207472616e73616374696f6e206c696d69742072656163686560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b600061374a602183612e6e565b9150613755826136ee565b604082019050919050565b600060208201905081810360008301526137798161373d565b9050919050565b600061378b82612f1e565b915061379683612f1e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156137cb576137ca61361f565b5b828201905092915050565b7f6e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b600061380c601683612e6e565b9150613817826137d6565b602082019050919050565b6000602082019050818103600083015261383b816137ff565b9050919050565b7f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564600082015250565b6000613878602083612e6e565b915061388382613842565b602082019050919050565b600060208201905081810360008301526138a78161386b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006138e882612f1e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561391b5761391a61361f565b5b600182019050919050565b600081905092915050565b600061393c82612e63565b6139468185613926565b9350613956818560208601612e7f565b80840191505092915050565b600061396e8285613931565b915061397a8284613931565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006139e2602683612e6e565b91506139ed82613986565b604082019050919050565b60006020820190508181036000830152613a11816139d5565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613a3f82613a18565b613a498185613a23565b9350613a59818560208601612e7f565b613a6281612eb2565b840191505092915050565b6000608082019050613a826000830187612fb3565b613a8f6020830186612fb3565b613a9c6040830185613049565b8181036060830152613aae8184613a34565b905095945050505050565b600081519050613ac881612dd4565b92915050565b600060208284031215613ae457613ae3612d9e565b5b6000613af284828501613ab9565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613b3582612f1e565b9150613b4083612f1e565b925082613b5057613b4f613afb565b5b828204905092915050565b6000613b6682612f1e565b9150613b7183612f1e565b925082613b8157613b80613afb565b5b82820690509291505056fea26469706673582212203b50bebd41b87cffaebad11c251cc58b1aaac70995303ae646ecdf8f6ce4f43b64736f6c63430008090033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f578063a2309ff8116100a2578063c87b56dd11610071578063c87b56dd14610545578063da47f76714610575578063e985e9c514610591578063f2fde38b146105c1576101f0565b8063a2309ff8146104d1578063aca8ffe7146104ef578063b88d4fde1461050b578063c3743cff14610527576101f0565b80638da5cb5b116100de5780638da5cb5b1461045d57806395d89b411461047b578063a0bcfc7f14610499578063a22cb465146104b5576101f0565b806370a08231146103e9578063715018a6146104195780637155c1ea14610423578063729ad39e14610441576101f0565b80633ccfd60b116101875780634b980d67116101565780634b980d67146103615780636352211e1461037f57806364bfa546146103af5780636c0360eb146103cb576101f0565b80633ccfd60b1461030157806342842e0e1461030b57806342966c681461032757806345c0f53314610343576101f0565b80630c6ea51c116101c35780630c6ea51c1461028f57806318160ddd146102ab57806323b872dd146102c957806323d98917146102e5576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360381019061020a9190612e00565b6105dd565b60405161021c9190612e48565b60405180910390f35b61022d6105ef565b60405161023a9190612efc565b60405180910390f35b61025d60048036038101906102589190612f54565b610681565b60405161026a9190612fc2565b60405180910390f35b61028d60048036038101906102889190613009565b6106fd565b005b6102a960048036038101906102a49190612f54565b610808565b005b6102b36108aa565b6040516102c09190613058565b60405180910390f35b6102e360048036038101906102de9190613073565b6108c1565b005b6102ff60048036038101906102fa9190613009565b6108d1565b005b610309610a4e565b005b61032560048036038101906103209190613073565b610b35565b005b610341600480360381019061033c9190612f54565b610b55565b005b61034b610bf8565b6040516103589190613058565b60405180910390f35b610369610bfe565b6040516103769190613058565b60405180910390f35b61039960048036038101906103949190612f54565b610c04565b6040516103a69190612fc2565b60405180910390f35b6103c960048036038101906103c49190612f54565b610c1a565b005b6103d3610ca0565b6040516103e09190612efc565b60405180910390f35b61040360048036038101906103fe91906130c6565b610d2e565b6040516104109190613058565b60405180910390f35b610421610dfe565b005b61042b610e86565b6040516104389190613058565b60405180910390f35b61045b6004803603810190610456919061323b565b610e90565b005b610465611007565b6040516104729190612fc2565b60405180910390f35b610483611030565b6040516104909190612efc565b60405180910390f35b6104b360048036038101906104ae9190613339565b6110c2565b005b6104cf60048036038101906104ca91906133ae565b611158565b005b6104d96112d0565b6040516104e69190613058565b60405180910390f35b61050960048036038101906105049190612f54565b6112d6565b005b6105256004803603810190610520919061348f565b61135c565b005b61052f6113d8565b60405161053c9190613058565b60405180910390f35b61055f600480360381019061055a9190612f54565b6113e2565b60405161056c9190612efc565b60405180910390f35b61058f600480360381019061058a91906130c6565b611481565b005b6105ab60048036038101906105a69190613512565b611541565b6040516105b89190612e48565b60405180910390f35b6105db60048036038101906105d691906130c6565b6115d5565b005b60006105e8826116f0565b9050919050565b6060600380546105fe90613581565b80601f016020809104026020016040519081016040528092919081815260200182805461062a90613581565b80156106775780601f1061064c57610100808354040283529160200191610677565b820191906000526020600020905b81548152906001019060200180831161065a57829003601f168201915b5050505050905090565b600061068c826117d2565b6106c2576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061070882610c04565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610770576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661078f611820565b73ffffffffffffffffffffffffffffffffffffffff16141580156107c157506107bf816107ba611820565b611541565b155b156107f8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610803838383611828565b505050565b610810611820565b73ffffffffffffffffffffffffffffffffffffffff1661082e611007565b73ffffffffffffffffffffffffffffffffffffffff1614610884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087b906135ff565b60405180910390fd5b61088d816118da565b6001600960008282546108a0919061364e565b9250508190555050565b60006108b46118e8565b6002546001540303905090565b6108cc8383836118ed565b505050565b6108d9611820565b73ffffffffffffffffffffffffffffffffffffffff166108f7611007565b73ffffffffffffffffffffffffffffffffffffffff161461094d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610944906135ff565b60405180910390fd5b60008111610990576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610987906136ce565b60405180910390fd5b600b548111156109d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cc90613760565b60405180910390fd5b600c54816009546109e69190613780565b1115610a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1e90613822565b60405180910390fd5b610a318282611da3565b8060096000828254610a439190613780565b925050819055505050565b610a56611820565b73ffffffffffffffffffffffffffffffffffffffff16610a74611007565b73ffffffffffffffffffffffffffffffffffffffff1614610aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac1906135ff565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610b32573d6000803e3d6000fd5b50565b610b508383836040518060200160405280600081525061135c565b505050565b610b5e81610c04565b73ffffffffffffffffffffffffffffffffffffffff16610b7c611820565b73ffffffffffffffffffffffffffffffffffffffff1614610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc99061388e565b60405180910390fd5b610bdb816118da565b600160096000828254610bee919061364e565b9250508190555050565b600c5481565b600b5481565b6000610c0f82611dc1565b600001519050919050565b610c22611820565b73ffffffffffffffffffffffffffffffffffffffff16610c40611007565b73ffffffffffffffffffffffffffffffffffffffff1614610c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8d906135ff565b60405180910390fd5b80600b8190555050565b600a8054610cad90613581565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd990613581565b8015610d265780601f10610cfb57610100808354040283529160200191610d26565b820191906000526020600020905b815481529060010190602001808311610d0957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d96576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610e06611820565b73ffffffffffffffffffffffffffffffffffffffff16610e24611007565b73ffffffffffffffffffffffffffffffffffffffff1614610e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e71906135ff565b60405180910390fd5b610e846000612050565b565b6000600c54905090565b610e98611820565b73ffffffffffffffffffffffffffffffffffffffff16610eb6611007565b73ffffffffffffffffffffffffffffffffffffffff1614610f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f03906135ff565b60405180910390fd5b600b5481511115610f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4990613760565b60405180910390fd5b600c548151600954610f649190613780565b1115610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90613822565b60405180910390fd5b60005b815181101561100357610fd6828281518110610fc757610fc66138ae565b5b60200260200101516001611da3565b600160096000828254610fe99190613780565b925050819055508080610ffb906138dd565b915050610fa8565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461103f90613581565b80601f016020809104026020016040519081016040528092919081815260200182805461106b90613581565b80156110b85780601f1061108d576101008083540402835291602001916110b8565b820191906000526020600020905b81548152906001019060200180831161109b57829003601f168201915b5050505050905090565b6110ca611820565b73ffffffffffffffffffffffffffffffffffffffff166110e8611007565b73ffffffffffffffffffffffffffffffffffffffff161461113e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611135906135ff565b60405180910390fd5b80600a9080519060200190611154929190612cae565b5050565b611160611820565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111c5576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006111d2611820565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661127f611820565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112c49190612e48565b60405180910390a35050565b60095481565b6112de611820565b73ffffffffffffffffffffffffffffffffffffffff166112fc611007565b73ffffffffffffffffffffffffffffffffffffffff1614611352576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611349906135ff565b60405180910390fd5b80600c8190555050565b6113678484846118ed565b6113868373ffffffffffffffffffffffffffffffffffffffff166116cd565b801561139b575061139984848484612114565b155b156113d2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000600b54905090565b60606113ed826117d2565b611423576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061142d612274565b905060008151141561144e5760405180602001604052806000815250611479565b8061145884612306565b604051602001611469929190613962565b6040516020818303038152906040525b915050919050565b611489611820565b73ffffffffffffffffffffffffffffffffffffffff166114a7611007565b73ffffffffffffffffffffffffffffffffffffffff16146114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f4906135ff565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115dd611820565b73ffffffffffffffffffffffffffffffffffffffff166115fb611007565b73ffffffffffffffffffffffffffffffffffffffff1614611651576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611648906135ff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b8906139f8565b60405180910390fd5b6116ca81612050565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117bb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806117cb57506117ca82612467565b5b9050919050565b6000816117dd6118e8565b111580156117ec575060015482105b8015611819575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6118e58160006124d1565b50565b600090565b60006118f882611dc1565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611963576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611984611820565b73ffffffffffffffffffffffffffffffffffffffff1614806119b357506119b2856119ad611820565b611541565b5b806119f857506119c1611820565b73ffffffffffffffffffffffffffffffffffffffff166119e084610681565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611a31576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611a98576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611aa585858560016128c1565b611ab160008487611828565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d31576001548214611d3057878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d9c85858560016128c7565b5050505050565b611dbd8282604051806020016040528060008152506128cd565b5050565b611dc9612d34565b600082905080611dd76118e8565b11158015611de6575060015481105b15612019576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161201757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611efb57809250505061204b565b5b60011561201657818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461201157809250505061204b565b611efc565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261213a611820565b8786866040518563ffffffff1660e01b815260040161215c9493929190613a6d565b602060405180830381600087803b15801561217657600080fd5b505af19250505080156121a757506040513d601f19601f820116820180604052508101906121a49190613ace565b60015b612221573d80600081146121d7576040519150601f19603f3d011682016040523d82523d6000602084013e6121dc565b606091505b50600081511415612219576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a805461228390613581565b80601f01602080910402602001604051908101604052809291908181526020018280546122af90613581565b80156122fc5780601f106122d1576101008083540402835291602001916122fc565b820191906000526020600020905b8154815290600101906020018083116122df57829003601f168201915b5050505050905090565b6060600082141561234e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612462565b600082905060005b60008214612380578080612369906138dd565b915050600a826123799190613b2a565b9150612356565b60008167ffffffffffffffff81111561239c5761239b6130f8565b5b6040519080825280601f01601f1916602001820160405280156123ce5781602001600182028036833780820191505090505b5090505b6000851461245b576001826123e7919061364e565b9150600a856123f69190613b5b565b60306124029190613780565b60f81b818381518110612418576124176138ae565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124549190613b2a565b94506123d2565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006124dc83611dc1565b905060008160000151905082156125bd5760008173ffffffffffffffffffffffffffffffffffffffff1661250e611820565b73ffffffffffffffffffffffffffffffffffffffff16148061253d575061253c82612537611820565b611541565b5b80612582575061254b611820565b73ffffffffffffffffffffffffffffffffffffffff1661256a86610681565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806125bb576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6125cb8160008660016128c1565b6125d760008583611828565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060018160000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008781526020019081526020016000209050828160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff02191690831515021790555060006001870190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561283b57600154821461283a57848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128a98160008660016128c7565b60026000815480929190600101919050555050505050565b50505050565b50505050565b6128da83838360016128df565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561294d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612988576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61299560008683876128c1565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612b5f5750612b5e8773ffffffffffffffffffffffffffffffffffffffff166116cd565b5b15612c25575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bd46000888480600101955088612114565b612c0a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612b65578260015414612c2057600080fd5b612c91565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612c26575b816001819055505050612ca760008683876128c7565b5050505050565b828054612cba90613581565b90600052602060002090601f016020900481019282612cdc5760008555612d23565b82601f10612cf557805160ff1916838001178555612d23565b82800160010185558215612d23579182015b82811115612d22578251825591602001919060010190612d07565b5b509050612d309190612d77565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612d90576000816000905550600101612d78565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ddd81612da8565b8114612de857600080fd5b50565b600081359050612dfa81612dd4565b92915050565b600060208284031215612e1657612e15612d9e565b5b6000612e2484828501612deb565b91505092915050565b60008115159050919050565b612e4281612e2d565b82525050565b6000602082019050612e5d6000830184612e39565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e9d578082015181840152602081019050612e82565b83811115612eac576000848401525b50505050565b6000601f19601f8301169050919050565b6000612ece82612e63565b612ed88185612e6e565b9350612ee8818560208601612e7f565b612ef181612eb2565b840191505092915050565b60006020820190508181036000830152612f168184612ec3565b905092915050565b6000819050919050565b612f3181612f1e565b8114612f3c57600080fd5b50565b600081359050612f4e81612f28565b92915050565b600060208284031215612f6a57612f69612d9e565b5b6000612f7884828501612f3f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fac82612f81565b9050919050565b612fbc81612fa1565b82525050565b6000602082019050612fd76000830184612fb3565b92915050565b612fe681612fa1565b8114612ff157600080fd5b50565b60008135905061300381612fdd565b92915050565b600080604083850312156130205761301f612d9e565b5b600061302e85828601612ff4565b925050602061303f85828601612f3f565b9150509250929050565b61305281612f1e565b82525050565b600060208201905061306d6000830184613049565b92915050565b60008060006060848603121561308c5761308b612d9e565b5b600061309a86828701612ff4565b93505060206130ab86828701612ff4565b92505060406130bc86828701612f3f565b9150509250925092565b6000602082840312156130dc576130db612d9e565b5b60006130ea84828501612ff4565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61313082612eb2565b810181811067ffffffffffffffff8211171561314f5761314e6130f8565b5b80604052505050565b6000613162612d94565b905061316e8282613127565b919050565b600067ffffffffffffffff82111561318e5761318d6130f8565b5b602082029050602081019050919050565b600080fd5b60006131b76131b284613173565b613158565b905080838252602082019050602084028301858111156131da576131d961319f565b5b835b8181101561320357806131ef8882612ff4565b8452602084019350506020810190506131dc565b5050509392505050565b600082601f830112613222576132216130f3565b5b81356132328482602086016131a4565b91505092915050565b60006020828403121561325157613250612d9e565b5b600082013567ffffffffffffffff81111561326f5761326e612da3565b5b61327b8482850161320d565b91505092915050565b600080fd5b600067ffffffffffffffff8211156132a4576132a36130f8565b5b6132ad82612eb2565b9050602081019050919050565b82818337600083830152505050565b60006132dc6132d784613289565b613158565b9050828152602081018484840111156132f8576132f7613284565b5b6133038482856132ba565b509392505050565b600082601f8301126133205761331f6130f3565b5b81356133308482602086016132c9565b91505092915050565b60006020828403121561334f5761334e612d9e565b5b600082013567ffffffffffffffff81111561336d5761336c612da3565b5b6133798482850161330b565b91505092915050565b61338b81612e2d565b811461339657600080fd5b50565b6000813590506133a881613382565b92915050565b600080604083850312156133c5576133c4612d9e565b5b60006133d385828601612ff4565b92505060206133e485828601613399565b9150509250929050565b600067ffffffffffffffff821115613409576134086130f8565b5b61341282612eb2565b9050602081019050919050565b600061343261342d846133ee565b613158565b90508281526020810184848401111561344e5761344d613284565b5b6134598482856132ba565b509392505050565b600082601f830112613476576134756130f3565b5b813561348684826020860161341f565b91505092915050565b600080600080608085870312156134a9576134a8612d9e565b5b60006134b787828801612ff4565b94505060206134c887828801612ff4565b93505060406134d987828801612f3f565b925050606085013567ffffffffffffffff8111156134fa576134f9612da3565b5b61350687828801613461565b91505092959194509250565b6000806040838503121561352957613528612d9e565b5b600061353785828601612ff4565b925050602061354885828601612ff4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061359957607f821691505b602082108114156135ad576135ac613552565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135e9602083612e6e565b91506135f4826135b3565b602082019050919050565b60006020820190508181036000830152613618816135dc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061365982612f1e565b915061366483612f1e565b9250828210156136775761367661361f565b5b828203905092915050565b7f6d696e74206174206c65617374206f6e6520746f6b656e000000000000000000600082015250565b60006136b8601783612e6e565b91506136c382613682565b602082019050919050565b600060208201905081810360008301526136e7816136ab565b9050919050565b7f4d617820706572207472616e73616374696f6e206c696d69742072656163686560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b600061374a602183612e6e565b9150613755826136ee565b604082019050919050565b600060208201905081810360008301526137798161373d565b9050919050565b600061378b82612f1e565b915061379683612f1e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156137cb576137ca61361f565b5b828201905092915050565b7f6e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b600061380c601683612e6e565b9150613817826137d6565b602082019050919050565b6000602082019050818103600083015261383b816137ff565b9050919050565b7f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564600082015250565b6000613878602083612e6e565b915061388382613842565b602082019050919050565b600060208201905081810360008301526138a78161386b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006138e882612f1e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561391b5761391a61361f565b5b600182019050919050565b600081905092915050565b600061393c82612e63565b6139468185613926565b9350613956818560208601612e7f565b80840191505092915050565b600061396e8285613931565b915061397a8284613931565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006139e2602683612e6e565b91506139ed82613986565b604082019050919050565b60006020820190508181036000830152613a11816139d5565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613a3f82613a18565b613a498185613a23565b9350613a59818560208601612e7f565b613a6281612eb2565b840191505092915050565b6000608082019050613a826000830187612fb3565b613a8f6020830186612fb3565b613a9c6040830185613049565b8181036060830152613aae8184613a34565b905095945050505050565b600081519050613ac881612dd4565b92915050565b600060208284031215613ae457613ae3612d9e565b5b6000613af284828501613ab9565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613b3582612f1e565b9150613b4083612f1e565b925082613b5057613b4f613afb565b5b828204905092915050565b6000613b6682612f1e565b9150613b7183612f1e565b925082613b8157613b80613afb565b5b82820690509291505056fea26469706673582212203b50bebd41b87cffaebad11c251cc58b1aaac70995303ae646ecdf8f6ce4f43b64736f6c63430008090033
Deployed Bytecode Sourcemap
47924:2997:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50756:162;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33232:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34735:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34298:371;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49532:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29368:303;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35600:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48914:368;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50577:103;;;:::i;:::-;;35841:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49313:182;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48094:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48050:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33040:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49689:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48022:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30488:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7837:103;;;:::i;:::-;;50124:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48458:414;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7186:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33401:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50247:92;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35011:287;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47988:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49985:101;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36097:369;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49842:99;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33576:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50469:83;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35369:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8095:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50756:162;50850:4;50874:36;50898:11;50874:23;:36::i;:::-;50867:43;;50756:162;;;:::o;33232:100::-;33286:13;33319:5;33312:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33232:100;:::o;34735:204::-;34803:7;34828:16;34836:7;34828;:16::i;:::-;34823:64;;34853:34;;;;;;;;;;;;;;34823:64;34907:15;:24;34923:7;34907:24;;;;;;;;;;;;;;;;;;;;;34900:31;;34735:204;;;:::o;34298:371::-;34371:13;34387:24;34403:7;34387:15;:24::i;:::-;34371:40;;34432:5;34426:11;;:2;:11;;;34422:48;;;34446:24;;;;;;;;;;;;;;34422:48;34503:5;34487:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;34513:37;34530:5;34537:12;:10;:12::i;:::-;34513:16;:37::i;:::-;34512:38;34487:63;34483:138;;;34574:35;;;;;;;;;;;;;;34483:138;34633:28;34642:2;34646:7;34655:5;34633:8;:28::i;:::-;34360:309;34298:371;;:::o;49532:109::-;7417:12;:10;:12::i;:::-;7406:23;;:7;:5;:7::i;:::-;:23;;;7398:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49593:14:::1;49599:7;49593:5;:14::i;:::-;49632:1;49618:11;;:15;;;;;;;:::i;:::-;;;;;;;;49532:109:::0;:::o;29368:303::-;29412:7;29637:15;:13;:15::i;:::-;29622:12;;29606:13;;:28;:46;29599:53;;29368:303;:::o;35600:170::-;35734:28;35744:4;35750:2;35754:7;35734:9;:28::i;:::-;35600:170;;;:::o;48914:368::-;7417:12;:10;:12::i;:::-;7406:23;;:7;:5;:7::i;:::-;:23;;;7398:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49011:1:::1;49003:5;:9;48995:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;49068:17;;49059:5;:26;;49051:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;49167:14;;49157:5;49142:11;;:20;;;;:::i;:::-;:39;;49134:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;49219:24;49229:6;49237:5;49219:9;:24::i;:::-;49269:5;49254:11;;:20;;;;;;;:::i;:::-;;;;;;;;48914:368:::0;;:::o;50577:103::-;7417:12;:10;:12::i;:::-;7406:23;;:7;:5;:7::i;:::-;:23;;;7398:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50635:3:::1;;;;;;;;;;;50627:21;;:44;50649:21;50627:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;50577:103::o:0;35841:185::-;35979:39;35996:4;36002:2;36006:7;35979:39;;;;;;;;;;;;:16;:39::i;:::-;35841:185;;;:::o;49313:182::-;49383:16;49391:7;49383;:16::i;:::-;49367:32;;:12;:10;:12::i;:::-;:32;;;49359:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;49447:14;49453:7;49447:5;:14::i;:::-;49486:1;49472:11;;:15;;;;;;;:::i;:::-;;;;;;;;49313:182;:::o;48094:33::-;;;;:::o;48050:35::-;;;;:::o;33040:125::-;33104:7;33131:21;33144:7;33131:12;:21::i;:::-;:26;;;33124:33;;33040:125;;;:::o;49689:105::-;7417:12;:10;:12::i;:::-;7406:23;;:7;:5;:7::i;:::-;:23;;;7398:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49780:6:::1;49760:17;:26;;;;49689:105:::0;:::o;48022:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30488:206::-;30552:7;30593:1;30576:19;;:5;:19;;;30572:60;;;30604:28;;;;;;;;;;;;;;30572:60;30658:12;:19;30671:5;30658:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;30650:36;;30643:43;;30488:206;;;:::o;7837:103::-;7417:12;:10;:12::i;:::-;7406:23;;:7;:5;:7::i;:::-;:23;;;7398:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7902:30:::1;7929:1;7902:18;:30::i;:::-;7837:103::o:0;50124:94::-;50173:4;50196:14;;50189:21;;50124:94;:::o;48458:414::-;7417:12;:10;:12::i;:::-;7406:23;;:7;:5;:7::i;:::-;:23;;;7398:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48566:17:::1;;48547:8;:15;:36;;48539:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;48675:14;;48655:8;:15;48640:11;;:30;;;;:::i;:::-;:49;;48632:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;48731:6;48727:124;48747:8;:15;48743:1;:19;48727:124;;;48783:25;48793:8;48802:1;48793:11;;;;;;;;:::i;:::-;;;;;;;;48806:1;48783:9;:25::i;:::-;48838:1;48823:11;;:16;;;;;;;:::i;:::-;;;;;;;;48764:3;;;;;:::i;:::-;;;;48727:124;;;;48458:414:::0;:::o;7186:87::-;7232:7;7259:6;;;;;;;;;;;7252:13;;7186:87;:::o;33401:104::-;33457:13;33490:7;33483:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33401:104;:::o;50247:92::-;7417:12;:10;:12::i;:::-;7406:23;;:7;:5;:7::i;:::-;:23;;;7398:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50327:4:::1;50317:7;:14;;;;;;;;;;;;:::i;:::-;;50247:92:::0;:::o;35011:287::-;35122:12;:10;:12::i;:::-;35110:24;;:8;:24;;;35106:54;;;35143:17;;;;;;;;;;;;;;35106:54;35218:8;35173:18;:32;35192:12;:10;:12::i;:::-;35173:32;;;;;;;;;;;;;;;:42;35206:8;35173:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;35271:8;35242:48;;35257:12;:10;:12::i;:::-;35242:48;;;35281:8;35242:48;;;;;;:::i;:::-;;;;;;;;35011:287;;:::o;47988:27::-;;;;:::o;49985:101::-;7417:12;:10;:12::i;:::-;7406:23;;:7;:5;:7::i;:::-;:23;;;7398:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50072:6:::1;50055:14;:23;;;;49985:101:::0;:::o;36097:369::-;36264:28;36274:4;36280:2;36284:7;36264:9;:28::i;:::-;36307:15;:2;:13;;;:15::i;:::-;:76;;;;;36327:56;36358:4;36364:2;36368:7;36377:5;36327:30;:56::i;:::-;36326:57;36307:76;36303:156;;;36407:40;;;;;;;;;;;;;;36303:156;36097:369;;;;:::o;49842:99::-;49893:4;49916:17;;49909:24;;49842:99;:::o;33576:318::-;33649:13;33680:16;33688:7;33680;:16::i;:::-;33675:59;;33705:29;;;;;;;;;;;;;;33675:59;33747:21;33771:10;:8;:10::i;:::-;33747:34;;33824:1;33805:7;33799:21;:26;;:87;;;;;;;;;;;;;;;;;33852:7;33861:18;:7;:16;:18::i;:::-;33835:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33799:87;33792:94;;;33576:318;;;:::o;50469:83::-;7417:12;:10;:12::i;:::-;7406:23;;:7;:5;:7::i;:::-;:23;;;7398:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50540:4:::1;50534:3;;:10;;;;;;;;;;;;;;;;;;50469:83:::0;:::o;35369:164::-;35466:4;35490:18;:25;35509:5;35490:25;;;;;;;;;;;;;;;:35;35516:8;35490:35;;;;;;;;;;;;;;;;;;;;;;;;;35483:42;;35369:164;;;;:::o;8095:201::-;7417:12;:10;:12::i;:::-;7406:23;;:7;:5;:7::i;:::-;:23;;;7398:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8204:1:::1;8184:22;;:8;:22;;;;8176:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8260:28;8279:8;8260:18;:28::i;:::-;8095:201:::0;:::o;9887:326::-;9947:4;10204:1;10182:7;:19;;;:23;10175:30;;9887:326;;;:::o;30119:305::-;30221:4;30273:25;30258:40;;;:11;:40;;;;:105;;;;30330:33;30315:48;;;:11;:48;;;;30258:105;:158;;;;30380:36;30404:11;30380:23;:36::i;:::-;30258:158;30238:178;;30119:305;;;:::o;36721:187::-;36778:4;36821:7;36802:15;:13;:15::i;:::-;:26;;:53;;;;;36842:13;;36832:7;:23;36802:53;:98;;;;;36873:11;:20;36885:7;36873:20;;;;;;;;;;;:27;;;;;;;;;;;;36872:28;36802:98;36795:105;;36721:187;;;:::o;5910:98::-;5963:7;5990:10;5983:17;;5910:98;:::o;44891:196::-;45033:2;45006:15;:24;45022:7;45006:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45071:7;45067:2;45051:28;;45060:5;45051:28;;;;;;;;;;;;44891:196;;;:::o;42047:89::-;42107:21;42113:7;42122:5;42107;:21::i;:::-;42047:89;:::o;29142:92::-;29198:7;29142:92;:::o;39834:2130::-;39949:35;39987:21;40000:7;39987:12;:21::i;:::-;39949:59;;40047:4;40025:26;;:13;:18;;;:26;;;40021:67;;40060:28;;;;;;;;;;;;;;40021:67;40101:22;40143:4;40127:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;40164:36;40181:4;40187:12;:10;:12::i;:::-;40164:16;:36::i;:::-;40127:73;:126;;;;40241:12;:10;:12::i;:::-;40217:36;;:20;40229:7;40217:11;:20::i;:::-;:36;;;40127:126;40101:153;;40272:17;40267:66;;40298:35;;;;;;;;;;;;;;40267:66;40362:1;40348:16;;:2;:16;;;40344:52;;;40373:23;;;;;;;;;;;;;;40344:52;40409:43;40431:4;40437:2;40441:7;40450:1;40409:21;:43::i;:::-;40517:35;40534:1;40538:7;40547:4;40517:8;:35::i;:::-;40878:1;40848:12;:18;40861:4;40848:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40922:1;40894:12;:16;40907:2;40894:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40940:31;40974:11;:20;40986:7;40974:20;;;;;;;;;;;40940:54;;41025:2;41009:8;:13;;;:18;;;;;;;;;;;;;;;;;;41075:15;41042:8;:23;;;:49;;;;;;;;;;;;;;;;;;41343:19;41375:1;41365:7;:11;41343:33;;41391:31;41425:11;:24;41437:11;41425:24;;;;;;;;;;;41391:58;;41493:1;41468:27;;:8;:13;;;;;;;;;;;;:27;;;41464:384;;;41678:13;;41663:11;:28;41659:174;;41732:4;41716:8;:13;;;:20;;;;;;;;;;;;;;;;;;41785:13;:28;;;41759:8;:23;;;:54;;;;;;;;;;;;;;;;;;41659:174;41464:384;40823:1036;;;41895:7;41891:2;41876:27;;41885:4;41876:27;;;;;;;;;;;;41914:42;41935:4;41941:2;41945:7;41954:1;41914:20;:42::i;:::-;39938:2026;;39834:2130;;;:::o;36916:104::-;36985:27;36995:2;36999:8;36985:27;;;;;;;;;;;;:9;:27::i;:::-;36916:104;;:::o;31869:1109::-;31931:21;;:::i;:::-;31965:12;31980:7;31965:22;;32048:4;32029:15;:13;:15::i;:::-;:23;;:47;;;;;32063:13;;32056:4;:20;32029:47;32025:886;;;32097:31;32131:11;:17;32143:4;32131:17;;;;;;;;;;;32097:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32172:9;:16;;;32167:729;;32243:1;32217:28;;:9;:14;;;:28;;;32213:101;;32281:9;32274:16;;;;;;32213:101;32616:261;32623:4;32616:261;;;32656:6;;;;;;;;32701:11;:17;32713:4;32701:17;;;;;;;;;;;32689:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32775:1;32749:28;;:9;:14;;;:28;;;32745:109;;32817:9;32810:16;;;;;;32745:109;32616:261;;;32167:729;32078:833;32025:886;32939:31;;;;;;;;;;;;;;31869:1109;;;;:::o;8456:191::-;8530:16;8549:6;;;;;;;;;;;8530:25;;8575:8;8566:6;;:17;;;;;;;;;;;;;;;;;;8630:8;8599:40;;8620:8;8599:40;;;;;;;;;;;;8519:128;8456:191;:::o;45579:667::-;45742:4;45779:2;45763:36;;;45800:12;:10;:12::i;:::-;45814:4;45820:7;45829:5;45763:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45759:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46014:1;45997:6;:13;:18;45993:235;;;46043:40;;;;;;;;;;;;;;45993:235;46186:6;46180:13;46171:6;46167:2;46163:15;46156:38;45759:480;45892:45;;;45882:55;;;:6;:55;;;;45875:62;;;45579:667;;;;;;:::o;50353:108::-;50413:13;50446:7;50439:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50353:108;:::o;3472:723::-;3528:13;3758:1;3749:5;:10;3745:53;;;3776:10;;;;;;;;;;;;;;;;;;;;;3745:53;3808:12;3823:5;3808:20;;3839:14;3864:78;3879:1;3871:4;:9;3864:78;;3897:8;;;;;:::i;:::-;;;;3928:2;3920:10;;;;;:::i;:::-;;;3864:78;;;3952:19;3984:6;3974:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3952:39;;4002:154;4018:1;4009:5;:10;4002:154;;4046:1;4036:11;;;;;:::i;:::-;;;4113:2;4105:5;:10;;;;:::i;:::-;4092:2;:24;;;;:::i;:::-;4079:39;;4062:6;4069;4062:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;4142:2;4133:11;;;;;:::i;:::-;;;4002:154;;;4180:6;4166:21;;;;;3472:723;;;;:::o;19970:157::-;20055:4;20094:25;20079:40;;;:11;:40;;;;20072:47;;19970:157;;;:::o;42365:2408::-;42445:35;42483:21;42496:7;42483:12;:21::i;:::-;42445:59;;42517:12;42532:13;:18;;;42517:33;;42567:13;42563:290;;;42597:22;42639:4;42623:20;;:12;:10;:12::i;:::-;:20;;;:77;;;;42664:36;42681:4;42687:12;:10;:12::i;:::-;42664:16;:36::i;:::-;42623:77;:134;;;;42745:12;:10;:12::i;:::-;42721:36;;:20;42733:7;42721:11;:20::i;:::-;:36;;;42623:134;42597:161;;42780:17;42775:66;;42806:35;;;;;;;;;;;;;;42775:66;42582:271;42563:290;42865:51;42887:4;42901:1;42905:7;42914:1;42865:21;:51::i;:::-;42981:35;42998:1;43002:7;43011:4;42981:8;:35::i;:::-;43312:31;43346:12;:18;43359:4;43346:18;;;;;;;;;;;;;;;43312:52;;43402:1;43379:11;:19;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43446:1;43418:11;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43546:31;43580:11;:20;43592:7;43580:20;;;;;;;;;;;43546:54;;43631:4;43615:8;:13;;;:20;;;;;;;;;;;;;;;;;;43683:15;43650:8;:23;;;:49;;;;;;;;;;;;;;;;;;43732:4;43714:8;:15;;;:22;;;;;;;;;;;;;;;;;;43984:19;44016:1;44006:7;:11;43984:33;;44032:31;44066:11;:24;44078:11;44066:24;;;;;;;;;;;44032:58;;44134:1;44109:27;;:8;:13;;;;;;;;;;;;:27;;;44105:384;;;44319:13;;44304:11;:28;44300:174;;44373:4;44357:8;:13;;;:20;;;;;;;;;;;;;;;;;;44426:13;:28;;;44400:8;:23;;;:54;;;;;;;;;;;;;;;;;;44300:174;44105:384;43287:1213;;;;44544:7;44540:1;44517:35;;44526:4;44517:35;;;;;;;;;;;;44563:50;44584:4;44598:1;44602:7;44611:1;44563:20;:50::i;:::-;44740:12;;:14;;;;;;;;;;;;;42434:2339;;42365:2408;;:::o;46894:159::-;;;;;:::o;47712:158::-;;;;;:::o;37383:163::-;37506:32;37512:2;37516:8;37526:5;37533:4;37506:5;:32::i;:::-;37383:163;;;:::o;37805:1775::-;37944:20;37967:13;;37944:36;;38009:1;37995:16;;:2;:16;;;37991:48;;;38020:19;;;;;;;;;;;;;;37991:48;38066:1;38054:8;:13;38050:44;;;38076:18;;;;;;;;;;;;;;38050:44;38107:61;38137:1;38141:2;38145:12;38159:8;38107:21;:61::i;:::-;38480:8;38445:12;:16;38458:2;38445:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38544:8;38504:12;:16;38517:2;38504:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38603:2;38570:11;:25;38582:12;38570:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;38670:15;38620:11;:25;38632:12;38620:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;38703:20;38726:12;38703:35;;38753:11;38782:8;38767:12;:23;38753:37;;38811:4;:23;;;;;38819:15;:2;:13;;;:15::i;:::-;38811:23;38807:641;;;38855:314;38911:12;38907:2;38886:38;;38903:1;38886:38;;;;;;;;;;;;38952:69;38991:1;38995:2;38999:14;;;;;;39015:5;38952:30;:69::i;:::-;38947:174;;39057:40;;;;;;;;;;;;;;38947:174;39164:3;39148:12;:19;;38855:314;;39250:12;39233:13;;:29;39229:43;;39264:8;;;39229:43;38807:641;;;39313:120;39369:14;;;;;;39365:2;39344:40;;39361:1;39344:40;;;;;;;;;;;;39428:3;39412:12;:19;;39313:120;;38807:641;39478:12;39462:13;:28;;;;38420:1082;;39512:60;39541:1;39545:2;39549:12;39563:8;39512:20;:60::i;:::-;37933:1647;37805:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:180;6421:77;6418:1;6411:88;6518:4;6515:1;6508:15;6542:4;6539:1;6532:15;6559:281;6642:27;6664:4;6642:27;:::i;:::-;6634:6;6630:40;6772:6;6760:10;6757:22;6736:18;6724:10;6721:34;6718:62;6715:88;;;6783:18;;:::i;:::-;6715:88;6823:10;6819:2;6812:22;6602:238;6559:281;;:::o;6846:129::-;6880:6;6907:20;;:::i;:::-;6897:30;;6936:33;6964:4;6956:6;6936:33;:::i;:::-;6846:129;;;:::o;6981:311::-;7058:4;7148:18;7140:6;7137:30;7134:56;;;7170:18;;:::i;:::-;7134:56;7220:4;7212:6;7208:17;7200:25;;7280:4;7274;7270:15;7262:23;;6981:311;;;:::o;7298:117::-;7407:1;7404;7397:12;7438:710;7534:5;7559:81;7575:64;7632:6;7575:64;:::i;:::-;7559:81;:::i;:::-;7550:90;;7660:5;7689:6;7682:5;7675:21;7723:4;7716:5;7712:16;7705:23;;7776:4;7768:6;7764:17;7756:6;7752:30;7805:3;7797:6;7794:15;7791:122;;;7824:79;;:::i;:::-;7791:122;7939:6;7922:220;7956:6;7951:3;7948:15;7922:220;;;8031:3;8060:37;8093:3;8081:10;8060:37;:::i;:::-;8055:3;8048:50;8127:4;8122:3;8118:14;8111:21;;7998:144;7982:4;7977:3;7973:14;7966:21;;7922:220;;;7926:21;7540:608;;7438:710;;;;;:::o;8171:370::-;8242:5;8291:3;8284:4;8276:6;8272:17;8268:27;8258:122;;8299:79;;:::i;:::-;8258:122;8416:6;8403:20;8441:94;8531:3;8523:6;8516:4;8508:6;8504:17;8441:94;:::i;:::-;8432:103;;8248:293;8171:370;;;;:::o;8547:539::-;8631:6;8680:2;8668:9;8659:7;8655:23;8651:32;8648:119;;;8686:79;;:::i;:::-;8648:119;8834:1;8823:9;8819:17;8806:31;8864:18;8856:6;8853:30;8850:117;;;8886:79;;:::i;:::-;8850:117;8991:78;9061:7;9052:6;9041:9;9037:22;8991:78;:::i;:::-;8981:88;;8777:302;8547:539;;;;:::o;9092:117::-;9201:1;9198;9191:12;9215:308;9277:4;9367:18;9359:6;9356:30;9353:56;;;9389:18;;:::i;:::-;9353:56;9427:29;9449:6;9427:29;:::i;:::-;9419:37;;9511:4;9505;9501:15;9493:23;;9215:308;;;:::o;9529:154::-;9613:6;9608:3;9603;9590:30;9675:1;9666:6;9661:3;9657:16;9650:27;9529:154;;;:::o;9689:412::-;9767:5;9792:66;9808:49;9850:6;9808:49;:::i;:::-;9792:66;:::i;:::-;9783:75;;9881:6;9874:5;9867:21;9919:4;9912:5;9908:16;9957:3;9948:6;9943:3;9939:16;9936:25;9933:112;;;9964:79;;:::i;:::-;9933:112;10054:41;10088:6;10083:3;10078;10054:41;:::i;:::-;9773:328;9689:412;;;;;:::o;10121:340::-;10177:5;10226:3;10219:4;10211:6;10207:17;10203:27;10193:122;;10234:79;;:::i;:::-;10193:122;10351:6;10338:20;10376:79;10451:3;10443:6;10436:4;10428:6;10424:17;10376:79;:::i;:::-;10367:88;;10183:278;10121:340;;;;:::o;10467:509::-;10536:6;10585:2;10573:9;10564:7;10560:23;10556:32;10553:119;;;10591:79;;:::i;:::-;10553:119;10739:1;10728:9;10724:17;10711:31;10769:18;10761:6;10758:30;10755:117;;;10791:79;;:::i;:::-;10755:117;10896:63;10951:7;10942:6;10931:9;10927:22;10896:63;:::i;:::-;10886:73;;10682:287;10467:509;;;;:::o;10982:116::-;11052:21;11067:5;11052:21;:::i;:::-;11045:5;11042:32;11032:60;;11088:1;11085;11078:12;11032:60;10982:116;:::o;11104:133::-;11147:5;11185:6;11172:20;11163:29;;11201:30;11225:5;11201:30;:::i;:::-;11104:133;;;;:::o;11243:468::-;11308:6;11316;11365:2;11353:9;11344:7;11340:23;11336:32;11333:119;;;11371:79;;:::i;:::-;11333:119;11491:1;11516:53;11561:7;11552:6;11541:9;11537:22;11516:53;:::i;:::-;11506:63;;11462:117;11618:2;11644:50;11686:7;11677:6;11666:9;11662:22;11644:50;:::i;:::-;11634:60;;11589:115;11243:468;;;;;:::o;11717:307::-;11778:4;11868:18;11860:6;11857:30;11854:56;;;11890:18;;:::i;:::-;11854:56;11928:29;11950:6;11928:29;:::i;:::-;11920:37;;12012:4;12006;12002:15;11994:23;;11717:307;;;:::o;12030:410::-;12107:5;12132:65;12148:48;12189:6;12148:48;:::i;:::-;12132:65;:::i;:::-;12123:74;;12220:6;12213:5;12206:21;12258:4;12251:5;12247:16;12296:3;12287:6;12282:3;12278:16;12275:25;12272:112;;;12303:79;;:::i;:::-;12272:112;12393:41;12427:6;12422:3;12417;12393:41;:::i;:::-;12113:327;12030:410;;;;;:::o;12459:338::-;12514:5;12563:3;12556:4;12548:6;12544:17;12540:27;12530:122;;12571:79;;:::i;:::-;12530:122;12688:6;12675:20;12713:78;12787:3;12779:6;12772:4;12764:6;12760:17;12713:78;:::i;:::-;12704:87;;12520:277;12459:338;;;;:::o;12803:943::-;12898:6;12906;12914;12922;12971:3;12959:9;12950:7;12946:23;12942:33;12939:120;;;12978:79;;:::i;:::-;12939:120;13098:1;13123:53;13168:7;13159:6;13148:9;13144:22;13123:53;:::i;:::-;13113:63;;13069:117;13225:2;13251:53;13296:7;13287:6;13276:9;13272:22;13251:53;:::i;:::-;13241:63;;13196:118;13353:2;13379:53;13424:7;13415:6;13404:9;13400:22;13379:53;:::i;:::-;13369:63;;13324:118;13509:2;13498:9;13494:18;13481:32;13540:18;13532:6;13529:30;13526:117;;;13562:79;;:::i;:::-;13526:117;13667:62;13721:7;13712:6;13701:9;13697:22;13667:62;:::i;:::-;13657:72;;13452:287;12803:943;;;;;;;:::o;13752:474::-;13820:6;13828;13877:2;13865:9;13856:7;13852:23;13848:32;13845:119;;;13883:79;;:::i;:::-;13845:119;14003:1;14028:53;14073:7;14064:6;14053:9;14049:22;14028:53;:::i;:::-;14018:63;;13974:117;14130:2;14156:53;14201:7;14192:6;14181:9;14177:22;14156:53;:::i;:::-;14146:63;;14101:118;13752:474;;;;;:::o;14232:180::-;14280:77;14277:1;14270:88;14377:4;14374:1;14367:15;14401:4;14398:1;14391:15;14418:320;14462:6;14499:1;14493:4;14489:12;14479:22;;14546:1;14540:4;14536:12;14567:18;14557:81;;14623:4;14615:6;14611:17;14601:27;;14557:81;14685:2;14677:6;14674:14;14654:18;14651:38;14648:84;;;14704:18;;:::i;:::-;14648:84;14469:269;14418:320;;;:::o;14744:182::-;14884:34;14880:1;14872:6;14868:14;14861:58;14744:182;:::o;14932:366::-;15074:3;15095:67;15159:2;15154:3;15095:67;:::i;:::-;15088:74;;15171:93;15260:3;15171:93;:::i;:::-;15289:2;15284:3;15280:12;15273:19;;14932:366;;;:::o;15304:419::-;15470:4;15508:2;15497:9;15493:18;15485:26;;15557:9;15551:4;15547:20;15543:1;15532:9;15528:17;15521:47;15585:131;15711:4;15585:131;:::i;:::-;15577:139;;15304:419;;;:::o;15729:180::-;15777:77;15774:1;15767:88;15874:4;15871:1;15864:15;15898:4;15895:1;15888:15;15915:191;15955:4;15975:20;15993:1;15975:20;:::i;:::-;15970:25;;16009:20;16027:1;16009:20;:::i;:::-;16004:25;;16048:1;16045;16042:8;16039:34;;;16053:18;;:::i;:::-;16039:34;16098:1;16095;16091:9;16083:17;;15915:191;;;;:::o;16112:173::-;16252:25;16248:1;16240:6;16236:14;16229:49;16112:173;:::o;16291:366::-;16433:3;16454:67;16518:2;16513:3;16454:67;:::i;:::-;16447:74;;16530:93;16619:3;16530:93;:::i;:::-;16648:2;16643:3;16639:12;16632:19;;16291:366;;;:::o;16663:419::-;16829:4;16867:2;16856:9;16852:18;16844:26;;16916:9;16910:4;16906:20;16902:1;16891:9;16887:17;16880:47;16944:131;17070:4;16944:131;:::i;:::-;16936:139;;16663:419;;;:::o;17088:220::-;17228:34;17224:1;17216:6;17212:14;17205:58;17297:3;17292:2;17284:6;17280:15;17273:28;17088:220;:::o;17314:366::-;17456:3;17477:67;17541:2;17536:3;17477:67;:::i;:::-;17470:74;;17553:93;17642:3;17553:93;:::i;:::-;17671:2;17666:3;17662:12;17655:19;;17314:366;;;:::o;17686:419::-;17852:4;17890:2;17879:9;17875:18;17867:26;;17939:9;17933:4;17929:20;17925:1;17914:9;17910:17;17903:47;17967:131;18093:4;17967:131;:::i;:::-;17959:139;;17686:419;;;:::o;18111:305::-;18151:3;18170:20;18188:1;18170:20;:::i;:::-;18165:25;;18204:20;18222:1;18204:20;:::i;:::-;18199:25;;18358:1;18290:66;18286:74;18283:1;18280:81;18277:107;;;18364:18;;:::i;:::-;18277:107;18408:1;18405;18401:9;18394:16;;18111:305;;;;:::o;18422:172::-;18562:24;18558:1;18550:6;18546:14;18539:48;18422:172;:::o;18600:366::-;18742:3;18763:67;18827:2;18822:3;18763:67;:::i;:::-;18756:74;;18839:93;18928:3;18839:93;:::i;:::-;18957:2;18952:3;18948:12;18941:19;;18600:366;;;:::o;18972:419::-;19138:4;19176:2;19165:9;19161:18;19153:26;;19225:9;19219:4;19215:20;19211:1;19200:9;19196:17;19189:47;19253:131;19379:4;19253:131;:::i;:::-;19245:139;;18972:419;;;:::o;19397:182::-;19537:34;19533:1;19525:6;19521:14;19514:58;19397:182;:::o;19585:366::-;19727:3;19748:67;19812:2;19807:3;19748:67;:::i;:::-;19741:74;;19824:93;19913:3;19824:93;:::i;:::-;19942:2;19937:3;19933:12;19926:19;;19585:366;;;:::o;19957:419::-;20123:4;20161:2;20150:9;20146:18;20138:26;;20210:9;20204:4;20200:20;20196:1;20185:9;20181:17;20174:47;20238:131;20364:4;20238:131;:::i;:::-;20230:139;;19957:419;;;:::o;20382:180::-;20430:77;20427:1;20420:88;20527:4;20524:1;20517:15;20551:4;20548:1;20541:15;20568:233;20607:3;20630:24;20648:5;20630:24;:::i;:::-;20621:33;;20676:66;20669:5;20666:77;20663:103;;;20746:18;;:::i;:::-;20663:103;20793:1;20786:5;20782:13;20775:20;;20568:233;;;:::o;20807:148::-;20909:11;20946:3;20931:18;;20807:148;;;;:::o;20961:377::-;21067:3;21095:39;21128:5;21095:39;:::i;:::-;21150:89;21232:6;21227:3;21150:89;:::i;:::-;21143:96;;21248:52;21293:6;21288:3;21281:4;21274:5;21270:16;21248:52;:::i;:::-;21325:6;21320:3;21316:16;21309:23;;21071:267;20961:377;;;;:::o;21344:435::-;21524:3;21546:95;21637:3;21628:6;21546:95;:::i;:::-;21539:102;;21658:95;21749:3;21740:6;21658:95;:::i;:::-;21651:102;;21770:3;21763:10;;21344:435;;;;;:::o;21785:225::-;21925:34;21921:1;21913:6;21909:14;21902:58;21994:8;21989:2;21981:6;21977:15;21970:33;21785:225;:::o;22016:366::-;22158:3;22179:67;22243:2;22238:3;22179:67;:::i;:::-;22172:74;;22255:93;22344:3;22255:93;:::i;:::-;22373:2;22368:3;22364:12;22357:19;;22016:366;;;:::o;22388:419::-;22554:4;22592:2;22581:9;22577:18;22569:26;;22641:9;22635:4;22631:20;22627:1;22616:9;22612:17;22605:47;22669:131;22795:4;22669:131;:::i;:::-;22661:139;;22388:419;;;:::o;22813:98::-;22864:6;22898:5;22892:12;22882:22;;22813:98;;;:::o;22917:168::-;23000:11;23034:6;23029:3;23022:19;23074:4;23069:3;23065:14;23050:29;;22917:168;;;;:::o;23091:360::-;23177:3;23205:38;23237:5;23205:38;:::i;:::-;23259:70;23322:6;23317:3;23259:70;:::i;:::-;23252:77;;23338:52;23383:6;23378:3;23371:4;23364:5;23360:16;23338:52;:::i;:::-;23415:29;23437:6;23415:29;:::i;:::-;23410:3;23406:39;23399:46;;23181:270;23091:360;;;;:::o;23457:640::-;23652:4;23690:3;23679:9;23675:19;23667:27;;23704:71;23772:1;23761:9;23757:17;23748:6;23704:71;:::i;:::-;23785:72;23853:2;23842:9;23838:18;23829:6;23785:72;:::i;:::-;23867;23935:2;23924:9;23920:18;23911:6;23867:72;:::i;:::-;23986:9;23980:4;23976:20;23971:2;23960:9;23956:18;23949:48;24014:76;24085:4;24076:6;24014:76;:::i;:::-;24006:84;;23457:640;;;;;;;:::o;24103:141::-;24159:5;24190:6;24184:13;24175:22;;24206:32;24232:5;24206:32;:::i;:::-;24103:141;;;;:::o;24250:349::-;24319:6;24368:2;24356:9;24347:7;24343:23;24339:32;24336:119;;;24374:79;;:::i;:::-;24336:119;24494:1;24519:63;24574:7;24565:6;24554:9;24550:22;24519:63;:::i;:::-;24509:73;;24465:127;24250:349;;;;:::o;24605:180::-;24653:77;24650:1;24643:88;24750:4;24747:1;24740:15;24774:4;24771:1;24764:15;24791:185;24831:1;24848:20;24866:1;24848:20;:::i;:::-;24843:25;;24882:20;24900:1;24882:20;:::i;:::-;24877:25;;24921:1;24911:35;;24926:18;;:::i;:::-;24911:35;24968:1;24965;24961:9;24956:14;;24791:185;;;;:::o;24982:176::-;25014:1;25031:20;25049:1;25031:20;:::i;:::-;25026:25;;25065:20;25083:1;25065:20;:::i;:::-;25060:25;;25104:1;25094:35;;25109:18;;:::i;:::-;25094:35;25150:1;25147;25143:9;25138:14;;24982:176;;;;:::o
Swarm Source
ipfs://3b50bebd41b87cffaebad11c251cc58b1aaac70995303ae646ecdf8f6ce4f43b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.