ERC-721
Overview
Max Total Supply
660 AAC
Holders
341
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 AACLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ArgentinianApeClub
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-12-19 */ /** *Submitted for verification at Etherscan.io on 2022-06-08 */ /** *Submitted for verification at Etherscan.io on 2022-05-27 */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries( address registrant, address registrantToCopy ) external; function unregister(address addr) external; function updateOperator( address registrant, address operator, bool filtered ) external; function updateOperators( address registrant, address[] calldata operators, bool filtered ) external; function updateCodeHash( address registrant, bytes32 codehash, bool filtered ) external; function updateCodeHashes( address registrant, bytes32[] calldata codeHashes, bool filtered ) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe( address(this), subscriptionOrRegistrantToCopy ); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries( address(this), subscriptionOrRegistrantToCopy ); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if ( !OPERATOR_FILTER_REGISTRY.isOperatorAllowed( address(this), operator ) ) { revert OperatorNotAllowed(operator); } } } } /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} } // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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; } } /** * @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); } // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } /** * @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); } // ERC721A Contracts v3.3.0 // Creator: Chiru Labs /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A is IERC721, IERC721Metadata { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); // 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; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @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; } } // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev 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); } } // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) /** * @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); } } } } // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) /** * @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); } } // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol) /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // 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; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @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 virtual override returns (uint256) { require( owner != address(0), "ERC721: balance query for the zero address" ); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require( owner != address(0), "ERC721: owner query for nonexistent token" ); return owner; } /** * @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) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); 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 overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require( _exists(tokenId), "ERC721: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_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 { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _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 { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } /** * @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. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @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`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require( _exists(tokenId), "ERC721: operator query for nonexistent token" ); address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * 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 ) internal virtual { require( ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner" ); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a 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 _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721: transfer to non ERC721Receiver implementer" ); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // ERC721A Contracts v3.3.0 // Creator: Chiru Labs /** * @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, IERC721A { using Address for address; using Strings for uint256; // 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 override 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) if (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 virtual override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner) if (!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()) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _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 (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 Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _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; 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 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 {} } // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol) /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be payed in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require( feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice" ); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require( feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice" ); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } contract ArgentinianApeClub is ERC721A, ERC2981, Ownable, DefaultOperatorFilterer { string public baseURI = "https://nftservice.s3.amazonaws.com/goblinpoop/"; uint256 public tokenPrice = 5000000000000000; //0.005 ETH uint256 public maxTokensPerTx = 20; uint256 public defaultTokensPerTx = 3; uint256 public MAX_TOKENS = 5555; // bool public saleIsActive = true; uint256 public whitelistMintRemains = 1000; // = 0 if there are no free tokens // = maxTokensPerTx if free all // max token free per transaction when whitelist mint uint256 public maxTokensFreePerTxWW = 2; // minimum token required per transaction when whitelist mint uint256 public miniumTokensRequiredPerTxWW = 1; enum TokenURIMode { MODE_ONE, MODE_TWO, MODE_THREE } TokenURIMode private tokenUriMode = TokenURIMode.MODE_ONE; constructor() ERC721A("Argentinian Ape Club", "AAC") { // 500 = RoyaltyFee 5% _setDefaultRoyalty(msg.sender, 500); } struct HelperState { uint256 tokenPrice; uint256 maxTokensPerTx; uint256 MAX_TOKENS; bool saleIsActive; uint256 totalSupply; uint256 maxTokensFreePerTx; uint256 userMinted; uint256 defaultTokensPerTx; } function _state(address minter) external view returns (HelperState memory) { return HelperState({ tokenPrice: tokenPrice, maxTokensPerTx: maxTokensPerTx, MAX_TOKENS: MAX_TOKENS, saleIsActive: true, //saleIsActive, totalSupply: uint256(totalSupply()), maxTokensFreePerTx: maxTokensFreePerTxWW, userMinted: uint256(_numberMinted(minter)), defaultTokensPerTx: defaultTokensPerTx }); } function withdraw() public onlyOwner { uint256 balance = address(this).balance; payable(msg.sender).transfer(balance); } // function withdrawTo(address to, uint256 amount) public onlyOwner { // require( // amount <= address(this).balance, // "Exceed balance of this contract" // ); // payable(to).transfer(amount); // } function reserveTokens(address to, uint256 numberOfTokens) public onlyOwner { require( totalSupply() + numberOfTokens <= MAX_TOKENS, "Exceed max supply of tokens" ); _safeMint(to, numberOfTokens); } function setBaseURI(string memory newURI) public onlyOwner { baseURI = newURI; } // function flipSaleState() public onlyOwner { // saleIsActive = !saleIsActive; // } function openWhitelistMint( uint256 _whitelistMintRemains, uint256 _maxTokensFreePerTxWW, uint256 _miniumTokensRequiredPerTxWW ) public onlyOwner { whitelistMintRemains = _whitelistMintRemains; maxTokensFreePerTxWW = _maxTokensFreePerTxWW; miniumTokensRequiredPerTxWW = _miniumTokensRequiredPerTxWW; // saleIsActive = true; } function closeWhitelistMint() public onlyOwner { whitelistMintRemains = 0; } function getPrice(uint256 numberOfTokens, address minter) public view returns (uint256) { if (numberMinted(minter) > 0) { return numberOfTokens * tokenPrice; } else if ( whitelistMintRemains > 0 && numberOfTokens > maxTokensFreePerTxWW ) { return (numberOfTokens - maxTokensFreePerTxWW) * tokenPrice; } else if ( whitelistMintRemains > 0 && numberOfTokens <= maxTokensFreePerTxWW ) { return 0; } return numberOfTokens * tokenPrice; } // if numberMinted(msg.sender) > 0 -> no whitelist, no free. function mintToken(uint256 numberOfTokens) public payable { // require(saleIsActive, "Sale must be active"); require(numberOfTokens <= maxTokensPerTx, "Exceed max tokens per tx"); require(numberOfTokens > 0, "Must mint at least one"); require( totalSupply() + numberOfTokens <= MAX_TOKENS, "Exceed max supply" ); if (whitelistMintRemains > 0 && numberMinted(msg.sender) <= 0) { require( numberOfTokens >= miniumTokensRequiredPerTxWW, "Less then mininum required" ); if (numberOfTokens > maxTokensFreePerTxWW) { require( msg.value >= (numberOfTokens - maxTokensFreePerTxWW) * tokenPrice, "Not enough ether" ); } _safeMint(msg.sender, numberOfTokens); uint256 totalFreeToken = numberOfTokens > maxTokensFreePerTxWW ? maxTokensFreePerTxWW : numberOfTokens; if (totalFreeToken >= whitelistMintRemains) { whitelistMintRemains = 0; } else { whitelistMintRemains = whitelistMintRemains - totalFreeToken; } } else { require( msg.value >= numberOfTokens * tokenPrice, "Not enough ether" ); _safeMint(msg.sender, numberOfTokens); } } function setTokenPrice(uint256 newTokenPrice) public onlyOwner { tokenPrice = newTokenPrice; } function tokenURI(uint256 _tokenId) public view override returns (string memory) { require(_exists(_tokenId), "Token does not exist."); if (tokenUriMode == TokenURIMode.MODE_TWO) { return bytes(baseURI).length > 0 ? string( abi.encodePacked(baseURI, Strings.toString(_tokenId)) ) : ""; } else if (tokenUriMode == TokenURIMode.MODE_ONE) { return bytes(baseURI).length > 0 ? string( abi.encodePacked( baseURI, Strings.toString(_tokenId), ".json" ) ) : ""; } else if (tokenUriMode == TokenURIMode.MODE_THREE) { return baseURI; } return ""; } function setTokenURIMode(uint256 mode) external onlyOwner { if (mode == 2) { tokenUriMode = TokenURIMode.MODE_TWO; } else if (mode == 1) { tokenUriMode = TokenURIMode.MODE_ONE; } else { tokenUriMode = TokenURIMode.MODE_THREE; } } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function setMaxSupply(uint256 _maxSupply) public onlyOwner { MAX_TOKENS = _maxSupply; } function setMaxTokensPerTx(uint256 _maxTokensPerTx) public onlyOwner { maxTokensPerTx = _maxTokensPerTx; } function setMaxTokensFreePerTxWW(uint256 _maxTokensFreePerTxWW) public onlyOwner { maxTokensFreePerTxWW = _maxTokensFreePerTxWW; } function setMiniumTokensRequiredPerTxWW( uint256 _miniumTokensRequiredPerTxWW ) public onlyOwner { miniumTokensRequiredPerTxWW = _miniumTokensRequiredPerTxWW; } function setDefaultTokensPerTx(uint256 _defaultTokensPerTx) public onlyOwner { defaultTokensPerTx = _defaultTokensPerTx; } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } function setRoyaltyInfo(address receiver, uint96 feeBasisPoints) external onlyOwner { _setDefaultRoyalty(receiver, feeBasisPoints); } function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom( address from, address to, uint256 tokenId ) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId ) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } }
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":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"_state","outputs":[{"components":[{"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"internalType":"uint256","name":"maxTokensPerTx","type":"uint256"},{"internalType":"uint256","name":"MAX_TOKENS","type":"uint256"},{"internalType":"bool","name":"saleIsActive","type":"bool"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"maxTokensFreePerTx","type":"uint256"},{"internalType":"uint256","name":"userMinted","type":"uint256"},{"internalType":"uint256","name":"defaultTokensPerTx","type":"uint256"}],"internalType":"struct ArgentinianApeClub.HelperState","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closeWhitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultTokensPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"address","name":"minter","type":"address"}],"name":"getPrice","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":"maxTokensFreePerTxWW","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"miniumTokensRequiredPerTxWW","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistMintRemains","type":"uint256"},{"internalType":"uint256","name":"_maxTokensFreePerTxWW","type":"uint256"},{"internalType":"uint256","name":"_miniumTokensRequiredPerTxWW","type":"uint256"}],"name":"openWhitelistMint","outputs":[],"stateMutability":"nonpayable","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":"to","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_defaultTokensPerTx","type":"uint256"}],"name":"setDefaultTokensPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTokensFreePerTxWW","type":"uint256"}],"name":"setMaxTokensFreePerTxWW","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTokensPerTx","type":"uint256"}],"name":"setMaxTokensPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_miniumTokensRequiredPerTxWW","type":"uint256"}],"name":"setMiniumTokensRequiredPerTxWW","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeBasisPoints","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTokenPrice","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mode","type":"uint256"}],"name":"setTokenURIMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistMintRemains","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060600160405280602f8152602001620056e0602f9139600b9080519060200190620000359291906200061b565b506611c37937e08000600c556014600d556003600e556115b3600f556103e8601055600260115560016012556000601360006101000a81548160ff021916908360028111156200008a5762000089620006cb565b5b02179055503480156200009c57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280601481526020017f417267656e74696e69616e2041706520436c75620000000000000000000000008152506040518060400160405280600381526020017f41414300000000000000000000000000000000000000000000000000000000008152508160029080519060200190620001389291906200061b565b508060039080519060200190620001519291906200061b565b50620001626200039b60201b60201c565b60008190555050506200018a6200017e620003a060201b60201c565b620003a860201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200037f57801562000245576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200020b9291906200073f565b600060405180830381600087803b1580156200022657600080fd5b505af11580156200023b573d6000803e3d6000fd5b505050506200037e565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002ff576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002c59291906200073f565b600060405180830381600087803b158015620002e057600080fd5b505af1158015620002f5573d6000803e3d6000fd5b505050506200037d565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200034891906200076c565b600060405180830381600087803b1580156200036357600080fd5b505af115801562000378573d6000803e3d6000fd5b505050505b5b5b505062000395336101f46200046e60201b60201c565b62000908565b600090565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200047e6200061160201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115620004df576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004d69062000810565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000551576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005489062000882565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b8280546200062990620008d3565b90600052602060002090601f0160209004810192826200064d576000855562000699565b82601f106200066857805160ff191683800117855562000699565b8280016001018555821562000699579182015b82811115620006985782518255916020019190600101906200067b565b5b509050620006a89190620006ac565b5090565b5b80821115620006c7576000816000905550600101620006ad565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200072782620006fa565b9050919050565b62000739816200071a565b82525050565b60006040820190506200075660008301856200072e565b6200076560208301846200072e565b9392505050565b60006020820190506200078360008301846200072e565b92915050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000620007f8602a8362000789565b915062000805826200079a565b604082019050919050565b600060208201905081810360008301526200082b81620007e9565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006200086a60198362000789565b9150620008778262000832565b602082019050919050565b600060208201905081810360008301526200089d816200085b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620008ec57607f821691505b602082108103620009025762000901620008a4565b5b50919050565b614dc880620009186000396000f3fe6080604052600436106102675760003560e01c806370a0823111610144578063b88d4fde116100b6578063dc33e6811161007a578063dc33e681146108f8578063e985e9c514610935578063f2fde38b14610972578063f47c84c51461099b578063f8ca094c146109c6578063fd5ce05a146109ef57610267565b8063b88d4fde14610836578063b9bed05e1461085f578063c4d7e2f814610888578063c634d0321461089f578063c87b56dd146108bb57610267565b80638ef3596d116101085780638ef3596d1461073a5780638f69ae6f14610765578063900c71f51461079057806395d89b41146107b9578063a22cb465146107e4578063ac730f641461080d57610267565b806370a0823114610667578063715018a6146106a457806378cf19e9146106bb5780637ff9b596146106e45780638da5cb5b1461070f57610267565b806341f43434116101dd5780635e307a48116101a15780635e307a48146105575780636352211e14610582578063681c8bac146105bf5780636a61e5fc146105ea5780636c0360eb146106135780636f8b44b01461063e57610267565b806341f434341461047457806342842e0e1461049f578063495e1eba146104c85780634df8bb45146104f157806355f804b31461052e57610267565b8063095ea7b31161022f578063095ea7b31461036557806318160ddd1461038e57806323b872dd146103b95780632a55205a146103e25780632b57cfbb146104205780633ccfd60b1461045d57610267565b806301ffc9a71461026c57806302fa7c47146102a957806306fdde03146102d2578063074f457c146102fd578063081812fc14610328575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190613a24565b610a18565b6040516102a09190613a6c565b60405180910390f35b3480156102b557600080fd5b506102d060048036038101906102cb9190613b29565b610a2a565b005b3480156102de57600080fd5b506102e7610ab4565b6040516102f49190613c02565b60405180910390f35b34801561030957600080fd5b50610312610b46565b60405161031f9190613c3d565b60405180910390f35b34801561033457600080fd5b5061034f600480360381019061034a9190613c84565b610b4c565b60405161035c9190613cc0565b60405180910390f35b34801561037157600080fd5b5061038c60048036038101906103879190613cdb565b610bc8565b005b34801561039a57600080fd5b506103a3610be1565b6040516103b09190613c3d565b60405180910390f35b3480156103c557600080fd5b506103e060048036038101906103db9190613d1b565b610bf8565b005b3480156103ee57600080fd5b5061040960048036038101906104049190613d6e565b610c47565b604051610417929190613dae565b60405180910390f35b34801561042c57600080fd5b5061044760048036038101906104429190613dd7565b610e31565b6040516104549190613c3d565b60405180910390f35b34801561046957600080fd5b50610472610ecb565b005b34801561048057600080fd5b50610489610f96565b6040516104969190613e76565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c19190613d1b565b610fa8565b005b3480156104d457600080fd5b506104ef60048036038101906104ea9190613c84565b610ff7565b005b3480156104fd57600080fd5b5061051860048036038101906105139190613e91565b61107d565b6040516105259190613f7e565b60405180910390f35b34801561053a57600080fd5b50610555600480360381019061055091906140cf565b6110e2565b005b34801561056357600080fd5b5061056c611178565b6040516105799190613c3d565b60405180910390f35b34801561058e57600080fd5b506105a960048036038101906105a49190613c84565b61117e565b6040516105b69190613cc0565b60405180910390f35b3480156105cb57600080fd5b506105d4611194565b6040516105e19190613c3d565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c9190613c84565b61119a565b005b34801561061f57600080fd5b50610628611220565b6040516106359190613c02565b60405180910390f35b34801561064a57600080fd5b5061066560048036038101906106609190613c84565b6112ae565b005b34801561067357600080fd5b5061068e60048036038101906106899190613e91565b611334565b60405161069b9190613c3d565b60405180910390f35b3480156106b057600080fd5b506106b9611403565b005b3480156106c757600080fd5b506106e260048036038101906106dd9190613cdb565b61148b565b005b3480156106f057600080fd5b506106f961156c565b6040516107069190613c3d565b60405180910390f35b34801561071b57600080fd5b50610724611572565b6040516107319190613cc0565b60405180910390f35b34801561074657600080fd5b5061074f61159c565b60405161075c9190613c3d565b60405180910390f35b34801561077157600080fd5b5061077a6115a2565b6040516107879190613c3d565b60405180910390f35b34801561079c57600080fd5b506107b760048036038101906107b29190613c84565b6115a8565b005b3480156107c557600080fd5b506107ce6116c4565b6040516107db9190613c02565b60405180910390f35b3480156107f057600080fd5b5061080b60048036038101906108069190614144565b611756565b005b34801561081957600080fd5b50610834600480360381019061082f9190613c84565b61176f565b005b34801561084257600080fd5b5061085d60048036038101906108589190614225565b6117f5565b005b34801561086b57600080fd5b5061088660048036038101906108819190613c84565b611846565b005b34801561089457600080fd5b5061089d6118cc565b005b6108b960048036038101906108b49190613c84565b611952565b005b3480156108c757600080fd5b506108e260048036038101906108dd9190613c84565b611bae565b6040516108ef9190613c02565b60405180910390f35b34801561090457600080fd5b5061091f600480360381019061091a9190613e91565b611e0e565b60405161092c9190613c3d565b60405180910390f35b34801561094157600080fd5b5061095c600480360381019061095791906142a8565b611e20565b6040516109699190613a6c565b60405180910390f35b34801561097e57600080fd5b5061099960048036038101906109949190613e91565b611eb4565b005b3480156109a757600080fd5b506109b0611fab565b6040516109bd9190613c3d565b60405180910390f35b3480156109d257600080fd5b506109ed60048036038101906109e89190613c84565b611fb1565b005b3480156109fb57600080fd5b50610a166004803603810190610a1191906142e8565b612037565b005b6000610a23826120cd565b9050919050565b610a32612147565b73ffffffffffffffffffffffffffffffffffffffff16610a50611572565b73ffffffffffffffffffffffffffffffffffffffff1614610aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9d90614387565b60405180910390fd5b610ab0828261214f565b5050565b606060028054610ac3906143d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610aef906143d6565b8015610b3c5780601f10610b1157610100808354040283529160200191610b3c565b820191906000526020600020905b815481529060010190602001808311610b1f57829003601f168201915b5050505050905090565b60125481565b6000610b57826122e4565b610b8d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610bd281612332565b610bdc838361242f565b505050565b6000610beb612533565b6001546000540303905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c3657610c3533612332565b5b610c41848484612538565b50505050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610ddc5760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610de6612548565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610e129190614436565b610e1c91906144bf565b90508160000151819350935050509250929050565b600080610e3d83611e0e565b1115610e5857600c5483610e519190614436565b9050610ec5565b6000601054118015610e6b575060115483115b15610e9257600c5460115484610e8191906144f0565b610e8b9190614436565b9050610ec5565b6000601054118015610ea657506011548311155b15610eb45760009050610ec5565b600c5483610ec29190614436565b90505b92915050565b610ed3612147565b73ffffffffffffffffffffffffffffffffffffffff16610ef1611572565b73ffffffffffffffffffffffffffffffffffffffff1614610f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3e90614387565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f92573d6000803e3d6000fd5b5050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fe657610fe533612332565b5b610ff1848484612552565b50505050565b610fff612147565b73ffffffffffffffffffffffffffffffffffffffff1661101d611572565b73ffffffffffffffffffffffffffffffffffffffff1614611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106a90614387565b60405180910390fd5b80600e8190555050565b61108561388b565b604051806101000160405280600c548152602001600d548152602001600f5481526020016001151581526020016110ba610be1565b815260200160115481526020016110d084612572565b8152602001600e548152509050919050565b6110ea612147565b73ffffffffffffffffffffffffffffffffffffffff16611108611572565b73ffffffffffffffffffffffffffffffffffffffff161461115e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115590614387565b60405180910390fd5b80600b90805190602001906111749291906138d2565b5050565b600d5481565b6000611189826125dc565b600001519050919050565b600e5481565b6111a2612147565b73ffffffffffffffffffffffffffffffffffffffff166111c0611572565b73ffffffffffffffffffffffffffffffffffffffff1614611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614387565b60405180910390fd5b80600c8190555050565b600b805461122d906143d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611259906143d6565b80156112a65780601f1061127b576101008083540402835291602001916112a6565b820191906000526020600020905b81548152906001019060200180831161128957829003601f168201915b505050505081565b6112b6612147565b73ffffffffffffffffffffffffffffffffffffffff166112d4611572565b73ffffffffffffffffffffffffffffffffffffffff161461132a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132190614387565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361139b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61140b612147565b73ffffffffffffffffffffffffffffffffffffffff16611429611572565b73ffffffffffffffffffffffffffffffffffffffff161461147f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147690614387565b60405180910390fd5b6114896000612867565b565b611493612147565b73ffffffffffffffffffffffffffffffffffffffff166114b1611572565b73ffffffffffffffffffffffffffffffffffffffff1614611507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fe90614387565b60405180910390fd5b600f5481611513610be1565b61151d9190614524565b111561155e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611555906145c6565b60405180910390fd5b611568828261292d565b5050565b600c5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60115481565b60105481565b6115b0612147565b73ffffffffffffffffffffffffffffffffffffffff166115ce611572565b73ffffffffffffffffffffffffffffffffffffffff1614611624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161b90614387565b60405180910390fd5b6002810361165c576001601360006101000a81548160ff02191690836002811115611652576116516145e6565b5b02179055506116c1565b60018103611694576000601360006101000a81548160ff0219169083600281111561168a576116896145e6565b5b02179055506116c0565b6002601360006101000a81548160ff021916908360028111156116ba576116b96145e6565b5b02179055505b5b50565b6060600380546116d3906143d6565b80601f01602080910402602001604051908101604052809291908181526020018280546116ff906143d6565b801561174c5780601f106117215761010080835404028352916020019161174c565b820191906000526020600020905b81548152906001019060200180831161172f57829003601f168201915b5050505050905090565b8161176081612332565b61176a838361294b565b505050565b611777612147565b73ffffffffffffffffffffffffffffffffffffffff16611795611572565b73ffffffffffffffffffffffffffffffffffffffff16146117eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e290614387565b60405180910390fd5b8060118190555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146118335761183233612332565b5b61183f85858585612ac2565b5050505050565b61184e612147565b73ffffffffffffffffffffffffffffffffffffffff1661186c611572565b73ffffffffffffffffffffffffffffffffffffffff16146118c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b990614387565b60405180910390fd5b80600d8190555050565b6118d4612147565b73ffffffffffffffffffffffffffffffffffffffff166118f2611572565b73ffffffffffffffffffffffffffffffffffffffff1614611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193f90614387565b60405180910390fd5b6000601081905550565b600d54811115611997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198e90614661565b60405180910390fd5b600081116119da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d1906146cd565b60405180910390fd5b600f54816119e6610be1565b6119f09190614524565b1115611a31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2890614739565b60405180910390fd5b6000601054118015611a4c57506000611a4933611e0e565b11155b15611b5057601254811015611a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8d906147a5565b60405180910390fd5b601154811115611afe57600c5460115482611ab191906144f0565b611abb9190614436565b341015611afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af490614811565b60405180910390fd5b5b611b08338261292d565b60006011548211611b195781611b1d565b6011545b90506010548110611b35576000601081905550611b4a565b80601054611b4391906144f0565b6010819055505b50611bab565b600c5481611b5e9190614436565b341015611ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9790614811565b60405180910390fd5b611baa338261292d565b5b50565b6060611bb9826122e4565b611bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bef9061487d565b60405180910390fd5b60016002811115611c0c57611c0b6145e6565b5b601360009054906101000a900460ff166002811115611c2e57611c2d6145e6565b5b03611c91576000600b8054611c42906143d6565b905011611c5e5760405180602001604052806000815250611c8a565b600b611c6983612b3a565b604051602001611c7a92919061496d565b6040516020818303038152906040525b9050611e09565b60006002811115611ca557611ca46145e6565b5b601360009054906101000a900460ff166002811115611cc757611cc66145e6565b5b03611d2a576000600b8054611cdb906143d6565b905011611cf75760405180602001604052806000815250611d23565b600b611d0283612b3a565b604051602001611d139291906149dd565b6040516020818303038152906040525b9050611e09565b600280811115611d3d57611d3c6145e6565b5b601360009054906101000a900460ff166002811115611d5f57611d5e6145e6565b5b03611df657600b8054611d71906143d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9d906143d6565b8015611dea5780601f10611dbf57610100808354040283529160200191611dea565b820191906000526020600020905b815481529060010190602001808311611dcd57829003601f168201915b50505050509050611e09565b6040518060200160405280600081525090505b919050565b6000611e1982612572565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ebc612147565b73ffffffffffffffffffffffffffffffffffffffff16611eda611572565b73ffffffffffffffffffffffffffffffffffffffff1614611f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2790614387565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9690614a7e565b60405180910390fd5b611fa881612867565b50565b600f5481565b611fb9612147565b73ffffffffffffffffffffffffffffffffffffffff16611fd7611572565b73ffffffffffffffffffffffffffffffffffffffff161461202d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202490614387565b60405180910390fd5b8060128190555050565b61203f612147565b73ffffffffffffffffffffffffffffffffffffffff1661205d611572565b73ffffffffffffffffffffffffffffffffffffffff16146120b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120aa90614387565b60405180910390fd5b826010819055508160118190555080601281905550505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612140575061213f82612c9a565b5b9050919050565b600033905090565b612157612548565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156121b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ac90614b10565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221b90614b7c565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000816122ef612533565b111580156122fe575060005482105b801561232b575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561242c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016123a9929190614b9c565b602060405180830381865afa1580156123c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ea9190614bda565b61242b57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016124229190613cc0565b60405180910390fd5b5b50565b600061243a8261117e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036124a1576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166124c0612147565b73ffffffffffffffffffffffffffffffffffffffff1614612523576124ec816124e7612147565b611e20565b612522576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b61252e838383612d7c565b505050565b600090565b612543838383612e2e565b505050565b6000612710905090565b61256d838383604051806020016040528060008152506117f5565b505050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6125e4613958565b6000829050806125f2612533565b116128305760005481101561282f576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161282d57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612711578092505050612862565b5b60011561282c57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612827578092505050612862565b612712565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6129478282604051806020016040528060008152506132e2565b5050565b612953612147565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036129b7576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006129c4612147565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612a71612147565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ab69190613a6c565b60405180910390a35050565b612acd848484612e2e565b612aec8373ffffffffffffffffffffffffffffffffffffffff166136a2565b15612b3457612afd848484846136c5565b612b33576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060008203612b81576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c95565b600082905060005b60008214612bb3578080612b9c90614c07565b915050600a82612bac91906144bf565b9150612b89565b60008167ffffffffffffffff811115612bcf57612bce613fa4565b5b6040519080825280601f01601f191660200182016040528015612c015781602001600182028036833780820191505090505b5090505b60008514612c8e57600182612c1a91906144f0565b9150600a85612c299190614c4f565b6030612c359190614524565b60f81b818381518110612c4b57612c4a614c80565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c8791906144bf565b9450612c05565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d6557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d755750612d7482613815565b5b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612e39826125dc565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ea4576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612ec5612147565b73ffffffffffffffffffffffffffffffffffffffff161480612ef45750612ef385612eee612147565b611e20565b5b80612f395750612f02612147565b73ffffffffffffffffffffffffffffffffffffffff16612f2184610b4c565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612f72576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612fd8576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fe5858585600161387f565b612ff160008487612d7c565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361327057600054821461326f57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132db8585856001613885565b5050505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361334e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303613388576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613395600085838661387f565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506135568673ffffffffffffffffffffffffffffffffffffffff166136a2565b1561361b575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135cb60008784806001019550876136c5565b613601576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061355c57826000541461361657600080fd5b613686565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061361c575b81600081905550505061369c6000858386613885565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026136eb612147565b8786866040518563ffffffff1660e01b815260040161370d9493929190614d04565b6020604051808303816000875af192505050801561374957506040513d601f19601f820116820180604052508101906137469190614d65565b60015b6137c2573d8060008114613779576040519150601f19603f3d011682016040523d82523d6000602084013e61377e565b606091505b5060008151036137ba576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b50505050565b604051806101000160405280600081526020016000815260200160008152602001600015158152602001600081526020016000815260200160008152602001600081525090565b8280546138de906143d6565b90600052602060002090601f0160209004810192826139005760008555613947565b82601f1061391957805160ff1916838001178555613947565b82800160010185558215613947579182015b8281111561394657825182559160200191906001019061392b565b5b509050613954919061399b565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156139b457600081600090555060010161399c565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a01816139cc565b8114613a0c57600080fd5b50565b600081359050613a1e816139f8565b92915050565b600060208284031215613a3a57613a396139c2565b5b6000613a4884828501613a0f565b91505092915050565b60008115159050919050565b613a6681613a51565b82525050565b6000602082019050613a816000830184613a5d565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ab282613a87565b9050919050565b613ac281613aa7565b8114613acd57600080fd5b50565b600081359050613adf81613ab9565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613b0681613ae5565b8114613b1157600080fd5b50565b600081359050613b2381613afd565b92915050565b60008060408385031215613b4057613b3f6139c2565b5b6000613b4e85828601613ad0565b9250506020613b5f85828601613b14565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ba3578082015181840152602081019050613b88565b83811115613bb2576000848401525b50505050565b6000601f19601f8301169050919050565b6000613bd482613b69565b613bde8185613b74565b9350613bee818560208601613b85565b613bf781613bb8565b840191505092915050565b60006020820190508181036000830152613c1c8184613bc9565b905092915050565b6000819050919050565b613c3781613c24565b82525050565b6000602082019050613c526000830184613c2e565b92915050565b613c6181613c24565b8114613c6c57600080fd5b50565b600081359050613c7e81613c58565b92915050565b600060208284031215613c9a57613c996139c2565b5b6000613ca884828501613c6f565b91505092915050565b613cba81613aa7565b82525050565b6000602082019050613cd56000830184613cb1565b92915050565b60008060408385031215613cf257613cf16139c2565b5b6000613d0085828601613ad0565b9250506020613d1185828601613c6f565b9150509250929050565b600080600060608486031215613d3457613d336139c2565b5b6000613d4286828701613ad0565b9350506020613d5386828701613ad0565b9250506040613d6486828701613c6f565b9150509250925092565b60008060408385031215613d8557613d846139c2565b5b6000613d9385828601613c6f565b9250506020613da485828601613c6f565b9150509250929050565b6000604082019050613dc36000830185613cb1565b613dd06020830184613c2e565b9392505050565b60008060408385031215613dee57613ded6139c2565b5b6000613dfc85828601613c6f565b9250506020613e0d85828601613ad0565b9150509250929050565b6000819050919050565b6000613e3c613e37613e3284613a87565b613e17565b613a87565b9050919050565b6000613e4e82613e21565b9050919050565b6000613e6082613e43565b9050919050565b613e7081613e55565b82525050565b6000602082019050613e8b6000830184613e67565b92915050565b600060208284031215613ea757613ea66139c2565b5b6000613eb584828501613ad0565b91505092915050565b613ec781613c24565b82525050565b613ed681613a51565b82525050565b61010082016000820151613ef36000850182613ebe565b506020820151613f066020850182613ebe565b506040820151613f196040850182613ebe565b506060820151613f2c6060850182613ecd565b506080820151613f3f6080850182613ebe565b5060a0820151613f5260a0850182613ebe565b5060c0820151613f6560c0850182613ebe565b5060e0820151613f7860e0850182613ebe565b50505050565b600061010082019050613f946000830184613edc565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613fdc82613bb8565b810181811067ffffffffffffffff82111715613ffb57613ffa613fa4565b5b80604052505050565b600061400e6139b8565b905061401a8282613fd3565b919050565b600067ffffffffffffffff82111561403a57614039613fa4565b5b61404382613bb8565b9050602081019050919050565b82818337600083830152505050565b600061407261406d8461401f565b614004565b90508281526020810184848401111561408e5761408d613f9f565b5b614099848285614050565b509392505050565b600082601f8301126140b6576140b5613f9a565b5b81356140c684826020860161405f565b91505092915050565b6000602082840312156140e5576140e46139c2565b5b600082013567ffffffffffffffff811115614103576141026139c7565b5b61410f848285016140a1565b91505092915050565b61412181613a51565b811461412c57600080fd5b50565b60008135905061413e81614118565b92915050565b6000806040838503121561415b5761415a6139c2565b5b600061416985828601613ad0565b925050602061417a8582860161412f565b9150509250929050565b600067ffffffffffffffff82111561419f5761419e613fa4565b5b6141a882613bb8565b9050602081019050919050565b60006141c86141c384614184565b614004565b9050828152602081018484840111156141e4576141e3613f9f565b5b6141ef848285614050565b509392505050565b600082601f83011261420c5761420b613f9a565b5b813561421c8482602086016141b5565b91505092915050565b6000806000806080858703121561423f5761423e6139c2565b5b600061424d87828801613ad0565b945050602061425e87828801613ad0565b935050604061426f87828801613c6f565b925050606085013567ffffffffffffffff8111156142905761428f6139c7565b5b61429c878288016141f7565b91505092959194509250565b600080604083850312156142bf576142be6139c2565b5b60006142cd85828601613ad0565b92505060206142de85828601613ad0565b9150509250929050565b600080600060608486031215614301576143006139c2565b5b600061430f86828701613c6f565b935050602061432086828701613c6f565b925050604061433186828701613c6f565b9150509250925092565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614371602083613b74565b915061437c8261433b565b602082019050919050565b600060208201905081810360008301526143a081614364565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806143ee57607f821691505b602082108103614401576144006143a7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061444182613c24565b915061444c83613c24565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561448557614484614407565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144ca82613c24565b91506144d583613c24565b9250826144e5576144e4614490565b5b828204905092915050565b60006144fb82613c24565b915061450683613c24565b92508282101561451957614518614407565b5b828203905092915050565b600061452f82613c24565b915061453a83613c24565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561456f5761456e614407565b5b828201905092915050565b7f457863656564206d617820737570706c79206f6620746f6b656e730000000000600082015250565b60006145b0601b83613b74565b91506145bb8261457a565b602082019050919050565b600060208201905081810360008301526145df816145a3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f457863656564206d617820746f6b656e73207065722074780000000000000000600082015250565b600061464b601883613b74565b915061465682614615565b602082019050919050565b6000602082019050818103600083015261467a8161463e565b9050919050565b7f4d757374206d696e74206174206c65617374206f6e6500000000000000000000600082015250565b60006146b7601683613b74565b91506146c282614681565b602082019050919050565b600060208201905081810360008301526146e6816146aa565b9050919050565b7f457863656564206d617820737570706c79000000000000000000000000000000600082015250565b6000614723601183613b74565b915061472e826146ed565b602082019050919050565b6000602082019050818103600083015261475281614716565b9050919050565b7f4c657373207468656e206d696e696e756d207265717569726564000000000000600082015250565b600061478f601a83613b74565b915061479a82614759565b602082019050919050565b600060208201905081810360008301526147be81614782565b9050919050565b7f4e6f7420656e6f75676820657468657200000000000000000000000000000000600082015250565b60006147fb601083613b74565b9150614806826147c5565b602082019050919050565b6000602082019050818103600083015261482a816147ee565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b6000614867601583613b74565b915061487282614831565b602082019050919050565b600060208201905081810360008301526148968161485a565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546148ca816143d6565b6148d4818661489d565b945060018216600081146148ef576001811461490057614933565b60ff19831686528186019350614933565b614909856148a8565b60005b8381101561492b5781548189015260018201915060208101905061490c565b838801955050505b50505092915050565b600061494782613b69565b614951818561489d565b9350614961818560208601613b85565b80840191505092915050565b600061497982856148bd565b9150614985828461493c565b91508190509392505050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006149c760058361489d565b91506149d282614991565b600582019050919050565b60006149e982856148bd565b91506149f5828461493c565b9150614a00826149ba565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a68602683613b74565b9150614a7382614a0c565b604082019050919050565b60006020820190508181036000830152614a9781614a5b565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000614afa602a83613b74565b9150614b0582614a9e565b604082019050919050565b60006020820190508181036000830152614b2981614aed565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000614b66601983613b74565b9150614b7182614b30565b602082019050919050565b60006020820190508181036000830152614b9581614b59565b9050919050565b6000604082019050614bb16000830185613cb1565b614bbe6020830184613cb1565b9392505050565b600081519050614bd481614118565b92915050565b600060208284031215614bf057614bef6139c2565b5b6000614bfe84828501614bc5565b91505092915050565b6000614c1282613c24565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614c4457614c43614407565b5b600182019050919050565b6000614c5a82613c24565b9150614c6583613c24565b925082614c7557614c74614490565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000614cd682614caf565b614ce08185614cba565b9350614cf0818560208601613b85565b614cf981613bb8565b840191505092915050565b6000608082019050614d196000830187613cb1565b614d266020830186613cb1565b614d336040830185613c2e565b8181036060830152614d458184614ccb565b905095945050505050565b600081519050614d5f816139f8565b92915050565b600060208284031215614d7b57614d7a6139c2565b5b6000614d8984828501614d50565b9150509291505056fea26469706673582212202fb0f97050f4cb085b7efb8bec413e3891feb9683990aef26bafb35e5388302764736f6c634300080d003368747470733a2f2f6e6674736572766963652e73332e616d617a6f6e6177732e636f6d2f676f626c696e706f6f702f
Deployed Bytecode
0x6080604052600436106102675760003560e01c806370a0823111610144578063b88d4fde116100b6578063dc33e6811161007a578063dc33e681146108f8578063e985e9c514610935578063f2fde38b14610972578063f47c84c51461099b578063f8ca094c146109c6578063fd5ce05a146109ef57610267565b8063b88d4fde14610836578063b9bed05e1461085f578063c4d7e2f814610888578063c634d0321461089f578063c87b56dd146108bb57610267565b80638ef3596d116101085780638ef3596d1461073a5780638f69ae6f14610765578063900c71f51461079057806395d89b41146107b9578063a22cb465146107e4578063ac730f641461080d57610267565b806370a0823114610667578063715018a6146106a457806378cf19e9146106bb5780637ff9b596146106e45780638da5cb5b1461070f57610267565b806341f43434116101dd5780635e307a48116101a15780635e307a48146105575780636352211e14610582578063681c8bac146105bf5780636a61e5fc146105ea5780636c0360eb146106135780636f8b44b01461063e57610267565b806341f434341461047457806342842e0e1461049f578063495e1eba146104c85780634df8bb45146104f157806355f804b31461052e57610267565b8063095ea7b31161022f578063095ea7b31461036557806318160ddd1461038e57806323b872dd146103b95780632a55205a146103e25780632b57cfbb146104205780633ccfd60b1461045d57610267565b806301ffc9a71461026c57806302fa7c47146102a957806306fdde03146102d2578063074f457c146102fd578063081812fc14610328575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190613a24565b610a18565b6040516102a09190613a6c565b60405180910390f35b3480156102b557600080fd5b506102d060048036038101906102cb9190613b29565b610a2a565b005b3480156102de57600080fd5b506102e7610ab4565b6040516102f49190613c02565b60405180910390f35b34801561030957600080fd5b50610312610b46565b60405161031f9190613c3d565b60405180910390f35b34801561033457600080fd5b5061034f600480360381019061034a9190613c84565b610b4c565b60405161035c9190613cc0565b60405180910390f35b34801561037157600080fd5b5061038c60048036038101906103879190613cdb565b610bc8565b005b34801561039a57600080fd5b506103a3610be1565b6040516103b09190613c3d565b60405180910390f35b3480156103c557600080fd5b506103e060048036038101906103db9190613d1b565b610bf8565b005b3480156103ee57600080fd5b5061040960048036038101906104049190613d6e565b610c47565b604051610417929190613dae565b60405180910390f35b34801561042c57600080fd5b5061044760048036038101906104429190613dd7565b610e31565b6040516104549190613c3d565b60405180910390f35b34801561046957600080fd5b50610472610ecb565b005b34801561048057600080fd5b50610489610f96565b6040516104969190613e76565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c19190613d1b565b610fa8565b005b3480156104d457600080fd5b506104ef60048036038101906104ea9190613c84565b610ff7565b005b3480156104fd57600080fd5b5061051860048036038101906105139190613e91565b61107d565b6040516105259190613f7e565b60405180910390f35b34801561053a57600080fd5b50610555600480360381019061055091906140cf565b6110e2565b005b34801561056357600080fd5b5061056c611178565b6040516105799190613c3d565b60405180910390f35b34801561058e57600080fd5b506105a960048036038101906105a49190613c84565b61117e565b6040516105b69190613cc0565b60405180910390f35b3480156105cb57600080fd5b506105d4611194565b6040516105e19190613c3d565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c9190613c84565b61119a565b005b34801561061f57600080fd5b50610628611220565b6040516106359190613c02565b60405180910390f35b34801561064a57600080fd5b5061066560048036038101906106609190613c84565b6112ae565b005b34801561067357600080fd5b5061068e60048036038101906106899190613e91565b611334565b60405161069b9190613c3d565b60405180910390f35b3480156106b057600080fd5b506106b9611403565b005b3480156106c757600080fd5b506106e260048036038101906106dd9190613cdb565b61148b565b005b3480156106f057600080fd5b506106f961156c565b6040516107069190613c3d565b60405180910390f35b34801561071b57600080fd5b50610724611572565b6040516107319190613cc0565b60405180910390f35b34801561074657600080fd5b5061074f61159c565b60405161075c9190613c3d565b60405180910390f35b34801561077157600080fd5b5061077a6115a2565b6040516107879190613c3d565b60405180910390f35b34801561079c57600080fd5b506107b760048036038101906107b29190613c84565b6115a8565b005b3480156107c557600080fd5b506107ce6116c4565b6040516107db9190613c02565b60405180910390f35b3480156107f057600080fd5b5061080b60048036038101906108069190614144565b611756565b005b34801561081957600080fd5b50610834600480360381019061082f9190613c84565b61176f565b005b34801561084257600080fd5b5061085d60048036038101906108589190614225565b6117f5565b005b34801561086b57600080fd5b5061088660048036038101906108819190613c84565b611846565b005b34801561089457600080fd5b5061089d6118cc565b005b6108b960048036038101906108b49190613c84565b611952565b005b3480156108c757600080fd5b506108e260048036038101906108dd9190613c84565b611bae565b6040516108ef9190613c02565b60405180910390f35b34801561090457600080fd5b5061091f600480360381019061091a9190613e91565b611e0e565b60405161092c9190613c3d565b60405180910390f35b34801561094157600080fd5b5061095c600480360381019061095791906142a8565b611e20565b6040516109699190613a6c565b60405180910390f35b34801561097e57600080fd5b5061099960048036038101906109949190613e91565b611eb4565b005b3480156109a757600080fd5b506109b0611fab565b6040516109bd9190613c3d565b60405180910390f35b3480156109d257600080fd5b506109ed60048036038101906109e89190613c84565b611fb1565b005b3480156109fb57600080fd5b50610a166004803603810190610a1191906142e8565b612037565b005b6000610a23826120cd565b9050919050565b610a32612147565b73ffffffffffffffffffffffffffffffffffffffff16610a50611572565b73ffffffffffffffffffffffffffffffffffffffff1614610aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9d90614387565b60405180910390fd5b610ab0828261214f565b5050565b606060028054610ac3906143d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610aef906143d6565b8015610b3c5780601f10610b1157610100808354040283529160200191610b3c565b820191906000526020600020905b815481529060010190602001808311610b1f57829003601f168201915b5050505050905090565b60125481565b6000610b57826122e4565b610b8d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610bd281612332565b610bdc838361242f565b505050565b6000610beb612533565b6001546000540303905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c3657610c3533612332565b5b610c41848484612538565b50505050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610ddc5760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610de6612548565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610e129190614436565b610e1c91906144bf565b90508160000151819350935050509250929050565b600080610e3d83611e0e565b1115610e5857600c5483610e519190614436565b9050610ec5565b6000601054118015610e6b575060115483115b15610e9257600c5460115484610e8191906144f0565b610e8b9190614436565b9050610ec5565b6000601054118015610ea657506011548311155b15610eb45760009050610ec5565b600c5483610ec29190614436565b90505b92915050565b610ed3612147565b73ffffffffffffffffffffffffffffffffffffffff16610ef1611572565b73ffffffffffffffffffffffffffffffffffffffff1614610f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3e90614387565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f92573d6000803e3d6000fd5b5050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fe657610fe533612332565b5b610ff1848484612552565b50505050565b610fff612147565b73ffffffffffffffffffffffffffffffffffffffff1661101d611572565b73ffffffffffffffffffffffffffffffffffffffff1614611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106a90614387565b60405180910390fd5b80600e8190555050565b61108561388b565b604051806101000160405280600c548152602001600d548152602001600f5481526020016001151581526020016110ba610be1565b815260200160115481526020016110d084612572565b8152602001600e548152509050919050565b6110ea612147565b73ffffffffffffffffffffffffffffffffffffffff16611108611572565b73ffffffffffffffffffffffffffffffffffffffff161461115e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115590614387565b60405180910390fd5b80600b90805190602001906111749291906138d2565b5050565b600d5481565b6000611189826125dc565b600001519050919050565b600e5481565b6111a2612147565b73ffffffffffffffffffffffffffffffffffffffff166111c0611572565b73ffffffffffffffffffffffffffffffffffffffff1614611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614387565b60405180910390fd5b80600c8190555050565b600b805461122d906143d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611259906143d6565b80156112a65780601f1061127b576101008083540402835291602001916112a6565b820191906000526020600020905b81548152906001019060200180831161128957829003601f168201915b505050505081565b6112b6612147565b73ffffffffffffffffffffffffffffffffffffffff166112d4611572565b73ffffffffffffffffffffffffffffffffffffffff161461132a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132190614387565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361139b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61140b612147565b73ffffffffffffffffffffffffffffffffffffffff16611429611572565b73ffffffffffffffffffffffffffffffffffffffff161461147f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147690614387565b60405180910390fd5b6114896000612867565b565b611493612147565b73ffffffffffffffffffffffffffffffffffffffff166114b1611572565b73ffffffffffffffffffffffffffffffffffffffff1614611507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fe90614387565b60405180910390fd5b600f5481611513610be1565b61151d9190614524565b111561155e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611555906145c6565b60405180910390fd5b611568828261292d565b5050565b600c5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60115481565b60105481565b6115b0612147565b73ffffffffffffffffffffffffffffffffffffffff166115ce611572565b73ffffffffffffffffffffffffffffffffffffffff1614611624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161b90614387565b60405180910390fd5b6002810361165c576001601360006101000a81548160ff02191690836002811115611652576116516145e6565b5b02179055506116c1565b60018103611694576000601360006101000a81548160ff0219169083600281111561168a576116896145e6565b5b02179055506116c0565b6002601360006101000a81548160ff021916908360028111156116ba576116b96145e6565b5b02179055505b5b50565b6060600380546116d3906143d6565b80601f01602080910402602001604051908101604052809291908181526020018280546116ff906143d6565b801561174c5780601f106117215761010080835404028352916020019161174c565b820191906000526020600020905b81548152906001019060200180831161172f57829003601f168201915b5050505050905090565b8161176081612332565b61176a838361294b565b505050565b611777612147565b73ffffffffffffffffffffffffffffffffffffffff16611795611572565b73ffffffffffffffffffffffffffffffffffffffff16146117eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e290614387565b60405180910390fd5b8060118190555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146118335761183233612332565b5b61183f85858585612ac2565b5050505050565b61184e612147565b73ffffffffffffffffffffffffffffffffffffffff1661186c611572565b73ffffffffffffffffffffffffffffffffffffffff16146118c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b990614387565b60405180910390fd5b80600d8190555050565b6118d4612147565b73ffffffffffffffffffffffffffffffffffffffff166118f2611572565b73ffffffffffffffffffffffffffffffffffffffff1614611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193f90614387565b60405180910390fd5b6000601081905550565b600d54811115611997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198e90614661565b60405180910390fd5b600081116119da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d1906146cd565b60405180910390fd5b600f54816119e6610be1565b6119f09190614524565b1115611a31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2890614739565b60405180910390fd5b6000601054118015611a4c57506000611a4933611e0e565b11155b15611b5057601254811015611a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8d906147a5565b60405180910390fd5b601154811115611afe57600c5460115482611ab191906144f0565b611abb9190614436565b341015611afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af490614811565b60405180910390fd5b5b611b08338261292d565b60006011548211611b195781611b1d565b6011545b90506010548110611b35576000601081905550611b4a565b80601054611b4391906144f0565b6010819055505b50611bab565b600c5481611b5e9190614436565b341015611ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9790614811565b60405180910390fd5b611baa338261292d565b5b50565b6060611bb9826122e4565b611bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bef9061487d565b60405180910390fd5b60016002811115611c0c57611c0b6145e6565b5b601360009054906101000a900460ff166002811115611c2e57611c2d6145e6565b5b03611c91576000600b8054611c42906143d6565b905011611c5e5760405180602001604052806000815250611c8a565b600b611c6983612b3a565b604051602001611c7a92919061496d565b6040516020818303038152906040525b9050611e09565b60006002811115611ca557611ca46145e6565b5b601360009054906101000a900460ff166002811115611cc757611cc66145e6565b5b03611d2a576000600b8054611cdb906143d6565b905011611cf75760405180602001604052806000815250611d23565b600b611d0283612b3a565b604051602001611d139291906149dd565b6040516020818303038152906040525b9050611e09565b600280811115611d3d57611d3c6145e6565b5b601360009054906101000a900460ff166002811115611d5f57611d5e6145e6565b5b03611df657600b8054611d71906143d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9d906143d6565b8015611dea5780601f10611dbf57610100808354040283529160200191611dea565b820191906000526020600020905b815481529060010190602001808311611dcd57829003601f168201915b50505050509050611e09565b6040518060200160405280600081525090505b919050565b6000611e1982612572565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ebc612147565b73ffffffffffffffffffffffffffffffffffffffff16611eda611572565b73ffffffffffffffffffffffffffffffffffffffff1614611f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2790614387565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9690614a7e565b60405180910390fd5b611fa881612867565b50565b600f5481565b611fb9612147565b73ffffffffffffffffffffffffffffffffffffffff16611fd7611572565b73ffffffffffffffffffffffffffffffffffffffff161461202d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202490614387565b60405180910390fd5b8060128190555050565b61203f612147565b73ffffffffffffffffffffffffffffffffffffffff1661205d611572565b73ffffffffffffffffffffffffffffffffffffffff16146120b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120aa90614387565b60405180910390fd5b826010819055508160118190555080601281905550505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612140575061213f82612c9a565b5b9050919050565b600033905090565b612157612548565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156121b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ac90614b10565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221b90614b7c565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000816122ef612533565b111580156122fe575060005482105b801561232b575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561242c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016123a9929190614b9c565b602060405180830381865afa1580156123c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ea9190614bda565b61242b57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016124229190613cc0565b60405180910390fd5b5b50565b600061243a8261117e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036124a1576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166124c0612147565b73ffffffffffffffffffffffffffffffffffffffff1614612523576124ec816124e7612147565b611e20565b612522576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b61252e838383612d7c565b505050565b600090565b612543838383612e2e565b505050565b6000612710905090565b61256d838383604051806020016040528060008152506117f5565b505050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6125e4613958565b6000829050806125f2612533565b116128305760005481101561282f576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161282d57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612711578092505050612862565b5b60011561282c57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612827578092505050612862565b612712565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6129478282604051806020016040528060008152506132e2565b5050565b612953612147565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036129b7576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006129c4612147565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612a71612147565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ab69190613a6c565b60405180910390a35050565b612acd848484612e2e565b612aec8373ffffffffffffffffffffffffffffffffffffffff166136a2565b15612b3457612afd848484846136c5565b612b33576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060008203612b81576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c95565b600082905060005b60008214612bb3578080612b9c90614c07565b915050600a82612bac91906144bf565b9150612b89565b60008167ffffffffffffffff811115612bcf57612bce613fa4565b5b6040519080825280601f01601f191660200182016040528015612c015781602001600182028036833780820191505090505b5090505b60008514612c8e57600182612c1a91906144f0565b9150600a85612c299190614c4f565b6030612c359190614524565b60f81b818381518110612c4b57612c4a614c80565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c8791906144bf565b9450612c05565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d6557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d755750612d7482613815565b5b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612e39826125dc565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ea4576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612ec5612147565b73ffffffffffffffffffffffffffffffffffffffff161480612ef45750612ef385612eee612147565b611e20565b5b80612f395750612f02612147565b73ffffffffffffffffffffffffffffffffffffffff16612f2184610b4c565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612f72576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612fd8576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fe5858585600161387f565b612ff160008487612d7c565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361327057600054821461326f57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132db8585856001613885565b5050505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361334e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303613388576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613395600085838661387f565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506135568673ffffffffffffffffffffffffffffffffffffffff166136a2565b1561361b575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135cb60008784806001019550876136c5565b613601576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061355c57826000541461361657600080fd5b613686565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061361c575b81600081905550505061369c6000858386613885565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026136eb612147565b8786866040518563ffffffff1660e01b815260040161370d9493929190614d04565b6020604051808303816000875af192505050801561374957506040513d601f19601f820116820180604052508101906137469190614d65565b60015b6137c2573d8060008114613779576040519150601f19603f3d011682016040523d82523d6000602084013e61377e565b606091505b5060008151036137ba576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b50505050565b604051806101000160405280600081526020016000815260200160008152602001600015158152602001600081526020016000815260200160008152602001600081525090565b8280546138de906143d6565b90600052602060002090601f0160209004810192826139005760008555613947565b82601f1061391957805160ff1916838001178555613947565b82800160010185558215613947579182015b8281111561394657825182559160200191906001019061392b565b5b509050613954919061399b565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156139b457600081600090555060010161399c565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a01816139cc565b8114613a0c57600080fd5b50565b600081359050613a1e816139f8565b92915050565b600060208284031215613a3a57613a396139c2565b5b6000613a4884828501613a0f565b91505092915050565b60008115159050919050565b613a6681613a51565b82525050565b6000602082019050613a816000830184613a5d565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ab282613a87565b9050919050565b613ac281613aa7565b8114613acd57600080fd5b50565b600081359050613adf81613ab9565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613b0681613ae5565b8114613b1157600080fd5b50565b600081359050613b2381613afd565b92915050565b60008060408385031215613b4057613b3f6139c2565b5b6000613b4e85828601613ad0565b9250506020613b5f85828601613b14565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ba3578082015181840152602081019050613b88565b83811115613bb2576000848401525b50505050565b6000601f19601f8301169050919050565b6000613bd482613b69565b613bde8185613b74565b9350613bee818560208601613b85565b613bf781613bb8565b840191505092915050565b60006020820190508181036000830152613c1c8184613bc9565b905092915050565b6000819050919050565b613c3781613c24565b82525050565b6000602082019050613c526000830184613c2e565b92915050565b613c6181613c24565b8114613c6c57600080fd5b50565b600081359050613c7e81613c58565b92915050565b600060208284031215613c9a57613c996139c2565b5b6000613ca884828501613c6f565b91505092915050565b613cba81613aa7565b82525050565b6000602082019050613cd56000830184613cb1565b92915050565b60008060408385031215613cf257613cf16139c2565b5b6000613d0085828601613ad0565b9250506020613d1185828601613c6f565b9150509250929050565b600080600060608486031215613d3457613d336139c2565b5b6000613d4286828701613ad0565b9350506020613d5386828701613ad0565b9250506040613d6486828701613c6f565b9150509250925092565b60008060408385031215613d8557613d846139c2565b5b6000613d9385828601613c6f565b9250506020613da485828601613c6f565b9150509250929050565b6000604082019050613dc36000830185613cb1565b613dd06020830184613c2e565b9392505050565b60008060408385031215613dee57613ded6139c2565b5b6000613dfc85828601613c6f565b9250506020613e0d85828601613ad0565b9150509250929050565b6000819050919050565b6000613e3c613e37613e3284613a87565b613e17565b613a87565b9050919050565b6000613e4e82613e21565b9050919050565b6000613e6082613e43565b9050919050565b613e7081613e55565b82525050565b6000602082019050613e8b6000830184613e67565b92915050565b600060208284031215613ea757613ea66139c2565b5b6000613eb584828501613ad0565b91505092915050565b613ec781613c24565b82525050565b613ed681613a51565b82525050565b61010082016000820151613ef36000850182613ebe565b506020820151613f066020850182613ebe565b506040820151613f196040850182613ebe565b506060820151613f2c6060850182613ecd565b506080820151613f3f6080850182613ebe565b5060a0820151613f5260a0850182613ebe565b5060c0820151613f6560c0850182613ebe565b5060e0820151613f7860e0850182613ebe565b50505050565b600061010082019050613f946000830184613edc565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613fdc82613bb8565b810181811067ffffffffffffffff82111715613ffb57613ffa613fa4565b5b80604052505050565b600061400e6139b8565b905061401a8282613fd3565b919050565b600067ffffffffffffffff82111561403a57614039613fa4565b5b61404382613bb8565b9050602081019050919050565b82818337600083830152505050565b600061407261406d8461401f565b614004565b90508281526020810184848401111561408e5761408d613f9f565b5b614099848285614050565b509392505050565b600082601f8301126140b6576140b5613f9a565b5b81356140c684826020860161405f565b91505092915050565b6000602082840312156140e5576140e46139c2565b5b600082013567ffffffffffffffff811115614103576141026139c7565b5b61410f848285016140a1565b91505092915050565b61412181613a51565b811461412c57600080fd5b50565b60008135905061413e81614118565b92915050565b6000806040838503121561415b5761415a6139c2565b5b600061416985828601613ad0565b925050602061417a8582860161412f565b9150509250929050565b600067ffffffffffffffff82111561419f5761419e613fa4565b5b6141a882613bb8565b9050602081019050919050565b60006141c86141c384614184565b614004565b9050828152602081018484840111156141e4576141e3613f9f565b5b6141ef848285614050565b509392505050565b600082601f83011261420c5761420b613f9a565b5b813561421c8482602086016141b5565b91505092915050565b6000806000806080858703121561423f5761423e6139c2565b5b600061424d87828801613ad0565b945050602061425e87828801613ad0565b935050604061426f87828801613c6f565b925050606085013567ffffffffffffffff8111156142905761428f6139c7565b5b61429c878288016141f7565b91505092959194509250565b600080604083850312156142bf576142be6139c2565b5b60006142cd85828601613ad0565b92505060206142de85828601613ad0565b9150509250929050565b600080600060608486031215614301576143006139c2565b5b600061430f86828701613c6f565b935050602061432086828701613c6f565b925050604061433186828701613c6f565b9150509250925092565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614371602083613b74565b915061437c8261433b565b602082019050919050565b600060208201905081810360008301526143a081614364565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806143ee57607f821691505b602082108103614401576144006143a7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061444182613c24565b915061444c83613c24565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561448557614484614407565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144ca82613c24565b91506144d583613c24565b9250826144e5576144e4614490565b5b828204905092915050565b60006144fb82613c24565b915061450683613c24565b92508282101561451957614518614407565b5b828203905092915050565b600061452f82613c24565b915061453a83613c24565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561456f5761456e614407565b5b828201905092915050565b7f457863656564206d617820737570706c79206f6620746f6b656e730000000000600082015250565b60006145b0601b83613b74565b91506145bb8261457a565b602082019050919050565b600060208201905081810360008301526145df816145a3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f457863656564206d617820746f6b656e73207065722074780000000000000000600082015250565b600061464b601883613b74565b915061465682614615565b602082019050919050565b6000602082019050818103600083015261467a8161463e565b9050919050565b7f4d757374206d696e74206174206c65617374206f6e6500000000000000000000600082015250565b60006146b7601683613b74565b91506146c282614681565b602082019050919050565b600060208201905081810360008301526146e6816146aa565b9050919050565b7f457863656564206d617820737570706c79000000000000000000000000000000600082015250565b6000614723601183613b74565b915061472e826146ed565b602082019050919050565b6000602082019050818103600083015261475281614716565b9050919050565b7f4c657373207468656e206d696e696e756d207265717569726564000000000000600082015250565b600061478f601a83613b74565b915061479a82614759565b602082019050919050565b600060208201905081810360008301526147be81614782565b9050919050565b7f4e6f7420656e6f75676820657468657200000000000000000000000000000000600082015250565b60006147fb601083613b74565b9150614806826147c5565b602082019050919050565b6000602082019050818103600083015261482a816147ee565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b6000614867601583613b74565b915061487282614831565b602082019050919050565b600060208201905081810360008301526148968161485a565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546148ca816143d6565b6148d4818661489d565b945060018216600081146148ef576001811461490057614933565b60ff19831686528186019350614933565b614909856148a8565b60005b8381101561492b5781548189015260018201915060208101905061490c565b838801955050505b50505092915050565b600061494782613b69565b614951818561489d565b9350614961818560208601613b85565b80840191505092915050565b600061497982856148bd565b9150614985828461493c565b91508190509392505050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006149c760058361489d565b91506149d282614991565b600582019050919050565b60006149e982856148bd565b91506149f5828461493c565b9150614a00826149ba565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a68602683613b74565b9150614a7382614a0c565b604082019050919050565b60006020820190508181036000830152614a9781614a5b565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000614afa602a83613b74565b9150614b0582614a9e565b604082019050919050565b60006020820190508181036000830152614b2981614aed565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000614b66601983613b74565b9150614b7182614b30565b602082019050919050565b60006020820190508181036000830152614b9581614b59565b9050919050565b6000604082019050614bb16000830185613cb1565b614bbe6020830184613cb1565b9392505050565b600081519050614bd481614118565b92915050565b600060208284031215614bf057614bef6139c2565b5b6000614bfe84828501614bc5565b91505092915050565b6000614c1282613c24565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614c4457614c43614407565b5b600182019050919050565b6000614c5a82613c24565b9150614c6583613c24565b925082614c7557614c74614490565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000614cd682614caf565b614ce08185614cba565b9350614cf0818560208601613b85565b614cf981613bb8565b840191505092915050565b6000608082019050614d196000830187613cb1565b614d266020830186613cb1565b614d336040830185613c2e565b8181036060830152614d458184614ccb565b905095945050505050565b600081519050614d5f816139f8565b92915050565b600060208284031215614d7b57614d7a6139c2565b5b6000614d8984828501614d50565b9150509291505056fea26469706673582212202fb0f97050f4cb085b7efb8bec413e3891feb9683990aef26bafb35e5388302764736f6c634300080d0033
Deployed Bytecode Sourcemap
72815:9491:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80826:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81055:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52374:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73545:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54005:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81449:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48328:312;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81646:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70158:505;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;76171:598;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74757:143;;;;;;;;;;;;;:::i;:::-;;2907;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81851:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80659:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74192:557;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75459:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73072:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52182:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73115:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78374:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72925:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80051:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49507:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18173:103;;;;;;;;;;;;;:::i;:::-;;75172:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73007:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17522:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73432:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73245:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79497:309;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52543:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81233:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80288:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82064:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80160:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76073:90;;;;;;;;;;;;;:::i;:::-;;76843:1523;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78490:999;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79930:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54712:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18431:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73161:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80463:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75667:398;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80826:221;80974:4;81003:36;81027:11;81003:23;:36::i;:::-;80996:43;;80826:221;;;:::o;81055:170::-;17753:12;:10;:12::i;:::-;17742:23;;:7;:5;:7::i;:::-;:23;;;17734:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;81173:44:::1;81192:8;81202:14;81173:18;:44::i;:::-;81055:170:::0;;:::o;52374:100::-;52428:13;52461:5;52454:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52374:100;:::o;73545:46::-;;;;:::o;54005:245::-;54109:7;54139:16;54147:7;54139;:16::i;:::-;54134:64;;54164:34;;;;;;;;;;;;;;54134:64;54218:15;:24;54234:7;54218:24;;;;;;;;;;;;;;;;;;;;;54211:31;;54005:245;;;:::o;81449:189::-;81572:8;4562:30;4583:8;4562:20;:30::i;:::-;81598:32:::1;81612:8;81622:7;81598:13;:32::i;:::-;81449:189:::0;;;:::o;48328:312::-;48381:7;48606:15;:13;:15::i;:::-;48591:12;;48575:13;;:28;:46;48568:53;;48328:312;:::o;81646:197::-;81781:4;4390:10;4382:18;;:4;:18;;;4378:83;;4417:32;4438:10;4417:20;:32::i;:::-;4378:83;81798:37:::1;81817:4;81823:2;81827:7;81798:18;:37::i;:::-;81646:197:::0;;;;:::o;70158:505::-;70300:7;70309;70334:26;70363:17;:27;70381:8;70363:27;;;;;;;;;;;70334:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70435:1;70407:30;;:7;:16;;;:30;;;70403:92;;70464:19;70454:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70403:92;70507:21;70585:17;:15;:17::i;:::-;70531:71;;70545:7;:23;;;70532:36;;:10;:36;;;;:::i;:::-;70531:71;;;;:::i;:::-;70507:95;;70623:7;:16;;;70641:13;70615:40;;;;;;70158:505;;;;;:::o;76171:598::-;76277:7;76329:1;76306:20;76319:6;76306:12;:20::i;:::-;:24;76302:415;;;76371:10;;76354:14;:27;;;;:::i;:::-;76347:34;;;;76302:415;76440:1;76417:20;;:24;:65;;;;;76462:20;;76445:14;:37;76417:65;76399:318;;;76558:10;;76534:20;;76517:14;:37;;;;:::i;:::-;76516:52;;;;:::i;:::-;76509:59;;;;76399:318;76627:1;76604:20;;:24;:66;;;;;76650:20;;76632:14;:38;;76604:66;76586:131;;;76704:1;76697:8;;;;76586:131;76751:10;;76734:14;:27;;;;:::i;:::-;76727:34;;76171:598;;;;;:::o;74757:143::-;17753:12;:10;:12::i;:::-;17742:23;;:7;:5;:7::i;:::-;:23;;;17734:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74805:15:::1;74823:21;74805:39;;74863:10;74855:28;;:37;74884:7;74855:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;74794:106;74757:143::o:0;2907:::-;3007:42;2907:143;:::o;81851:205::-;81990:4;4390:10;4382:18;;:4;:18;;;4378:83;;4417:32;4438:10;4417:20;:32::i;:::-;4378:83;82007:41:::1;82030:4;82036:2;82040:7;82007:22;:41::i;:::-;81851:205:::0;;;;:::o;80659:159::-;17753:12;:10;:12::i;:::-;17742:23;;:7;:5;:7::i;:::-;:23;;;17734:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;80791:19:::1;80770:18;:40;;;;80659:159:::0;:::o;74192:557::-;74247:18;;:::i;:::-;74298:443;;;;;;;;74341:10;;74298:443;;;;74386:14;;74298:443;;;;74431:10;;74298:443;;;;74474:4;74298:443;;;;;;74534:13;:11;:13::i;:::-;74298:443;;;;74587:20;;74298:443;;;;74646:21;74660:6;74646:13;:21::i;:::-;74298:443;;;;74707:18;;74298:443;;;74278:463;;74192:557;;;:::o;75459:94::-;17753:12;:10;:12::i;:::-;17742:23;;:7;:5;:7::i;:::-;:23;;;17734:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75539:6:::1;75529:7;:16;;;;;;;;;;;;:::i;:::-;;75459:94:::0;:::o;73072:34::-;;;;:::o;52182:125::-;52246:7;52273:21;52286:7;52273:12;:21::i;:::-;:26;;;52266:33;;52182:125;;;:::o;73115:37::-;;;;:::o;78374:108::-;17753:12;:10;:12::i;:::-;17742:23;;:7;:5;:7::i;:::-;:23;;;17734:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78461:13:::1;78448:10;:26;;;;78374:108:::0;:::o;72925:73::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;80051:101::-;17753:12;:10;:12::i;:::-;17742:23;;:7;:5;:7::i;:::-;:23;;;17734:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;80134:10:::1;80121;:23;;;;80051:101:::0;:::o;49507:206::-;49571:7;49612:1;49595:19;;:5;:19;;;49591:60;;49623:28;;;;;;;;;;;;;;49591:60;49677:12;:19;49690:5;49677:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;49669:36;;49662:43;;49507:206;;;:::o;18173:103::-;17753:12;:10;:12::i;:::-;17742:23;;:7;:5;:7::i;:::-;:23;;;17734:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18238:30:::1;18265:1;18238:18;:30::i;:::-;18173:103::o:0;75172:279::-;17753:12;:10;:12::i;:::-;17742:23;;:7;:5;:7::i;:::-;:23;;;17734:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75338:10:::1;;75320:14;75304:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;75282:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;75414:29;75424:2;75428:14;75414:9;:29::i;:::-;75172:279:::0;;:::o;73007:44::-;;;;:::o;17522:87::-;17568:7;17595:6;;;;;;;;;;;17588:13;;17522:87;:::o;73432:39::-;;;;:::o;73245:42::-;;;;:::o;79497:309::-;17753:12;:10;:12::i;:::-;17742:23;;:7;:5;:7::i;:::-;:23;;;17734:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;79578:1:::1;79570:4;:9:::0;79566:233:::1;;79611:21;79596:12;;:36;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;79566:233;;;79662:1;79654:4;:9:::0;79650:149:::1;;79695:21;79680:12;;:36;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;79650:149;;;79764:23;79749:12;;:38;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;79650:149;79566:233;79497:309:::0;:::o;52543:104::-;52599:13;52632:7;52625:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52543:104;:::o;81233:208::-;81364:8;4562:30;4583:8;4562:20;:30::i;:::-;81390:43:::1;81414:8;81424;81390:23;:43::i;:::-;81233:208:::0;;;:::o;80288:167::-;17753:12;:10;:12::i;:::-;17742:23;;:7;:5;:7::i;:::-;:23;;;17734:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;80426:21:::1;80403:20;:44;;;;80288:167:::0;:::o;82064:239::-;82231:4;4390:10;4382:18;;:4;:18;;;4378:83;;4417:32;4438:10;4417:20;:32::i;:::-;4378:83;82248:47:::1;82271:4;82277:2;82281:7;82290:4;82248:22;:47::i;:::-;82064:239:::0;;;;;:::o;80160:120::-;17753:12;:10;:12::i;:::-;17742:23;;:7;:5;:7::i;:::-;:23;;;17734:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;80257:15:::1;80240:14;:32;;;;80160:120:::0;:::o;76073:90::-;17753:12;:10;:12::i;:::-;17742:23;;:7;:5;:7::i;:::-;:23;;;17734:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76154:1:::1;76131:20;:24;;;;76073:90::o:0;76843:1523::-;76996:14;;76978;:32;;76970:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;77075:1;77058:14;:18;77050:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;77170:10;;77152:14;77136:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;77114:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;77265:1;77242:20;;:24;:57;;;;;77298:1;77270:24;77283:10;77270:12;:24::i;:::-;:29;;77242:57;77238:1121;;;77360:27;;77342:14;:45;;77316:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;77487:20;;77470:14;:37;77466:258;;;77638:10;;77614:20;;77597:14;:37;;;;:::i;:::-;77596:52;;;;:::i;:::-;77558:9;:90;;77528:180;;;;;;;;;;;;:::i;:::-;;;;;;;;;77466:258;77738:37;77748:10;77760:14;77738:9;:37::i;:::-;77790:22;77832:20;;77815:14;:37;:111;;77912:14;77815:111;;;77872:20;;77815:111;77790:136;;77963:20;;77945:14;:38;77941:204;;78027:1;78004:20;:24;;;;77941:204;;;78115:14;78092:20;;:37;;;;:::i;:::-;78069:20;:60;;;;77941:204;77301:855;77238:1121;;;78233:10;;78216:14;:27;;;;:::i;:::-;78203:9;:40;;78177:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;78310:37;78320:10;78332:14;78310:9;:37::i;:::-;77238:1121;76843:1523;:::o;78490:999::-;78592:13;78631:17;78639:8;78631:7;:17::i;:::-;78623:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;78705:21;78689:37;;;;;;;;:::i;:::-;;:12;;;;;;;;;;;:37;;;;;;;;:::i;:::-;;;78685:777;;78791:1;78773:7;78767:21;;;;;:::i;:::-;;;:25;:184;;;;;;;;;;;;;;;;;78866:7;78875:26;78892:8;78875:16;:26::i;:::-;78849:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78767:184;78743:208;;;;78685:777;78989:21;78973:37;;;;;;;;:::i;:::-;;:12;;;;;;;;;;;:37;;;;;;;;:::i;:::-;;;78969:493;;79075:1;79057:7;79051:21;;;;;:::i;:::-;;;:25;:307;;;;;;;;;;;;;;;;;79180:7;79218:26;79235:8;79218:16;:26::i;:::-;79133:176;;;;;;;;;:::i;:::-;;;;;;;;;;;;;79051:307;79027:331;;;;78969:493;79396:23;79380:39;;;;;;;;:::i;:::-;;:12;;;;;;;;;;;:39;;;;;;;;:::i;:::-;;;79376:86;;79443:7;79436:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79376:86;79472:9;;;;;;;;;;;;;;78490:999;;;;:::o;79930:113::-;79988:7;80015:20;80029:5;80015:13;:20::i;:::-;80008:27;;79930:113;;;:::o;54712:214::-;54854:4;54883:18;:25;54902:5;54883:25;;;;;;;;;;;;;;;:35;54909:8;54883:35;;;;;;;;;;;;;;;;;;;;;;;;;54876:42;;54712:214;;;;:::o;18431:238::-;17753:12;:10;:12::i;:::-;17742:23;;:7;:5;:7::i;:::-;:23;;;17734:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18554:1:::1;18534:22;;:8;:22;;::::0;18512:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;18633:28;18652:8;18633:18;:28::i;:::-;18431:238:::0;:::o;73161:32::-;;;;:::o;80463:188::-;17753:12;:10;:12::i;:::-;17742:23;;:7;:5;:7::i;:::-;:23;;;17734:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;80615:28:::1;80585:27;:58;;;;80463:188:::0;:::o;75667:398::-;17753:12;:10;:12::i;:::-;17742:23;;:7;:5;:7::i;:::-;:23;;;17734:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75879:21:::1;75856:20;:44;;;;75934:21;75911:20;:44;;;;75996:28;75966:27;:58;;;;75667:398:::0;;;:::o;69812:291::-;69959:4;70016:26;70001:41;;;:11;:41;;;;:94;;;;70059:36;70083:11;70059:23;:36::i;:::-;70001:94;69981:114;;69812:291;;;:::o;6136:98::-;6189:7;6216:10;6209:17;;6136:98;:::o;71313:392::-;71469:17;:15;:17::i;:::-;71453:33;;:12;:33;;;;71431:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;71595:1;71575:22;;:8;:22;;;71567:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;71662:35;;;;;;;;71674:8;71662:35;;;;;;71684:12;71662:35;;;;;71640:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71313:392;;:::o;56137:213::-;56194:4;56250:7;56231:15;:13;:15::i;:::-;:26;;:66;;;;;56284:13;;56274:7;:23;56231:66;:111;;;;;56315:11;:20;56327:7;56315:20;;;;;;;;;;;:27;;;;;;;;;;;;56314:28;56231:111;56211:131;;56137:213;;;:::o;4620:512::-;4859:1;3007:42;4811:45;;;:49;4807:318;;;3007:42;4900;;;4973:4;5001:8;4900:128;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4877:237;;5089:8;5070:28;;;;;;;;;;;:::i;:::-;;;;;;;;4877:237;4807:318;4620:512;:::o;53537:402::-;53618:13;53634:24;53650:7;53634:15;:24::i;:::-;53618:40;;53679:5;53673:11;;:2;:11;;;53669:48;;53693:24;;;;;;;;;;;;;;53669:48;53750:5;53734:21;;:12;:10;:12::i;:::-;:21;;;53730:161;;53775:37;53792:5;53799:12;:10;:12::i;:::-;53775:16;:37::i;:::-;53770:121;;53840:35;;;;;;;;;;;;;;53770:121;53730:161;53903:28;53912:2;53916:7;53925:5;53903:8;:28::i;:::-;53607:332;53537:402;;:::o;48102:92::-;48158:7;48102:92;:::o;54993:170::-;55127:28;55137:4;55143:2;55147:7;55127:9;:28::i;:::-;54993:170;;;:::o;70945:97::-;71003:6;71029:5;71022:12;;70945:97;:::o;55234:185::-;55372:39;55389:4;55395:2;55399:7;55372:39;;;;;;;;;;;;:16;:39::i;:::-;55234:185;;;:::o;49795:137::-;49856:7;49891:12;:19;49904:5;49891:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;49883:41;;49876:48;;49795:137;;;:::o;50888:1232::-;50977:21;;:::i;:::-;51016:12;51031:7;51016:22;;51099:4;51080:15;:13;:15::i;:::-;:23;51076:977;;51133:13;;51126:4;:20;51122:931;;;51171:31;51205:11;:17;51217:4;51205:17;;;;;;;;;;;51171:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51250:9;:16;;;51245:789;;51325:1;51299:28;;:9;:14;;;:28;;;51295:109;;51367:9;51360:16;;;;;;51295:109;51726:285;51733:4;51726:285;;;51770:6;;;;;;;;51819:11;:17;51831:4;51819:17;;;;;;;;;;;51807:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51897:1;51871:28;;:9;:14;;;:28;;;51867:117;;51943:9;51936:16;;;;;;51867:117;51726:285;;;51245:789;51148:905;51122:931;51076:977;52081:31;;;;;;;;;;;;;;50888:1232;;;;:::o;18829:191::-;18903:16;18922:6;;;;;;;;;;;18903:25;;18948:8;18939:6;;:17;;;;;;;;;;;;;;;;;;19003:8;18972:40;;18993:8;18972:40;;;;;;;;;;;;18892:128;18829:191;:::o;56434:104::-;56503:27;56513:2;56517:8;56503:27;;;;;;;;;;;;:9;:27::i;:::-;56434:104;;:::o;54322:319::-;54465:12;:10;:12::i;:::-;54453:24;;:8;:24;;;54449:54;;54486:17;;;;;;;;;;;;;;54449:54;54561:8;54516:18;:32;54535:12;:10;:12::i;:::-;54516:32;;;;;;;;;;;;;;;:42;54549:8;54516:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;54614:8;54585:48;;54600:12;:10;:12::i;:::-;54585:48;;;54624:8;54585:48;;;;;;:::i;:::-;;;;;;;;54322:319;;:::o;55490:392::-;55657:28;55667:4;55673:2;55677:7;55657:9;:28::i;:::-;55700:15;:2;:13;;;:15::i;:::-;55696:179;;;55735:56;55766:4;55772:2;55776:7;55785:5;55735:30;:56::i;:::-;55730:145;;55819:40;;;;;;;;;;;;;;55730:145;55696:179;55490:392;;;;:::o;28196:723::-;28252:13;28482:1;28473:5;:10;28469:53;;28500:10;;;;;;;;;;;;;;;;;;;;;28469:53;28532:12;28547:5;28532:20;;28563:14;28588:78;28603:1;28595:4;:9;28588:78;;28621:8;;;;;:::i;:::-;;;;28652:2;28644:10;;;;;:::i;:::-;;;28588:78;;;28676:19;28708:6;28698:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28676:39;;28726:154;28742:1;28733:5;:10;28726:154;;28770:1;28760:11;;;;;:::i;:::-;;;28837:2;28829:5;:10;;;;:::i;:::-;28816:2;:24;;;;:::i;:::-;28803:39;;28786:6;28793;28786:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;28866:2;28857:11;;;;;:::i;:::-;;;28726:154;;;28904:6;28890:21;;;;;28196:723;;;;:::o;49088:355::-;49235:4;49292:25;49277:40;;;:11;:40;;;;:105;;;;49349:33;49334:48;;;:11;:48;;;;49277:105;:158;;;;49399:36;49423:11;49399:23;:36::i;:::-;49277:158;49257:178;;49088:355;;;:::o;65589:196::-;65731:2;65704:15;:24;65720:7;65704:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;65769:7;65765:2;65749:28;;65758:5;65749:28;;;;;;;;;;;;65589:196;;;:::o;60537:2130::-;60652:35;60690:21;60703:7;60690:12;:21::i;:::-;60652:59;;60750:4;60728:26;;:13;:18;;;:26;;;60724:67;;60763:28;;;;;;;;;;;;;;60724:67;60804:22;60846:4;60830:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;60867:36;60884:4;60890:12;:10;:12::i;:::-;60867:16;:36::i;:::-;60830:73;:126;;;;60944:12;:10;:12::i;:::-;60920:36;;:20;60932:7;60920:11;:20::i;:::-;:36;;;60830:126;60804:153;;60975:17;60970:66;;61001:35;;;;;;;;;;;;;;60970:66;61065:1;61051:16;;:2;:16;;;61047:52;;61076:23;;;;;;;;;;;;;;61047:52;61112:43;61134:4;61140:2;61144:7;61153:1;61112:21;:43::i;:::-;61220:35;61237:1;61241:7;61250:4;61220:8;:35::i;:::-;61581:1;61551:12;:18;61564:4;61551:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61625:1;61597:12;:16;61610:2;61597:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61643:31;61677:11;:20;61689:7;61677:20;;;;;;;;;;;61643:54;;61728:2;61712:8;:13;;;:18;;;;;;;;;;;;;;;;;;61778:15;61745:8;:23;;;:49;;;;;;;;;;;;;;;;;;62046:19;62078:1;62068:7;:11;62046:33;;62094:31;62128:11;:24;62140:11;62128:24;;;;;;;;;;;62094:58;;62196:1;62171:27;;:8;:13;;;;;;;;;;;;:27;;;62167:384;;62381:13;;62366:11;:28;62362:174;;62435:4;62419:8;:13;;;:20;;;;;;;;;;;;;;;;;;62488:13;:28;;;62462:8;:23;;;:54;;;;;;;;;;;;;;;;;;62362:174;62167:384;61526:1036;;;62598:7;62594:2;62579:27;;62588:4;62579:27;;;;;;;;;;;;62617:42;62638:4;62644:2;62648:7;62657:1;62617:20;:42::i;:::-;60641:2026;;60537:2130;;;:::o;56911:1940::-;57034:20;57057:13;;57034:36;;57099:1;57085:16;;:2;:16;;;57081:48;;57110:19;;;;;;;;;;;;;;57081:48;57156:1;57144:8;:13;57140:44;;57166:18;;;;;;;;;;;;;;57140:44;57197:61;57227:1;57231:2;57235:12;57249:8;57197:21;:61::i;:::-;57570:8;57535:12;:16;57548:2;57535:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57634:8;57594:12;:16;57607:2;57594:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57693:2;57660:11;:25;57672:12;57660:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;57760:15;57710:11;:25;57722:12;57710:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;57793:20;57816:12;57793:35;;57843:11;57872:8;57857:12;:23;57843:37;;57901:15;:2;:13;;;:15::i;:::-;57897:822;;;57937:504;57993:12;57989:2;57968:38;;57985:1;57968:38;;;;;;;;;;;;58060:212;58129:1;58162:2;58195:14;;;;;;58240:5;58060:30;:212::i;:::-;58029:365;;58330:40;;;;;;;;;;;;;;58029:365;58436:3;58421:12;:18;57937:504;;58522:12;58505:13;;:29;58501:43;;58536:8;;;58501:43;57897:822;;;58585:119;58641:14;;;;;;58637:2;58616:40;;58633:1;58616:40;;;;;;;;;;;;58699:3;58684:12;:18;58585:119;;57897:822;58749:12;58733:13;:28;;;;57510:1263;;58783:60;58812:1;58816:2;58820:12;58834:8;58783:20;:60::i;:::-;57023:1828;56911:1940;;;:::o;20177:326::-;20237:4;20494:1;20472:7;:19;;;:23;20465:30;;20177:326;;;:::o;66277:772::-;66440:4;66490:2;66474:36;;;66529:12;:10;:12::i;:::-;66560:4;66583:7;66609:5;66474:155;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;66457:585;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66817:1;66800:6;:13;:18;66796:235;;66846:40;;;;;;;;;;;;;;66796:235;66989:6;66983:13;66974:6;66970:2;66966:15;66959:38;66457:585;66695:45;;;66685:55;;;:6;:55;;;;66678:62;;;66277:772;;;;;;:::o;16307:207::-;16437:4;16481:25;16466:40;;;:11;:40;;;;16459:47;;16307:207;;;:::o;67697:159::-;;;;;:::o;68515:158::-;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::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:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:109::-;2061:7;2101:26;2094:5;2090:38;2079:49;;2025:109;;;:::o;2140:120::-;2212:23;2229:5;2212:23;:::i;:::-;2205:5;2202:34;2192:62;;2250:1;2247;2240:12;2192:62;2140:120;:::o;2266:137::-;2311:5;2349:6;2336:20;2327:29;;2365:32;2391:5;2365:32;:::i;:::-;2266:137;;;;:::o;2409:472::-;2476:6;2484;2533:2;2521:9;2512:7;2508:23;2504:32;2501:119;;;2539:79;;:::i;:::-;2501:119;2659:1;2684:53;2729:7;2720:6;2709:9;2705:22;2684:53;:::i;:::-;2674:63;;2630:117;2786:2;2812:52;2856:7;2847:6;2836:9;2832:22;2812:52;:::i;:::-;2802:62;;2757:117;2409:472;;;;;:::o;2887:99::-;2939:6;2973:5;2967:12;2957:22;;2887:99;;;:::o;2992:169::-;3076:11;3110:6;3105:3;3098:19;3150:4;3145:3;3141:14;3126:29;;2992:169;;;;:::o;3167:307::-;3235:1;3245:113;3259:6;3256:1;3253:13;3245:113;;;3344:1;3339:3;3335:11;3329:18;3325:1;3320:3;3316:11;3309:39;3281:2;3278:1;3274:10;3269:15;;3245:113;;;3376:6;3373:1;3370:13;3367:101;;;3456:1;3447:6;3442:3;3438:16;3431:27;3367:101;3216:258;3167:307;;;:::o;3480:102::-;3521:6;3572:2;3568:7;3563:2;3556:5;3552:14;3548:28;3538:38;;3480:102;;;:::o;3588:364::-;3676:3;3704:39;3737:5;3704:39;:::i;:::-;3759:71;3823:6;3818:3;3759:71;:::i;:::-;3752:78;;3839:52;3884:6;3879:3;3872:4;3865:5;3861:16;3839:52;:::i;:::-;3916:29;3938:6;3916:29;:::i;:::-;3911:3;3907:39;3900:46;;3680:272;3588:364;;;;:::o;3958:313::-;4071:4;4109:2;4098:9;4094:18;4086:26;;4158:9;4152:4;4148:20;4144:1;4133:9;4129:17;4122:47;4186:78;4259:4;4250:6;4186:78;:::i;:::-;4178:86;;3958:313;;;;:::o;4277:77::-;4314:7;4343:5;4332:16;;4277:77;;;:::o;4360:118::-;4447:24;4465:5;4447:24;:::i;:::-;4442:3;4435:37;4360:118;;:::o;4484:222::-;4577:4;4615:2;4604:9;4600:18;4592:26;;4628:71;4696:1;4685:9;4681:17;4672:6;4628:71;:::i;:::-;4484:222;;;;:::o;4712:122::-;4785:24;4803:5;4785:24;:::i;:::-;4778:5;4775:35;4765:63;;4824:1;4821;4814:12;4765:63;4712:122;:::o;4840:139::-;4886:5;4924:6;4911:20;4902:29;;4940:33;4967:5;4940:33;:::i;:::-;4840:139;;;;:::o;4985:329::-;5044:6;5093:2;5081:9;5072:7;5068:23;5064:32;5061:119;;;5099:79;;:::i;:::-;5061:119;5219:1;5244:53;5289:7;5280:6;5269:9;5265:22;5244:53;:::i;:::-;5234:63;;5190:117;4985:329;;;;:::o;5320:118::-;5407:24;5425:5;5407:24;:::i;:::-;5402:3;5395:37;5320:118;;:::o;5444:222::-;5537:4;5575:2;5564:9;5560:18;5552:26;;5588:71;5656:1;5645:9;5641:17;5632:6;5588:71;:::i;:::-;5444:222;;;;:::o;5672:474::-;5740:6;5748;5797:2;5785:9;5776:7;5772:23;5768:32;5765:119;;;5803:79;;:::i;:::-;5765:119;5923:1;5948:53;5993:7;5984:6;5973:9;5969:22;5948:53;:::i;:::-;5938:63;;5894:117;6050:2;6076:53;6121:7;6112:6;6101:9;6097:22;6076:53;:::i;:::-;6066:63;;6021:118;5672:474;;;;;:::o;6152:619::-;6229:6;6237;6245;6294:2;6282:9;6273:7;6269:23;6265:32;6262:119;;;6300:79;;:::i;:::-;6262:119;6420:1;6445:53;6490:7;6481:6;6470:9;6466:22;6445:53;:::i;:::-;6435:63;;6391:117;6547:2;6573:53;6618:7;6609:6;6598:9;6594:22;6573:53;:::i;:::-;6563:63;;6518:118;6675:2;6701:53;6746:7;6737:6;6726:9;6722:22;6701:53;:::i;:::-;6691:63;;6646:118;6152:619;;;;;:::o;6777:474::-;6845:6;6853;6902:2;6890:9;6881:7;6877:23;6873:32;6870:119;;;6908:79;;:::i;:::-;6870:119;7028:1;7053:53;7098:7;7089:6;7078:9;7074:22;7053:53;:::i;:::-;7043:63;;6999:117;7155:2;7181:53;7226:7;7217:6;7206:9;7202:22;7181:53;:::i;:::-;7171:63;;7126:118;6777:474;;;;;:::o;7257:332::-;7378:4;7416:2;7405:9;7401:18;7393:26;;7429:71;7497:1;7486:9;7482:17;7473:6;7429:71;:::i;:::-;7510:72;7578:2;7567:9;7563:18;7554:6;7510:72;:::i;:::-;7257:332;;;;;:::o;7595:474::-;7663:6;7671;7720:2;7708:9;7699:7;7695:23;7691:32;7688:119;;;7726:79;;:::i;:::-;7688:119;7846:1;7871:53;7916:7;7907:6;7896:9;7892:22;7871:53;:::i;:::-;7861:63;;7817:117;7973:2;7999:53;8044:7;8035:6;8024:9;8020:22;7999:53;:::i;:::-;7989:63;;7944:118;7595:474;;;;;:::o;8075:60::-;8103:3;8124:5;8117:12;;8075:60;;;:::o;8141:142::-;8191:9;8224:53;8242:34;8251:24;8269:5;8251:24;:::i;:::-;8242:34;:::i;:::-;8224:53;:::i;:::-;8211:66;;8141:142;;;:::o;8289:126::-;8339:9;8372:37;8403:5;8372:37;:::i;:::-;8359:50;;8289:126;;;:::o;8421:157::-;8502:9;8535:37;8566:5;8535:37;:::i;:::-;8522:50;;8421:157;;;:::o;8584:193::-;8702:68;8764:5;8702:68;:::i;:::-;8697:3;8690:81;8584:193;;:::o;8783:284::-;8907:4;8945:2;8934:9;8930:18;8922:26;;8958:102;9057:1;9046:9;9042:17;9033:6;8958:102;:::i;:::-;8783:284;;;;:::o;9073:329::-;9132:6;9181:2;9169:9;9160:7;9156:23;9152:32;9149:119;;;9187:79;;:::i;:::-;9149:119;9307:1;9332:53;9377:7;9368:6;9357:9;9353:22;9332:53;:::i;:::-;9322:63;;9278:117;9073:329;;;;:::o;9408:108::-;9485:24;9503:5;9485:24;:::i;:::-;9480:3;9473:37;9408:108;;:::o;9522:99::-;9593:21;9608:5;9593:21;:::i;:::-;9588:3;9581:34;9522:99;;:::o;9713:1626::-;9868:6;9863:3;9859:16;9963:4;9956:5;9952:16;9946:23;9982:63;10039:4;10034:3;10030:14;10016:12;9982:63;:::i;:::-;9885:170;10147:4;10140:5;10136:16;10130:23;10166:63;10223:4;10218:3;10214:14;10200:12;10166:63;:::i;:::-;10065:174;10327:4;10320:5;10316:16;10310:23;10346:63;10403:4;10398:3;10394:14;10380:12;10346:63;:::i;:::-;10249:170;10509:4;10502:5;10498:16;10492:23;10528:57;10579:4;10574:3;10570:14;10556:12;10528:57;:::i;:::-;10429:166;10684:4;10677:5;10673:16;10667:23;10703:63;10760:4;10755:3;10751:14;10737:12;10703:63;:::i;:::-;10605:171;10872:4;10865:5;10861:16;10855:23;10891:63;10948:4;10943:3;10939:14;10925:12;10891:63;:::i;:::-;10786:178;11052:4;11045:5;11041:16;11035:23;11071:63;11128:4;11123:3;11119:14;11105:12;11071:63;:::i;:::-;10974:170;11240:4;11233:5;11229:16;11223:23;11259:63;11316:4;11311:3;11307:14;11293:12;11259:63;:::i;:::-;11154:178;9837:1502;9713:1626;;:::o;11345:339::-;11496:4;11534:3;11523:9;11519:19;11511:27;;11548:129;11674:1;11663:9;11659:17;11650:6;11548:129;:::i;:::-;11345:339;;;;:::o;11690:117::-;11799:1;11796;11789:12;11813:117;11922:1;11919;11912:12;11936:180;11984:77;11981:1;11974:88;12081:4;12078:1;12071:15;12105:4;12102:1;12095:15;12122:281;12205:27;12227:4;12205:27;:::i;:::-;12197:6;12193:40;12335:6;12323:10;12320:22;12299:18;12287:10;12284:34;12281:62;12278:88;;;12346:18;;:::i;:::-;12278:88;12386:10;12382:2;12375:22;12165:238;12122:281;;:::o;12409:129::-;12443:6;12470:20;;:::i;:::-;12460:30;;12499:33;12527:4;12519:6;12499:33;:::i;:::-;12409:129;;;:::o;12544:308::-;12606:4;12696:18;12688:6;12685:30;12682:56;;;12718:18;;:::i;:::-;12682:56;12756:29;12778:6;12756:29;:::i;:::-;12748:37;;12840:4;12834;12830:15;12822:23;;12544:308;;;:::o;12858:154::-;12942:6;12937:3;12932;12919:30;13004:1;12995:6;12990:3;12986:16;12979:27;12858:154;;;:::o;13018:412::-;13096:5;13121:66;13137:49;13179:6;13137:49;:::i;:::-;13121:66;:::i;:::-;13112:75;;13210:6;13203:5;13196:21;13248:4;13241:5;13237:16;13286:3;13277:6;13272:3;13268:16;13265:25;13262:112;;;13293:79;;:::i;:::-;13262:112;13383:41;13417:6;13412:3;13407;13383:41;:::i;:::-;13102:328;13018:412;;;;;:::o;13450:340::-;13506:5;13555:3;13548:4;13540:6;13536:17;13532:27;13522:122;;13563:79;;:::i;:::-;13522:122;13680:6;13667:20;13705:79;13780:3;13772:6;13765:4;13757:6;13753:17;13705:79;:::i;:::-;13696:88;;13512:278;13450:340;;;;:::o;13796:509::-;13865:6;13914:2;13902:9;13893:7;13889:23;13885:32;13882:119;;;13920:79;;:::i;:::-;13882:119;14068:1;14057:9;14053:17;14040:31;14098:18;14090:6;14087:30;14084:117;;;14120:79;;:::i;:::-;14084:117;14225:63;14280:7;14271:6;14260:9;14256:22;14225:63;:::i;:::-;14215:73;;14011:287;13796:509;;;;:::o;14311:116::-;14381:21;14396:5;14381:21;:::i;:::-;14374:5;14371:32;14361:60;;14417:1;14414;14407:12;14361:60;14311:116;:::o;14433:133::-;14476:5;14514:6;14501:20;14492:29;;14530:30;14554:5;14530:30;:::i;:::-;14433:133;;;;:::o;14572:468::-;14637:6;14645;14694:2;14682:9;14673:7;14669:23;14665:32;14662:119;;;14700:79;;:::i;:::-;14662:119;14820:1;14845:53;14890:7;14881:6;14870:9;14866:22;14845:53;:::i;:::-;14835:63;;14791:117;14947:2;14973:50;15015:7;15006:6;14995:9;14991:22;14973:50;:::i;:::-;14963:60;;14918:115;14572:468;;;;;:::o;15046:307::-;15107:4;15197:18;15189:6;15186:30;15183:56;;;15219:18;;:::i;:::-;15183:56;15257:29;15279:6;15257:29;:::i;:::-;15249:37;;15341:4;15335;15331:15;15323:23;;15046:307;;;:::o;15359:410::-;15436:5;15461:65;15477:48;15518:6;15477:48;:::i;:::-;15461:65;:::i;:::-;15452:74;;15549:6;15542:5;15535:21;15587:4;15580:5;15576:16;15625:3;15616:6;15611:3;15607:16;15604:25;15601:112;;;15632:79;;:::i;:::-;15601:112;15722:41;15756:6;15751:3;15746;15722:41;:::i;:::-;15442:327;15359:410;;;;;:::o;15788:338::-;15843:5;15892:3;15885:4;15877:6;15873:17;15869:27;15859:122;;15900:79;;:::i;:::-;15859:122;16017:6;16004:20;16042:78;16116:3;16108:6;16101:4;16093:6;16089:17;16042:78;:::i;:::-;16033:87;;15849:277;15788:338;;;;:::o;16132:943::-;16227:6;16235;16243;16251;16300:3;16288:9;16279:7;16275:23;16271:33;16268:120;;;16307:79;;:::i;:::-;16268:120;16427:1;16452:53;16497:7;16488:6;16477:9;16473:22;16452:53;:::i;:::-;16442:63;;16398:117;16554:2;16580:53;16625:7;16616:6;16605:9;16601:22;16580:53;:::i;:::-;16570:63;;16525:118;16682:2;16708:53;16753:7;16744:6;16733:9;16729:22;16708:53;:::i;:::-;16698:63;;16653:118;16838:2;16827:9;16823:18;16810:32;16869:18;16861:6;16858:30;16855:117;;;16891:79;;:::i;:::-;16855:117;16996:62;17050:7;17041:6;17030:9;17026:22;16996:62;:::i;:::-;16986:72;;16781:287;16132:943;;;;;;;:::o;17081:474::-;17149:6;17157;17206:2;17194:9;17185:7;17181:23;17177:32;17174:119;;;17212:79;;:::i;:::-;17174:119;17332:1;17357:53;17402:7;17393:6;17382:9;17378:22;17357:53;:::i;:::-;17347:63;;17303:117;17459:2;17485:53;17530:7;17521:6;17510:9;17506:22;17485:53;:::i;:::-;17475:63;;17430:118;17081:474;;;;;:::o;17561:619::-;17638:6;17646;17654;17703:2;17691:9;17682:7;17678:23;17674:32;17671:119;;;17709:79;;:::i;:::-;17671:119;17829:1;17854:53;17899:7;17890:6;17879:9;17875:22;17854:53;:::i;:::-;17844:63;;17800:117;17956:2;17982:53;18027:7;18018:6;18007:9;18003:22;17982:53;:::i;:::-;17972:63;;17927:118;18084:2;18110:53;18155:7;18146:6;18135:9;18131:22;18110:53;:::i;:::-;18100:63;;18055:118;17561:619;;;;;:::o;18186:182::-;18326:34;18322:1;18314:6;18310:14;18303:58;18186:182;:::o;18374:366::-;18516:3;18537:67;18601:2;18596:3;18537:67;:::i;:::-;18530:74;;18613:93;18702:3;18613:93;:::i;:::-;18731:2;18726:3;18722:12;18715:19;;18374:366;;;:::o;18746:419::-;18912:4;18950:2;18939:9;18935:18;18927:26;;18999:9;18993:4;18989:20;18985:1;18974:9;18970:17;18963:47;19027:131;19153:4;19027:131;:::i;:::-;19019:139;;18746:419;;;:::o;19171:180::-;19219:77;19216:1;19209:88;19316:4;19313:1;19306:15;19340:4;19337:1;19330:15;19357:320;19401:6;19438:1;19432:4;19428:12;19418:22;;19485:1;19479:4;19475:12;19506:18;19496:81;;19562:4;19554:6;19550:17;19540:27;;19496:81;19624:2;19616:6;19613:14;19593:18;19590:38;19587:84;;19643:18;;:::i;:::-;19587:84;19408:269;19357:320;;;:::o;19683:180::-;19731:77;19728:1;19721:88;19828:4;19825:1;19818:15;19852:4;19849:1;19842:15;19869:348;19909:7;19932:20;19950:1;19932:20;:::i;:::-;19927:25;;19966:20;19984:1;19966:20;:::i;:::-;19961:25;;20154:1;20086:66;20082:74;20079:1;20076:81;20071:1;20064:9;20057:17;20053:105;20050:131;;;20161:18;;:::i;:::-;20050:131;20209:1;20206;20202:9;20191:20;;19869:348;;;;:::o;20223:180::-;20271:77;20268:1;20261:88;20368:4;20365:1;20358:15;20392:4;20389:1;20382:15;20409:185;20449:1;20466:20;20484:1;20466:20;:::i;:::-;20461:25;;20500:20;20518:1;20500:20;:::i;:::-;20495:25;;20539:1;20529:35;;20544:18;;:::i;:::-;20529:35;20586:1;20583;20579:9;20574:14;;20409:185;;;;:::o;20600:191::-;20640:4;20660:20;20678:1;20660:20;:::i;:::-;20655:25;;20694:20;20712:1;20694:20;:::i;:::-;20689:25;;20733:1;20730;20727:8;20724:34;;;20738:18;;:::i;:::-;20724:34;20783:1;20780;20776:9;20768:17;;20600:191;;;;:::o;20797:305::-;20837:3;20856:20;20874:1;20856:20;:::i;:::-;20851:25;;20890:20;20908:1;20890:20;:::i;:::-;20885:25;;21044:1;20976:66;20972:74;20969:1;20966:81;20963:107;;;21050:18;;:::i;:::-;20963:107;21094:1;21091;21087:9;21080:16;;20797:305;;;;:::o;21108:177::-;21248:29;21244:1;21236:6;21232:14;21225:53;21108:177;:::o;21291:366::-;21433:3;21454:67;21518:2;21513:3;21454:67;:::i;:::-;21447:74;;21530:93;21619:3;21530:93;:::i;:::-;21648:2;21643:3;21639:12;21632:19;;21291:366;;;:::o;21663:419::-;21829:4;21867:2;21856:9;21852:18;21844:26;;21916:9;21910:4;21906:20;21902:1;21891:9;21887:17;21880:47;21944:131;22070:4;21944:131;:::i;:::-;21936:139;;21663:419;;;:::o;22088:180::-;22136:77;22133:1;22126:88;22233:4;22230:1;22223:15;22257:4;22254:1;22247:15;22274:174;22414:26;22410:1;22402:6;22398:14;22391:50;22274:174;:::o;22454:366::-;22596:3;22617:67;22681:2;22676:3;22617:67;:::i;:::-;22610:74;;22693:93;22782:3;22693:93;:::i;:::-;22811:2;22806:3;22802:12;22795:19;;22454:366;;;:::o;22826:419::-;22992:4;23030:2;23019:9;23015:18;23007:26;;23079:9;23073:4;23069:20;23065:1;23054:9;23050:17;23043:47;23107:131;23233:4;23107:131;:::i;:::-;23099:139;;22826:419;;;:::o;23251:172::-;23391:24;23387:1;23379:6;23375:14;23368:48;23251:172;:::o;23429:366::-;23571:3;23592:67;23656:2;23651:3;23592:67;:::i;:::-;23585:74;;23668:93;23757:3;23668:93;:::i;:::-;23786:2;23781:3;23777:12;23770:19;;23429:366;;;:::o;23801:419::-;23967:4;24005:2;23994:9;23990:18;23982:26;;24054:9;24048:4;24044:20;24040:1;24029:9;24025:17;24018:47;24082:131;24208:4;24082:131;:::i;:::-;24074:139;;23801:419;;;:::o;24226:167::-;24366:19;24362:1;24354:6;24350:14;24343:43;24226:167;:::o;24399:366::-;24541:3;24562:67;24626:2;24621:3;24562:67;:::i;:::-;24555:74;;24638:93;24727:3;24638:93;:::i;:::-;24756:2;24751:3;24747:12;24740:19;;24399:366;;;:::o;24771:419::-;24937:4;24975:2;24964:9;24960:18;24952:26;;25024:9;25018:4;25014:20;25010:1;24999:9;24995:17;24988:47;25052:131;25178:4;25052:131;:::i;:::-;25044:139;;24771:419;;;:::o;25196:176::-;25336:28;25332:1;25324:6;25320:14;25313:52;25196:176;:::o;25378:366::-;25520:3;25541:67;25605:2;25600:3;25541:67;:::i;:::-;25534:74;;25617:93;25706:3;25617:93;:::i;:::-;25735:2;25730:3;25726:12;25719:19;;25378:366;;;:::o;25750:419::-;25916:4;25954:2;25943:9;25939:18;25931:26;;26003:9;25997:4;25993:20;25989:1;25978:9;25974:17;25967:47;26031:131;26157:4;26031:131;:::i;:::-;26023:139;;25750:419;;;:::o;26175:166::-;26315:18;26311:1;26303:6;26299:14;26292:42;26175:166;:::o;26347:366::-;26489:3;26510:67;26574:2;26569:3;26510:67;:::i;:::-;26503:74;;26586:93;26675:3;26586:93;:::i;:::-;26704:2;26699:3;26695:12;26688:19;;26347:366;;;:::o;26719:419::-;26885:4;26923:2;26912:9;26908:18;26900:26;;26972:9;26966:4;26962:20;26958:1;26947:9;26943:17;26936:47;27000:131;27126:4;27000:131;:::i;:::-;26992:139;;26719:419;;;:::o;27144:171::-;27284:23;27280:1;27272:6;27268:14;27261:47;27144:171;:::o;27321:366::-;27463:3;27484:67;27548:2;27543:3;27484:67;:::i;:::-;27477:74;;27560:93;27649:3;27560:93;:::i;:::-;27678:2;27673:3;27669:12;27662:19;;27321:366;;;:::o;27693:419::-;27859:4;27897:2;27886:9;27882:18;27874:26;;27946:9;27940:4;27936:20;27932:1;27921:9;27917:17;27910:47;27974:131;28100:4;27974:131;:::i;:::-;27966:139;;27693:419;;;:::o;28118:148::-;28220:11;28257:3;28242:18;;28118:148;;;;:::o;28272:141::-;28321:4;28344:3;28336:11;;28367:3;28364:1;28357:14;28401:4;28398:1;28388:18;28380:26;;28272:141;;;:::o;28443:845::-;28546:3;28583:5;28577:12;28612:36;28638:9;28612:36;:::i;:::-;28664:89;28746:6;28741:3;28664:89;:::i;:::-;28657:96;;28784:1;28773:9;28769:17;28800:1;28795:137;;;;28946:1;28941:341;;;;28762:520;;28795:137;28879:4;28875:9;28864;28860:25;28855:3;28848:38;28915:6;28910:3;28906:16;28899:23;;28795:137;;28941:341;29008:38;29040:5;29008:38;:::i;:::-;29068:1;29082:154;29096:6;29093:1;29090:13;29082:154;;;29170:7;29164:14;29160:1;29155:3;29151:11;29144:35;29220:1;29211:7;29207:15;29196:26;;29118:4;29115:1;29111:12;29106:17;;29082:154;;;29265:6;29260:3;29256:16;29249:23;;28948:334;;28762:520;;28550:738;;28443:845;;;;:::o;29294:377::-;29400:3;29428:39;29461:5;29428:39;:::i;:::-;29483:89;29565:6;29560:3;29483:89;:::i;:::-;29476:96;;29581:52;29626:6;29621:3;29614:4;29607:5;29603:16;29581:52;:::i;:::-;29658:6;29653:3;29649:16;29642:23;;29404:267;29294:377;;;;:::o;29677:429::-;29854:3;29876:92;29964:3;29955:6;29876:92;:::i;:::-;29869:99;;29985:95;30076:3;30067:6;29985:95;:::i;:::-;29978:102;;30097:3;30090:10;;29677:429;;;;;:::o;30112:155::-;30252:7;30248:1;30240:6;30236:14;30229:31;30112:155;:::o;30273:400::-;30433:3;30454:84;30536:1;30531:3;30454:84;:::i;:::-;30447:91;;30547:93;30636:3;30547:93;:::i;:::-;30665:1;30660:3;30656:11;30649:18;;30273:400;;;:::o;30679:695::-;30957:3;30979:92;31067:3;31058:6;30979:92;:::i;:::-;30972:99;;31088:95;31179:3;31170:6;31088:95;:::i;:::-;31081:102;;31200:148;31344:3;31200:148;:::i;:::-;31193:155;;31365:3;31358:10;;30679:695;;;;;:::o;31380:225::-;31520:34;31516:1;31508:6;31504:14;31497:58;31589:8;31584:2;31576:6;31572:15;31565:33;31380:225;:::o;31611:366::-;31753:3;31774:67;31838:2;31833:3;31774:67;:::i;:::-;31767:74;;31850:93;31939:3;31850:93;:::i;:::-;31968:2;31963:3;31959:12;31952:19;;31611:366;;;:::o;31983:419::-;32149:4;32187:2;32176:9;32172:18;32164:26;;32236:9;32230:4;32226:20;32222:1;32211:9;32207:17;32200:47;32264:131;32390:4;32264:131;:::i;:::-;32256:139;;31983:419;;;:::o;32408:229::-;32548:34;32544:1;32536:6;32532:14;32525:58;32617:12;32612:2;32604:6;32600:15;32593:37;32408:229;:::o;32643:366::-;32785:3;32806:67;32870:2;32865:3;32806:67;:::i;:::-;32799:74;;32882:93;32971:3;32882:93;:::i;:::-;33000:2;32995:3;32991:12;32984:19;;32643:366;;;:::o;33015:419::-;33181:4;33219:2;33208:9;33204:18;33196:26;;33268:9;33262:4;33258:20;33254:1;33243:9;33239:17;33232:47;33296:131;33422:4;33296:131;:::i;:::-;33288:139;;33015:419;;;:::o;33440:175::-;33580:27;33576:1;33568:6;33564:14;33557:51;33440:175;:::o;33621:366::-;33763:3;33784:67;33848:2;33843:3;33784:67;:::i;:::-;33777:74;;33860:93;33949:3;33860:93;:::i;:::-;33978:2;33973:3;33969:12;33962:19;;33621:366;;;:::o;33993:419::-;34159:4;34197:2;34186:9;34182:18;34174:26;;34246:9;34240:4;34236:20;34232:1;34221:9;34217:17;34210:47;34274:131;34400:4;34274:131;:::i;:::-;34266:139;;33993:419;;;:::o;34418:332::-;34539:4;34577:2;34566:9;34562:18;34554:26;;34590:71;34658:1;34647:9;34643:17;34634:6;34590:71;:::i;:::-;34671:72;34739:2;34728:9;34724:18;34715:6;34671:72;:::i;:::-;34418:332;;;;;:::o;34756:137::-;34810:5;34841:6;34835:13;34826:22;;34857:30;34881:5;34857:30;:::i;:::-;34756:137;;;;:::o;34899:345::-;34966:6;35015:2;35003:9;34994:7;34990:23;34986:32;34983:119;;;35021:79;;:::i;:::-;34983:119;35141:1;35166:61;35219:7;35210:6;35199:9;35195:22;35166:61;:::i;:::-;35156:71;;35112:125;34899:345;;;;:::o;35250:233::-;35289:3;35312:24;35330:5;35312:24;:::i;:::-;35303:33;;35358:66;35351:5;35348:77;35345:103;;35428:18;;:::i;:::-;35345:103;35475:1;35468:5;35464:13;35457:20;;35250:233;;;:::o;35489:176::-;35521:1;35538:20;35556:1;35538:20;:::i;:::-;35533:25;;35572:20;35590:1;35572:20;:::i;:::-;35567:25;;35611:1;35601:35;;35616:18;;:::i;:::-;35601:35;35657:1;35654;35650:9;35645:14;;35489:176;;;;:::o;35671:180::-;35719:77;35716:1;35709:88;35816:4;35813:1;35806:15;35840:4;35837:1;35830:15;35857:98;35908:6;35942:5;35936:12;35926:22;;35857:98;;;:::o;35961:168::-;36044:11;36078:6;36073:3;36066:19;36118:4;36113:3;36109:14;36094:29;;35961:168;;;;:::o;36135:360::-;36221:3;36249:38;36281:5;36249:38;:::i;:::-;36303:70;36366:6;36361:3;36303:70;:::i;:::-;36296:77;;36382:52;36427:6;36422:3;36415:4;36408:5;36404:16;36382:52;:::i;:::-;36459:29;36481:6;36459:29;:::i;:::-;36454:3;36450:39;36443:46;;36225:270;36135:360;;;;:::o;36501:640::-;36696:4;36734:3;36723:9;36719:19;36711:27;;36748:71;36816:1;36805:9;36801:17;36792:6;36748:71;:::i;:::-;36829:72;36897:2;36886:9;36882:18;36873:6;36829:72;:::i;:::-;36911;36979:2;36968:9;36964:18;36955:6;36911:72;:::i;:::-;37030:9;37024:4;37020:20;37015:2;37004:9;37000:18;36993:48;37058:76;37129:4;37120:6;37058:76;:::i;:::-;37050:84;;36501:640;;;;;;;:::o;37147:141::-;37203:5;37234:6;37228:13;37219:22;;37250:32;37276:5;37250:32;:::i;:::-;37147:141;;;;:::o;37294:349::-;37363:6;37412:2;37400:9;37391:7;37387:23;37383:32;37380:119;;;37418:79;;:::i;:::-;37380:119;37538:1;37563:63;37618:7;37609:6;37598:9;37594:22;37563:63;:::i;:::-;37553:73;;37509:127;37294:349;;;;:::o
Swarm Source
ipfs://2fb0f97050f4cb085b7efb8bec413e3891feb9683990aef26bafb35e53883027
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.