Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
257 InuClub
Holders
148
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 InuClubLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
InuNFT
Compiler Version
v0.8.1+commit.df193b15
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-05 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @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); } /** * @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; } } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @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); } /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = true; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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); } } } } /** * @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); } } /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } } /** * @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 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 = 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 { require(operator != _msgSender(), "ERC721: approve to caller"); _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 { //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 || getApproved(tokenId) == spender || isApprovedForAll(owner, 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); } /** * @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); } /** * @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 of token that is not own"); 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); } /** * @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 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 {} } /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } } contract InuNFT is ERC721, Ownable, ERC721Burnable, ERC721Pausable { uint256 private _tokenIdTracker; uint256 public constant MAX_ELEMENTS = 1000; uint256 public constant PRESALE_ELEMENTS = 900; uint256 public constant PRICE = 0.08 ether; uint256 public constant PRICE2 = 0.08 ether; uint256 public constant MAX_BY_MINT = 1; uint256 public constant tierOneMaxMint = 1; uint256 public constant tierTwoMaxMint = 2; uint256 public constant tierThreeMaxMint = 3; uint256 public MINT_NUMBER = 0; string public baseTokenURI; address public withdrawAddress; bytes32 public tierOneMerkleRoot; bytes32 public tierTwoMerkleRoot; bytes32 public tierThreeMerkleRoot; mapping(address => uint256) public whitelistClaimed; bool public publicSaleOpen = true; bool public tier2Start = false; event CreateItem(uint256 indexed id); constructor() ERC721("THE INU NFT CLUB", "InuClub") { pause(false); setWithdrawAddress(_msgSender()); _mintAnElement(msg.sender); } modifier saleIsOpen { require(_tokenIdTracker <= MAX_ELEMENTS, "Sale end"); if (_msgSender() != owner()) { require(!paused(), "Pausable: paused"); } _; } modifier noContract() { address account = msg.sender; require(account == tx.origin, "Caller is a contract"); require(account.code.length == 0, "Caller is a contract"); _; } function totalSupply() public view returns (uint256) { return _tokenIdTracker; } function setPublicSale(bool val) public onlyOwner { publicSaleOpen = val; } function freeMint(uint256 _count) public payable saleIsOpen noContract { uint256 total = totalSupply(); require(publicSaleOpen, "Public sale not open yet"); require(total + _count <= MAX_ELEMENTS, "Max limit"); require(_count <= MAX_BY_MINT, "Exceeds number"); require(MINT_NUMBER <= 900, "max 900 free mint"); for (uint256 i = 0; i < _count; i++) { _mintAnElement(msg.sender); MINT_NUMBER = MINT_NUMBER + 1; } } // function setPresaleStart(bool flag) external onlyOwner { // tier2Start = flag; // } // function presaleMint(uint256 _count, bytes32[] calldata _proof, uint256 amount, uint256 _tier) public payable saleIsOpen noContract { // uint256 total = totalSupply(); // // require(_tier == 1 || _tier == 2, "only presale mint"); // // if (_tier == 2) { // // require(tier2Start == true, "presale not start"); // // require(msg.value == PRICE * _count, "Value is over or under price."); // // } // require(total + _count <= PRESALE_ELEMENTS, "Max limit"); // // require(verifySender(_proof, amount, _tier), "Sender is not whitelisted"); // require(canMintAmount(_count, _tier), "Sender max presale mint amount already met"); // whitelistClaimed[msg.sender] += _count; // for (uint256 i = 0; i < _count; i++) { // _mintAnElement(msg.sender); // } // } function ownerMint(uint256 _count, address addr) public onlyOwner { uint256 total = totalSupply(); require(total + _count <= MAX_ELEMENTS, "Sale end"); for (uint256 i = 0; i < _count; i++) { _mintAnElement(addr); } } function _mintAnElement(address _to) private { uint id = totalSupply(); _tokenIdTracker += 1; _mint(_to, id); emit CreateItem(id); } // function canMintAmount(uint256 _count, uint256 _tier) public view returns (bool) { // uint256 maxMintAmount = MAX_BY_MINT; // // if (_tier == 1) { // // maxMintAmount = tierOneMaxMint; // // } else if (_tier == 2) { // // maxMintAmount = tierTwoMaxMint; // // } else if (_tier == 3) { // // maxMintAmount = tierThreeMaxMint; // // } // return whitelistClaimed[msg.sender] + _count <= maxMintAmount; // } // function setWhitelistMerkleRoot(bytes32 _merkleRoot, uint256 _tier) external onlyOwner { // require(_tierExists(_tier), "Tier does not exist"); // if (_tier == 1) { // tierOneMerkleRoot = _merkleRoot; // } else if (_tier == 2) { // tierTwoMerkleRoot = _merkleRoot; // } else if (_tier == 3) { // tierThreeMerkleRoot = _merkleRoot; // } // } // function _tierExists(uint256 _tier) private pure returns (bool) { // return _tier <= 3; // } // function verifySender(bytes32[] calldata proof, uint256 amount, uint256 _tier) public view returns (bool) { // return _verify(proof, keccak256(abi.encodePacked(msg.sender, amount)), _tier); // } // function _verify(bytes32[] calldata proof, bytes32 addressHash, uint256 _tier) internal view returns (bool) { // bytes32 whitelistMerkleRoot; // if (_tier == 1) { // whitelistMerkleRoot = tierOneMerkleRoot; // } else if (_tier == 2) { // whitelistMerkleRoot = tierTwoMerkleRoot; // } else if (_tier == 3) { // whitelistMerkleRoot = tierThreeMerkleRoot; // } // return MerkleProof.verify(proof, whitelistMerkleRoot, addressHash); // } // function _hash(address _address) internal pure returns (bytes32) { // return keccak256(abi.encodePacked(_address)); // } function _baseURI() internal view virtual override returns (string memory) { return baseTokenURI; } function setBaseURI(string memory baseURI) public onlyOwner { baseTokenURI = baseURI; } function pause(bool val) public onlyOwner { if (val == true) { _pause(); return; } _unpause(); } function withdrawAll() public onlyOwner { uint256 balance = address(this).balance; require(balance > 0); _withdraw(withdrawAddress, balance); } function setWithdrawAddress(address _withdrawAddress) public onlyOwner { withdrawAddress = _withdrawAddress; } function _withdraw(address _address, uint256 _amount) private { (bool success, ) = _address.call{value: _amount}(""); require(success, "Transfer failed."); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override(ERC721, ERC721Pausable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"uint256","name":"id","type":"uint256"}],"name":"CreateItem","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_BY_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ELEMENTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_NUMBER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_ELEMENTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"address","name":"addr","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_withdrawAddress","type":"address"}],"name":"setWithdrawAddress","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":"tier2Start","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tierOneMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tierOneMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tierThreeMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tierThreeMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tierTwoMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tierTwoMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260006008556001600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff0219169083151502179055503480156200004c57600080fd5b506040518060400160405280601081526020017f54484520494e55204e465420434c5542000000000000000000000000000000008152506040518060400160405280600781526020017f496e75436c7562000000000000000000000000000000000000000000000000008152508160009080519060200190620000d1929190620008ea565b508060019080519060200190620000ea929190620008ea565b5050506200010d620001016200017160201b60201c565b6200017960201b60201c565b6001600660146101000a81548160ff0219169083151502179055506200013a60006200023f60201b60201c565b6200015a6200014e6200017160201b60201c565b6200030660201b60201c565b6200016b33620003d960201b60201c565b62000dda565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200024f6200017160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002756200044c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002ce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002c59062000b5c565b60405180910390fd5b600115158115151415620002f257620002ec6200047660201b60201c565b62000303565b620003026200052e60201b60201c565b5b50565b620003166200017160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200033c6200044c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000395576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038c9062000b5c565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000620003eb620005e560201b60201c565b905060016007600082825462000402919062000b8f565b925050819055506200041b8282620005ef60201b60201c565b807fdfe3e57736ff136c528786ad701a1b04e118a2c7a62a61f5fd8ea48b8729ea2360405160405180910390a25050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b62000486620007d560201b60201c565b15620004c9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004c09062000b18565b60405180910390fd5b6001600660146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620005156200017160201b60201c565b60405162000524919062000a95565b60405180910390a1565b6200053e620007d560201b60201c565b62000580576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005779062000ad4565b60405180910390fd5b6000600660146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa620005cc6200017160201b60201c565b604051620005db919062000a95565b60405180910390a1565b6000600754905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000662576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006599062000b3a565b60405180910390fd5b6200067381620007ec60201b60201c565b15620006b6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006ad9062000af6565b60405180910390fd5b620006ca600083836200085860201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200071c919062000b8f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600660149054906101000a900460ff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b620008708383836200087560201b62001c761760201c565b505050565b6200088d838383620008e560201b62001cce1760201c565b6200089d620007d560201b60201c565b15620008e0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008d79062000ab2565b60405180910390fd5b505050565b505050565b828054620008f89062000c2a565b90600052602060002090601f0160209004810192826200091c576000855562000968565b82601f106200093757805160ff191683800117855562000968565b8280016001018555821562000968579182015b82811115620009675782518255916020019190600101906200094a565b5b5090506200097791906200097b565b5090565b5b80821115620009965760008160009055506001016200097c565b5090565b620009a58162000bec565b82525050565b6000620009ba602b8362000b7e565b9150620009c78262000cbe565b604082019050919050565b6000620009e160148362000b7e565b9150620009ee8262000d0d565b602082019050919050565b600062000a08601c8362000b7e565b915062000a158262000d36565b602082019050919050565b600062000a2f60108362000b7e565b915062000a3c8262000d5f565b602082019050919050565b600062000a5660208362000b7e565b915062000a638262000d88565b602082019050919050565b600062000a7d60208362000b7e565b915062000a8a8262000db1565b602082019050919050565b600060208201905062000aac60008301846200099a565b92915050565b6000602082019050818103600083015262000acd81620009ab565b9050919050565b6000602082019050818103600083015262000aef81620009d2565b9050919050565b6000602082019050818103600083015262000b1181620009f9565b9050919050565b6000602082019050818103600083015262000b338162000a20565b9050919050565b6000602082019050818103600083015262000b558162000a47565b9050919050565b6000602082019050818103600083015262000b778162000a6e565b9050919050565b600082825260208201905092915050565b600062000b9c8262000c20565b915062000ba98362000c20565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000be15762000be062000c60565b5b828201905092915050565b600062000bf98262000c00565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000600282049050600182168062000c4357607f821691505b6020821081141562000c5a5762000c5962000c8f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6145978062000dea6000396000f3fe60806040526004361061025c5760003560e01c806370a0823111610144578063a22cb465116100b6578063d8abaeeb1161007a578063d8abaeeb146108a5578063db4bec44146108d0578063e985e9c51461090d578063ef4468241461094a578063f2fde38b14610975578063f9e237991461099e5761025c565b8063a22cb465146107c2578063b88d4fde146107eb578063c87b56dd14610814578063d52c57e014610851578063d547cfb71461087a5761025c565b80638d859f3e116101085780638d859f3e146106c05780638da5cb5b146106eb578063938fb8651461071657806395d89b4114610741578063998428311461076c578063a1542bd2146107975761025c565b806370a082311461060e578063715018a61461064b5780637c928fe914610662578063853828b61461067e5780638ad5de28146106955761025c565b80633ab1a494116101dd5780635c975abb116101a15780635c975abb146104fa5780635f6a0589146105255780636146af4f146105505780636352211e1461057b57806365baf5db146105b85780636a5da9ee146105e35761025c565b80633ab1a4941461042d57806342842e0e1461045657806342966c681461047f57806355f804b3146104a85780635aca1bb6146104d15761025c565b8063095ea7b311610224578063095ea7b31461035a5780631581b6001461038357806318160ddd146103ae57806323b872dd146103d95780633502a716146104025761025c565b806301ffc9a71461026157806302329a291461029e57806305ffe170146102c757806306fdde03146102f2578063081812fc1461031d575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613083565b6109c9565b60405161029591906136ce565b60405180910390f35b3480156102aa57600080fd5b506102c560048036038101906102c0919061305a565b6109db565b005b3480156102d357600080fd5b506102dc610a7d565b6040516102e99190613a86565b60405180910390f35b3480156102fe57600080fd5b50610307610a82565b6040516103149190613704565b60405180910390f35b34801561032957600080fd5b50610344600480360381019061033f9190613116565b610b14565b6040516103519190613667565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c919061301e565b610b99565b005b34801561038f57600080fd5b50610398610cb1565b6040516103a59190613667565b60405180910390f35b3480156103ba57600080fd5b506103c3610cd7565b6040516103d09190613a86565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb9190612f18565b610ce1565b005b34801561040e57600080fd5b50610417610d41565b6040516104249190613a86565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f9190612eb3565b610d47565b005b34801561046257600080fd5b5061047d60048036038101906104789190612f18565b610e07565b005b34801561048b57600080fd5b506104a660048036038101906104a19190613116565b610e27565b005b3480156104b457600080fd5b506104cf60048036038101906104ca91906130d5565b610e83565b005b3480156104dd57600080fd5b506104f860048036038101906104f3919061305a565b610f19565b005b34801561050657600080fd5b5061050f610fb2565b60405161051c91906136ce565b60405180910390f35b34801561053157600080fd5b5061053a610fc9565b60405161054791906136e9565b60405180910390f35b34801561055c57600080fd5b50610565610fcf565b6040516105729190613a86565b60405180910390f35b34801561058757600080fd5b506105a2600480360381019061059d9190613116565b610fd4565b6040516105af9190613667565b60405180910390f35b3480156105c457600080fd5b506105cd611086565b6040516105da91906136ce565b60405180910390f35b3480156105ef57600080fd5b506105f8611099565b6040516106059190613a86565b60405180910390f35b34801561061a57600080fd5b5061063560048036038101906106309190612eb3565b61109f565b6040516106429190613a86565b60405180910390f35b34801561065757600080fd5b50610660611157565b005b61067c60048036038101906106779190613116565b6111df565b005b34801561068a57600080fd5b506106936114f5565b005b3480156106a157600080fd5b506106aa6115b2565b6040516106b79190613a86565b60405180910390f35b3480156106cc57600080fd5b506106d56115b7565b6040516106e29190613a86565b60405180910390f35b3480156106f757600080fd5b506107006115c3565b60405161070d9190613667565b60405180910390f35b34801561072257600080fd5b5061072b6115ed565b60405161073891906136e9565b60405180910390f35b34801561074d57600080fd5b506107566115f3565b6040516107639190613704565b60405180910390f35b34801561077857600080fd5b50610781611685565b60405161078e91906136e9565b60405180910390f35b3480156107a357600080fd5b506107ac61168b565b6040516107b99190613a86565b60405180910390f35b3480156107ce57600080fd5b506107e960048036038101906107e49190612fe2565b611697565b005b3480156107f757600080fd5b50610812600480360381019061080d9190612f67565b611818565b005b34801561082057600080fd5b5061083b60048036038101906108369190613116565b61187a565b6040516108489190613704565b60405180910390f35b34801561085d57600080fd5b506108786004803603810190610873919061313f565b611921565b005b34801561088657600080fd5b5061088f611a26565b60405161089c9190613704565b60405180910390f35b3480156108b157600080fd5b506108ba611ab4565b6040516108c79190613a86565b60405180910390f35b3480156108dc57600080fd5b506108f760048036038101906108f29190612eb3565b611aba565b6040516109049190613a86565b60405180910390f35b34801561091957600080fd5b50610934600480360381019061092f9190612edc565b611ad2565b60405161094191906136ce565b60405180910390f35b34801561095657600080fd5b5061095f611b66565b60405161096c9190613a86565b60405180910390f35b34801561098157600080fd5b5061099c60048036038101906109979190612eb3565b611b6b565b005b3480156109aa57600080fd5b506109b3611c63565b6040516109c091906136ce565b60405180910390f35b60006109d482611cd3565b9050919050565b6109e3611db5565b73ffffffffffffffffffffffffffffffffffffffff16610a016115c3565b73ffffffffffffffffffffffffffffffffffffffff1614610a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4e90613966565b60405180910390fd5b600115158115151415610a7157610a6c611dbd565b610a7a565b610a79611e60565b5b50565b600181565b606060008054610a9190613cf1565b80601f0160208091040260200160405190810160405280929190818152602001828054610abd90613cf1565b8015610b0a5780601f10610adf57610100808354040283529160200191610b0a565b820191906000526020600020905b815481529060010190602001808311610aed57829003601f168201915b5050505050905090565b6000610b1f82611f02565b610b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5590613946565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ba482610fd4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0c906139e6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c34611db5565b73ffffffffffffffffffffffffffffffffffffffff161480610c635750610c6281610c5d611db5565b611ad2565b5b610ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c99906138a6565b60405180910390fd5b610cac8383611f6e565b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600754905090565b610cf2610cec611db5565b82612027565b610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2890613a26565b60405180910390fd5b610d3c838383612105565b505050565b6103e881565b610d4f611db5565b73ffffffffffffffffffffffffffffffffffffffff16610d6d6115c3565b73ffffffffffffffffffffffffffffffffffffffff1614610dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba90613966565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610e2283838360405180602001604052806000815250611818565b505050565b610e38610e32611db5565b82612027565b610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e90613a66565b60405180910390fd5b610e8081612361565b50565b610e8b611db5565b73ffffffffffffffffffffffffffffffffffffffff16610ea96115c3565b73ffffffffffffffffffffffffffffffffffffffff1614610eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef690613966565b60405180910390fd5b8060099080519060200190610f15929190612cd7565b5050565b610f21611db5565b73ffffffffffffffffffffffffffffffffffffffff16610f3f6115c3565b73ffffffffffffffffffffffffffffffffffffffff1614610f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8c90613966565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b6000600660149054906101000a900460ff16905090565b600d5481565b600281565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561107d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611074906138e6565b60405180910390fd5b80915050919050565b600f60019054906101000a900460ff1681565b61038481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611110576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611107906138c6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61115f611db5565b73ffffffffffffffffffffffffffffffffffffffff1661117d6115c3565b73ffffffffffffffffffffffffffffffffffffffff16146111d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ca90613966565b60405180910390fd5b6111dd6000612472565b565b6103e86007541115611226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121d90613926565b60405180910390fd5b61122e6115c3565b73ffffffffffffffffffffffffffffffffffffffff1661124c611db5565b73ffffffffffffffffffffffffffffffffffffffff16146112b05761126f610fb2565b156112af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a690613886565b60405180910390fd5b5b60003390503273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131a906137e6565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff163b1461137d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611374906137e6565b60405180910390fd5b6000611387610cd7565b9050600f60009054906101000a900460ff166113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf90613a46565b60405180910390fd5b6103e883826113e79190613b76565b1115611428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141f90613846565b60405180910390fd5b600183111561146c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146390613766565b60405180910390fd5b61038460085411156114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa906139a6565b60405180910390fd5b60005b838110156114ef576114c733612538565b60016008546114d69190613b76565b60088190555080806114e790613d54565b9150506114b6565b50505050565b6114fd611db5565b73ffffffffffffffffffffffffffffffffffffffff1661151b6115c3565b73ffffffffffffffffffffffffffffffffffffffff1614611571576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156890613966565b60405180910390fd5b60004790506000811161158357600080fd5b6115af600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612599565b50565b600181565b67011c37937e08000081565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c5481565b60606001805461160290613cf1565b80601f016020809104026020016040519081016040528092919081815260200182805461162e90613cf1565b801561167b5780601f106116505761010080835404028352916020019161167b565b820191906000526020600020905b81548152906001019060200180831161165e57829003601f168201915b5050505050905090565b600b5481565b67011c37937e08000081565b61169f611db5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561170d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170490613826565b60405180910390fd5b806005600061171a611db5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117c7611db5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161180c91906136ce565b60405180910390a35050565b611829611823611db5565b83612027565b611868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185f90613a26565b60405180910390fd5b6118748484848461264a565b50505050565b606061188582611f02565b6118c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bb906139c6565b60405180910390fd5b60006118ce6126a6565b905060008151116118ee5760405180602001604052806000815250611919565b806118f884612738565b60405160200161190992919061362e565b6040516020818303038152906040525b915050919050565b611929611db5565b73ffffffffffffffffffffffffffffffffffffffff166119476115c3565b73ffffffffffffffffffffffffffffffffffffffff161461199d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199490613966565b60405180910390fd5b60006119a7610cd7565b90506103e883826119b89190613b76565b11156119f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f090613926565b60405180910390fd5b60005b83811015611a2057611a0d83612538565b8080611a1890613d54565b9150506119fc565b50505050565b60098054611a3390613cf1565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5f90613cf1565b8015611aac5780601f10611a8157610100808354040283529160200191611aac565b820191906000526020600020905b815481529060010190602001808311611a8f57829003601f168201915b505050505081565b60085481565b600e6020528060005260406000206000915090505481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600381565b611b73611db5565b73ffffffffffffffffffffffffffffffffffffffff16611b916115c3565b73ffffffffffffffffffffffffffffffffffffffff1614611be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bde90613966565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4e906137a6565b60405180910390fd5b611c6081612472565b50565b600f60009054906101000a900460ff1681565b611c81838383611cce565b611c89610fb2565b15611cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc090613726565b60405180910390fd5b505050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d9e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611dae5750611dad826128e5565b5b9050919050565b600033905090565b611dc5610fb2565b15611e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfc90613886565b60405180910390fd5b6001600660146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611e49611db5565b604051611e569190613667565b60405180910390a1565b611e68610fb2565b611ea7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9e90613746565b60405180910390fd5b6000600660146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611eeb611db5565b604051611ef89190613667565b60405180910390a1565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611fe183610fd4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061203282611f02565b612071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206890613866565b60405180910390fd5b600061207c83610fd4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120eb57508373ffffffffffffffffffffffffffffffffffffffff166120d384610b14565b73ffffffffffffffffffffffffffffffffffffffff16145b806120fc57506120fb8185611ad2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661212582610fd4565b73ffffffffffffffffffffffffffffffffffffffff161461217b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217290613986565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e290613806565b60405180910390fd5b6121f683838361294f565b612201600082611f6e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122519190613bfd565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122a89190613b76565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061236c82610fd4565b905061237a8160008461294f565b612385600083611f6e565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123d59190613bfd565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612542610cd7565b90506001600760008282546125579190613b76565b92505081905550612568828261295f565b807fdfe3e57736ff136c528786ad701a1b04e118a2c7a62a61f5fd8ea48b8729ea2360405160405180910390a25050565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516125bf90613652565b60006040518083038185875af1925050503d80600081146125fc576040519150601f19603f3d011682016040523d82523d6000602084013e612601565b606091505b5050905080612645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263c90613a06565b60405180910390fd5b505050565b612655848484612105565b61266184848484612b2d565b6126a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269790613786565b60405180910390fd5b50505050565b6060600980546126b590613cf1565b80601f01602080910402602001604051908101604052809291908181526020018280546126e190613cf1565b801561272e5780601f106127035761010080835404028352916020019161272e565b820191906000526020600020905b81548152906001019060200180831161271157829003601f168201915b5050505050905090565b60606000821415612780576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506128e0565b600082905060005b600082146127b257808061279b90613d54565b915050600a826127ab9190613bcc565b9150612788565b60008167ffffffffffffffff8111156127f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156128265781602001600182028036833780820191505090505b5090505b600085146128d95760018261283f9190613bfd565b9150600a8561284e9190613d9d565b603061285a9190613b76565b60f81b818381518110612896577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128d29190613bcc565b945061282a565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61295a838383611c76565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c690613906565b60405180910390fd5b6129d881611f02565b15612a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0f906137c6565b60405180910390fd5b612a246000838361294f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a749190613b76565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612b4e8473ffffffffffffffffffffffffffffffffffffffff16612cc4565b15612cb7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b77611db5565b8786866040518563ffffffff1660e01b8152600401612b999493929190613682565b602060405180830381600087803b158015612bb357600080fd5b505af1925050508015612be457506040513d601f19601f82011682018060405250810190612be191906130ac565b60015b612c67573d8060008114612c14576040519150601f19603f3d011682016040523d82523d6000602084013e612c19565b606091505b50600081511415612c5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5690613786565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612cbc565b600190505b949350505050565b600080823b905060008111915050919050565b828054612ce390613cf1565b90600052602060002090601f016020900481019282612d055760008555612d4c565b82601f10612d1e57805160ff1916838001178555612d4c565b82800160010185558215612d4c579182015b82811115612d4b578251825591602001919060010190612d30565b5b509050612d599190612d5d565b5090565b5b80821115612d76576000816000905550600101612d5e565b5090565b6000612d8d612d8884613ac6565b613aa1565b905082815260208101848484011115612da557600080fd5b612db0848285613caf565b509392505050565b6000612dcb612dc684613af7565b613aa1565b905082815260208101848484011115612de357600080fd5b612dee848285613caf565b509392505050565b600081359050612e0581614505565b92915050565b600081359050612e1a8161451c565b92915050565b600081359050612e2f81614533565b92915050565b600081519050612e4481614533565b92915050565b600082601f830112612e5b57600080fd5b8135612e6b848260208601612d7a565b91505092915050565b600082601f830112612e8557600080fd5b8135612e95848260208601612db8565b91505092915050565b600081359050612ead8161454a565b92915050565b600060208284031215612ec557600080fd5b6000612ed384828501612df6565b91505092915050565b60008060408385031215612eef57600080fd5b6000612efd85828601612df6565b9250506020612f0e85828601612df6565b9150509250929050565b600080600060608486031215612f2d57600080fd5b6000612f3b86828701612df6565b9350506020612f4c86828701612df6565b9250506040612f5d86828701612e9e565b9150509250925092565b60008060008060808587031215612f7d57600080fd5b6000612f8b87828801612df6565b9450506020612f9c87828801612df6565b9350506040612fad87828801612e9e565b925050606085013567ffffffffffffffff811115612fca57600080fd5b612fd687828801612e4a565b91505092959194509250565b60008060408385031215612ff557600080fd5b600061300385828601612df6565b925050602061301485828601612e0b565b9150509250929050565b6000806040838503121561303157600080fd5b600061303f85828601612df6565b925050602061305085828601612e9e565b9150509250929050565b60006020828403121561306c57600080fd5b600061307a84828501612e0b565b91505092915050565b60006020828403121561309557600080fd5b60006130a384828501612e20565b91505092915050565b6000602082840312156130be57600080fd5b60006130cc84828501612e35565b91505092915050565b6000602082840312156130e757600080fd5b600082013567ffffffffffffffff81111561310157600080fd5b61310d84828501612e74565b91505092915050565b60006020828403121561312857600080fd5b600061313684828501612e9e565b91505092915050565b6000806040838503121561315257600080fd5b600061316085828601612e9e565b925050602061317185828601612df6565b9150509250929050565b61318481613c31565b82525050565b61319381613c43565b82525050565b6131a281613c4f565b82525050565b60006131b382613b28565b6131bd8185613b3e565b93506131cd818560208601613cbe565b6131d681613e8a565b840191505092915050565b60006131ec82613b33565b6131f68185613b5a565b9350613206818560208601613cbe565b61320f81613e8a565b840191505092915050565b600061322582613b33565b61322f8185613b6b565b935061323f818560208601613cbe565b80840191505092915050565b6000613258602b83613b5a565b915061326382613e9b565b604082019050919050565b600061327b601483613b5a565b915061328682613eea565b602082019050919050565b600061329e600e83613b5a565b91506132a982613f13565b602082019050919050565b60006132c1603283613b5a565b91506132cc82613f3c565b604082019050919050565b60006132e4602683613b5a565b91506132ef82613f8b565b604082019050919050565b6000613307601c83613b5a565b915061331282613fda565b602082019050919050565b600061332a601483613b5a565b915061333582614003565b602082019050919050565b600061334d602483613b5a565b91506133588261402c565b604082019050919050565b6000613370601983613b5a565b915061337b8261407b565b602082019050919050565b6000613393600983613b5a565b915061339e826140a4565b602082019050919050565b60006133b6602c83613b5a565b91506133c1826140cd565b604082019050919050565b60006133d9601083613b5a565b91506133e48261411c565b602082019050919050565b60006133fc603883613b5a565b915061340782614145565b604082019050919050565b600061341f602a83613b5a565b915061342a82614194565b604082019050919050565b6000613442602983613b5a565b915061344d826141e3565b604082019050919050565b6000613465602083613b5a565b915061347082614232565b602082019050919050565b6000613488600883613b5a565b91506134938261425b565b602082019050919050565b60006134ab602c83613b5a565b91506134b682614284565b604082019050919050565b60006134ce602083613b5a565b91506134d9826142d3565b602082019050919050565b60006134f1602983613b5a565b91506134fc826142fc565b604082019050919050565b6000613514601183613b5a565b915061351f8261434b565b602082019050919050565b6000613537602f83613b5a565b915061354282614374565b604082019050919050565b600061355a602183613b5a565b9150613565826143c3565b604082019050919050565b600061357d600083613b4f565b915061358882614412565b600082019050919050565b60006135a0601083613b5a565b91506135ab82614415565b602082019050919050565b60006135c3603183613b5a565b91506135ce8261443e565b604082019050919050565b60006135e6601883613b5a565b91506135f18261448d565b602082019050919050565b6000613609603083613b5a565b9150613614826144b6565b604082019050919050565b61362881613ca5565b82525050565b600061363a828561321a565b9150613646828461321a565b91508190509392505050565b600061365d82613570565b9150819050919050565b600060208201905061367c600083018461317b565b92915050565b6000608082019050613697600083018761317b565b6136a4602083018661317b565b6136b1604083018561361f565b81810360608301526136c381846131a8565b905095945050505050565b60006020820190506136e3600083018461318a565b92915050565b60006020820190506136fe6000830184613199565b92915050565b6000602082019050818103600083015261371e81846131e1565b905092915050565b6000602082019050818103600083015261373f8161324b565b9050919050565b6000602082019050818103600083015261375f8161326e565b9050919050565b6000602082019050818103600083015261377f81613291565b9050919050565b6000602082019050818103600083015261379f816132b4565b9050919050565b600060208201905081810360008301526137bf816132d7565b9050919050565b600060208201905081810360008301526137df816132fa565b9050919050565b600060208201905081810360008301526137ff8161331d565b9050919050565b6000602082019050818103600083015261381f81613340565b9050919050565b6000602082019050818103600083015261383f81613363565b9050919050565b6000602082019050818103600083015261385f81613386565b9050919050565b6000602082019050818103600083015261387f816133a9565b9050919050565b6000602082019050818103600083015261389f816133cc565b9050919050565b600060208201905081810360008301526138bf816133ef565b9050919050565b600060208201905081810360008301526138df81613412565b9050919050565b600060208201905081810360008301526138ff81613435565b9050919050565b6000602082019050818103600083015261391f81613458565b9050919050565b6000602082019050818103600083015261393f8161347b565b9050919050565b6000602082019050818103600083015261395f8161349e565b9050919050565b6000602082019050818103600083015261397f816134c1565b9050919050565b6000602082019050818103600083015261399f816134e4565b9050919050565b600060208201905081810360008301526139bf81613507565b9050919050565b600060208201905081810360008301526139df8161352a565b9050919050565b600060208201905081810360008301526139ff8161354d565b9050919050565b60006020820190508181036000830152613a1f81613593565b9050919050565b60006020820190508181036000830152613a3f816135b6565b9050919050565b60006020820190508181036000830152613a5f816135d9565b9050919050565b60006020820190508181036000830152613a7f816135fc565b9050919050565b6000602082019050613a9b600083018461361f565b92915050565b6000613aab613abc565b9050613ab78282613d23565b919050565b6000604051905090565b600067ffffffffffffffff821115613ae157613ae0613e5b565b5b613aea82613e8a565b9050602081019050919050565b600067ffffffffffffffff821115613b1257613b11613e5b565b5b613b1b82613e8a565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b8182613ca5565b9150613b8c83613ca5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613bc157613bc0613dce565b5b828201905092915050565b6000613bd782613ca5565b9150613be283613ca5565b925082613bf257613bf1613dfd565b5b828204905092915050565b6000613c0882613ca5565b9150613c1383613ca5565b925082821015613c2657613c25613dce565b5b828203905092915050565b6000613c3c82613c85565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613cdc578082015181840152602081019050613cc1565b83811115613ceb576000848401525b50505050565b60006002820490506001821680613d0957607f821691505b60208210811415613d1d57613d1c613e2c565b5b50919050565b613d2c82613e8a565b810181811067ffffffffffffffff82111715613d4b57613d4a613e5b565b5b80604052505050565b6000613d5f82613ca5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d9257613d91613dce565b5b600182019050919050565b6000613da882613ca5565b9150613db383613ca5565b925082613dc357613dc2613dfd565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f45786365656473206e756d626572000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f43616c6c6572206973206120636f6e7472616374000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4d6178206c696d69740000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53616c6520656e64000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f6d6178203930302066726565206d696e74000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f5075626c69632073616c65206e6f74206f70656e207965740000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b61450e81613c31565b811461451957600080fd5b50565b61452581613c43565b811461453057600080fd5b50565b61453c81613c59565b811461454757600080fd5b50565b61455381613ca5565b811461455e57600080fd5b5056fea264697066735822122097fbda608b5cd4cf0bf3114353270563e65de41810e639b701ea295eef49bce164736f6c63430008010033
Deployed Bytecode
0x60806040526004361061025c5760003560e01c806370a0823111610144578063a22cb465116100b6578063d8abaeeb1161007a578063d8abaeeb146108a5578063db4bec44146108d0578063e985e9c51461090d578063ef4468241461094a578063f2fde38b14610975578063f9e237991461099e5761025c565b8063a22cb465146107c2578063b88d4fde146107eb578063c87b56dd14610814578063d52c57e014610851578063d547cfb71461087a5761025c565b80638d859f3e116101085780638d859f3e146106c05780638da5cb5b146106eb578063938fb8651461071657806395d89b4114610741578063998428311461076c578063a1542bd2146107975761025c565b806370a082311461060e578063715018a61461064b5780637c928fe914610662578063853828b61461067e5780638ad5de28146106955761025c565b80633ab1a494116101dd5780635c975abb116101a15780635c975abb146104fa5780635f6a0589146105255780636146af4f146105505780636352211e1461057b57806365baf5db146105b85780636a5da9ee146105e35761025c565b80633ab1a4941461042d57806342842e0e1461045657806342966c681461047f57806355f804b3146104a85780635aca1bb6146104d15761025c565b8063095ea7b311610224578063095ea7b31461035a5780631581b6001461038357806318160ddd146103ae57806323b872dd146103d95780633502a716146104025761025c565b806301ffc9a71461026157806302329a291461029e57806305ffe170146102c757806306fdde03146102f2578063081812fc1461031d575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613083565b6109c9565b60405161029591906136ce565b60405180910390f35b3480156102aa57600080fd5b506102c560048036038101906102c0919061305a565b6109db565b005b3480156102d357600080fd5b506102dc610a7d565b6040516102e99190613a86565b60405180910390f35b3480156102fe57600080fd5b50610307610a82565b6040516103149190613704565b60405180910390f35b34801561032957600080fd5b50610344600480360381019061033f9190613116565b610b14565b6040516103519190613667565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c919061301e565b610b99565b005b34801561038f57600080fd5b50610398610cb1565b6040516103a59190613667565b60405180910390f35b3480156103ba57600080fd5b506103c3610cd7565b6040516103d09190613a86565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb9190612f18565b610ce1565b005b34801561040e57600080fd5b50610417610d41565b6040516104249190613a86565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f9190612eb3565b610d47565b005b34801561046257600080fd5b5061047d60048036038101906104789190612f18565b610e07565b005b34801561048b57600080fd5b506104a660048036038101906104a19190613116565b610e27565b005b3480156104b457600080fd5b506104cf60048036038101906104ca91906130d5565b610e83565b005b3480156104dd57600080fd5b506104f860048036038101906104f3919061305a565b610f19565b005b34801561050657600080fd5b5061050f610fb2565b60405161051c91906136ce565b60405180910390f35b34801561053157600080fd5b5061053a610fc9565b60405161054791906136e9565b60405180910390f35b34801561055c57600080fd5b50610565610fcf565b6040516105729190613a86565b60405180910390f35b34801561058757600080fd5b506105a2600480360381019061059d9190613116565b610fd4565b6040516105af9190613667565b60405180910390f35b3480156105c457600080fd5b506105cd611086565b6040516105da91906136ce565b60405180910390f35b3480156105ef57600080fd5b506105f8611099565b6040516106059190613a86565b60405180910390f35b34801561061a57600080fd5b5061063560048036038101906106309190612eb3565b61109f565b6040516106429190613a86565b60405180910390f35b34801561065757600080fd5b50610660611157565b005b61067c60048036038101906106779190613116565b6111df565b005b34801561068a57600080fd5b506106936114f5565b005b3480156106a157600080fd5b506106aa6115b2565b6040516106b79190613a86565b60405180910390f35b3480156106cc57600080fd5b506106d56115b7565b6040516106e29190613a86565b60405180910390f35b3480156106f757600080fd5b506107006115c3565b60405161070d9190613667565b60405180910390f35b34801561072257600080fd5b5061072b6115ed565b60405161073891906136e9565b60405180910390f35b34801561074d57600080fd5b506107566115f3565b6040516107639190613704565b60405180910390f35b34801561077857600080fd5b50610781611685565b60405161078e91906136e9565b60405180910390f35b3480156107a357600080fd5b506107ac61168b565b6040516107b99190613a86565b60405180910390f35b3480156107ce57600080fd5b506107e960048036038101906107e49190612fe2565b611697565b005b3480156107f757600080fd5b50610812600480360381019061080d9190612f67565b611818565b005b34801561082057600080fd5b5061083b60048036038101906108369190613116565b61187a565b6040516108489190613704565b60405180910390f35b34801561085d57600080fd5b506108786004803603810190610873919061313f565b611921565b005b34801561088657600080fd5b5061088f611a26565b60405161089c9190613704565b60405180910390f35b3480156108b157600080fd5b506108ba611ab4565b6040516108c79190613a86565b60405180910390f35b3480156108dc57600080fd5b506108f760048036038101906108f29190612eb3565b611aba565b6040516109049190613a86565b60405180910390f35b34801561091957600080fd5b50610934600480360381019061092f9190612edc565b611ad2565b60405161094191906136ce565b60405180910390f35b34801561095657600080fd5b5061095f611b66565b60405161096c9190613a86565b60405180910390f35b34801561098157600080fd5b5061099c60048036038101906109979190612eb3565b611b6b565b005b3480156109aa57600080fd5b506109b3611c63565b6040516109c091906136ce565b60405180910390f35b60006109d482611cd3565b9050919050565b6109e3611db5565b73ffffffffffffffffffffffffffffffffffffffff16610a016115c3565b73ffffffffffffffffffffffffffffffffffffffff1614610a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4e90613966565b60405180910390fd5b600115158115151415610a7157610a6c611dbd565b610a7a565b610a79611e60565b5b50565b600181565b606060008054610a9190613cf1565b80601f0160208091040260200160405190810160405280929190818152602001828054610abd90613cf1565b8015610b0a5780601f10610adf57610100808354040283529160200191610b0a565b820191906000526020600020905b815481529060010190602001808311610aed57829003601f168201915b5050505050905090565b6000610b1f82611f02565b610b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5590613946565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ba482610fd4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0c906139e6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c34611db5565b73ffffffffffffffffffffffffffffffffffffffff161480610c635750610c6281610c5d611db5565b611ad2565b5b610ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c99906138a6565b60405180910390fd5b610cac8383611f6e565b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600754905090565b610cf2610cec611db5565b82612027565b610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2890613a26565b60405180910390fd5b610d3c838383612105565b505050565b6103e881565b610d4f611db5565b73ffffffffffffffffffffffffffffffffffffffff16610d6d6115c3565b73ffffffffffffffffffffffffffffffffffffffff1614610dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba90613966565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610e2283838360405180602001604052806000815250611818565b505050565b610e38610e32611db5565b82612027565b610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e90613a66565b60405180910390fd5b610e8081612361565b50565b610e8b611db5565b73ffffffffffffffffffffffffffffffffffffffff16610ea96115c3565b73ffffffffffffffffffffffffffffffffffffffff1614610eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef690613966565b60405180910390fd5b8060099080519060200190610f15929190612cd7565b5050565b610f21611db5565b73ffffffffffffffffffffffffffffffffffffffff16610f3f6115c3565b73ffffffffffffffffffffffffffffffffffffffff1614610f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8c90613966565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b6000600660149054906101000a900460ff16905090565b600d5481565b600281565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561107d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611074906138e6565b60405180910390fd5b80915050919050565b600f60019054906101000a900460ff1681565b61038481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611110576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611107906138c6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61115f611db5565b73ffffffffffffffffffffffffffffffffffffffff1661117d6115c3565b73ffffffffffffffffffffffffffffffffffffffff16146111d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ca90613966565b60405180910390fd5b6111dd6000612472565b565b6103e86007541115611226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121d90613926565b60405180910390fd5b61122e6115c3565b73ffffffffffffffffffffffffffffffffffffffff1661124c611db5565b73ffffffffffffffffffffffffffffffffffffffff16146112b05761126f610fb2565b156112af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a690613886565b60405180910390fd5b5b60003390503273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131a906137e6565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff163b1461137d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611374906137e6565b60405180910390fd5b6000611387610cd7565b9050600f60009054906101000a900460ff166113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf90613a46565b60405180910390fd5b6103e883826113e79190613b76565b1115611428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141f90613846565b60405180910390fd5b600183111561146c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146390613766565b60405180910390fd5b61038460085411156114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa906139a6565b60405180910390fd5b60005b838110156114ef576114c733612538565b60016008546114d69190613b76565b60088190555080806114e790613d54565b9150506114b6565b50505050565b6114fd611db5565b73ffffffffffffffffffffffffffffffffffffffff1661151b6115c3565b73ffffffffffffffffffffffffffffffffffffffff1614611571576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156890613966565b60405180910390fd5b60004790506000811161158357600080fd5b6115af600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612599565b50565b600181565b67011c37937e08000081565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c5481565b60606001805461160290613cf1565b80601f016020809104026020016040519081016040528092919081815260200182805461162e90613cf1565b801561167b5780601f106116505761010080835404028352916020019161167b565b820191906000526020600020905b81548152906001019060200180831161165e57829003601f168201915b5050505050905090565b600b5481565b67011c37937e08000081565b61169f611db5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561170d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170490613826565b60405180910390fd5b806005600061171a611db5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117c7611db5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161180c91906136ce565b60405180910390a35050565b611829611823611db5565b83612027565b611868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185f90613a26565b60405180910390fd5b6118748484848461264a565b50505050565b606061188582611f02565b6118c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bb906139c6565b60405180910390fd5b60006118ce6126a6565b905060008151116118ee5760405180602001604052806000815250611919565b806118f884612738565b60405160200161190992919061362e565b6040516020818303038152906040525b915050919050565b611929611db5565b73ffffffffffffffffffffffffffffffffffffffff166119476115c3565b73ffffffffffffffffffffffffffffffffffffffff161461199d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199490613966565b60405180910390fd5b60006119a7610cd7565b90506103e883826119b89190613b76565b11156119f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f090613926565b60405180910390fd5b60005b83811015611a2057611a0d83612538565b8080611a1890613d54565b9150506119fc565b50505050565b60098054611a3390613cf1565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5f90613cf1565b8015611aac5780601f10611a8157610100808354040283529160200191611aac565b820191906000526020600020905b815481529060010190602001808311611a8f57829003601f168201915b505050505081565b60085481565b600e6020528060005260406000206000915090505481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600381565b611b73611db5565b73ffffffffffffffffffffffffffffffffffffffff16611b916115c3565b73ffffffffffffffffffffffffffffffffffffffff1614611be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bde90613966565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4e906137a6565b60405180910390fd5b611c6081612472565b50565b600f60009054906101000a900460ff1681565b611c81838383611cce565b611c89610fb2565b15611cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc090613726565b60405180910390fd5b505050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d9e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611dae5750611dad826128e5565b5b9050919050565b600033905090565b611dc5610fb2565b15611e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfc90613886565b60405180910390fd5b6001600660146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611e49611db5565b604051611e569190613667565b60405180910390a1565b611e68610fb2565b611ea7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9e90613746565b60405180910390fd5b6000600660146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611eeb611db5565b604051611ef89190613667565b60405180910390a1565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611fe183610fd4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061203282611f02565b612071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206890613866565b60405180910390fd5b600061207c83610fd4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120eb57508373ffffffffffffffffffffffffffffffffffffffff166120d384610b14565b73ffffffffffffffffffffffffffffffffffffffff16145b806120fc57506120fb8185611ad2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661212582610fd4565b73ffffffffffffffffffffffffffffffffffffffff161461217b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217290613986565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e290613806565b60405180910390fd5b6121f683838361294f565b612201600082611f6e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122519190613bfd565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122a89190613b76565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061236c82610fd4565b905061237a8160008461294f565b612385600083611f6e565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123d59190613bfd565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612542610cd7565b90506001600760008282546125579190613b76565b92505081905550612568828261295f565b807fdfe3e57736ff136c528786ad701a1b04e118a2c7a62a61f5fd8ea48b8729ea2360405160405180910390a25050565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516125bf90613652565b60006040518083038185875af1925050503d80600081146125fc576040519150601f19603f3d011682016040523d82523d6000602084013e612601565b606091505b5050905080612645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263c90613a06565b60405180910390fd5b505050565b612655848484612105565b61266184848484612b2d565b6126a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269790613786565b60405180910390fd5b50505050565b6060600980546126b590613cf1565b80601f01602080910402602001604051908101604052809291908181526020018280546126e190613cf1565b801561272e5780601f106127035761010080835404028352916020019161272e565b820191906000526020600020905b81548152906001019060200180831161271157829003601f168201915b5050505050905090565b60606000821415612780576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506128e0565b600082905060005b600082146127b257808061279b90613d54565b915050600a826127ab9190613bcc565b9150612788565b60008167ffffffffffffffff8111156127f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156128265781602001600182028036833780820191505090505b5090505b600085146128d95760018261283f9190613bfd565b9150600a8561284e9190613d9d565b603061285a9190613b76565b60f81b818381518110612896577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128d29190613bcc565b945061282a565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61295a838383611c76565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c690613906565b60405180910390fd5b6129d881611f02565b15612a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0f906137c6565b60405180910390fd5b612a246000838361294f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a749190613b76565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612b4e8473ffffffffffffffffffffffffffffffffffffffff16612cc4565b15612cb7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b77611db5565b8786866040518563ffffffff1660e01b8152600401612b999493929190613682565b602060405180830381600087803b158015612bb357600080fd5b505af1925050508015612be457506040513d601f19601f82011682018060405250810190612be191906130ac565b60015b612c67573d8060008114612c14576040519150601f19603f3d011682016040523d82523d6000602084013e612c19565b606091505b50600081511415612c5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5690613786565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612cbc565b600190505b949350505050565b600080823b905060008111915050919050565b828054612ce390613cf1565b90600052602060002090601f016020900481019282612d055760008555612d4c565b82601f10612d1e57805160ff1916838001178555612d4c565b82800160010185558215612d4c579182015b82811115612d4b578251825591602001919060010190612d30565b5b509050612d599190612d5d565b5090565b5b80821115612d76576000816000905550600101612d5e565b5090565b6000612d8d612d8884613ac6565b613aa1565b905082815260208101848484011115612da557600080fd5b612db0848285613caf565b509392505050565b6000612dcb612dc684613af7565b613aa1565b905082815260208101848484011115612de357600080fd5b612dee848285613caf565b509392505050565b600081359050612e0581614505565b92915050565b600081359050612e1a8161451c565b92915050565b600081359050612e2f81614533565b92915050565b600081519050612e4481614533565b92915050565b600082601f830112612e5b57600080fd5b8135612e6b848260208601612d7a565b91505092915050565b600082601f830112612e8557600080fd5b8135612e95848260208601612db8565b91505092915050565b600081359050612ead8161454a565b92915050565b600060208284031215612ec557600080fd5b6000612ed384828501612df6565b91505092915050565b60008060408385031215612eef57600080fd5b6000612efd85828601612df6565b9250506020612f0e85828601612df6565b9150509250929050565b600080600060608486031215612f2d57600080fd5b6000612f3b86828701612df6565b9350506020612f4c86828701612df6565b9250506040612f5d86828701612e9e565b9150509250925092565b60008060008060808587031215612f7d57600080fd5b6000612f8b87828801612df6565b9450506020612f9c87828801612df6565b9350506040612fad87828801612e9e565b925050606085013567ffffffffffffffff811115612fca57600080fd5b612fd687828801612e4a565b91505092959194509250565b60008060408385031215612ff557600080fd5b600061300385828601612df6565b925050602061301485828601612e0b565b9150509250929050565b6000806040838503121561303157600080fd5b600061303f85828601612df6565b925050602061305085828601612e9e565b9150509250929050565b60006020828403121561306c57600080fd5b600061307a84828501612e0b565b91505092915050565b60006020828403121561309557600080fd5b60006130a384828501612e20565b91505092915050565b6000602082840312156130be57600080fd5b60006130cc84828501612e35565b91505092915050565b6000602082840312156130e757600080fd5b600082013567ffffffffffffffff81111561310157600080fd5b61310d84828501612e74565b91505092915050565b60006020828403121561312857600080fd5b600061313684828501612e9e565b91505092915050565b6000806040838503121561315257600080fd5b600061316085828601612e9e565b925050602061317185828601612df6565b9150509250929050565b61318481613c31565b82525050565b61319381613c43565b82525050565b6131a281613c4f565b82525050565b60006131b382613b28565b6131bd8185613b3e565b93506131cd818560208601613cbe565b6131d681613e8a565b840191505092915050565b60006131ec82613b33565b6131f68185613b5a565b9350613206818560208601613cbe565b61320f81613e8a565b840191505092915050565b600061322582613b33565b61322f8185613b6b565b935061323f818560208601613cbe565b80840191505092915050565b6000613258602b83613b5a565b915061326382613e9b565b604082019050919050565b600061327b601483613b5a565b915061328682613eea565b602082019050919050565b600061329e600e83613b5a565b91506132a982613f13565b602082019050919050565b60006132c1603283613b5a565b91506132cc82613f3c565b604082019050919050565b60006132e4602683613b5a565b91506132ef82613f8b565b604082019050919050565b6000613307601c83613b5a565b915061331282613fda565b602082019050919050565b600061332a601483613b5a565b915061333582614003565b602082019050919050565b600061334d602483613b5a565b91506133588261402c565b604082019050919050565b6000613370601983613b5a565b915061337b8261407b565b602082019050919050565b6000613393600983613b5a565b915061339e826140a4565b602082019050919050565b60006133b6602c83613b5a565b91506133c1826140cd565b604082019050919050565b60006133d9601083613b5a565b91506133e48261411c565b602082019050919050565b60006133fc603883613b5a565b915061340782614145565b604082019050919050565b600061341f602a83613b5a565b915061342a82614194565b604082019050919050565b6000613442602983613b5a565b915061344d826141e3565b604082019050919050565b6000613465602083613b5a565b915061347082614232565b602082019050919050565b6000613488600883613b5a565b91506134938261425b565b602082019050919050565b60006134ab602c83613b5a565b91506134b682614284565b604082019050919050565b60006134ce602083613b5a565b91506134d9826142d3565b602082019050919050565b60006134f1602983613b5a565b91506134fc826142fc565b604082019050919050565b6000613514601183613b5a565b915061351f8261434b565b602082019050919050565b6000613537602f83613b5a565b915061354282614374565b604082019050919050565b600061355a602183613b5a565b9150613565826143c3565b604082019050919050565b600061357d600083613b4f565b915061358882614412565b600082019050919050565b60006135a0601083613b5a565b91506135ab82614415565b602082019050919050565b60006135c3603183613b5a565b91506135ce8261443e565b604082019050919050565b60006135e6601883613b5a565b91506135f18261448d565b602082019050919050565b6000613609603083613b5a565b9150613614826144b6565b604082019050919050565b61362881613ca5565b82525050565b600061363a828561321a565b9150613646828461321a565b91508190509392505050565b600061365d82613570565b9150819050919050565b600060208201905061367c600083018461317b565b92915050565b6000608082019050613697600083018761317b565b6136a4602083018661317b565b6136b1604083018561361f565b81810360608301526136c381846131a8565b905095945050505050565b60006020820190506136e3600083018461318a565b92915050565b60006020820190506136fe6000830184613199565b92915050565b6000602082019050818103600083015261371e81846131e1565b905092915050565b6000602082019050818103600083015261373f8161324b565b9050919050565b6000602082019050818103600083015261375f8161326e565b9050919050565b6000602082019050818103600083015261377f81613291565b9050919050565b6000602082019050818103600083015261379f816132b4565b9050919050565b600060208201905081810360008301526137bf816132d7565b9050919050565b600060208201905081810360008301526137df816132fa565b9050919050565b600060208201905081810360008301526137ff8161331d565b9050919050565b6000602082019050818103600083015261381f81613340565b9050919050565b6000602082019050818103600083015261383f81613363565b9050919050565b6000602082019050818103600083015261385f81613386565b9050919050565b6000602082019050818103600083015261387f816133a9565b9050919050565b6000602082019050818103600083015261389f816133cc565b9050919050565b600060208201905081810360008301526138bf816133ef565b9050919050565b600060208201905081810360008301526138df81613412565b9050919050565b600060208201905081810360008301526138ff81613435565b9050919050565b6000602082019050818103600083015261391f81613458565b9050919050565b6000602082019050818103600083015261393f8161347b565b9050919050565b6000602082019050818103600083015261395f8161349e565b9050919050565b6000602082019050818103600083015261397f816134c1565b9050919050565b6000602082019050818103600083015261399f816134e4565b9050919050565b600060208201905081810360008301526139bf81613507565b9050919050565b600060208201905081810360008301526139df8161352a565b9050919050565b600060208201905081810360008301526139ff8161354d565b9050919050565b60006020820190508181036000830152613a1f81613593565b9050919050565b60006020820190508181036000830152613a3f816135b6565b9050919050565b60006020820190508181036000830152613a5f816135d9565b9050919050565b60006020820190508181036000830152613a7f816135fc565b9050919050565b6000602082019050613a9b600083018461361f565b92915050565b6000613aab613abc565b9050613ab78282613d23565b919050565b6000604051905090565b600067ffffffffffffffff821115613ae157613ae0613e5b565b5b613aea82613e8a565b9050602081019050919050565b600067ffffffffffffffff821115613b1257613b11613e5b565b5b613b1b82613e8a565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b8182613ca5565b9150613b8c83613ca5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613bc157613bc0613dce565b5b828201905092915050565b6000613bd782613ca5565b9150613be283613ca5565b925082613bf257613bf1613dfd565b5b828204905092915050565b6000613c0882613ca5565b9150613c1383613ca5565b925082821015613c2657613c25613dce565b5b828203905092915050565b6000613c3c82613c85565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613cdc578082015181840152602081019050613cc1565b83811115613ceb576000848401525b50505050565b60006002820490506001821680613d0957607f821691505b60208210811415613d1d57613d1c613e2c565b5b50919050565b613d2c82613e8a565b810181811067ffffffffffffffff82111715613d4b57613d4a613e5b565b5b80604052505050565b6000613d5f82613ca5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d9257613d91613dce565b5b600182019050919050565b6000613da882613ca5565b9150613db383613ca5565b925082613dc357613dc2613dfd565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f45786365656473206e756d626572000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f43616c6c6572206973206120636f6e7472616374000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4d6178206c696d69740000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53616c6520656e64000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f6d6178203930302066726565206d696e74000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f5075626c69632073616c65206e6f74206f70656e207965740000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b61450e81613c31565b811461451957600080fd5b50565b61452581613c43565b811461453057600080fd5b50565b61453c81613c59565b811461454757600080fd5b50565b61455381613ca5565b811461455e57600080fd5b5056fea264697066735822122097fbda608b5cd4cf0bf3114353270563e65de41810e639b701ea295eef49bce164736f6c63430008010033
Deployed Bytecode Sourcemap
39266:7023:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46119:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45225:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39628:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26726:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28285:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27808:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39855:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40815:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29175:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39380:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45570:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29585:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38247:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45116:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40917:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11793:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39972:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39677:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26420:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40115:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39430:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26150:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2377:94;;;;;;;;;;;;;:::i;:::-;;41014:518;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45387:175;;;;;;;;;;;;;:::i;:::-;;39582:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39483:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1726:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39933:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26895:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39894:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39532:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28578:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29841:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27070:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42547:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39820:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39777:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40015:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28944:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39726:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2626:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40075:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46119:161;46212:4;46236:36;46260:11;46236:23;:36::i;:::-;46229:43;;46119:161;;;:::o;45225:154::-;1957:12;:10;:12::i;:::-;1946:23;;:7;:5;:7::i;:::-;:23;;;1938:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45289:4:::1;45282:11;;:3;:11;;;45278:73;;;45310:8;:6;:8::i;:::-;45333:7;;45278:73;45361:10;:8;:10::i;:::-;2017:1;45225:154:::0;:::o;39628:42::-;39669:1;39628:42;:::o;26726:100::-;26780:13;26813:5;26806:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26726:100;:::o;28285:221::-;28361:7;28389:16;28397:7;28389;:16::i;:::-;28381:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28474:15;:24;28490:7;28474:24;;;;;;;;;;;;;;;;;;;;;28467:31;;28285:221;;;:::o;27808:411::-;27889:13;27905:23;27920:7;27905:14;:23::i;:::-;27889:39;;27953:5;27947:11;;:2;:11;;;;27939:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28047:5;28031:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28056:37;28073:5;28080:12;:10;:12::i;:::-;28056:16;:37::i;:::-;28031:62;28009:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;28190:21;28199:2;28203:7;28190:8;:21::i;:::-;27808:411;;;:::o;39855:30::-;;;;;;;;;;;;;:::o;40815:94::-;40859:7;40886:15;;40879:22;;40815:94;:::o;29175:339::-;29370:41;29389:12;:10;:12::i;:::-;29403:7;29370:18;:41::i;:::-;29362:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29478:28;29488:4;29494:2;29498:7;29478:9;:28::i;:::-;29175:339;;;:::o;39380:43::-;39419:4;39380:43;:::o;45570:124::-;1957:12;:10;:12::i;:::-;1946:23;;:7;:5;:7::i;:::-;:23;;;1938:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45670:16:::1;45652:15;;:34;;;;;;;;;;;;;;;;;;45570:124:::0;:::o;29585:185::-;29723:39;29740:4;29746:2;29750:7;29723:39;;;;;;;;;;;;:16;:39::i;:::-;29585:185;;;:::o;38247:245::-;38365:41;38384:12;:10;:12::i;:::-;38398:7;38365:18;:41::i;:::-;38357:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;38470:14;38476:7;38470:5;:14::i;:::-;38247:245;:::o;45116:101::-;1957:12;:10;:12::i;:::-;1946:23;;:7;:5;:7::i;:::-;:23;;;1938:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45202:7:::1;45187:12;:22;;;;;;;;;;;;:::i;:::-;;45116:101:::0;:::o;40917:89::-;1957:12;:10;:12::i;:::-;1946:23;;:7;:5;:7::i;:::-;:23;;;1938:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40995:3:::1;40978:14;;:20;;;;;;;;;;;;;;;;;;40917:89:::0;:::o;11793:86::-;11840:4;11864:7;;;;;;;;;;;11857:14;;11793:86;:::o;39972:34::-;;;;:::o;39677:42::-;39718:1;39677:42;:::o;26420:239::-;26492:7;26512:13;26528:7;:16;26536:7;26528:16;;;;;;;;;;;;;;;;;;;;;26512:32;;26580:1;26563:19;;:5;:19;;;;26555:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26646:5;26639:12;;;26420:239;;;:::o;40115:30::-;;;;;;;;;;;;;:::o;39430:46::-;39473:3;39430:46;:::o;26150:208::-;26222:7;26267:1;26250:19;;:5;:19;;;;26242:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;26334:9;:16;26344:5;26334:16;;;;;;;;;;;;;;;;26327:23;;26150:208;;;:::o;2377:94::-;1957:12;:10;:12::i;:::-;1946:23;;:7;:5;:7::i;:::-;:23;;;1938:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2442:21:::1;2460:1;2442:9;:21::i;:::-;2377:94::o:0;41014:518::-;39419:4;40418:15;;:31;;40410:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;40493:7;:5;:7::i;:::-;40477:23;;:12;:10;:12::i;:::-;:23;;;40473:94;;40526:8;:6;:8::i;:::-;40525:9;40517:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;40473:94;40627:15:::1;40645:10;40627:28;;40685:9;40674:20;;:7;:20;;;40666:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;40761:1;40738:7;:19;;;:24;40730:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;41096:13:::2;41112;:11;:13::i;:::-;41096:29;;41144:14;;;;;;;;;;;41136:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;39419:4;41214:6;41206:5;:14;;;;:::i;:::-;:30;;41198:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;39620:1;41269:6;:21;;41261:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;41343:3;41328:11;;:18;;41320:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;41396:9;41391:134;41415:6;41411:1;:10;41391:134;;;41443:26;41458:10;41443:14;:26::i;:::-;41512:1;41498:11;;:15;;;;:::i;:::-;41484:11;:29;;;;41423:3;;;;;:::i;:::-;;;;41391:134;;;;40798:1;40577::::1;41014:518:::0;:::o;45387:175::-;1957:12;:10;:12::i;:::-;1946:23;;:7;:5;:7::i;:::-;:23;;;1938:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45438:15:::1;45456:21;45438:39;;45506:1;45496:7;:11;45488:20;;;::::0;::::1;;45519:35;45529:15;;;;;;;;;;;45546:7;45519:9;:35::i;:::-;2017:1;45387:175::o:0;39582:39::-;39620:1;39582:39;:::o;39483:42::-;39515:10;39483:42;:::o;1726:87::-;1772:7;1799:6;;;;;;;;;;;1792:13;;1726:87;:::o;39933:32::-;;;;:::o;26895:104::-;26951:13;26984:7;26977:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26895:104;:::o;39894:32::-;;;;:::o;39532:43::-;39565:10;39532:43;:::o;28578:295::-;28693:12;:10;:12::i;:::-;28681:24;;:8;:24;;;;28673:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28793:8;28748:18;:32;28767:12;:10;:12::i;:::-;28748:32;;;;;;;;;;;;;;;:42;28781:8;28748:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28846:8;28817:48;;28832:12;:10;:12::i;:::-;28817:48;;;28856:8;28817:48;;;;;;:::i;:::-;;;;;;;;28578:295;;:::o;29841:328::-;30016:41;30035:12;:10;:12::i;:::-;30049:7;30016:18;:41::i;:::-;30008:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30122:39;30136:4;30142:2;30146:7;30155:5;30122:13;:39::i;:::-;29841:328;;;;:::o;27070:334::-;27143:13;27177:16;27185:7;27177;:16::i;:::-;27169:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;27258:21;27282:10;:8;:10::i;:::-;27258:34;;27334:1;27316:7;27310:21;:25;:86;;;;;;;;;;;;;;;;;27362:7;27371:18;:7;:16;:18::i;:::-;27345:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27310:86;27303:93;;;27070:334;;;:::o;42547:274::-;1957:12;:10;:12::i;:::-;1946:23;;:7;:5;:7::i;:::-;:23;;;1938:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42624:13:::1;42640;:11;:13::i;:::-;42624:29;;39419:4;42680:6;42672:5;:14;;;;:::i;:::-;:30;;42664:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;42733:9;42728:84;42752:6;42748:1;:10;42728:84;;;42780:20;42795:4;42780:14;:20::i;:::-;42760:3;;;;;:::i;:::-;;;;42728:84;;;;2017:1;42547:274:::0;;:::o;39820:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39777:30::-;;;;:::o;40015:51::-;;;;;;;;;;;;;;;;;:::o;28944:164::-;29041:4;29065:18;:25;29084:5;29065:25;;;;;;;;;;;;;;;:35;29091:8;29065:35;;;;;;;;;;;;;;;;;;;;;;;;;29058:42;;28944:164;;;;:::o;39726:44::-;39769:1;39726:44;:::o;2626:192::-;1957:12;:10;:12::i;:::-;1946:23;;:7;:5;:7::i;:::-;:23;;;1938:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2735:1:::1;2715:22;;:8;:22;;;;2707:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2791:19;2801:8;2791:9;:19::i;:::-;2626:192:::0;:::o;40075:33::-;;;;;;;;;;;;;:::o;38984:275::-;39128:45;39155:4;39161:2;39165:7;39128:26;:45::i;:::-;39195:8;:6;:8::i;:::-;39194:9;39186:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38984:275;;;:::o;37771:126::-;;;;:::o;25781:305::-;25883:4;25935:25;25920:40;;;:11;:40;;;;:105;;;;25992:33;25977:48;;;:11;:48;;;;25920:105;:158;;;;26042:36;26066:11;26042:23;:36::i;:::-;25920:158;25900:178;;25781:305;;;:::o;602:98::-;655:7;682:10;675:17;;602:98;:::o;12593:118::-;12119:8;:6;:8::i;:::-;12118:9;12110:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;12663:4:::1;12653:7;;:14;;;;;;;;;;;;;;;;;;12683:20;12690:12;:10;:12::i;:::-;12683:20;;;;;;:::i;:::-;;;;;;;;12593:118::o:0;12852:120::-;12396:8;:6;:8::i;:::-;12388:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;12921:5:::1;12911:7;;:15;;;;;;;;;;;;;;;;;;12942:22;12951:12;:10;:12::i;:::-;12942:22;;;;;;:::i;:::-;;;;;;;;12852:120::o:0;31679:127::-;31744:4;31796:1;31768:30;;:7;:16;31776:7;31768:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31761:37;;31679:127;;;:::o;35661:174::-;35763:2;35736:15;:24;35752:7;35736:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35819:7;35815:2;35781:46;;35790:23;35805:7;35790:14;:23::i;:::-;35781:46;;;;;;;;;;;;35661:174;;:::o;31973:348::-;32066:4;32091:16;32099:7;32091;:16::i;:::-;32083:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32167:13;32183:23;32198:7;32183:14;:23::i;:::-;32167:39;;32236:5;32225:16;;:7;:16;;;:51;;;;32269:7;32245:31;;:20;32257:7;32245:11;:20::i;:::-;:31;;;32225:51;:87;;;;32280:32;32297:5;32304:7;32280:16;:32::i;:::-;32225:87;32217:96;;;31973:348;;;;:::o;34965:578::-;35124:4;35097:31;;:23;35112:7;35097:14;:23::i;:::-;:31;;;35089:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;35207:1;35193:16;;:2;:16;;;;35185:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35263:39;35284:4;35290:2;35294:7;35263:20;:39::i;:::-;35367:29;35384:1;35388:7;35367:8;:29::i;:::-;35428:1;35409:9;:15;35419:4;35409:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35457:1;35440:9;:13;35450:2;35440:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35488:2;35469:7;:16;35477:7;35469:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35527:7;35523:2;35508:27;;35517:4;35508:27;;;;;;;;;;;;34965:578;;;:::o;34268:360::-;34328:13;34344:23;34359:7;34344:14;:23::i;:::-;34328:39;;34380:48;34401:5;34416:1;34420:7;34380:20;:48::i;:::-;34469:29;34486:1;34490:7;34469:8;:29::i;:::-;34531:1;34511:9;:16;34521:5;34511:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;34550:7;:16;34558:7;34550:16;;;;;;;;;;;;34543:23;;;;;;;;;;;34612:7;34608:1;34584:36;;34593:5;34584:36;;;;;;;;;;;;34268:360;;:::o;2826:173::-;2882:16;2901:6;;;;;;;;;;;2882:25;;2927:8;2918:6;;:17;;;;;;;;;;;;;;;;;;2982:8;2951:40;;2972:8;2951:40;;;;;;;;;;;;2826:173;;:::o;42829:::-;42885:7;42895:13;:11;:13::i;:::-;42885:23;;42938:1;42919:15;;:20;;;;;;;:::i;:::-;;;;;;;;42950:14;42956:3;42961:2;42950:5;:14::i;:::-;42991:2;42980:14;;;;;;;;;;42829:173;;:::o;45702:180::-;45776:12;45794:8;:13;;45815:7;45794:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45775:52;;;45846:7;45838:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;45702:180;;;:::o;31051:315::-;31208:28;31218:4;31224:2;31228:7;31208:9;:28::i;:::-;31255:48;31278:4;31284:2;31288:7;31297:5;31255:22;:48::i;:::-;31247:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;31051:315;;;;:::o;44995:113::-;45055:13;45088:12;45081:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44995:113;:::o;21221:723::-;21277:13;21507:1;21498:5;:10;21494:53;;;21525:10;;;;;;;;;;;;;;;;;;;;;21494:53;21557:12;21572:5;21557:20;;21588:14;21613:78;21628:1;21620:4;:9;21613:78;;21646:8;;;;;:::i;:::-;;;;21677:2;21669:10;;;;;:::i;:::-;;;21613:78;;;21701:19;21733:6;21723:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21701:39;;21751:154;21767:1;21758:5;:10;21751:154;;21795:1;21785:11;;;;;:::i;:::-;;;21862:2;21854:5;:10;;;;:::i;:::-;21841:2;:24;;;;:::i;:::-;21828:39;;21811:6;21818;21811:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;21891:2;21882:11;;;;;:::i;:::-;;;21751:154;;;21929:6;21915:21;;;;;21221:723;;;;:::o;4456:157::-;4541:4;4580:25;4565:40;;;:11;:40;;;;4558:47;;4456:157;;;:::o;45890:221::-;46058:45;46085:4;46091:2;46095:7;46058:26;:45::i;:::-;45890:221;;;:::o;33657:382::-;33751:1;33737:16;;:2;:16;;;;33729:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33810:16;33818:7;33810;:16::i;:::-;33809:17;33801:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33872:45;33901:1;33905:2;33909:7;33872:20;:45::i;:::-;33947:1;33930:9;:13;33940:2;33930:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33978:2;33959:7;:16;33967:7;33959:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34023:7;34019:2;33998:33;;34015:1;33998:33;;;;;;;;;;;;33657:382;;:::o;36400:799::-;36555:4;36576:15;:2;:13;;;:15::i;:::-;36572:620;;;36628:2;36612:36;;;36649:12;:10;:12::i;:::-;36663:4;36669:7;36678:5;36612:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36608:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36871:1;36854:6;:13;:18;36850:272;;;36897:60;;;;;;;;;;:::i;:::-;;;;;;;;36850:272;37072:6;37066:13;37057:6;37053:2;37049:15;37042:38;36608:529;36745:41;;;36735:51;;;:6;:51;;;;36728:58;;;;;36572:620;37176:4;37169:11;;36400:799;;;;;;;:::o;13662:387::-;13722:4;13930:12;13997:7;13985:20;13977:28;;14040:1;14033:4;:8;14026:15;;;13662:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;;;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;;;;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;;;;;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;;;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;;;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:256::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:50;5114:7;5105:6;5094:9;5090:22;5072:50;:::i;:::-;5062:60;;5018:114;4946:193;;;;:::o;5145:260::-;;5252:2;5240:9;5231:7;5227:23;5223:32;5220:2;;;5268:1;5265;5258:12;5220:2;5311:1;5336:52;5380:7;5371:6;5360:9;5356:22;5336:52;:::i;:::-;5326:62;;5282:116;5210:195;;;;:::o;5411:282::-;;5529:2;5517:9;5508:7;5504:23;5500:32;5497:2;;;5545:1;5542;5535:12;5497:2;5588:1;5613:63;5668:7;5659:6;5648:9;5644:22;5613:63;:::i;:::-;5603:73;;5559:127;5487:206;;;;:::o;5699:375::-;;5817:2;5805:9;5796:7;5792:23;5788:32;5785:2;;;5833:1;5830;5823:12;5785:2;5904:1;5893:9;5889:17;5876:31;5934:18;5926:6;5923:30;5920:2;;;5966:1;5963;5956:12;5920:2;5994:63;6049:7;6040:6;6029:9;6025:22;5994:63;:::i;:::-;5984:73;;5847:220;5775:299;;;;:::o;6080:262::-;;6188:2;6176:9;6167:7;6163:23;6159:32;6156:2;;;6204:1;6201;6194:12;6156:2;6247:1;6272:53;6317:7;6308:6;6297:9;6293:22;6272:53;:::i;:::-;6262:63;;6218:117;6146:196;;;;:::o;6348:407::-;;;6473:2;6461:9;6452:7;6448:23;6444:32;6441:2;;;6489:1;6486;6479:12;6441:2;6532:1;6557:53;6602:7;6593:6;6582:9;6578:22;6557:53;:::i;:::-;6547:63;;6503:117;6659:2;6685:53;6730:7;6721:6;6710:9;6706:22;6685:53;:::i;:::-;6675:63;;6630:118;6431:324;;;;;:::o;6761:118::-;6848:24;6866:5;6848:24;:::i;:::-;6843:3;6836:37;6826:53;;:::o;6885:109::-;6966:21;6981:5;6966:21;:::i;:::-;6961:3;6954:34;6944:50;;:::o;7000:118::-;7087:24;7105:5;7087:24;:::i;:::-;7082:3;7075:37;7065:53;;:::o;7124:360::-;;7238:38;7270:5;7238:38;:::i;:::-;7292:70;7355:6;7350:3;7292:70;:::i;:::-;7285:77;;7371:52;7416:6;7411:3;7404:4;7397:5;7393:16;7371:52;:::i;:::-;7448:29;7470:6;7448:29;:::i;:::-;7443:3;7439:39;7432:46;;7214:270;;;;;:::o;7490:364::-;;7606:39;7639:5;7606:39;:::i;:::-;7661:71;7725:6;7720:3;7661:71;:::i;:::-;7654:78;;7741:52;7786:6;7781:3;7774:4;7767:5;7763:16;7741:52;:::i;:::-;7818:29;7840:6;7818:29;:::i;:::-;7813:3;7809:39;7802:46;;7582:272;;;;;:::o;7860:377::-;;7994:39;8027:5;7994:39;:::i;:::-;8049:89;8131:6;8126:3;8049:89;:::i;:::-;8042:96;;8147:52;8192:6;8187:3;8180:4;8173:5;8169:16;8147:52;:::i;:::-;8224:6;8219:3;8215:16;8208:23;;7970:267;;;;;:::o;8243:366::-;;8406:67;8470:2;8465:3;8406:67;:::i;:::-;8399:74;;8482:93;8571:3;8482:93;:::i;:::-;8600:2;8595:3;8591:12;8584:19;;8389:220;;;:::o;8615:366::-;;8778:67;8842:2;8837:3;8778:67;:::i;:::-;8771:74;;8854:93;8943:3;8854:93;:::i;:::-;8972:2;8967:3;8963:12;8956:19;;8761:220;;;:::o;8987:366::-;;9150:67;9214:2;9209:3;9150:67;:::i;:::-;9143:74;;9226:93;9315:3;9226:93;:::i;:::-;9344:2;9339:3;9335:12;9328:19;;9133:220;;;:::o;9359:366::-;;9522:67;9586:2;9581:3;9522:67;:::i;:::-;9515:74;;9598:93;9687:3;9598:93;:::i;:::-;9716:2;9711:3;9707:12;9700:19;;9505:220;;;:::o;9731:366::-;;9894:67;9958:2;9953:3;9894:67;:::i;:::-;9887:74;;9970:93;10059:3;9970:93;:::i;:::-;10088:2;10083:3;10079:12;10072:19;;9877:220;;;:::o;10103:366::-;;10266:67;10330:2;10325:3;10266:67;:::i;:::-;10259:74;;10342:93;10431:3;10342:93;:::i;:::-;10460:2;10455:3;10451:12;10444:19;;10249:220;;;:::o;10475:366::-;;10638:67;10702:2;10697:3;10638:67;:::i;:::-;10631:74;;10714:93;10803:3;10714:93;:::i;:::-;10832:2;10827:3;10823:12;10816:19;;10621:220;;;:::o;10847:366::-;;11010:67;11074:2;11069:3;11010:67;:::i;:::-;11003:74;;11086:93;11175:3;11086:93;:::i;:::-;11204:2;11199:3;11195:12;11188:19;;10993:220;;;:::o;11219:366::-;;11382:67;11446:2;11441:3;11382:67;:::i;:::-;11375:74;;11458:93;11547:3;11458:93;:::i;:::-;11576:2;11571:3;11567:12;11560:19;;11365:220;;;:::o;11591:365::-;;11754:66;11818:1;11813:3;11754:66;:::i;:::-;11747:73;;11829:93;11918:3;11829:93;:::i;:::-;11947:2;11942:3;11938:12;11931:19;;11737:219;;;:::o;11962:366::-;;12125:67;12189:2;12184:3;12125:67;:::i;:::-;12118:74;;12201:93;12290:3;12201:93;:::i;:::-;12319:2;12314:3;12310:12;12303:19;;12108:220;;;:::o;12334:366::-;;12497:67;12561:2;12556:3;12497:67;:::i;:::-;12490:74;;12573:93;12662:3;12573:93;:::i;:::-;12691:2;12686:3;12682:12;12675:19;;12480:220;;;:::o;12706:366::-;;12869:67;12933:2;12928:3;12869:67;:::i;:::-;12862:74;;12945:93;13034:3;12945:93;:::i;:::-;13063:2;13058:3;13054:12;13047:19;;12852:220;;;:::o;13078:366::-;;13241:67;13305:2;13300:3;13241:67;:::i;:::-;13234:74;;13317:93;13406:3;13317:93;:::i;:::-;13435:2;13430:3;13426:12;13419:19;;13224:220;;;:::o;13450:366::-;;13613:67;13677:2;13672:3;13613:67;:::i;:::-;13606:74;;13689:93;13778:3;13689:93;:::i;:::-;13807:2;13802:3;13798:12;13791:19;;13596:220;;;:::o;13822:366::-;;13985:67;14049:2;14044:3;13985:67;:::i;:::-;13978:74;;14061:93;14150:3;14061:93;:::i;:::-;14179:2;14174:3;14170:12;14163:19;;13968:220;;;:::o;14194:365::-;;14357:66;14421:1;14416:3;14357:66;:::i;:::-;14350:73;;14432:93;14521:3;14432:93;:::i;:::-;14550:2;14545:3;14541:12;14534:19;;14340:219;;;:::o;14565:366::-;;14728:67;14792:2;14787:3;14728:67;:::i;:::-;14721:74;;14804:93;14893:3;14804:93;:::i;:::-;14922:2;14917:3;14913:12;14906:19;;14711:220;;;:::o;14937:366::-;;15100:67;15164:2;15159:3;15100:67;:::i;:::-;15093:74;;15176:93;15265:3;15176:93;:::i;:::-;15294:2;15289:3;15285:12;15278:19;;15083:220;;;:::o;15309:366::-;;15472:67;15536:2;15531:3;15472:67;:::i;:::-;15465:74;;15548:93;15637:3;15548:93;:::i;:::-;15666:2;15661:3;15657:12;15650:19;;15455:220;;;:::o;15681:366::-;;15844:67;15908:2;15903:3;15844:67;:::i;:::-;15837:74;;15920:93;16009:3;15920:93;:::i;:::-;16038:2;16033:3;16029:12;16022:19;;15827:220;;;:::o;16053:366::-;;16216:67;16280:2;16275:3;16216:67;:::i;:::-;16209:74;;16292:93;16381:3;16292:93;:::i;:::-;16410:2;16405:3;16401:12;16394:19;;16199:220;;;:::o;16425:366::-;;16588:67;16652:2;16647:3;16588:67;:::i;:::-;16581:74;;16664:93;16753:3;16664:93;:::i;:::-;16782:2;16777:3;16773:12;16766:19;;16571:220;;;:::o;16797:398::-;;16977:83;17058:1;17053:3;16977:83;:::i;:::-;16970:90;;17069:93;17158:3;17069:93;:::i;:::-;17187:1;17182:3;17178:11;17171:18;;16960:235;;;:::o;17201:366::-;;17364:67;17428:2;17423:3;17364:67;:::i;:::-;17357:74;;17440:93;17529:3;17440:93;:::i;:::-;17558:2;17553:3;17549:12;17542:19;;17347:220;;;:::o;17573:366::-;;17736:67;17800:2;17795:3;17736:67;:::i;:::-;17729:74;;17812:93;17901:3;17812:93;:::i;:::-;17930:2;17925:3;17921:12;17914:19;;17719:220;;;:::o;17945:366::-;;18108:67;18172:2;18167:3;18108:67;:::i;:::-;18101:74;;18184:93;18273:3;18184:93;:::i;:::-;18302:2;18297:3;18293:12;18286:19;;18091:220;;;:::o;18317:366::-;;18480:67;18544:2;18539:3;18480:67;:::i;:::-;18473:74;;18556:93;18645:3;18556:93;:::i;:::-;18674:2;18669:3;18665:12;18658:19;;18463:220;;;:::o;18689:118::-;18776:24;18794:5;18776:24;:::i;:::-;18771:3;18764:37;18754:53;;:::o;18813:435::-;;19015:95;19106:3;19097:6;19015:95;:::i;:::-;19008:102;;19127:95;19218:3;19209:6;19127:95;:::i;:::-;19120:102;;19239:3;19232:10;;18997:251;;;;;:::o;19254:379::-;;19460:147;19603:3;19460:147;:::i;:::-;19453:154;;19624:3;19617:10;;19442:191;;;:::o;19639:222::-;;19770:2;19759:9;19755:18;19747:26;;19783:71;19851:1;19840:9;19836:17;19827:6;19783:71;:::i;:::-;19737:124;;;;:::o;19867:640::-;;20100:3;20089:9;20085:19;20077:27;;20114:71;20182:1;20171:9;20167:17;20158:6;20114:71;:::i;:::-;20195:72;20263:2;20252:9;20248:18;20239:6;20195:72;:::i;:::-;20277;20345:2;20334:9;20330:18;20321:6;20277:72;:::i;:::-;20396:9;20390:4;20386:20;20381:2;20370:9;20366:18;20359:48;20424:76;20495:4;20486:6;20424:76;:::i;:::-;20416:84;;20067:440;;;;;;;:::o;20513:210::-;;20638:2;20627:9;20623:18;20615:26;;20651:65;20713:1;20702:9;20698:17;20689:6;20651:65;:::i;:::-;20605:118;;;;:::o;20729:222::-;;20860:2;20849:9;20845:18;20837:26;;20873:71;20941:1;20930:9;20926:17;20917:6;20873:71;:::i;:::-;20827:124;;;;:::o;20957:313::-;;21108:2;21097:9;21093:18;21085:26;;21157:9;21151:4;21147:20;21143:1;21132:9;21128:17;21121:47;21185:78;21258:4;21249:6;21185:78;:::i;:::-;21177:86;;21075:195;;;;:::o;21276:419::-;;21480:2;21469:9;21465:18;21457:26;;21529:9;21523:4;21519:20;21515:1;21504:9;21500:17;21493:47;21557:131;21683:4;21557:131;:::i;:::-;21549:139;;21447:248;;;:::o;21701:419::-;;21905:2;21894:9;21890:18;21882:26;;21954:9;21948:4;21944:20;21940:1;21929:9;21925:17;21918:47;21982:131;22108:4;21982:131;:::i;:::-;21974:139;;21872:248;;;:::o;22126:419::-;;22330:2;22319:9;22315:18;22307:26;;22379:9;22373:4;22369:20;22365:1;22354:9;22350:17;22343:47;22407:131;22533:4;22407:131;:::i;:::-;22399:139;;22297:248;;;:::o;22551:419::-;;22755:2;22744:9;22740:18;22732:26;;22804:9;22798:4;22794:20;22790:1;22779:9;22775:17;22768:47;22832:131;22958:4;22832:131;:::i;:::-;22824:139;;22722:248;;;:::o;22976:419::-;;23180:2;23169:9;23165:18;23157:26;;23229:9;23223:4;23219:20;23215:1;23204:9;23200:17;23193:47;23257:131;23383:4;23257:131;:::i;:::-;23249:139;;23147:248;;;:::o;23401:419::-;;23605:2;23594:9;23590:18;23582:26;;23654:9;23648:4;23644:20;23640:1;23629:9;23625:17;23618:47;23682:131;23808:4;23682:131;:::i;:::-;23674:139;;23572:248;;;:::o;23826:419::-;;24030:2;24019:9;24015:18;24007:26;;24079:9;24073:4;24069:20;24065:1;24054:9;24050:17;24043:47;24107:131;24233:4;24107:131;:::i;:::-;24099:139;;23997:248;;;:::o;24251:419::-;;24455:2;24444:9;24440:18;24432:26;;24504:9;24498:4;24494:20;24490:1;24479:9;24475:17;24468:47;24532:131;24658:4;24532:131;:::i;:::-;24524:139;;24422:248;;;:::o;24676:419::-;;24880:2;24869:9;24865:18;24857:26;;24929:9;24923:4;24919:20;24915:1;24904:9;24900:17;24893:47;24957:131;25083:4;24957:131;:::i;:::-;24949:139;;24847:248;;;:::o;25101:419::-;;25305:2;25294:9;25290:18;25282:26;;25354:9;25348:4;25344:20;25340:1;25329:9;25325:17;25318:47;25382:131;25508:4;25382:131;:::i;:::-;25374:139;;25272:248;;;:::o;25526:419::-;;25730:2;25719:9;25715:18;25707:26;;25779:9;25773:4;25769:20;25765:1;25754:9;25750:17;25743:47;25807:131;25933:4;25807:131;:::i;:::-;25799:139;;25697:248;;;:::o;25951:419::-;;26155:2;26144:9;26140:18;26132:26;;26204:9;26198:4;26194:20;26190:1;26179:9;26175:17;26168:47;26232:131;26358:4;26232:131;:::i;:::-;26224:139;;26122:248;;;:::o;26376:419::-;;26580:2;26569:9;26565:18;26557:26;;26629:9;26623:4;26619:20;26615:1;26604:9;26600:17;26593:47;26657:131;26783:4;26657:131;:::i;:::-;26649:139;;26547:248;;;:::o;26801:419::-;;27005:2;26994:9;26990:18;26982:26;;27054:9;27048:4;27044:20;27040:1;27029:9;27025:17;27018:47;27082:131;27208:4;27082:131;:::i;:::-;27074:139;;26972:248;;;:::o;27226:419::-;;27430:2;27419:9;27415:18;27407:26;;27479:9;27473:4;27469:20;27465:1;27454:9;27450:17;27443:47;27507:131;27633:4;27507:131;:::i;:::-;27499:139;;27397:248;;;:::o;27651:419::-;;27855:2;27844:9;27840:18;27832:26;;27904:9;27898:4;27894:20;27890:1;27879:9;27875:17;27868:47;27932:131;28058:4;27932:131;:::i;:::-;27924:139;;27822:248;;;:::o;28076:419::-;;28280:2;28269:9;28265:18;28257:26;;28329:9;28323:4;28319:20;28315:1;28304:9;28300:17;28293:47;28357:131;28483:4;28357:131;:::i;:::-;28349:139;;28247:248;;;:::o;28501:419::-;;28705:2;28694:9;28690:18;28682:26;;28754:9;28748:4;28744:20;28740:1;28729:9;28725:17;28718:47;28782:131;28908:4;28782:131;:::i;:::-;28774:139;;28672:248;;;:::o;28926:419::-;;29130:2;29119:9;29115:18;29107:26;;29179:9;29173:4;29169:20;29165:1;29154:9;29150:17;29143:47;29207:131;29333:4;29207:131;:::i;:::-;29199:139;;29097:248;;;:::o;29351:419::-;;29555:2;29544:9;29540:18;29532:26;;29604:9;29598:4;29594:20;29590:1;29579:9;29575:17;29568:47;29632:131;29758:4;29632:131;:::i;:::-;29624:139;;29522:248;;;:::o;29776:419::-;;29980:2;29969:9;29965:18;29957:26;;30029:9;30023:4;30019:20;30015:1;30004:9;30000:17;29993:47;30057:131;30183:4;30057:131;:::i;:::-;30049:139;;29947:248;;;:::o;30201:419::-;;30405:2;30394:9;30390:18;30382:26;;30454:9;30448:4;30444:20;30440:1;30429:9;30425:17;30418:47;30482:131;30608:4;30482:131;:::i;:::-;30474:139;;30372:248;;;:::o;30626:419::-;;30830:2;30819:9;30815:18;30807:26;;30879:9;30873:4;30869:20;30865:1;30854:9;30850:17;30843:47;30907:131;31033:4;30907:131;:::i;:::-;30899:139;;30797:248;;;:::o;31051:419::-;;31255:2;31244:9;31240:18;31232:26;;31304:9;31298:4;31294:20;31290:1;31279:9;31275:17;31268:47;31332:131;31458:4;31332:131;:::i;:::-;31324:139;;31222:248;;;:::o;31476:419::-;;31680:2;31669:9;31665:18;31657:26;;31729:9;31723:4;31719:20;31715:1;31704:9;31700:17;31693:47;31757:131;31883:4;31757:131;:::i;:::-;31749:139;;31647:248;;;:::o;31901:419::-;;32105:2;32094:9;32090:18;32082:26;;32154:9;32148:4;32144:20;32140:1;32129:9;32125:17;32118:47;32182:131;32308:4;32182:131;:::i;:::-;32174:139;;32072:248;;;:::o;32326:419::-;;32530:2;32519:9;32515:18;32507:26;;32579:9;32573:4;32569:20;32565:1;32554:9;32550:17;32543:47;32607:131;32733:4;32607:131;:::i;:::-;32599:139;;32497:248;;;:::o;32751:222::-;;32882:2;32871:9;32867:18;32859:26;;32895:71;32963:1;32952:9;32948:17;32939:6;32895:71;:::i;:::-;32849:124;;;;:::o;32979:129::-;;33040:20;;:::i;:::-;33030:30;;33069:33;33097:4;33089:6;33069:33;:::i;:::-;33020:88;;;:::o;33114:75::-;;33180:2;33174:9;33164:19;;33154:35;:::o;33195:307::-;;33346:18;33338:6;33335:30;33332:2;;;33368:18;;:::i;:::-;33332:2;33406:29;33428:6;33406:29;:::i;:::-;33398:37;;33490:4;33484;33480:15;33472:23;;33261:241;;;:::o;33508:308::-;;33660:18;33652:6;33649:30;33646:2;;;33682:18;;:::i;:::-;33646:2;33720:29;33742:6;33720:29;:::i;:::-;33712:37;;33804:4;33798;33794:15;33786:23;;33575:241;;;:::o;33822:98::-;;33907:5;33901:12;33891:22;;33880:40;;;:::o;33926:99::-;;34012:5;34006:12;33996:22;;33985:40;;;:::o;34031:168::-;;34148:6;34143:3;34136:19;34188:4;34183:3;34179:14;34164:29;;34126:73;;;;:::o;34205:147::-;;34343:3;34328:18;;34318:34;;;;:::o;34358:169::-;;34476:6;34471:3;34464:19;34516:4;34511:3;34507:14;34492:29;;34454:73;;;;:::o;34533:148::-;;34672:3;34657:18;;34647:34;;;;:::o;34687:305::-;;34746:20;34764:1;34746:20;:::i;:::-;34741:25;;34780:20;34798:1;34780:20;:::i;:::-;34775:25;;34934:1;34866:66;34862:74;34859:1;34856:81;34853:2;;;34940:18;;:::i;:::-;34853:2;34984:1;34981;34977:9;34970:16;;34731:261;;;;:::o;34998:185::-;;35055:20;35073:1;35055:20;:::i;:::-;35050:25;;35089:20;35107:1;35089:20;:::i;:::-;35084:25;;35128:1;35118:2;;35133:18;;:::i;:::-;35118:2;35175:1;35172;35168:9;35163:14;;35040:143;;;;:::o;35189:191::-;;35249:20;35267:1;35249:20;:::i;:::-;35244:25;;35283:20;35301:1;35283:20;:::i;:::-;35278:25;;35322:1;35319;35316:8;35313:2;;;35327:18;;:::i;:::-;35313:2;35372:1;35369;35365:9;35357:17;;35234:146;;;;:::o;35386:96::-;;35452:24;35470:5;35452:24;:::i;:::-;35441:35;;35431:51;;;:::o;35488:90::-;;35565:5;35558:13;35551:21;35540:32;;35530:48;;;:::o;35584:77::-;;35650:5;35639:16;;35629:32;;;:::o;35667:149::-;;35743:66;35736:5;35732:78;35721:89;;35711:105;;;:::o;35822:126::-;;35899:42;35892:5;35888:54;35877:65;;35867:81;;;:::o;35954:77::-;;36020:5;36009:16;;35999:32;;;:::o;36037:154::-;36121:6;36116:3;36111;36098:30;36183:1;36174:6;36169:3;36165:16;36158:27;36088:103;;;:::o;36197:307::-;36265:1;36275:113;36289:6;36286:1;36283:13;36275:113;;;36374:1;36369:3;36365:11;36359:18;36355:1;36350:3;36346:11;36339:39;36311:2;36308:1;36304:10;36299:15;;36275:113;;;36406:6;36403:1;36400:13;36397:2;;;36486:1;36477:6;36472:3;36468:16;36461:27;36397:2;36246:258;;;;:::o;36510:320::-;;36591:1;36585:4;36581:12;36571:22;;36638:1;36632:4;36628:12;36659:18;36649:2;;36715:4;36707:6;36703:17;36693:27;;36649:2;36777;36769:6;36766:14;36746:18;36743:38;36740:2;;;36796:18;;:::i;:::-;36740:2;36561:269;;;;:::o;36836:281::-;36919:27;36941:4;36919:27;:::i;:::-;36911:6;36907:40;37049:6;37037:10;37034:22;37013:18;37001:10;36998:34;36995:62;36992:2;;;37060:18;;:::i;:::-;36992:2;37100:10;37096:2;37089:22;36879:238;;;:::o;37123:233::-;;37185:24;37203:5;37185:24;:::i;:::-;37176:33;;37231:66;37224:5;37221:77;37218:2;;;37301:18;;:::i;:::-;37218:2;37348:1;37341:5;37337:13;37330:20;;37166:190;;;:::o;37362:176::-;;37411:20;37429:1;37411:20;:::i;:::-;37406:25;;37445:20;37463:1;37445:20;:::i;:::-;37440:25;;37484:1;37474:2;;37489:18;;:::i;:::-;37474:2;37530:1;37527;37523:9;37518:14;;37396:142;;;;:::o;37544:180::-;37592:77;37589:1;37582:88;37689:4;37686:1;37679:15;37713:4;37710:1;37703:15;37730:180;37778:77;37775:1;37768:88;37875:4;37872:1;37865:15;37899:4;37896:1;37889:15;37916:180;37964:77;37961:1;37954:88;38061:4;38058:1;38051:15;38085:4;38082:1;38075:15;38102:180;38150:77;38147:1;38140:88;38247:4;38244:1;38237:15;38271:4;38268:1;38261:15;38288:102;;38380:2;38376:7;38371:2;38364:5;38360:14;38356:28;38346:38;;38336:54;;;:::o;38396:230::-;38536:34;38532:1;38524:6;38520:14;38513:58;38605:13;38600:2;38592:6;38588:15;38581:38;38502:124;:::o;38632:170::-;38772:22;38768:1;38760:6;38756:14;38749:46;38738:64;:::o;38808:164::-;38948:16;38944:1;38936:6;38932:14;38925:40;38914:58;:::o;38978:237::-;39118:34;39114:1;39106:6;39102:14;39095:58;39187:20;39182:2;39174:6;39170:15;39163:45;39084:131;:::o;39221:225::-;39361:34;39357:1;39349:6;39345:14;39338:58;39430:8;39425:2;39417:6;39413:15;39406:33;39327:119;:::o;39452:178::-;39592:30;39588:1;39580:6;39576:14;39569:54;39558:72;:::o;39636:170::-;39776:22;39772:1;39764:6;39760:14;39753:46;39742:64;:::o;39812:223::-;39952:34;39948:1;39940:6;39936:14;39929:58;40021:6;40016:2;40008:6;40004:15;39997:31;39918:117;:::o;40041:175::-;40181:27;40177:1;40169:6;40165:14;40158:51;40147:69;:::o;40222:159::-;40362:11;40358:1;40350:6;40346:14;40339:35;40328:53;:::o;40387:231::-;40527:34;40523:1;40515:6;40511:14;40504:58;40596:14;40591:2;40583:6;40579:15;40572:39;40493:125;:::o;40624:166::-;40764:18;40760:1;40752:6;40748:14;40741:42;40730:60;:::o;40796:243::-;40936:34;40932:1;40924:6;40920:14;40913:58;41005:26;41000:2;40992:6;40988:15;40981:51;40902:137;:::o;41045:229::-;41185:34;41181:1;41173:6;41169:14;41162:58;41254:12;41249:2;41241:6;41237:15;41230:37;41151:123;:::o;41280:228::-;41420:34;41416:1;41408:6;41404:14;41397:58;41489:11;41484:2;41476:6;41472:15;41465:36;41386:122;:::o;41514:182::-;41654:34;41650:1;41642:6;41638:14;41631:58;41620:76;:::o;41702:158::-;41842:10;41838:1;41830:6;41826:14;41819:34;41808:52;:::o;41866:231::-;42006:34;42002:1;41994:6;41990:14;41983:58;42075:14;42070:2;42062:6;42058:15;42051:39;41972:125;:::o;42103:182::-;42243:34;42239:1;42231:6;42227:14;42220:58;42209:76;:::o;42291:228::-;42431:34;42427:1;42419:6;42415:14;42408:58;42500:11;42495:2;42487:6;42483:15;42476:36;42397:122;:::o;42525:167::-;42665:19;42661:1;42653:6;42649:14;42642:43;42631:61;:::o;42698:234::-;42838:34;42834:1;42826:6;42822:14;42815:58;42907:17;42902:2;42894:6;42890:15;42883:42;42804:128;:::o;42938:220::-;43078:34;43074:1;43066:6;43062:14;43055:58;43147:3;43142:2;43134:6;43130:15;43123:28;43044:114;:::o;43164:::-;43270:8;:::o;43284:166::-;43424:18;43420:1;43412:6;43408:14;43401:42;43390:60;:::o;43456:236::-;43596:34;43592:1;43584:6;43580:14;43573:58;43665:19;43660:2;43652:6;43648:15;43641:44;43562:130;:::o;43698:174::-;43838:26;43834:1;43826:6;43822:14;43815:50;43804:68;:::o;43878:235::-;44018:34;44014:1;44006:6;44002:14;43995:58;44087:18;44082:2;44074:6;44070:15;44063:43;43984:129;:::o;44119:122::-;44192:24;44210:5;44192:24;:::i;:::-;44185:5;44182:35;44172:2;;44231:1;44228;44221:12;44172:2;44162:79;:::o;44247:116::-;44317:21;44332:5;44317:21;:::i;:::-;44310:5;44307:32;44297:2;;44353:1;44350;44343:12;44297:2;44287:76;:::o;44369:120::-;44441:23;44458:5;44441:23;:::i;:::-;44434:5;44431:34;44421:2;;44479:1;44476;44469:12;44421:2;44411:78;:::o;44495:122::-;44568:24;44586:5;44568:24;:::i;:::-;44561:5;44558:35;44548:2;;44607:1;44604;44597:12;44548:2;44538:79;:::o
Swarm Source
ipfs://97fbda608b5cd4cf0bf3114353270563e65de41810e639b701ea295eef49bce1
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.