Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
3,257 WOF
Holders
1,755
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 WOFLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
M2PACPOEM
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-23 */ /** *Submitted for verification at Etherscan.io on 2022-04-20 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: ECDSA.sol // OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: Context.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _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); } } // File: Address.sol pragma solidity ^0.8.0; /** * @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); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: Payment.sol // OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol) pragma solidity ^0.8.0; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract Payment is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = address(this).balance + totalReleased(); uint256 payment = _pendingPayment(account, totalReceived, released(account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] += payment; _totalReleased += payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } } // File: IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: ERC721A.sol pragma solidity ^0.8.0; contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 internal currentIndex; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), 'ERC721A: global index out of bounds'); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), 'ERC721A: owner index out of bounds'); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx; address currOwnershipAddr; // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } revert('ERC721A: unable to get token of owner by index'); } /** * @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 || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), 'ERC721A: balance query for the zero address'); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require(owner != address(0), 'ERC721A: number minted query for the zero address'); return uint256(_addressData[owner].numberMinted); } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), 'ERC721A: owner query for nonexistent token'); unchecked { for (uint256 curr = tokenId; curr >= 0; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } revert('ERC721A: unable to determine the owner of token'); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { 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 override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, 'ERC721A: approval to current owner'); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), 'ERC721A: approve caller is not owner nor approved for all' ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), 'ERC721A: approved query for nonexistent token'); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), 'ERC721A: 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 override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), 'ERC721A: 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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = currentIndex; require(to != address(0), 'ERC721A: mint to the zero address'); require(quantity != 0, 'ERC721A: quantity must be greater than 0'); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1 // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1 unchecked { _addressData[to].balance += uint128(quantity); _addressData[to].numberMinted += uint128(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe) { require( _checkOnERC721Received(address(0), to, updatedIndex, _data), 'ERC721A: transfer to non ERC721Receiver implementer' ); } updatedIndex++; } currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved'); require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner'); require(to != address(0), 'ERC721A: transfer to the zero address'); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert('ERC721A: transfer to non ERC721Receiver implementer'); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } pragma solidity ^0.8.2; abstract contract M2PAC { function ownerOf(uint256 tokenId) public view virtual returns (address); } contract M2PACPOEM is ERC721A, Ownable { using Strings for uint256; string public _baseURIextended; bool public claimActive = false; M2PAC private m2pac; uint256 MAX_SUPPLY = 6000; mapping(uint256 => bool) public claimTracker; address m2pacContractAddress = 0xa1102B1aCD17bE19A1e7aB211379A34d8D0f7407; address m2pcDevAddress = 0xCE487b4742909d7233078Eb3E3c33DfdF5b490d1; constructor() ERC721A("M2PACPOEM", "WOF") { m2pac = M2PAC(m2pacContractAddress); } function claim(uint256[] calldata tokens) external { if(msg.sender != m2pcDevAddress){ require(claimActive, "Claim is not active"); } require(tokens.length > 0, "You must claim at least 1 token"); for(uint256 x = 0; x < tokens.length; x++) { require(m2pac.ownerOf(tokens[x]) == msg.sender, "You do not own these tokens"); require(claimTracker[tokens[x]] == false, "An inputted token was already claimed"); claimTracker[tokens[x]] = true; } _safeMint(msg.sender, tokens.length); } // allow claim function setClaimActive(bool _status) external onlyOwner { claimActive = _status; } //check claim function checkClaimed(uint256 tokenId) public view returns (bool) { return claimTracker[tokenId]; } //metadata function setBaseURI(string memory baseURI_) external onlyOwner { _baseURIextended = baseURI_; } function _baseURI() internal view virtual override returns (string memory) { return _baseURIextended; } function withdraw() public payable onlyOwner { (bool success, ) = payable(msg.sender).call{value: address(this).balance}(""); require(success); } }
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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_baseURIextended","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"checkClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokens","type":"uint256[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimTracker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setClaimActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526000600960006101000a81548160ff021916908315150217905550611770600a5573a1102b1acd17be19a1e7ab211379a34d8d0f7407600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ce487b4742909d7233078eb3e3c33dfdf5b490d1600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000dc57600080fd5b506040518060400160405280600981526020017f4d32504143504f454d00000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f574f460000000000000000000000000000000000000000000000000000000000815250816001908051906020019062000161929190620002d4565b5080600290805190602001906200017a929190620002d4565b5050506200019d620001916200020660201b60201c565b6200020e60201b60201c565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620003e8565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002e290620003b3565b90600052602060002090601f01602090048101928262000306576000855562000352565b82601f106200032157805160ff191683800117855562000352565b8280016001018555821562000352579182015b828111156200035157825182559160200191906001019062000334565b5b50905062000361919062000365565b5090565b5b808211156200038057600081600090555060010162000366565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003cc57607f821691505b602082108103620003e257620003e162000384565b5b50919050565b6141e980620003f86000396000f3fe60806040526004361061019c5760003560e01c806355f804b3116100ec57806395d89b411161008a578063c87b56dd11610064578063c87b56dd146105c9578063d4a6a2fd14610606578063e985e9c514610631578063f2fde38b1461066e5761019c565b806395d89b411461054c578063a22cb46514610577578063b88d4fde146105a05761019c565b806370a08231116100c657806370a08231146104a4578063715018a6146104e157806373417b09146104f85780638da5cb5b146105215761019c565b806355f804b3146104155780636352211e1461043e5780636ba4c1381461047b5761019c565b806323b872dd116101595780633ccfd60b116101335780633ccfd60b1461036857806342842e0e146103725780634d4491671461039b5780634f6ccce7146103d85761019c565b806323b872dd146102c55780632f745c59146102ee57806335a55caa1461032b5761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc146102095780630928fc2214610246578063095ea7b31461027157806318160ddd1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612a4c565b610697565b6040516101d59190612a94565b60405180910390f35b3480156101ea57600080fd5b506101f36107e1565b6040516102009190612b48565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612ba0565b610873565b60405161023d9190612c0e565b60405180910390f35b34801561025257600080fd5b5061025b6108f8565b6040516102689190612b48565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190612c55565b610986565b005b3480156102a657600080fd5b506102af610a9e565b6040516102bc9190612ca4565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e79190612cbf565b610aa7565b005b3480156102fa57600080fd5b5061031560048036038101906103109190612c55565b610ab7565b6040516103229190612ca4565b60405180910390f35b34801561033757600080fd5b50610352600480360381019061034d9190612ba0565b610ca7565b60405161035f9190612a94565b60405180910390f35b610370610cd1565b005b34801561037e57600080fd5b5061039960048036038101906103949190612cbf565b610dc6565b005b3480156103a757600080fd5b506103c260048036038101906103bd9190612ba0565b610de6565b6040516103cf9190612a94565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190612ba0565b610e06565b60405161040c9190612ca4565b60405180910390f35b34801561042157600080fd5b5061043c60048036038101906104379190612e47565b610e59565b005b34801561044a57600080fd5b5061046560048036038101906104609190612ba0565b610eef565b6040516104729190612c0e565b60405180910390f35b34801561048757600080fd5b506104a2600480360381019061049d9190612ef0565b610f05565b005b3480156104b057600080fd5b506104cb60048036038101906104c69190612f3d565b61120a565b6040516104d89190612ca4565b60405180910390f35b3480156104ed57600080fd5b506104f66112f2565b005b34801561050457600080fd5b5061051f600480360381019061051a9190612f96565b61137a565b005b34801561052d57600080fd5b50610536611413565b6040516105439190612c0e565b60405180910390f35b34801561055857600080fd5b5061056161143d565b60405161056e9190612b48565b60405180910390f35b34801561058357600080fd5b5061059e60048036038101906105999190612fc3565b6114cf565b005b3480156105ac57600080fd5b506105c760048036038101906105c291906130a4565b61164f565b005b3480156105d557600080fd5b506105f060048036038101906105eb9190612ba0565b6116ab565b6040516105fd9190612b48565b60405180910390f35b34801561061257600080fd5b5061061b611752565b6040516106289190612a94565b60405180910390f35b34801561063d57600080fd5b5061065860048036038101906106539190613127565b611765565b6040516106659190612a94565b60405180910390f35b34801561067a57600080fd5b5061069560048036038101906106909190612f3d565b6117f9565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061076257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107ca57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107da57506107d9826118f0565b5b9050919050565b6060600180546107f090613196565b80601f016020809104026020016040519081016040528092919081815260200182805461081c90613196565b80156108695780601f1061083e57610100808354040283529160200191610869565b820191906000526020600020905b81548152906001019060200180831161084c57829003601f168201915b5050505050905090565b600061087e8261195a565b6108bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b490613239565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6008805461090590613196565b80601f016020809104026020016040519081016040528092919081815260200182805461093190613196565b801561097e5780601f106109535761010080835404028352916020019161097e565b820191906000526020600020905b81548152906001019060200180831161096157829003601f168201915b505050505081565b600061099182610eef565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f8906132cb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a20611967565b73ffffffffffffffffffffffffffffffffffffffff161480610a4f5750610a4e81610a49611967565b611765565b5b610a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a859061335d565b60405180910390fd5b610a9983838361196f565b505050565b60008054905090565b610ab2838383611a21565b505050565b6000610ac28361120a565b8210610b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afa906133ef565b60405180910390fd5b6000610b0d610a9e565b905060008060005b83811015610c65576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610c0757806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c5757868403610c4e578195505050505050610ca1565b83806001019450505b508080600101915050610b15565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9890613481565b60405180910390fd5b92915050565b6000600b600083815260200190815260200160002060009054906101000a900460ff169050919050565b610cd9611967565b73ffffffffffffffffffffffffffffffffffffffff16610cf7611413565b73ffffffffffffffffffffffffffffffffffffffff1614610d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d44906134ed565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610d739061353e565b60006040518083038185875af1925050503d8060008114610db0576040519150601f19603f3d011682016040523d82523d6000602084013e610db5565b606091505b5050905080610dc357600080fd5b50565b610de18383836040518060200160405280600081525061164f565b505050565b600b6020528060005260406000206000915054906101000a900460ff1681565b6000610e10610a9e565b8210610e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e48906135c5565b60405180910390fd5b819050919050565b610e61611967565b73ffffffffffffffffffffffffffffffffffffffff16610e7f611413565b73ffffffffffffffffffffffffffffffffffffffff1614610ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecc906134ed565b60405180910390fd5b8060089080519060200190610eeb929190612903565b5050565b6000610efa82611f5f565b600001519050919050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610faa57600960009054906101000a900460ff16610fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa090613631565b60405180910390fd5b5b60008282905011610ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe79061369d565b60405180910390fd5b60005b828290508110156111f8573373ffffffffffffffffffffffffffffffffffffffff16600960019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e858585818110611066576110656136bd565b5b905060200201356040518263ffffffff1660e01b81526004016110899190612ca4565b602060405180830381865afa1580156110a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ca9190613701565b73ffffffffffffffffffffffffffffffffffffffff1614611120576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111179061377a565b60405180910390fd5b60001515600b600085858581811061113b5761113a6136bd565b5b90506020020135815260200190815260200160002060009054906101000a900460ff161515146111a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111979061380c565b60405180910390fd5b6001600b60008585858181106111b9576111b86136bd565b5b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555080806111f09061385b565b915050610ff3565b5061120633838390506120f9565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361127a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127190613915565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6112fa611967565b73ffffffffffffffffffffffffffffffffffffffff16611318611413565b73ffffffffffffffffffffffffffffffffffffffff161461136e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611365906134ed565b60405180910390fd5b6113786000612117565b565b611382611967565b73ffffffffffffffffffffffffffffffffffffffff166113a0611413565b73ffffffffffffffffffffffffffffffffffffffff16146113f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ed906134ed565b60405180910390fd5b80600960006101000a81548160ff02191690831515021790555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461144c90613196565b80601f016020809104026020016040519081016040528092919081815260200182805461147890613196565b80156114c55780601f1061149a576101008083540402835291602001916114c5565b820191906000526020600020905b8154815290600101906020018083116114a857829003601f168201915b5050505050905090565b6114d7611967565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153b90613981565b60405180910390fd5b8060066000611551611967565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115fe611967565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116439190612a94565b60405180910390a35050565b61165a848484611a21565b611666848484846121dd565b6116a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169c90613a13565b60405180910390fd5b50505050565b60606116b68261195a565b6116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90613aa5565b60405180910390fd5b60006116ff612364565b9050600081510361171f576040518060200160405280600081525061174a565b80611729846123f6565b60405160200161173a929190613b01565b6040516020818303038152906040525b915050919050565b600960009054906101000a900460ff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611801611967565b73ffffffffffffffffffffffffffffffffffffffff1661181f611413565b73ffffffffffffffffffffffffffffffffffffffff1614611875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186c906134ed565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118db90613b97565b60405180910390fd5b6118ed81612117565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611a2c82611f5f565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611a53611967565b73ffffffffffffffffffffffffffffffffffffffff161480611aaf5750611a78611967565b73ffffffffffffffffffffffffffffffffffffffff16611a9784610873565b73ffffffffffffffffffffffffffffffffffffffff16145b80611acb5750611aca8260000151611ac5611967565b611765565b5b905080611b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0490613c29565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7690613cbb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be590613d4d565b60405180910390fd5b611bfb8585856001612556565b611c0b600084846000015161196f565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611eef57611e4e8161195a565b15611eee5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f58858585600161255c565b5050505050565b611f67612989565b611f708261195a565b611faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa690613ddf565b60405180910390fd5b60008290505b600081106120b8576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146120a95780925050506120f4565b50808060019003915050611fb5565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120eb90613e71565b60405180910390fd5b919050565b612113828260405180602001604052806000815250612562565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006121fe8473ffffffffffffffffffffffffffffffffffffffff16612574565b15612357578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612227611967565b8786866040518563ffffffff1660e01b81526004016122499493929190613ee6565b6020604051808303816000875af192505050801561228557506040513d601f19601f820116820180604052508101906122829190613f47565b60015b612307573d80600081146122b5576040519150601f19603f3d011682016040523d82523d6000602084013e6122ba565b606091505b5060008151036122ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f690613a13565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061235c565b600190505b949350505050565b60606008805461237390613196565b80601f016020809104026020016040519081016040528092919081815260200182805461239f90613196565b80156123ec5780601f106123c1576101008083540402835291602001916123ec565b820191906000526020600020905b8154815290600101906020018083116123cf57829003601f168201915b5050505050905090565b60606000820361243d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612551565b600082905060005b6000821461246f5780806124589061385b565b915050600a826124689190613fa3565b9150612445565b60008167ffffffffffffffff81111561248b5761248a612d1c565b5b6040519080825280601f01601f1916602001820160405280156124bd5781602001600182028036833780820191505090505b5090505b6000851461254a576001826124d69190613fd4565b9150600a856124e59190614008565b60306124f19190614039565b60f81b818381518110612507576125066136bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125439190613fa3565b94506124c1565b8093505050505b919050565b50505050565b50505050565b61256f8383836001612587565b505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036125fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f390614101565b60405180910390fd5b6000840361263f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263690614193565b60405180910390fd5b61264c6000868387612556565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156128e657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156128d15761289160008884886121dd565b6128d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c790613a13565b60405180910390fd5b5b8180600101925050808060010191505061281a565b5080600081905550506128fc600086838761255c565b5050505050565b82805461290f90613196565b90600052602060002090601f0160209004810192826129315760008555612978565b82601f1061294a57805160ff1916838001178555612978565b82800160010185558215612978579182015b8281111561297757825182559160200191906001019061295c565b5b50905061298591906129c3565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156129dc5760008160009055506001016129c4565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a29816129f4565b8114612a3457600080fd5b50565b600081359050612a4681612a20565b92915050565b600060208284031215612a6257612a616129ea565b5b6000612a7084828501612a37565b91505092915050565b60008115159050919050565b612a8e81612a79565b82525050565b6000602082019050612aa96000830184612a85565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ae9578082015181840152602081019050612ace565b83811115612af8576000848401525b50505050565b6000601f19601f8301169050919050565b6000612b1a82612aaf565b612b248185612aba565b9350612b34818560208601612acb565b612b3d81612afe565b840191505092915050565b60006020820190508181036000830152612b628184612b0f565b905092915050565b6000819050919050565b612b7d81612b6a565b8114612b8857600080fd5b50565b600081359050612b9a81612b74565b92915050565b600060208284031215612bb657612bb56129ea565b5b6000612bc484828501612b8b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bf882612bcd565b9050919050565b612c0881612bed565b82525050565b6000602082019050612c236000830184612bff565b92915050565b612c3281612bed565b8114612c3d57600080fd5b50565b600081359050612c4f81612c29565b92915050565b60008060408385031215612c6c57612c6b6129ea565b5b6000612c7a85828601612c40565b9250506020612c8b85828601612b8b565b9150509250929050565b612c9e81612b6a565b82525050565b6000602082019050612cb96000830184612c95565b92915050565b600080600060608486031215612cd857612cd76129ea565b5b6000612ce686828701612c40565b9350506020612cf786828701612c40565b9250506040612d0886828701612b8b565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d5482612afe565b810181811067ffffffffffffffff82111715612d7357612d72612d1c565b5b80604052505050565b6000612d866129e0565b9050612d928282612d4b565b919050565b600067ffffffffffffffff821115612db257612db1612d1c565b5b612dbb82612afe565b9050602081019050919050565b82818337600083830152505050565b6000612dea612de584612d97565b612d7c565b905082815260208101848484011115612e0657612e05612d17565b5b612e11848285612dc8565b509392505050565b600082601f830112612e2e57612e2d612d12565b5b8135612e3e848260208601612dd7565b91505092915050565b600060208284031215612e5d57612e5c6129ea565b5b600082013567ffffffffffffffff811115612e7b57612e7a6129ef565b5b612e8784828501612e19565b91505092915050565b600080fd5b600080fd5b60008083601f840112612eb057612eaf612d12565b5b8235905067ffffffffffffffff811115612ecd57612ecc612e90565b5b602083019150836020820283011115612ee957612ee8612e95565b5b9250929050565b60008060208385031215612f0757612f066129ea565b5b600083013567ffffffffffffffff811115612f2557612f246129ef565b5b612f3185828601612e9a565b92509250509250929050565b600060208284031215612f5357612f526129ea565b5b6000612f6184828501612c40565b91505092915050565b612f7381612a79565b8114612f7e57600080fd5b50565b600081359050612f9081612f6a565b92915050565b600060208284031215612fac57612fab6129ea565b5b6000612fba84828501612f81565b91505092915050565b60008060408385031215612fda57612fd96129ea565b5b6000612fe885828601612c40565b9250506020612ff985828601612f81565b9150509250929050565b600067ffffffffffffffff82111561301e5761301d612d1c565b5b61302782612afe565b9050602081019050919050565b600061304761304284613003565b612d7c565b90508281526020810184848401111561306357613062612d17565b5b61306e848285612dc8565b509392505050565b600082601f83011261308b5761308a612d12565b5b813561309b848260208601613034565b91505092915050565b600080600080608085870312156130be576130bd6129ea565b5b60006130cc87828801612c40565b94505060206130dd87828801612c40565b93505060406130ee87828801612b8b565b925050606085013567ffffffffffffffff81111561310f5761310e6129ef565b5b61311b87828801613076565b91505092959194509250565b6000806040838503121561313e5761313d6129ea565b5b600061314c85828601612c40565b925050602061315d85828601612c40565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806131ae57607f821691505b6020821081036131c1576131c0613167565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000613223602d83612aba565b915061322e826131c7565b604082019050919050565b6000602082019050818103600083015261325281613216565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b60006132b5602283612aba565b91506132c082613259565b604082019050919050565b600060208201905081810360008301526132e4816132a8565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000613347603983612aba565b9150613352826132eb565b604082019050919050565b600060208201905081810360008301526133768161333a565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b60006133d9602283612aba565b91506133e48261337d565b604082019050919050565b60006020820190508181036000830152613408816133cc565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b600061346b602e83612aba565b91506134768261340f565b604082019050919050565b6000602082019050818103600083015261349a8161345e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006134d7602083612aba565b91506134e2826134a1565b602082019050919050565b60006020820190508181036000830152613506816134ca565b9050919050565b600081905092915050565b50565b600061352860008361350d565b915061353382613518565b600082019050919050565b60006135498261351b565b9150819050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b60006135af602383612aba565b91506135ba82613553565b604082019050919050565b600060208201905081810360008301526135de816135a2565b9050919050565b7f436c61696d206973206e6f742061637469766500000000000000000000000000600082015250565b600061361b601383612aba565b9150613626826135e5565b602082019050919050565b6000602082019050818103600083015261364a8161360e565b9050919050565b7f596f75206d75737420636c61696d206174206c65617374203120746f6b656e00600082015250565b6000613687601f83612aba565b915061369282613651565b602082019050919050565b600060208201905081810360008301526136b68161367a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815190506136fb81612c29565b92915050565b600060208284031215613717576137166129ea565b5b6000613725848285016136ec565b91505092915050565b7f596f7520646f206e6f74206f776e20746865736520746f6b656e730000000000600082015250565b6000613764601b83612aba565b915061376f8261372e565b602082019050919050565b6000602082019050818103600083015261379381613757565b9050919050565b7f416e20696e70757474656420746f6b656e2077617320616c726561647920636c60008201527f61696d6564000000000000000000000000000000000000000000000000000000602082015250565b60006137f6602583612aba565b91506138018261379a565b604082019050919050565b60006020820190508181036000830152613825816137e9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061386682612b6a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036138985761389761382c565b5b600182019050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b60006138ff602b83612aba565b915061390a826138a3565b604082019050919050565b6000602082019050818103600083015261392e816138f2565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b600061396b601a83612aba565b915061397682613935565b602082019050919050565b6000602082019050818103600083015261399a8161395e565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b60006139fd603383612aba565b9150613a08826139a1565b604082019050919050565b60006020820190508181036000830152613a2c816139f0565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613a8f602f83612aba565b9150613a9a82613a33565b604082019050919050565b60006020820190508181036000830152613abe81613a82565b9050919050565b600081905092915050565b6000613adb82612aaf565b613ae58185613ac5565b9350613af5818560208601612acb565b80840191505092915050565b6000613b0d8285613ad0565b9150613b198284613ad0565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b81602683612aba565b9150613b8c82613b25565b604082019050919050565b60006020820190508181036000830152613bb081613b74565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000613c13603283612aba565b9150613c1e82613bb7565b604082019050919050565b60006020820190508181036000830152613c4281613c06565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000613ca5602683612aba565b9150613cb082613c49565b604082019050919050565b60006020820190508181036000830152613cd481613c98565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613d37602583612aba565b9150613d4282613cdb565b604082019050919050565b60006020820190508181036000830152613d6681613d2a565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000613dc9602a83612aba565b9150613dd482613d6d565b604082019050919050565b60006020820190508181036000830152613df881613dbc565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000613e5b602f83612aba565b9150613e6682613dff565b604082019050919050565b60006020820190508181036000830152613e8a81613e4e565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613eb882613e91565b613ec28185613e9c565b9350613ed2818560208601612acb565b613edb81612afe565b840191505092915050565b6000608082019050613efb6000830187612bff565b613f086020830186612bff565b613f156040830185612c95565b8181036060830152613f278184613ead565b905095945050505050565b600081519050613f4181612a20565b92915050565b600060208284031215613f5d57613f5c6129ea565b5b6000613f6b84828501613f32565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613fae82612b6a565b9150613fb983612b6a565b925082613fc957613fc8613f74565b5b828204905092915050565b6000613fdf82612b6a565b9150613fea83612b6a565b925082821015613ffd57613ffc61382c565b5b828203905092915050565b600061401382612b6a565b915061401e83612b6a565b92508261402e5761402d613f74565b5b828206905092915050565b600061404482612b6a565b915061404f83612b6a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140845761408361382c565b5b828201905092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006140eb602183612aba565b91506140f68261408f565b604082019050919050565b6000602082019050818103600083015261411a816140de565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b600061417d602883612aba565b915061418882614121565b604082019050919050565b600060208201905081810360008301526141ac81614170565b905091905056fea2646970667358221220586739a29493ed6e4290f499157ffb22bc454d9848c3a0bc08765e2d366a6e4b64736f6c634300080d0033
Deployed Bytecode
0x60806040526004361061019c5760003560e01c806355f804b3116100ec57806395d89b411161008a578063c87b56dd11610064578063c87b56dd146105c9578063d4a6a2fd14610606578063e985e9c514610631578063f2fde38b1461066e5761019c565b806395d89b411461054c578063a22cb46514610577578063b88d4fde146105a05761019c565b806370a08231116100c657806370a08231146104a4578063715018a6146104e157806373417b09146104f85780638da5cb5b146105215761019c565b806355f804b3146104155780636352211e1461043e5780636ba4c1381461047b5761019c565b806323b872dd116101595780633ccfd60b116101335780633ccfd60b1461036857806342842e0e146103725780634d4491671461039b5780634f6ccce7146103d85761019c565b806323b872dd146102c55780632f745c59146102ee57806335a55caa1461032b5761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc146102095780630928fc2214610246578063095ea7b31461027157806318160ddd1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612a4c565b610697565b6040516101d59190612a94565b60405180910390f35b3480156101ea57600080fd5b506101f36107e1565b6040516102009190612b48565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612ba0565b610873565b60405161023d9190612c0e565b60405180910390f35b34801561025257600080fd5b5061025b6108f8565b6040516102689190612b48565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190612c55565b610986565b005b3480156102a657600080fd5b506102af610a9e565b6040516102bc9190612ca4565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e79190612cbf565b610aa7565b005b3480156102fa57600080fd5b5061031560048036038101906103109190612c55565b610ab7565b6040516103229190612ca4565b60405180910390f35b34801561033757600080fd5b50610352600480360381019061034d9190612ba0565b610ca7565b60405161035f9190612a94565b60405180910390f35b610370610cd1565b005b34801561037e57600080fd5b5061039960048036038101906103949190612cbf565b610dc6565b005b3480156103a757600080fd5b506103c260048036038101906103bd9190612ba0565b610de6565b6040516103cf9190612a94565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190612ba0565b610e06565b60405161040c9190612ca4565b60405180910390f35b34801561042157600080fd5b5061043c60048036038101906104379190612e47565b610e59565b005b34801561044a57600080fd5b5061046560048036038101906104609190612ba0565b610eef565b6040516104729190612c0e565b60405180910390f35b34801561048757600080fd5b506104a2600480360381019061049d9190612ef0565b610f05565b005b3480156104b057600080fd5b506104cb60048036038101906104c69190612f3d565b61120a565b6040516104d89190612ca4565b60405180910390f35b3480156104ed57600080fd5b506104f66112f2565b005b34801561050457600080fd5b5061051f600480360381019061051a9190612f96565b61137a565b005b34801561052d57600080fd5b50610536611413565b6040516105439190612c0e565b60405180910390f35b34801561055857600080fd5b5061056161143d565b60405161056e9190612b48565b60405180910390f35b34801561058357600080fd5b5061059e60048036038101906105999190612fc3565b6114cf565b005b3480156105ac57600080fd5b506105c760048036038101906105c291906130a4565b61164f565b005b3480156105d557600080fd5b506105f060048036038101906105eb9190612ba0565b6116ab565b6040516105fd9190612b48565b60405180910390f35b34801561061257600080fd5b5061061b611752565b6040516106289190612a94565b60405180910390f35b34801561063d57600080fd5b5061065860048036038101906106539190613127565b611765565b6040516106659190612a94565b60405180910390f35b34801561067a57600080fd5b5061069560048036038101906106909190612f3d565b6117f9565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061076257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107ca57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107da57506107d9826118f0565b5b9050919050565b6060600180546107f090613196565b80601f016020809104026020016040519081016040528092919081815260200182805461081c90613196565b80156108695780601f1061083e57610100808354040283529160200191610869565b820191906000526020600020905b81548152906001019060200180831161084c57829003601f168201915b5050505050905090565b600061087e8261195a565b6108bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b490613239565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6008805461090590613196565b80601f016020809104026020016040519081016040528092919081815260200182805461093190613196565b801561097e5780601f106109535761010080835404028352916020019161097e565b820191906000526020600020905b81548152906001019060200180831161096157829003601f168201915b505050505081565b600061099182610eef565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f8906132cb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a20611967565b73ffffffffffffffffffffffffffffffffffffffff161480610a4f5750610a4e81610a49611967565b611765565b5b610a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a859061335d565b60405180910390fd5b610a9983838361196f565b505050565b60008054905090565b610ab2838383611a21565b505050565b6000610ac28361120a565b8210610b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afa906133ef565b60405180910390fd5b6000610b0d610a9e565b905060008060005b83811015610c65576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610c0757806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c5757868403610c4e578195505050505050610ca1565b83806001019450505b508080600101915050610b15565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9890613481565b60405180910390fd5b92915050565b6000600b600083815260200190815260200160002060009054906101000a900460ff169050919050565b610cd9611967565b73ffffffffffffffffffffffffffffffffffffffff16610cf7611413565b73ffffffffffffffffffffffffffffffffffffffff1614610d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d44906134ed565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610d739061353e565b60006040518083038185875af1925050503d8060008114610db0576040519150601f19603f3d011682016040523d82523d6000602084013e610db5565b606091505b5050905080610dc357600080fd5b50565b610de18383836040518060200160405280600081525061164f565b505050565b600b6020528060005260406000206000915054906101000a900460ff1681565b6000610e10610a9e565b8210610e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e48906135c5565b60405180910390fd5b819050919050565b610e61611967565b73ffffffffffffffffffffffffffffffffffffffff16610e7f611413565b73ffffffffffffffffffffffffffffffffffffffff1614610ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecc906134ed565b60405180910390fd5b8060089080519060200190610eeb929190612903565b5050565b6000610efa82611f5f565b600001519050919050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610faa57600960009054906101000a900460ff16610fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa090613631565b60405180910390fd5b5b60008282905011610ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe79061369d565b60405180910390fd5b60005b828290508110156111f8573373ffffffffffffffffffffffffffffffffffffffff16600960019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e858585818110611066576110656136bd565b5b905060200201356040518263ffffffff1660e01b81526004016110899190612ca4565b602060405180830381865afa1580156110a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ca9190613701565b73ffffffffffffffffffffffffffffffffffffffff1614611120576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111179061377a565b60405180910390fd5b60001515600b600085858581811061113b5761113a6136bd565b5b90506020020135815260200190815260200160002060009054906101000a900460ff161515146111a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111979061380c565b60405180910390fd5b6001600b60008585858181106111b9576111b86136bd565b5b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555080806111f09061385b565b915050610ff3565b5061120633838390506120f9565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361127a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127190613915565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6112fa611967565b73ffffffffffffffffffffffffffffffffffffffff16611318611413565b73ffffffffffffffffffffffffffffffffffffffff161461136e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611365906134ed565b60405180910390fd5b6113786000612117565b565b611382611967565b73ffffffffffffffffffffffffffffffffffffffff166113a0611413565b73ffffffffffffffffffffffffffffffffffffffff16146113f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ed906134ed565b60405180910390fd5b80600960006101000a81548160ff02191690831515021790555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461144c90613196565b80601f016020809104026020016040519081016040528092919081815260200182805461147890613196565b80156114c55780601f1061149a576101008083540402835291602001916114c5565b820191906000526020600020905b8154815290600101906020018083116114a857829003601f168201915b5050505050905090565b6114d7611967565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153b90613981565b60405180910390fd5b8060066000611551611967565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115fe611967565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116439190612a94565b60405180910390a35050565b61165a848484611a21565b611666848484846121dd565b6116a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169c90613a13565b60405180910390fd5b50505050565b60606116b68261195a565b6116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90613aa5565b60405180910390fd5b60006116ff612364565b9050600081510361171f576040518060200160405280600081525061174a565b80611729846123f6565b60405160200161173a929190613b01565b6040516020818303038152906040525b915050919050565b600960009054906101000a900460ff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611801611967565b73ffffffffffffffffffffffffffffffffffffffff1661181f611413565b73ffffffffffffffffffffffffffffffffffffffff1614611875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186c906134ed565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118db90613b97565b60405180910390fd5b6118ed81612117565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611a2c82611f5f565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611a53611967565b73ffffffffffffffffffffffffffffffffffffffff161480611aaf5750611a78611967565b73ffffffffffffffffffffffffffffffffffffffff16611a9784610873565b73ffffffffffffffffffffffffffffffffffffffff16145b80611acb5750611aca8260000151611ac5611967565b611765565b5b905080611b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0490613c29565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7690613cbb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be590613d4d565b60405180910390fd5b611bfb8585856001612556565b611c0b600084846000015161196f565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611eef57611e4e8161195a565b15611eee5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f58858585600161255c565b5050505050565b611f67612989565b611f708261195a565b611faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa690613ddf565b60405180910390fd5b60008290505b600081106120b8576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146120a95780925050506120f4565b50808060019003915050611fb5565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120eb90613e71565b60405180910390fd5b919050565b612113828260405180602001604052806000815250612562565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006121fe8473ffffffffffffffffffffffffffffffffffffffff16612574565b15612357578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612227611967565b8786866040518563ffffffff1660e01b81526004016122499493929190613ee6565b6020604051808303816000875af192505050801561228557506040513d601f19601f820116820180604052508101906122829190613f47565b60015b612307573d80600081146122b5576040519150601f19603f3d011682016040523d82523d6000602084013e6122ba565b606091505b5060008151036122ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f690613a13565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061235c565b600190505b949350505050565b60606008805461237390613196565b80601f016020809104026020016040519081016040528092919081815260200182805461239f90613196565b80156123ec5780601f106123c1576101008083540402835291602001916123ec565b820191906000526020600020905b8154815290600101906020018083116123cf57829003601f168201915b5050505050905090565b60606000820361243d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612551565b600082905060005b6000821461246f5780806124589061385b565b915050600a826124689190613fa3565b9150612445565b60008167ffffffffffffffff81111561248b5761248a612d1c565b5b6040519080825280601f01601f1916602001820160405280156124bd5781602001600182028036833780820191505090505b5090505b6000851461254a576001826124d69190613fd4565b9150600a856124e59190614008565b60306124f19190614039565b60f81b818381518110612507576125066136bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125439190613fa3565b94506124c1565b8093505050505b919050565b50505050565b50505050565b61256f8383836001612587565b505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036125fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f390614101565b60405180910390fd5b6000840361263f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263690614193565b60405180910390fd5b61264c6000868387612556565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156128e657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156128d15761289160008884886121dd565b6128d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c790613a13565b60405180910390fd5b5b8180600101925050808060010191505061281a565b5080600081905550506128fc600086838761255c565b5050505050565b82805461290f90613196565b90600052602060002090601f0160209004810192826129315760008555612978565b82601f1061294a57805160ff1916838001178555612978565b82800160010185558215612978579182015b8281111561297757825182559160200191906001019061295c565b5b50905061298591906129c3565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156129dc5760008160009055506001016129c4565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a29816129f4565b8114612a3457600080fd5b50565b600081359050612a4681612a20565b92915050565b600060208284031215612a6257612a616129ea565b5b6000612a7084828501612a37565b91505092915050565b60008115159050919050565b612a8e81612a79565b82525050565b6000602082019050612aa96000830184612a85565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ae9578082015181840152602081019050612ace565b83811115612af8576000848401525b50505050565b6000601f19601f8301169050919050565b6000612b1a82612aaf565b612b248185612aba565b9350612b34818560208601612acb565b612b3d81612afe565b840191505092915050565b60006020820190508181036000830152612b628184612b0f565b905092915050565b6000819050919050565b612b7d81612b6a565b8114612b8857600080fd5b50565b600081359050612b9a81612b74565b92915050565b600060208284031215612bb657612bb56129ea565b5b6000612bc484828501612b8b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bf882612bcd565b9050919050565b612c0881612bed565b82525050565b6000602082019050612c236000830184612bff565b92915050565b612c3281612bed565b8114612c3d57600080fd5b50565b600081359050612c4f81612c29565b92915050565b60008060408385031215612c6c57612c6b6129ea565b5b6000612c7a85828601612c40565b9250506020612c8b85828601612b8b565b9150509250929050565b612c9e81612b6a565b82525050565b6000602082019050612cb96000830184612c95565b92915050565b600080600060608486031215612cd857612cd76129ea565b5b6000612ce686828701612c40565b9350506020612cf786828701612c40565b9250506040612d0886828701612b8b565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d5482612afe565b810181811067ffffffffffffffff82111715612d7357612d72612d1c565b5b80604052505050565b6000612d866129e0565b9050612d928282612d4b565b919050565b600067ffffffffffffffff821115612db257612db1612d1c565b5b612dbb82612afe565b9050602081019050919050565b82818337600083830152505050565b6000612dea612de584612d97565b612d7c565b905082815260208101848484011115612e0657612e05612d17565b5b612e11848285612dc8565b509392505050565b600082601f830112612e2e57612e2d612d12565b5b8135612e3e848260208601612dd7565b91505092915050565b600060208284031215612e5d57612e5c6129ea565b5b600082013567ffffffffffffffff811115612e7b57612e7a6129ef565b5b612e8784828501612e19565b91505092915050565b600080fd5b600080fd5b60008083601f840112612eb057612eaf612d12565b5b8235905067ffffffffffffffff811115612ecd57612ecc612e90565b5b602083019150836020820283011115612ee957612ee8612e95565b5b9250929050565b60008060208385031215612f0757612f066129ea565b5b600083013567ffffffffffffffff811115612f2557612f246129ef565b5b612f3185828601612e9a565b92509250509250929050565b600060208284031215612f5357612f526129ea565b5b6000612f6184828501612c40565b91505092915050565b612f7381612a79565b8114612f7e57600080fd5b50565b600081359050612f9081612f6a565b92915050565b600060208284031215612fac57612fab6129ea565b5b6000612fba84828501612f81565b91505092915050565b60008060408385031215612fda57612fd96129ea565b5b6000612fe885828601612c40565b9250506020612ff985828601612f81565b9150509250929050565b600067ffffffffffffffff82111561301e5761301d612d1c565b5b61302782612afe565b9050602081019050919050565b600061304761304284613003565b612d7c565b90508281526020810184848401111561306357613062612d17565b5b61306e848285612dc8565b509392505050565b600082601f83011261308b5761308a612d12565b5b813561309b848260208601613034565b91505092915050565b600080600080608085870312156130be576130bd6129ea565b5b60006130cc87828801612c40565b94505060206130dd87828801612c40565b93505060406130ee87828801612b8b565b925050606085013567ffffffffffffffff81111561310f5761310e6129ef565b5b61311b87828801613076565b91505092959194509250565b6000806040838503121561313e5761313d6129ea565b5b600061314c85828601612c40565b925050602061315d85828601612c40565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806131ae57607f821691505b6020821081036131c1576131c0613167565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000613223602d83612aba565b915061322e826131c7565b604082019050919050565b6000602082019050818103600083015261325281613216565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b60006132b5602283612aba565b91506132c082613259565b604082019050919050565b600060208201905081810360008301526132e4816132a8565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000613347603983612aba565b9150613352826132eb565b604082019050919050565b600060208201905081810360008301526133768161333a565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b60006133d9602283612aba565b91506133e48261337d565b604082019050919050565b60006020820190508181036000830152613408816133cc565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b600061346b602e83612aba565b91506134768261340f565b604082019050919050565b6000602082019050818103600083015261349a8161345e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006134d7602083612aba565b91506134e2826134a1565b602082019050919050565b60006020820190508181036000830152613506816134ca565b9050919050565b600081905092915050565b50565b600061352860008361350d565b915061353382613518565b600082019050919050565b60006135498261351b565b9150819050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b60006135af602383612aba565b91506135ba82613553565b604082019050919050565b600060208201905081810360008301526135de816135a2565b9050919050565b7f436c61696d206973206e6f742061637469766500000000000000000000000000600082015250565b600061361b601383612aba565b9150613626826135e5565b602082019050919050565b6000602082019050818103600083015261364a8161360e565b9050919050565b7f596f75206d75737420636c61696d206174206c65617374203120746f6b656e00600082015250565b6000613687601f83612aba565b915061369282613651565b602082019050919050565b600060208201905081810360008301526136b68161367a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815190506136fb81612c29565b92915050565b600060208284031215613717576137166129ea565b5b6000613725848285016136ec565b91505092915050565b7f596f7520646f206e6f74206f776e20746865736520746f6b656e730000000000600082015250565b6000613764601b83612aba565b915061376f8261372e565b602082019050919050565b6000602082019050818103600083015261379381613757565b9050919050565b7f416e20696e70757474656420746f6b656e2077617320616c726561647920636c60008201527f61696d6564000000000000000000000000000000000000000000000000000000602082015250565b60006137f6602583612aba565b91506138018261379a565b604082019050919050565b60006020820190508181036000830152613825816137e9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061386682612b6a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036138985761389761382c565b5b600182019050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b60006138ff602b83612aba565b915061390a826138a3565b604082019050919050565b6000602082019050818103600083015261392e816138f2565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b600061396b601a83612aba565b915061397682613935565b602082019050919050565b6000602082019050818103600083015261399a8161395e565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b60006139fd603383612aba565b9150613a08826139a1565b604082019050919050565b60006020820190508181036000830152613a2c816139f0565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613a8f602f83612aba565b9150613a9a82613a33565b604082019050919050565b60006020820190508181036000830152613abe81613a82565b9050919050565b600081905092915050565b6000613adb82612aaf565b613ae58185613ac5565b9350613af5818560208601612acb565b80840191505092915050565b6000613b0d8285613ad0565b9150613b198284613ad0565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b81602683612aba565b9150613b8c82613b25565b604082019050919050565b60006020820190508181036000830152613bb081613b74565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000613c13603283612aba565b9150613c1e82613bb7565b604082019050919050565b60006020820190508181036000830152613c4281613c06565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000613ca5602683612aba565b9150613cb082613c49565b604082019050919050565b60006020820190508181036000830152613cd481613c98565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613d37602583612aba565b9150613d4282613cdb565b604082019050919050565b60006020820190508181036000830152613d6681613d2a565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000613dc9602a83612aba565b9150613dd482613d6d565b604082019050919050565b60006020820190508181036000830152613df881613dbc565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000613e5b602f83612aba565b9150613e6682613dff565b604082019050919050565b60006020820190508181036000830152613e8a81613e4e565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613eb882613e91565b613ec28185613e9c565b9350613ed2818560208601612acb565b613edb81612afe565b840191505092915050565b6000608082019050613efb6000830187612bff565b613f086020830186612bff565b613f156040830185612c95565b8181036060830152613f278184613ead565b905095945050505050565b600081519050613f4181612a20565b92915050565b600060208284031215613f5d57613f5c6129ea565b5b6000613f6b84828501613f32565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613fae82612b6a565b9150613fb983612b6a565b925082613fc957613fc8613f74565b5b828204905092915050565b6000613fdf82612b6a565b9150613fea83612b6a565b925082821015613ffd57613ffc61382c565b5b828203905092915050565b600061401382612b6a565b915061401e83612b6a565b92508261402e5761402d613f74565b5b828206905092915050565b600061404482612b6a565b915061404f83612b6a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140845761408361382c565b5b828201905092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006140eb602183612aba565b91506140f68261408f565b604082019050919050565b6000602082019050818103600083015261411a816140de565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b600061417d602883612aba565b915061418882614121565b604082019050919050565b600060208201905081810360008301526141ac81614170565b905091905056fea2646970667358221220586739a29493ed6e4290f499157ffb22bc454d9848c3a0bc08765e2d366a6e4b64736f6c634300080d0033
Deployed Bytecode Sourcemap
53685:1834:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40426:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42312:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43874:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53765:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43395:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38683:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44750:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39347:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54973:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55352:164;;;:::i;:::-;;44983:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53902:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38860:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55110:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42121:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54221:599;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40862:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14013:94;;;;;;;;;;;;;:::i;:::-;;54849:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13362:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42481:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44160:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45231:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42656:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53804:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44519:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14262:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40426:372;40528:4;40580:25;40565:40;;;:11;:40;;;;:105;;;;40637:33;40622:48;;;:11;:48;;;;40565:105;:172;;;;40702:35;40687:50;;;:11;:50;;;;40565:172;:225;;;;40754:36;40778:11;40754:23;:36::i;:::-;40565:225;40545:245;;40426:372;;;:::o;42312:100::-;42366:13;42399:5;42392:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42312:100;:::o;43874:214::-;43942:7;43970:16;43978:7;43970;:16::i;:::-;43962:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;44056:15;:24;44072:7;44056:24;;;;;;;;;;;;;;;;;;;;;44049:31;;43874:214;;;:::o;53765:30::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43395:413::-;43468:13;43484:24;43500:7;43484:15;:24::i;:::-;43468:40;;43533:5;43527:11;;:2;:11;;;43519:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;43628:5;43612:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;43637:37;43654:5;43661:12;:10;:12::i;:::-;43637:16;:37::i;:::-;43612:62;43590:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;43772:28;43781:2;43785:7;43794:5;43772:8;:28::i;:::-;43457:351;43395:413;;:::o;38683:100::-;38736:7;38763:12;;38756:19;;38683:100;:::o;44750:162::-;44876:28;44886:4;44892:2;44896:7;44876:9;:28::i;:::-;44750:162;;;:::o;39347:1007::-;39436:7;39472:16;39482:5;39472:9;:16::i;:::-;39464:5;:24;39456:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;39538:22;39563:13;:11;:13::i;:::-;39538:38;;39587:19;39617:25;39806:9;39801:466;39821:14;39817:1;:18;39801:466;;;39861:31;39895:11;:14;39907:1;39895:14;;;;;;;;;;;39861:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39958:1;39932:28;;:9;:14;;;:28;;;39928:111;;40005:9;:14;;;39985:34;;39928:111;40082:5;40061:26;;:17;:26;;;40057:195;;40131:5;40116:11;:20;40112:85;;40172:1;40165:8;;;;;;;;;40112:85;40219:13;;;;;;;40057:195;39842:425;39837:3;;;;;;;39801:466;;;;40290:56;;;;;;;;;;:::i;:::-;;;;;;;;39347:1007;;;;;:::o;54973:113::-;55033:4;55057:12;:21;55070:7;55057:21;;;;;;;;;;;;;;;;;;;;;55050:28;;54973:113;;;:::o;55352:164::-;13593:12;:10;:12::i;:::-;13582:23;;:7;:5;:7::i;:::-;:23;;;13574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55405:12:::1;55431:10;55423:24;;55455:21;55423:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55404:77;;;55500:7;55492:16;;;::::0;::::1;;55397:119;55352:164::o:0;44983:177::-;45113:39;45130:4;45136:2;45140:7;45113:39;;;;;;;;;;;;:16;:39::i;:::-;44983:177;;;:::o;53902:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;38860:187::-;38927:7;38963:13;:11;:13::i;:::-;38955:5;:21;38947:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;39034:5;39027:12;;38860:187;;;:::o;55110:109::-;13593:12;:10;:12::i;:::-;13582:23;;:7;:5;:7::i;:::-;:23;;;13574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55203:8:::1;55184:16;:27;;;;;;;;;;;;:::i;:::-;;55110:109:::0;:::o;42121:124::-;42185:7;42212:20;42224:7;42212:11;:20::i;:::-;:25;;;42205:32;;42121:124;;;:::o;54221:599::-;54302:14;;;;;;;;;;;54288:28;;:10;:28;;;54285:98;;54336:11;;;;;;;;;;;54328:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;54285:98;54419:1;54403:6;;:13;;:17;54395:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;54473:9;54469:290;54492:6;;:13;;54488:1;:17;54469:290;;;54563:10;54535:38;;:5;;;;;;;;;;;:13;;;54549:6;;54556:1;54549:9;;;;;;;:::i;:::-;;;;;;;;54535:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;;;54527:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;54655:5;54628:32;;:12;:23;54641:6;;54648:1;54641:9;;;;;;;:::i;:::-;;;;;;;;54628:23;;;;;;;;;;;;;;;;;;;;;:32;;;54620:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;54743:4;54717:12;:23;54730:6;;54737:1;54730:9;;;;;;;:::i;:::-;;;;;;;;54717:23;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;54507:3;;;;;:::i;:::-;;;;54469:290;;;;54771:36;54781:10;54793:6;;:13;;54771:9;:36::i;:::-;54221:599;;:::o;40862:221::-;40926:7;40971:1;40954:19;;:5;:19;;;40946:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;41047:12;:19;41060:5;41047:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;41039:36;;41032:43;;40862:221;;;:::o;14013:94::-;13593:12;:10;:12::i;:::-;13582:23;;:7;:5;:7::i;:::-;:23;;;13574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14078:21:::1;14096:1;14078:9;:21::i;:::-;14013:94::o:0;54849:97::-;13593:12;:10;:12::i;:::-;13582:23;;:7;:5;:7::i;:::-;:23;;;13574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54931:7:::1;54917:11;;:21;;;;;;;;;;;;;;;;;;54849:97:::0;:::o;13362:87::-;13408:7;13435:6;;;;;;;;;;;13428:13;;13362:87;:::o;42481:104::-;42537:13;42570:7;42563:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42481:104;:::o;44160:288::-;44267:12;:10;:12::i;:::-;44255:24;;:8;:24;;;44247:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;44368:8;44323:18;:32;44342:12;:10;:12::i;:::-;44323:32;;;;;;;;;;;;;;;:42;44356:8;44323:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;44421:8;44392:48;;44407:12;:10;:12::i;:::-;44392:48;;;44431:8;44392:48;;;;;;:::i;:::-;;;;;;;;44160:288;;:::o;45231:355::-;45390:28;45400:4;45406:2;45410:7;45390:9;:28::i;:::-;45451:48;45474:4;45480:2;45484:7;45493:5;45451:22;:48::i;:::-;45429:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;45231:355;;;;:::o;42656:335::-;42729:13;42763:16;42771:7;42763;:16::i;:::-;42755:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;42844:21;42868:10;:8;:10::i;:::-;42844:34;;42921:1;42902:7;42896:21;:26;:87;;;;;;;;;;;;;;;;;42949:7;42958:18;:7;:16;:18::i;:::-;42932:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42896:87;42889:94;;;42656:335;;;:::o;53804:31::-;;;;;;;;;;;;;:::o;44519:164::-;44616:4;44640:18;:25;44659:5;44640:25;;;;;;;;;;;;;;;:35;44666:8;44640:35;;;;;;;;;;;;;;;;;;;;;;;;;44633:42;;44519:164;;;;:::o;14262:192::-;13593:12;:10;:12::i;:::-;13582:23;;:7;:5;:7::i;:::-;:23;;;13574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14371:1:::1;14351:22;;:8;:22;;::::0;14343:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;14427:19;14437:8;14427:9;:19::i;:::-;14262:192:::0;:::o;30814:157::-;30899:4;30938:25;30923:40;;;:11;:40;;;;30916:47;;30814:157;;;:::o;45841:111::-;45898:4;45932:12;;45922:7;:22;45915:29;;45841:111;;;:::o;12183:98::-;12236:7;12263:10;12256:17;;12183:98;:::o;50761:196::-;50903:2;50876:15;:24;50892:7;50876:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;50941:7;50937:2;50921:28;;50930:5;50921:28;;;;;;;;;;;;50761:196;;;:::o;48641:2002::-;48756:35;48794:20;48806:7;48794:11;:20::i;:::-;48756:58;;48827:22;48869:13;:18;;;48853:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;48928:12;:10;:12::i;:::-;48904:36;;:20;48916:7;48904:11;:20::i;:::-;:36;;;48853:87;:154;;;;48957:50;48974:13;:18;;;48994:12;:10;:12::i;:::-;48957:16;:50::i;:::-;48853:154;48827:181;;49029:17;49021:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;49144:4;49122:26;;:13;:18;;;:26;;;49114:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;49224:1;49210:16;;:2;:16;;;49202:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;49281:43;49303:4;49309:2;49313:7;49322:1;49281:21;:43::i;:::-;49389:49;49406:1;49410:7;49419:13;:18;;;49389:8;:49::i;:::-;49764:1;49734:12;:18;49747:4;49734:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49808:1;49780:12;:16;49793:2;49780:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49854:2;49826:11;:20;49838:7;49826:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;49916:15;49871:11;:20;49883:7;49871:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;50184:19;50216:1;50206:7;:11;50184:33;;50277:1;50236:43;;:11;:24;50248:11;50236:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;50232:295;;50304:20;50312:11;50304:7;:20::i;:::-;50300:212;;;50381:13;:18;;;50349:11;:24;50361:11;50349:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;50464:13;:28;;;50422:11;:24;50434:11;50422:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;50300:212;50232:295;49709:829;50574:7;50570:2;50555:27;;50564:4;50555:27;;;;;;;;;;;;50593:42;50614:4;50620:2;50624:7;50633:1;50593:20;:42::i;:::-;48745:1898;;48641:2002;;;:::o;41522:537::-;41583:21;;:::i;:::-;41625:16;41633:7;41625;:16::i;:::-;41617:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;41731:12;41746:7;41731:22;;41726:245;41763:1;41755:4;:9;41726:245;;41793:31;41827:11;:17;41839:4;41827:17;;;;;;;;;;;41793:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41893:1;41867:28;;:9;:14;;;:28;;;41863:93;;41927:9;41920:16;;;;;;41863:93;41774:197;41766:6;;;;;;;;41726:245;;;;41994:57;;;;;;;;;;:::i;:::-;;;;;;;;41522:537;;;;:::o;45960:104::-;46029:27;46039:2;46043:8;46029:27;;;;;;;;;;;;:9;:27::i;:::-;45960:104;;:::o;14462:173::-;14518:16;14537:6;;;;;;;;;;;14518:25;;14563:8;14554:6;;:17;;;;;;;;;;;;;;;;;;14618:8;14587:40;;14608:8;14587:40;;;;;;;;;;;;14507:128;14462:173;:::o;51522:804::-;51677:4;51698:15;:2;:13;;;:15::i;:::-;51694:625;;;51750:2;51734:36;;;51771:12;:10;:12::i;:::-;51785:4;51791:7;51800:5;51734:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51730:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51997:1;51980:6;:13;:18;51976:273;;52023:61;;;;;;;;;;:::i;:::-;;;;;;;;51976:273;52199:6;52193:13;52184:6;52180:2;52176:15;52169:38;51730:534;51867:45;;;51857:55;;;:6;:55;;;;51850:62;;;;;51694:625;52303:4;52296:11;;51522:804;;;;;;;:::o;55227:117::-;55287:13;55320:16;55313:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55227:117;:::o;357:723::-;413:13;643:1;634:5;:10;630:53;;661:10;;;;;;;;;;;;;;;;;;;;;630:53;693:12;708:5;693:20;;724:14;749:78;764:1;756:4;:9;749:78;;782:8;;;;;:::i;:::-;;;;813:2;805:10;;;;;:::i;:::-;;;749:78;;;837:19;869:6;859:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;837:39;;887:154;903:1;894:5;:10;887:154;;931:1;921:11;;;;;:::i;:::-;;;998:2;990:5;:10;;;;:::i;:::-;977:2;:24;;;;:::i;:::-;964:39;;947:6;954;947:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1027:2;1018:11;;;;;:::i;:::-;;;887:154;;;1065:6;1051:21;;;;;357:723;;;;:::o;52814:159::-;;;;;:::o;53385:158::-;;;;;:::o;46427:163::-;46550:32;46556:2;46560:8;46570:5;46577:4;46550:5;:32::i;:::-;46427:163;;;:::o;15376:387::-;15436:4;15644:12;15711:7;15699:20;15691:28;;15754:1;15747:4;:8;15740:15;;;15376:387;;;:::o;46849:1538::-;46988:20;47011:12;;46988:35;;47056:1;47042:16;;:2;:16;;;47034:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;47127:1;47115:8;:13;47107:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;47186:61;47216:1;47220:2;47224:12;47238:8;47186:21;:61::i;:::-;47561:8;47525:12;:16;47538:2;47525:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47626:8;47585:12;:16;47598:2;47585:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47685:2;47652:11;:25;47664:12;47652:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;47752:15;47702:11;:25;47714:12;47702:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;47785:20;47808:12;47785:35;;47842:9;47837:415;47857:8;47853:1;:12;47837:415;;;47921:12;47917:2;47896:38;;47913:1;47896:38;;;;;;;;;;;;47957:4;47953:249;;;48020:59;48051:1;48055:2;48059:12;48073:5;48020:22;:59::i;:::-;47986:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;47953:249;48222:14;;;;;;;47867:3;;;;;;;47837:415;;;;48283:12;48268;:27;;;;47500:807;48319:60;48348:1;48352:2;48356:12;48370:8;48319:20;:60::i;:::-;46977:1410;46849:1538;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:180;6209:77;6206:1;6199:88;6306:4;6303:1;6296:15;6330:4;6327:1;6320:15;6347:281;6430:27;6452:4;6430:27;:::i;:::-;6422:6;6418:40;6560:6;6548:10;6545:22;6524:18;6512:10;6509:34;6506:62;6503:88;;;6571:18;;:::i;:::-;6503:88;6611:10;6607:2;6600:22;6390:238;6347:281;;:::o;6634:129::-;6668:6;6695:20;;:::i;:::-;6685:30;;6724:33;6752:4;6744:6;6724:33;:::i;:::-;6634:129;;;:::o;6769:308::-;6831:4;6921:18;6913:6;6910:30;6907:56;;;6943:18;;:::i;:::-;6907:56;6981:29;7003:6;6981:29;:::i;:::-;6973:37;;7065:4;7059;7055:15;7047:23;;6769:308;;;:::o;7083:154::-;7167:6;7162:3;7157;7144:30;7229:1;7220:6;7215:3;7211:16;7204:27;7083:154;;;:::o;7243:412::-;7321:5;7346:66;7362:49;7404:6;7362:49;:::i;:::-;7346:66;:::i;:::-;7337:75;;7435:6;7428:5;7421:21;7473:4;7466:5;7462:16;7511:3;7502:6;7497:3;7493:16;7490:25;7487:112;;;7518:79;;:::i;:::-;7487:112;7608:41;7642:6;7637:3;7632;7608:41;:::i;:::-;7327:328;7243:412;;;;;:::o;7675:340::-;7731:5;7780:3;7773:4;7765:6;7761:17;7757:27;7747:122;;7788:79;;:::i;:::-;7747:122;7905:6;7892:20;7930:79;8005:3;7997:6;7990:4;7982:6;7978:17;7930:79;:::i;:::-;7921:88;;7737:278;7675:340;;;;:::o;8021:509::-;8090:6;8139:2;8127:9;8118:7;8114:23;8110:32;8107:119;;;8145:79;;:::i;:::-;8107:119;8293:1;8282:9;8278:17;8265:31;8323:18;8315:6;8312:30;8309:117;;;8345:79;;:::i;:::-;8309:117;8450:63;8505:7;8496:6;8485:9;8481:22;8450:63;:::i;:::-;8440:73;;8236:287;8021:509;;;;:::o;8536:117::-;8645:1;8642;8635:12;8659:117;8768:1;8765;8758:12;8799:568;8872:8;8882:6;8932:3;8925:4;8917:6;8913:17;8909:27;8899:122;;8940:79;;:::i;:::-;8899:122;9053:6;9040:20;9030:30;;9083:18;9075:6;9072:30;9069:117;;;9105:79;;:::i;:::-;9069:117;9219:4;9211:6;9207:17;9195:29;;9273:3;9265:4;9257:6;9253:17;9243:8;9239:32;9236:41;9233:128;;;9280:79;;:::i;:::-;9233:128;8799:568;;;;;:::o;9373:559::-;9459:6;9467;9516:2;9504:9;9495:7;9491:23;9487:32;9484:119;;;9522:79;;:::i;:::-;9484:119;9670:1;9659:9;9655:17;9642:31;9700:18;9692:6;9689:30;9686:117;;;9722:79;;:::i;:::-;9686:117;9835:80;9907:7;9898:6;9887:9;9883:22;9835:80;:::i;:::-;9817:98;;;;9613:312;9373:559;;;;;:::o;9938:329::-;9997:6;10046:2;10034:9;10025:7;10021:23;10017:32;10014:119;;;10052:79;;:::i;:::-;10014:119;10172:1;10197:53;10242:7;10233:6;10222:9;10218:22;10197:53;:::i;:::-;10187:63;;10143:117;9938:329;;;;:::o;10273:116::-;10343:21;10358:5;10343:21;:::i;:::-;10336:5;10333:32;10323:60;;10379:1;10376;10369:12;10323:60;10273:116;:::o;10395:133::-;10438:5;10476:6;10463:20;10454:29;;10492:30;10516:5;10492:30;:::i;:::-;10395:133;;;;:::o;10534:323::-;10590:6;10639:2;10627:9;10618:7;10614:23;10610:32;10607:119;;;10645:79;;:::i;:::-;10607:119;10765:1;10790:50;10832:7;10823:6;10812:9;10808:22;10790:50;:::i;:::-;10780:60;;10736:114;10534:323;;;;:::o;10863:468::-;10928:6;10936;10985:2;10973:9;10964:7;10960:23;10956:32;10953:119;;;10991:79;;:::i;:::-;10953:119;11111:1;11136:53;11181:7;11172:6;11161:9;11157:22;11136:53;:::i;:::-;11126:63;;11082:117;11238:2;11264:50;11306:7;11297:6;11286:9;11282:22;11264:50;:::i;:::-;11254:60;;11209:115;10863:468;;;;;:::o;11337:307::-;11398:4;11488:18;11480:6;11477:30;11474:56;;;11510:18;;:::i;:::-;11474:56;11548:29;11570:6;11548:29;:::i;:::-;11540:37;;11632:4;11626;11622:15;11614:23;;11337:307;;;:::o;11650:410::-;11727:5;11752:65;11768:48;11809:6;11768:48;:::i;:::-;11752:65;:::i;:::-;11743:74;;11840:6;11833:5;11826:21;11878:4;11871:5;11867:16;11916:3;11907:6;11902:3;11898:16;11895:25;11892:112;;;11923:79;;:::i;:::-;11892:112;12013:41;12047:6;12042:3;12037;12013:41;:::i;:::-;11733:327;11650:410;;;;;:::o;12079:338::-;12134:5;12183:3;12176:4;12168:6;12164:17;12160:27;12150:122;;12191:79;;:::i;:::-;12150:122;12308:6;12295:20;12333:78;12407:3;12399:6;12392:4;12384:6;12380:17;12333:78;:::i;:::-;12324:87;;12140:277;12079:338;;;;:::o;12423:943::-;12518:6;12526;12534;12542;12591:3;12579:9;12570:7;12566:23;12562:33;12559:120;;;12598:79;;:::i;:::-;12559:120;12718:1;12743:53;12788:7;12779:6;12768:9;12764:22;12743:53;:::i;:::-;12733:63;;12689:117;12845:2;12871:53;12916:7;12907:6;12896:9;12892:22;12871:53;:::i;:::-;12861:63;;12816:118;12973:2;12999:53;13044:7;13035:6;13024:9;13020:22;12999:53;:::i;:::-;12989:63;;12944:118;13129:2;13118:9;13114:18;13101:32;13160:18;13152:6;13149:30;13146:117;;;13182:79;;:::i;:::-;13146:117;13287:62;13341:7;13332:6;13321:9;13317:22;13287:62;:::i;:::-;13277:72;;13072:287;12423:943;;;;;;;:::o;13372:474::-;13440:6;13448;13497:2;13485:9;13476:7;13472:23;13468:32;13465:119;;;13503:79;;:::i;:::-;13465:119;13623:1;13648:53;13693:7;13684:6;13673:9;13669:22;13648:53;:::i;:::-;13638:63;;13594:117;13750:2;13776:53;13821:7;13812:6;13801:9;13797:22;13776:53;:::i;:::-;13766:63;;13721:118;13372:474;;;;;:::o;13852:180::-;13900:77;13897:1;13890:88;13997:4;13994:1;13987:15;14021:4;14018:1;14011:15;14038:320;14082:6;14119:1;14113:4;14109:12;14099:22;;14166:1;14160:4;14156:12;14187:18;14177:81;;14243:4;14235:6;14231:17;14221:27;;14177:81;14305:2;14297:6;14294:14;14274:18;14271:38;14268:84;;14324:18;;:::i;:::-;14268:84;14089:269;14038:320;;;:::o;14364:232::-;14504:34;14500:1;14492:6;14488:14;14481:58;14573:15;14568:2;14560:6;14556:15;14549:40;14364:232;:::o;14602:366::-;14744:3;14765:67;14829:2;14824:3;14765:67;:::i;:::-;14758:74;;14841:93;14930:3;14841:93;:::i;:::-;14959:2;14954:3;14950:12;14943:19;;14602:366;;;:::o;14974:419::-;15140:4;15178:2;15167:9;15163:18;15155:26;;15227:9;15221:4;15217:20;15213:1;15202:9;15198:17;15191:47;15255:131;15381:4;15255:131;:::i;:::-;15247:139;;14974:419;;;:::o;15399:221::-;15539:34;15535:1;15527:6;15523:14;15516:58;15608:4;15603:2;15595:6;15591:15;15584:29;15399:221;:::o;15626:366::-;15768:3;15789:67;15853:2;15848:3;15789:67;:::i;:::-;15782:74;;15865:93;15954:3;15865:93;:::i;:::-;15983:2;15978:3;15974:12;15967:19;;15626:366;;;:::o;15998:419::-;16164:4;16202:2;16191:9;16187:18;16179:26;;16251:9;16245:4;16241:20;16237:1;16226:9;16222:17;16215:47;16279:131;16405:4;16279:131;:::i;:::-;16271:139;;15998:419;;;:::o;16423:244::-;16563:34;16559:1;16551:6;16547:14;16540:58;16632:27;16627:2;16619:6;16615:15;16608:52;16423:244;:::o;16673:366::-;16815:3;16836:67;16900:2;16895:3;16836:67;:::i;:::-;16829:74;;16912:93;17001:3;16912:93;:::i;:::-;17030:2;17025:3;17021:12;17014:19;;16673:366;;;:::o;17045:419::-;17211:4;17249:2;17238:9;17234:18;17226:26;;17298:9;17292:4;17288:20;17284:1;17273:9;17269:17;17262:47;17326:131;17452:4;17326:131;:::i;:::-;17318:139;;17045:419;;;:::o;17470:221::-;17610:34;17606:1;17598:6;17594:14;17587:58;17679:4;17674:2;17666:6;17662:15;17655:29;17470:221;:::o;17697:366::-;17839:3;17860:67;17924:2;17919:3;17860:67;:::i;:::-;17853:74;;17936:93;18025:3;17936:93;:::i;:::-;18054:2;18049:3;18045:12;18038:19;;17697:366;;;:::o;18069:419::-;18235:4;18273:2;18262:9;18258:18;18250:26;;18322:9;18316:4;18312:20;18308:1;18297:9;18293:17;18286:47;18350:131;18476:4;18350:131;:::i;:::-;18342:139;;18069:419;;;:::o;18494:233::-;18634:34;18630:1;18622:6;18618:14;18611:58;18703:16;18698:2;18690:6;18686:15;18679:41;18494:233;:::o;18733:366::-;18875:3;18896:67;18960:2;18955:3;18896:67;:::i;:::-;18889:74;;18972:93;19061:3;18972:93;:::i;:::-;19090:2;19085:3;19081:12;19074:19;;18733:366;;;:::o;19105:419::-;19271:4;19309:2;19298:9;19294:18;19286:26;;19358:9;19352:4;19348:20;19344:1;19333:9;19329:17;19322:47;19386:131;19512:4;19386:131;:::i;:::-;19378:139;;19105:419;;;:::o;19530:182::-;19670:34;19666:1;19658:6;19654:14;19647:58;19530:182;:::o;19718:366::-;19860:3;19881:67;19945:2;19940:3;19881:67;:::i;:::-;19874:74;;19957:93;20046:3;19957:93;:::i;:::-;20075:2;20070:3;20066:12;20059:19;;19718:366;;;:::o;20090:419::-;20256:4;20294:2;20283:9;20279:18;20271:26;;20343:9;20337:4;20333:20;20329:1;20318:9;20314:17;20307:47;20371:131;20497:4;20371:131;:::i;:::-;20363:139;;20090:419;;;:::o;20515:147::-;20616:11;20653:3;20638:18;;20515:147;;;;:::o;20668:114::-;;:::o;20788:398::-;20947:3;20968:83;21049:1;21044:3;20968:83;:::i;:::-;20961:90;;21060:93;21149:3;21060:93;:::i;:::-;21178:1;21173:3;21169:11;21162:18;;20788:398;;;:::o;21192:379::-;21376:3;21398:147;21541:3;21398:147;:::i;:::-;21391:154;;21562:3;21555:10;;21192:379;;;:::o;21577:222::-;21717:34;21713:1;21705:6;21701:14;21694:58;21786:5;21781:2;21773:6;21769:15;21762:30;21577:222;:::o;21805:366::-;21947:3;21968:67;22032:2;22027:3;21968:67;:::i;:::-;21961:74;;22044:93;22133:3;22044:93;:::i;:::-;22162:2;22157:3;22153:12;22146:19;;21805:366;;;:::o;22177:419::-;22343:4;22381:2;22370:9;22366:18;22358:26;;22430:9;22424:4;22420:20;22416:1;22405:9;22401:17;22394:47;22458:131;22584:4;22458:131;:::i;:::-;22450:139;;22177:419;;;:::o;22602:169::-;22742:21;22738:1;22730:6;22726:14;22719:45;22602:169;:::o;22777:366::-;22919:3;22940:67;23004:2;22999:3;22940:67;:::i;:::-;22933:74;;23016:93;23105:3;23016:93;:::i;:::-;23134:2;23129:3;23125:12;23118:19;;22777:366;;;:::o;23149:419::-;23315:4;23353:2;23342:9;23338:18;23330:26;;23402:9;23396:4;23392:20;23388:1;23377:9;23373:17;23366:47;23430:131;23556:4;23430:131;:::i;:::-;23422:139;;23149:419;;;:::o;23574:181::-;23714:33;23710:1;23702:6;23698:14;23691:57;23574:181;:::o;23761:366::-;23903:3;23924:67;23988:2;23983:3;23924:67;:::i;:::-;23917:74;;24000:93;24089:3;24000:93;:::i;:::-;24118:2;24113:3;24109:12;24102:19;;23761:366;;;:::o;24133:419::-;24299:4;24337:2;24326:9;24322:18;24314:26;;24386:9;24380:4;24376:20;24372:1;24361:9;24357:17;24350:47;24414:131;24540:4;24414:131;:::i;:::-;24406:139;;24133:419;;;:::o;24558:180::-;24606:77;24603:1;24596:88;24703:4;24700:1;24693:15;24727:4;24724:1;24717:15;24744:143;24801:5;24832:6;24826:13;24817:22;;24848:33;24875:5;24848:33;:::i;:::-;24744:143;;;;:::o;24893:351::-;24963:6;25012:2;25000:9;24991:7;24987:23;24983:32;24980:119;;;25018:79;;:::i;:::-;24980:119;25138:1;25163:64;25219:7;25210:6;25199:9;25195:22;25163:64;:::i;:::-;25153:74;;25109:128;24893:351;;;;:::o;25250:177::-;25390:29;25386:1;25378:6;25374:14;25367:53;25250:177;:::o;25433:366::-;25575:3;25596:67;25660:2;25655:3;25596:67;:::i;:::-;25589:74;;25672:93;25761:3;25672:93;:::i;:::-;25790:2;25785:3;25781:12;25774:19;;25433:366;;;:::o;25805:419::-;25971:4;26009:2;25998:9;25994:18;25986:26;;26058:9;26052:4;26048:20;26044:1;26033:9;26029:17;26022:47;26086:131;26212:4;26086:131;:::i;:::-;26078:139;;25805:419;;;:::o;26230:224::-;26370:34;26366:1;26358:6;26354:14;26347:58;26439:7;26434:2;26426:6;26422:15;26415:32;26230:224;:::o;26460:366::-;26602:3;26623:67;26687:2;26682:3;26623:67;:::i;:::-;26616:74;;26699:93;26788:3;26699:93;:::i;:::-;26817:2;26812:3;26808:12;26801:19;;26460:366;;;:::o;26832:419::-;26998:4;27036:2;27025:9;27021:18;27013:26;;27085:9;27079:4;27075:20;27071:1;27060:9;27056:17;27049:47;27113:131;27239:4;27113:131;:::i;:::-;27105:139;;26832:419;;;:::o;27257:180::-;27305:77;27302:1;27295:88;27402:4;27399:1;27392:15;27426:4;27423:1;27416:15;27443:233;27482:3;27505:24;27523:5;27505:24;:::i;:::-;27496:33;;27551:66;27544:5;27541:77;27538:103;;27621:18;;:::i;:::-;27538:103;27668:1;27661:5;27657:13;27650:20;;27443:233;;;:::o;27682:230::-;27822:34;27818:1;27810:6;27806:14;27799:58;27891:13;27886:2;27878:6;27874:15;27867:38;27682:230;:::o;27918:366::-;28060:3;28081:67;28145:2;28140:3;28081:67;:::i;:::-;28074:74;;28157:93;28246:3;28157:93;:::i;:::-;28275:2;28270:3;28266:12;28259:19;;27918:366;;;:::o;28290:419::-;28456:4;28494:2;28483:9;28479:18;28471:26;;28543:9;28537:4;28533:20;28529:1;28518:9;28514:17;28507:47;28571:131;28697:4;28571:131;:::i;:::-;28563:139;;28290:419;;;:::o;28715:176::-;28855:28;28851:1;28843:6;28839:14;28832:52;28715:176;:::o;28897:366::-;29039:3;29060:67;29124:2;29119:3;29060:67;:::i;:::-;29053:74;;29136:93;29225:3;29136:93;:::i;:::-;29254:2;29249:3;29245:12;29238:19;;28897:366;;;:::o;29269:419::-;29435:4;29473:2;29462:9;29458:18;29450:26;;29522:9;29516:4;29512:20;29508:1;29497:9;29493:17;29486:47;29550:131;29676:4;29550:131;:::i;:::-;29542:139;;29269:419;;;:::o;29694:238::-;29834:34;29830:1;29822:6;29818:14;29811:58;29903:21;29898:2;29890:6;29886:15;29879:46;29694:238;:::o;29938:366::-;30080:3;30101:67;30165:2;30160:3;30101:67;:::i;:::-;30094:74;;30177:93;30266:3;30177:93;:::i;:::-;30295:2;30290:3;30286:12;30279:19;;29938:366;;;:::o;30310:419::-;30476:4;30514:2;30503:9;30499:18;30491:26;;30563:9;30557:4;30553:20;30549:1;30538:9;30534:17;30527:47;30591:131;30717:4;30591:131;:::i;:::-;30583:139;;30310:419;;;:::o;30735:234::-;30875:34;30871:1;30863:6;30859:14;30852:58;30944:17;30939:2;30931:6;30927:15;30920:42;30735:234;:::o;30975:366::-;31117:3;31138:67;31202:2;31197:3;31138:67;:::i;:::-;31131:74;;31214:93;31303:3;31214:93;:::i;:::-;31332:2;31327:3;31323:12;31316:19;;30975:366;;;:::o;31347:419::-;31513:4;31551:2;31540:9;31536:18;31528:26;;31600:9;31594:4;31590:20;31586:1;31575:9;31571:17;31564:47;31628:131;31754:4;31628:131;:::i;:::-;31620:139;;31347:419;;;:::o;31772:148::-;31874:11;31911:3;31896:18;;31772:148;;;;:::o;31926:377::-;32032:3;32060:39;32093:5;32060:39;:::i;:::-;32115:89;32197:6;32192:3;32115:89;:::i;:::-;32108:96;;32213:52;32258:6;32253:3;32246:4;32239:5;32235:16;32213:52;:::i;:::-;32290:6;32285:3;32281:16;32274:23;;32036:267;31926:377;;;;:::o;32309:435::-;32489:3;32511:95;32602:3;32593:6;32511:95;:::i;:::-;32504:102;;32623:95;32714:3;32705:6;32623:95;:::i;:::-;32616:102;;32735:3;32728:10;;32309:435;;;;;:::o;32750:225::-;32890:34;32886:1;32878:6;32874:14;32867:58;32959:8;32954:2;32946:6;32942:15;32935:33;32750:225;:::o;32981:366::-;33123:3;33144:67;33208:2;33203:3;33144:67;:::i;:::-;33137:74;;33220:93;33309:3;33220:93;:::i;:::-;33338:2;33333:3;33329:12;33322:19;;32981:366;;;:::o;33353:419::-;33519:4;33557:2;33546:9;33542:18;33534:26;;33606:9;33600:4;33596:20;33592:1;33581:9;33577:17;33570:47;33634:131;33760:4;33634:131;:::i;:::-;33626:139;;33353:419;;;:::o;33778:237::-;33918:34;33914:1;33906:6;33902:14;33895:58;33987:20;33982:2;33974:6;33970:15;33963:45;33778:237;:::o;34021:366::-;34163:3;34184:67;34248:2;34243:3;34184:67;:::i;:::-;34177:74;;34260:93;34349:3;34260:93;:::i;:::-;34378:2;34373:3;34369:12;34362:19;;34021:366;;;:::o;34393:419::-;34559:4;34597:2;34586:9;34582:18;34574:26;;34646:9;34640:4;34636:20;34632:1;34621:9;34617:17;34610:47;34674:131;34800:4;34674:131;:::i;:::-;34666:139;;34393:419;;;:::o;34818:225::-;34958:34;34954:1;34946:6;34942:14;34935:58;35027:8;35022:2;35014:6;35010:15;35003:33;34818:225;:::o;35049:366::-;35191:3;35212:67;35276:2;35271:3;35212:67;:::i;:::-;35205:74;;35288:93;35377:3;35288:93;:::i;:::-;35406:2;35401:3;35397:12;35390:19;;35049:366;;;:::o;35421:419::-;35587:4;35625:2;35614:9;35610:18;35602:26;;35674:9;35668:4;35664:20;35660:1;35649:9;35645:17;35638:47;35702:131;35828:4;35702:131;:::i;:::-;35694:139;;35421:419;;;:::o;35846:224::-;35986:34;35982:1;35974:6;35970:14;35963:58;36055:7;36050:2;36042:6;36038:15;36031:32;35846:224;:::o;36076:366::-;36218:3;36239:67;36303:2;36298:3;36239:67;:::i;:::-;36232:74;;36315:93;36404:3;36315:93;:::i;:::-;36433:2;36428:3;36424:12;36417:19;;36076:366;;;:::o;36448:419::-;36614:4;36652:2;36641:9;36637:18;36629:26;;36701:9;36695:4;36691:20;36687:1;36676:9;36672:17;36665:47;36729:131;36855:4;36729:131;:::i;:::-;36721:139;;36448:419;;;:::o;36873:229::-;37013:34;37009:1;37001:6;36997:14;36990:58;37082:12;37077:2;37069:6;37065:15;37058:37;36873:229;:::o;37108:366::-;37250:3;37271:67;37335:2;37330:3;37271:67;:::i;:::-;37264:74;;37347:93;37436:3;37347:93;:::i;:::-;37465:2;37460:3;37456:12;37449:19;;37108:366;;;:::o;37480:419::-;37646:4;37684:2;37673:9;37669:18;37661:26;;37733:9;37727:4;37723:20;37719:1;37708:9;37704:17;37697:47;37761:131;37887:4;37761:131;:::i;:::-;37753:139;;37480:419;;;:::o;37905:234::-;38045:34;38041:1;38033:6;38029:14;38022:58;38114:17;38109:2;38101:6;38097:15;38090:42;37905:234;:::o;38145:366::-;38287:3;38308:67;38372:2;38367:3;38308:67;:::i;:::-;38301:74;;38384:93;38473:3;38384:93;:::i;:::-;38502:2;38497:3;38493:12;38486:19;;38145:366;;;:::o;38517:419::-;38683:4;38721:2;38710:9;38706:18;38698:26;;38770:9;38764:4;38760:20;38756:1;38745:9;38741:17;38734:47;38798:131;38924:4;38798:131;:::i;:::-;38790:139;;38517:419;;;:::o;38942:98::-;38993:6;39027:5;39021:12;39011:22;;38942:98;;;:::o;39046:168::-;39129:11;39163:6;39158:3;39151:19;39203:4;39198:3;39194:14;39179:29;;39046:168;;;;:::o;39220:360::-;39306:3;39334:38;39366:5;39334:38;:::i;:::-;39388:70;39451:6;39446:3;39388:70;:::i;:::-;39381:77;;39467:52;39512:6;39507:3;39500:4;39493:5;39489:16;39467:52;:::i;:::-;39544:29;39566:6;39544:29;:::i;:::-;39539:3;39535:39;39528:46;;39310:270;39220:360;;;;:::o;39586:640::-;39781:4;39819:3;39808:9;39804:19;39796:27;;39833:71;39901:1;39890:9;39886:17;39877:6;39833:71;:::i;:::-;39914:72;39982:2;39971:9;39967:18;39958:6;39914:72;:::i;:::-;39996;40064:2;40053:9;40049:18;40040:6;39996:72;:::i;:::-;40115:9;40109:4;40105:20;40100:2;40089:9;40085:18;40078:48;40143:76;40214:4;40205:6;40143:76;:::i;:::-;40135:84;;39586:640;;;;;;;:::o;40232:141::-;40288:5;40319:6;40313:13;40304:22;;40335:32;40361:5;40335:32;:::i;:::-;40232:141;;;;:::o;40379:349::-;40448:6;40497:2;40485:9;40476:7;40472:23;40468:32;40465:119;;;40503:79;;:::i;:::-;40465:119;40623:1;40648:63;40703:7;40694:6;40683:9;40679:22;40648:63;:::i;:::-;40638:73;;40594:127;40379:349;;;;:::o;40734:180::-;40782:77;40779:1;40772:88;40879:4;40876:1;40869:15;40903:4;40900:1;40893:15;40920:185;40960:1;40977:20;40995:1;40977:20;:::i;:::-;40972:25;;41011:20;41029:1;41011:20;:::i;:::-;41006:25;;41050:1;41040:35;;41055:18;;:::i;:::-;41040:35;41097:1;41094;41090:9;41085:14;;40920:185;;;;:::o;41111:191::-;41151:4;41171:20;41189:1;41171:20;:::i;:::-;41166:25;;41205:20;41223:1;41205:20;:::i;:::-;41200:25;;41244:1;41241;41238:8;41235:34;;;41249:18;;:::i;:::-;41235:34;41294:1;41291;41287:9;41279:17;;41111:191;;;;:::o;41308:176::-;41340:1;41357:20;41375:1;41357:20;:::i;:::-;41352:25;;41391:20;41409:1;41391:20;:::i;:::-;41386:25;;41430:1;41420:35;;41435:18;;:::i;:::-;41420:35;41476:1;41473;41469:9;41464:14;;41308:176;;;;:::o;41490:305::-;41530:3;41549:20;41567:1;41549:20;:::i;:::-;41544:25;;41583:20;41601:1;41583:20;:::i;:::-;41578:25;;41737:1;41669:66;41665:74;41662:1;41659:81;41656:107;;;41743:18;;:::i;:::-;41656:107;41787:1;41784;41780:9;41773:16;;41490:305;;;;:::o;41801:220::-;41941:34;41937:1;41929:6;41925:14;41918:58;42010:3;42005:2;41997:6;41993:15;41986:28;41801:220;:::o;42027:366::-;42169:3;42190:67;42254:2;42249:3;42190:67;:::i;:::-;42183:74;;42266:93;42355:3;42266:93;:::i;:::-;42384:2;42379:3;42375:12;42368:19;;42027:366;;;:::o;42399:419::-;42565:4;42603:2;42592:9;42588:18;42580:26;;42652:9;42646:4;42642:20;42638:1;42627:9;42623:17;42616:47;42680:131;42806:4;42680:131;:::i;:::-;42672:139;;42399:419;;;:::o;42824:227::-;42964:34;42960:1;42952:6;42948:14;42941:58;43033:10;43028:2;43020:6;43016:15;43009:35;42824:227;:::o;43057:366::-;43199:3;43220:67;43284:2;43279:3;43220:67;:::i;:::-;43213:74;;43296:93;43385:3;43296:93;:::i;:::-;43414:2;43409:3;43405:12;43398:19;;43057:366;;;:::o;43429:419::-;43595:4;43633:2;43622:9;43618:18;43610:26;;43682:9;43676:4;43672:20;43668:1;43657:9;43653:17;43646:47;43710:131;43836:4;43710:131;:::i;:::-;43702:139;;43429:419;;;:::o
Swarm Source
ipfs://586739a29493ed6e4290f499157ffb22bc454d9848c3a0bc08765e2d366a6e4b
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.