Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 378 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 21218920 | 432 days ago | IN | 0 ETH | 0.00049186 | ||||
| Set Approval For... | 20182528 | 577 days ago | IN | 0 ETH | 0.00024191 | ||||
| Set Approval For... | 19009792 | 741 days ago | IN | 0 ETH | 0.00084689 | ||||
| Set Approval For... | 18668868 | 789 days ago | IN | 0 ETH | 0.00140087 | ||||
| Set Approval For... | 18167106 | 859 days ago | IN | 0 ETH | 0.00033789 | ||||
| Set Approval For... | 16052779 | 1156 days ago | IN | 0 ETH | 0.00049448 | ||||
| Set Approval For... | 15601984 | 1219 days ago | IN | 0 ETH | 0.0002538 | ||||
| Set Approval For... | 15487182 | 1236 days ago | IN | 0 ETH | 0.00150504 | ||||
| Transfer From | 15268391 | 1271 days ago | IN | 0 ETH | 0.00021285 | ||||
| Transfer From | 15236758 | 1276 days ago | IN | 0 ETH | 0.00030602 | ||||
| Transfer From | 15158620 | 1288 days ago | IN | 0 ETH | 0.00052368 | ||||
| Transfer From | 15158619 | 1288 days ago | IN | 0 ETH | 0.00045536 | ||||
| Transfer From | 15158614 | 1288 days ago | IN | 0 ETH | 0.00041177 | ||||
| Transfer From | 15146036 | 1290 days ago | IN | 0 ETH | 0.00048321 | ||||
| Transfer From | 15139694 | 1291 days ago | IN | 0 ETH | 0.00044939 | ||||
| Set Approval For... | 15080451 | 1300 days ago | IN | 0 ETH | 0.00056632 | ||||
| Set Approval For... | 15000214 | 1314 days ago | IN | 0 ETH | 0.00179742 | ||||
| Transfer From | 14947004 | 1323 days ago | IN | 0 ETH | 0.00504169 | ||||
| Transfer From | 14943003 | 1324 days ago | IN | 0 ETH | 0.00168825 | ||||
| Transfer From | 14942470 | 1324 days ago | IN | 0 ETH | 0.00138332 | ||||
| Withdraw | 14882342 | 1334 days ago | IN | 0 ETH | 0.00285673 | ||||
| Mint | 14847223 | 1340 days ago | IN | 0.09 ETH | 0.00191385 | ||||
| Transfer From | 14837684 | 1341 days ago | IN | 0 ETH | 0.00131437 | ||||
| Transfer From | 14837648 | 1341 days ago | IN | 0 ETH | 0.00280182 | ||||
| Set Uri Prefix | 14820471 | 1344 days ago | IN | 0 ETH | 0.00119854 |
Latest 14 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 14882342 | 1334 days ago | 0.018 ETH | ||||
| - | 14882342 | 1334 days ago | 0.342 ETH | ||||
| - | 14694918 | 1364 days ago | 0.05175 ETH | ||||
| - | 14694918 | 1364 days ago | 0.98325 ETH | ||||
| - | 14422837 | 1407 days ago | 0.024 ETH | ||||
| - | 14422837 | 1407 days ago | 0.456 ETH | ||||
| - | 14402480 | 1410 days ago | 0.068 ETH | ||||
| - | 14402480 | 1410 days ago | 1.292 ETH | ||||
| - | 14232759 | 1436 days ago | 0.064 ETH | ||||
| - | 14232759 | 1436 days ago | 1.216 ETH | ||||
| - | 14213340 | 1439 days ago | 0.356 ETH | ||||
| - | 14213340 | 1439 days ago | 6.764 ETH | ||||
| - | 14181261 | 1444 days ago | 0.004 ETH | ||||
| - | 14181261 | 1444 days ago | 0.076 ETH |
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
FracturedApesNFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-02-10
*/
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Counters.sol
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)
pragma solidity ^0.8.0;
/**
* @title Counters
* @author Matt Condon (@shrugs)
* @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
* of elements in a mapping, issuing ERC721 ids, or counting request ids.
*
* Include with `using Counters for Counters.Counter;`
*/
library Counters {
struct Counter {
// This variable should never be directly accessed by users of the library: interactions must be restricted to
// the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
// this feature: see https://github.com/ethereum/solidity/issues/4637
uint256 _value; // default: 0
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
unchecked {
counter._value += 1;
}
}
function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}
function reset(Counter storage counter) internal {
counter._value = 0;
}
}
// File: @openzeppelin/contracts/utils/Strings.sol
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
// File: @openzeppelin/contracts/utils/cryptography/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;
uint8 v;
assembly {
s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
v := add(shr(255, vs), 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: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: @openzeppelin/contracts/utils/Address.sol
// OpenZeppelin Contracts v4.4.1 (utils/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);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: contracts/Whitelisted.sol
pragma solidity ^0.8.0;
// Author: @sinta90210
contract Whitelisted {
using ECDSA for bytes32;
using Address for address;
address internal _signer;
constructor(address signer) {
_signer = signer;
}
// @dev Assumes the signed message was human-readable msg.sender address (lowercase, without the '0x')
modifier isValidWhitelistSignature(bytes memory signature) {
bytes32 messageHash = toEthSignedMessageHash(asciiSender());
address signer = messageHash.recover(signature);
require(signer == _signer, "Invalid whitelist signature");
_;
}
function recoveredAddress(bytes memory signature) public view returns (bytes memory) {
address recoveredSigner = recover(signature);
return abi.encodePacked(recoveredSigner);
}
function recover(bytes memory signature) public view returns (address) {
bytes32 messageHash = toEthSignedMessageHash(asciiSender());
address recoveredSigner = messageHash.recover(signature);
return recoveredSigner;
}
function generateSenderHash() public view returns (bytes32) {
return toEthSignedMessageHash(asciiSender());
}
// @dev Because at time of writing, 5b28...3cc0 hasn't made it into OpenZeppelin ECDSA release yet.
// @dev https://github.com/OpenZeppelin/openzeppelin-contracts/commit/5b28259dacf47fc208e03611eb3ba8eeaed63cc0#diff-ff09871806bcccfd38e43de481f3e7e2fb92134c58e1a1f97b054e2d0d727458R209
function toEthSignedMessageHash(string memory s) public pure returns (bytes32) {
bytes memory b = bytes(s);
return keccak256(
abi.encodePacked(
"\x19Ethereum Signed Message:\n",
Strings.toString(b.length),
b
)
);
}
function asciiSender() public view returns (string memory) {
return toAsciiString(msg.sender);
}
function toAsciiString(address x) internal pure returns (string memory) {
bytes memory s = new bytes(40);
for (uint256 i = 0; i < 20; i++) {
bytes1 b = bytes1(uint8(uint256(uint160(x)) / (2 ** (8 * (19 - i)))));
bytes1 hi = bytes1(uint8(b) / 16);
bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));
s[2 * i] = char(hi);
s[2 * i + 1] = char(lo);
}
return string(s);
}
function char(bytes1 b) internal pure returns (bytes1 c) {
return (uint8(b) < 10)
? bytes1(uint8(b) + 0x30)
: bytes1(uint8(b) + 0x57);
}
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
}
// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: balance query for the zero address");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _owners[tokenId];
require(owner != address(0), "ERC721: owner query for nonexistent token");
return owner;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overriden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not owner nor approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
require(_exists(tokenId), "ERC721: approved query for nonexistent token");
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_safeTransfer(from, to, tokenId, _data);
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* `_data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _owners[tokenId] != address(0);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
require(_exists(tokenId), "ERC721: operator query for nonexistent token");
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, _data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId);
// Clear approvals
_approve(address(0), tokenId);
_balances[owner] -= 1;
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId);
// Clear approvals from the previous owner
_approve(address(0), tokenId);
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits a {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param _data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
}
// File: contracts/FracturedApesNFT.sol
/**
*
* ╭━━━╮╱╱╱╱╱╱╱╭╮╱╱╱╱╱╱╱╱╱╱╭╮╭━━━╮
* ┃╭━━╯╱╱╱╱╱╱╭╯╰╮╱╱╱╱╱╱╱╱╱┃┃┃╭━╮┃
* ┃╰━━┳━┳━━┳━┻╮╭╋╮╭┳━┳━━┳━╯┃┃┃╱┃┣━━┳━━┳━━╮
* ┃╭━━┫╭┫╭╮┃╭━┫┃┃┃┃┃╭┫┃━┫╭╮┃┃╰━╯┃╭╮┃┃━┫━━┫
* ┃┃╱╱┃┃┃╭╮┃╰━┫╰┫╰╯┃┃┃┃━┫╰╯┃┃╭━╮┃╰╯┃┃━╋━━┃
* ╰╯╱╱╰╯╰╯╰┻━━┻━┻━━┻╯╰━━┻━━╯╰╯╱╰┫╭━┻━━┻━━╯
* ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱┃┃
* ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╰╯
* FracturedApes | 2021
* @author The Syndicure ([email protected])
*/
pragma solidity >=0.7.0 <0.9.0;
contract FracturedApesNFT is ERC721, Ownable, Whitelisted {
using Strings for uint256;
using Counters for Counters.Counter;
Counters.Counter private supply;
string public uriPrefix = "";
string public uriSuffix = ".json";
string public hiddenMetadataUri;
uint256 public cost = 0.08 ether;
uint256 public maxSupply = 10000;
uint256 public maxMintAmountPerTx = 2;
uint256 public nftPerAddressLimit = 2;
bool public paused = true;
bool public revealed = false;
bool public onlyWhitelisted = true;
mapping(address => uint256) public addressMintedBalance;
constructor() ERC721("FracturedApes", "FAPE") Whitelisted(0x61D81fc1B6979BB9ABe8A0375f3AA43791236c60) {
setHiddenMetadataUri("ipfs://QmQncbVGUCw3XJgucRHgxhzGMjvGMAF6UQhsAGQKW35kxf/Hidden.json");
}
modifier mintCompliance(uint256 _mintAmount) {
require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!");
require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded!");
_;
}
function totalSupply() public view returns (uint256) {
return supply.current();
}
function presaleMint(bytes memory signature, uint256 _mintAmount)
public
payable
mintCompliance(_mintAmount)
isValidWhitelistSignature(signature)
{
require(!paused, "The contract is paused!");
require(onlyWhitelisted, "Public mode is active");
require(msg.value >= cost * _mintAmount, "Insufficient funds!");
uint256 ownerMintedCount = addressMintedBalance[msg.sender];
require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "max NFT per address exceeded");
_mintLoop(msg.sender, _mintAmount);
}
function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
require(!paused, "The contract is paused!");
require(!onlyWhitelisted, "Presale mode is active");
require(msg.value >= cost * _mintAmount, "Insufficient funds!");
_mintLoop(msg.sender, _mintAmount);
}
function ownerMint(uint256 _mintAmount) public onlyOwner {
_mintLoop(msg.sender, _mintAmount);
}
function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
_mintLoop(_receiver, _mintAmount);
}
function walletOfOwner(address _owner)
public
view
returns (uint256[] memory)
{
uint256 ownerTokenCount = balanceOf(_owner);
uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
uint256 currentTokenId = 1;
uint256 ownedTokenIndex = 0;
while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
address currentTokenOwner = ownerOf(currentTokenId);
if (currentTokenOwner == _owner) {
ownedTokenIds[ownedTokenIndex] = currentTokenId;
ownedTokenIndex++;
}
currentTokenId++;
}
return ownedTokenIds;
}
function tokenURI(uint256 _tokenId)
public
view
virtual
override
returns (string memory)
{
require(
_exists(_tokenId),
"ERC721Metadata: URI query for nonexistent token"
);
if (revealed == false) {
return hiddenMetadataUri;
}
string memory currentBaseURI = _baseURI();
return bytes(currentBaseURI).length > 0
? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
: "";
}
function setRevealed(bool _state) public onlyOwner {
revealed = _state;
}
function setCost(uint256 _cost) public onlyOwner {
cost = _cost;
}
function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
maxMintAmountPerTx = _maxMintAmountPerTx;
}
function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
hiddenMetadataUri = _hiddenMetadataUri;
}
function setUriPrefix(string memory _uriPrefix) public onlyOwner {
uriPrefix = _uriPrefix;
}
function setUriSuffix(string memory _uriSuffix) public onlyOwner {
uriSuffix = _uriSuffix;
}
function setPaused(bool _state) public onlyOwner {
paused = _state;
}
function setOnlyWhitelisted(bool _state) public onlyOwner {
onlyWhitelisted = _state;
}
function withdraw() public onlyOwner {
(bool hs, ) = payable(0xc60058A8838714b1B0b4AfB9191A79c2052808aE).call{value: address(this).balance * 95 / 100}("");
require(hs);
(bool os, ) = payable(owner()).call{value: address(this).balance}("");
require(os);
}
function _mintLoop(address _receiver, uint256 _mintAmount) internal {
for (uint256 i = 0; i < _mintAmount; i++) {
addressMintedBalance[_receiver]++;
supply.increment();
_safeMint(_receiver, supply.current());
}
}
function _baseURI() internal view virtual override returns (string memory) {
return uriPrefix;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asciiSender","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generateSenderHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"recover","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"recoveredAddress","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","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":"string","name":"s","type":"string"}],"name":"toEthSignedMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a06040819052600060808190526200001b9160099162000238565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200004a91600a9162000238565b5067011c37937e080000600c55612710600d556002600e819055600f556010805462ffffff1916620100011790553480156200008557600080fd5b50604080518082018252600d81526c4672616374757265644170657360981b6020808301918252835180850190945260048452634641504560e01b9084015281517361d81fc1b6979bb9abe8a0375f3aa43791236c609391620000ec916000919062000238565b5080516200010290600190602084019062000238565b5050506200011f620001196200016a60201b60201c565b6200016e565b600780546001600160a01b0319166001600160a01b0392909216919091179055604080516080810190915260418082526200016491906200330e6020830139620001c0565b6200031b565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6006546001600160a01b031633146200021f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b80516200023490600b90602084019062000238565b5050565b8280546200024690620002de565b90600052602060002090601f0160209004810192826200026a5760008555620002b5565b82601f106200028557805160ff1916838001178555620002b5565b82800160010185558215620002b5579182015b82811115620002b557825182559160200191906001019062000298565b50620002c3929150620002c7565b5090565b5b80821115620002c35760008155600101620002c8565b600181811c90821680620002f357607f821691505b602082108114156200031557634e487b7160e01b600052602260045260246000fd5b50919050565b612fe3806200032b6000396000f3fe6080604052600436106102885760003560e01c80636352211e1161015a578063a4a1edb1116100c1578063d720f9da1161007a578063d720f9da14610758578063e0a8085314610778578063e985e9c514610798578063efbd73f4146107b8578063f19e75d4146107d8578063f2fde38b146107f857600080fd5b8063a4a1edb1146106ac578063b071401b146106cc578063b88d4fde146106ec578063ba7d2c761461070c578063c87b56dd14610722578063d5abeb011461074257600080fd5b806395d89b411161011357806395d89b411461060f5780639c6add8e146106245780639c70b51214610644578063a0712d6814610664578063a22cb46514610677578063a45ba8e71461069757600080fd5b80636352211e1461056657806370a0823114610586578063715018a6146105a65780637ec4a659146105bb5780638da5cb5b146105db57806394354fd0146105f957600080fd5b80633c952764116101fe5780634e21dc40116101b75780634e21dc40146104d05780634fdd43cb146104e357806351830227146105035780635503a0e8146105225780635c975abb1461053757806362b99ad41461055157600080fd5b80633c952764146104195780633ccfd60b1461043957806340838f741461044e57806342842e0e14610463578063438b63001461048357806344a0d68a146104b057600080fd5b806316ba10e01161025057806316ba10e01461036257806316c38b3c1461038257806318160ddd146103a257806318cae269146103b757806323b872dd146103e4578063346d14ae1461040457600080fd5b806301ffc9a71461028d57806306fdde03146102c2578063081812fc146102e4578063095ea7b31461031c57806313faede61461033e575b600080fd5b34801561029957600080fd5b506102ad6102a836600461286f565b610818565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d761086a565b6040516102b99190612b74565b3480156102f057600080fd5b506103046102ff36600461296c565b6108fc565b6040516001600160a01b0390911681526020016102b9565b34801561032857600080fd5b5061033c61033736600461282a565b610996565b005b34801561034a57600080fd5b50610354600c5481565b6040519081526020016102b9565b34801561036e57600080fd5b5061033c61037d366004612923565b610aac565b34801561038e57600080fd5b5061033c61039d366004612854565b610aed565b3480156103ae57600080fd5b50610354610b2a565b3480156103c357600080fd5b506103546103d236600461270e565b60116020526000908152604090205481565b3480156103f057600080fd5b5061033c6103ff36600461275c565b610b3a565b34801561041057600080fd5b506102d7610b6b565b34801561042557600080fd5b5061033c610434366004612854565b610b76565b34801561044557600080fd5b5061033c610bbc565b34801561045a57600080fd5b50610354610cd4565b34801561046f57600080fd5b5061033c61047e36600461275c565b610ce1565b34801561048f57600080fd5b506104a361049e36600461270e565b610cfc565b6040516102b99190612b30565b3480156104bc57600080fd5b5061033c6104cb36600461296c565b610ddd565b61033c6104de3660046128de565b610e0c565b3480156104ef57600080fd5b5061033c6104fe366004612923565b61105a565b34801561050f57600080fd5b506010546102ad90610100900460ff1681565b34801561052e57600080fd5b506102d7611097565b34801561054357600080fd5b506010546102ad9060ff1681565b34801561055d57600080fd5b506102d7611125565b34801561057257600080fd5b5061030461058136600461296c565b611132565b34801561059257600080fd5b506103546105a136600461270e565b6111a9565b3480156105b257600080fd5b5061033c611230565b3480156105c757600080fd5b5061033c6105d6366004612923565b611266565b3480156105e757600080fd5b506006546001600160a01b0316610304565b34801561060557600080fd5b50610354600e5481565b34801561061b57600080fd5b506102d76112a3565b34801561063057600080fd5b506102d761063f3660046128a9565b6112b2565b34801561065057600080fd5b506010546102ad9062010000900460ff1681565b61033c61067236600461296c565b6112f9565b34801561068357600080fd5b5061033c610692366004612800565b611459565b3480156106a357600080fd5b506102d7611464565b3480156106b857600080fd5b506103046106c73660046128a9565b611471565b3480156106d857600080fd5b5061033c6106e736600461296c565b611495565b3480156106f857600080fd5b5061033c610707366004612798565b6114c4565b34801561071857600080fd5b50610354600f5481565b34801561072e57600080fd5b506102d761073d36600461296c565b6114fc565b34801561074e57600080fd5b50610354600d5481565b34801561076457600080fd5b50610354610773366004612923565b61166b565b34801561078457600080fd5b5061033c610793366004612854565b6116ab565b3480156107a457600080fd5b506102ad6107b3366004612729565b6116ef565b3480156107c457600080fd5b5061033c6107d3366004612985565b61171d565b3480156107e457600080fd5b5061033c6107f336600461296c565b6117b5565b34801561080457600080fd5b5061033c61081336600461270e565b6117ec565b60006001600160e01b031982166380ac58cd60e01b148061084957506001600160e01b03198216635b5e139f60e01b145b8061086457506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461087990612ebf565b80601f01602080910402602001604051908101604052809291908181526020018280546108a590612ebf565b80156108f25780601f106108c7576101008083540402835291602001916108f2565b820191906000526020600020905b8154815290600101906020018083116108d557829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661097a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109a182611132565b9050806001600160a01b0316836001600160a01b03161415610a0f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610971565b336001600160a01b0382161480610a2b5750610a2b81336116ef565b610a9d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610971565b610aa78383611884565b505050565b6006546001600160a01b03163314610ad65760405162461bcd60e51b815260040161097190612c07565b8051610ae990600a9060208401906125b3565b5050565b6006546001600160a01b03163314610b175760405162461bcd60e51b815260040161097190612c07565b6010805460ff1916911515919091179055565b6000610b3560085490565b905090565b610b4433826118f2565b610b605760405162461bcd60e51b815260040161097190612c6a565b610aa78383836119c1565b6060610b3533611b61565b6006546001600160a01b03163314610ba05760405162461bcd60e51b815260040161097190612c07565b60108054911515620100000262ff000019909216919091179055565b6006546001600160a01b03163314610be65760405162461bcd60e51b815260040161097190612c07565b600073c60058a8838714b1b0b4afb9191a79c2052808ae6064610c0a47605f612e19565b610c149190612cf8565b604051600081818185875af1925050503d8060008114610c50576040519150601f19603f3d011682016040523d82523d6000602084013e610c55565b606091505b5050905080610c6357600080fd5b6000610c776006546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610cc1576040519150601f19603f3d011682016040523d82523d6000602084013e610cc6565b606091505b5050905080610ae957600080fd5b6000610b35610773610b6b565b610aa7838383604051806020016040528060008152506114c4565b60606000610d09836111a9565b905060008167ffffffffffffffff811115610d2657610d26612f81565b604051908082528060200260200182016040528015610d4f578160200160208202803683370190505b509050600160005b8381108015610d685750600d548211155b15610dd3576000610d7883611132565b9050866001600160a01b0316816001600160a01b03161415610dc05782848381518110610da757610da7612f6b565b602090810291909101015281610dbc81612efa565b9250505b82610dca81612efa565b93505050610d57565b5090949350505050565b6006546001600160a01b03163314610e075760405162461bcd60e51b815260040161097190612c07565b600c55565b80600081118015610e1f5750600e548111155b610e3b5760405162461bcd60e51b815260040161097190612bd9565b600d5481610e4860085490565b610e529190612cbb565b1115610e705760405162461bcd60e51b815260040161097190612c3c565b826000610e7e610773610b6b565b90506000610e8c8284611ca8565b6007549091506001600160a01b03808316911614610eec5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642077686974656c697374207369676e617475726500000000006044820152606401610971565b60105460ff1615610f395760405162461bcd60e51b815260206004820152601760248201527654686520636f6e7472616374206973207061757365642160481b6044820152606401610971565b60105462010000900460ff16610f895760405162461bcd60e51b81526020600482015260156024820152745075626c6963206d6f64652069732061637469766560581b6044820152606401610971565b84600c54610f979190612e19565b341015610fdc5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610971565b33600090815260116020526040902054600f54610ff98783612cbb565b11156110475760405162461bcd60e51b815260206004820152601c60248201527f6d6178204e4654207065722061646472657373206578636565646564000000006044820152606401610971565b6110513387611ccc565b50505050505050565b6006546001600160a01b031633146110845760405162461bcd60e51b815260040161097190612c07565b8051610ae990600b9060208401906125b3565b600a80546110a490612ebf565b80601f01602080910402602001604051908101604052809291908181526020018280546110d090612ebf565b801561111d5780601f106110f25761010080835404028352916020019161111d565b820191906000526020600020905b81548152906001019060200180831161110057829003601f168201915b505050505081565b600980546110a490612ebf565b6000818152600260205260408120546001600160a01b0316806108645760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610971565b60006001600160a01b0382166112145760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610971565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b0316331461125a5760405162461bcd60e51b815260040161097190612c07565b6112646000611d32565b565b6006546001600160a01b031633146112905760405162461bcd60e51b815260040161097190612c07565b8051610ae99060099060208401906125b3565b60606001805461087990612ebf565b606060006112bf83611471565b6040516bffffffffffffffffffffffff19606083901b1660208201529091506034015b604051602081830303815290604052915050919050565b8060008111801561130c5750600e548111155b6113285760405162461bcd60e51b815260040161097190612bd9565b600d548161133560085490565b61133f9190612cbb565b111561135d5760405162461bcd60e51b815260040161097190612c3c565b60105460ff16156113aa5760405162461bcd60e51b815260206004820152601760248201527654686520636f6e7472616374206973207061757365642160481b6044820152606401610971565b60105462010000900460ff16156113fc5760405162461bcd60e51b815260206004820152601660248201527550726573616c65206d6f64652069732061637469766560501b6044820152606401610971565b81600c5461140a9190612e19565b34101561144f5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610971565b610ae93383611ccc565b610ae9338383611d84565b600b80546110a490612ebf565b60008061147f610773610b6b565b9050600061148d8285611ca8565b949350505050565b6006546001600160a01b031633146114bf5760405162461bcd60e51b815260040161097190612c07565b600e55565b6114ce33836118f2565b6114ea5760405162461bcd60e51b815260040161097190612c6a565b6114f684848484611e53565b50505050565b6000818152600260205260409020546060906001600160a01b031661157b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610971565b601054610100900460ff1661161c57600b805461159790612ebf565b80601f01602080910402602001604051908101604052809291908181526020018280546115c390612ebf565b80156116105780601f106115e557610100808354040283529160200191611610565b820191906000526020600020905b8154815290600101906020018083116115f357829003601f168201915b50505050509050919050565b6000611626611e86565b905060008151116116465760405180602001604052806000815250611664565b8061165084611e95565b600a6040516020016112e2939291906129d4565b9392505050565b60008082905061167b8151611e95565b8160405160200161168d929190612a98565b60405160208183030381529060405280519060200120915050919050565b6006546001600160a01b031633146116d55760405162461bcd60e51b815260040161097190612c07565b601080549115156101000261ff0019909216919091179055565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b816000811180156117305750600e548111155b61174c5760405162461bcd60e51b815260040161097190612bd9565b600d548161175960085490565b6117639190612cbb565b11156117815760405162461bcd60e51b815260040161097190612c3c565b6006546001600160a01b031633146117ab5760405162461bcd60e51b815260040161097190612c07565b610aa78284611ccc565b6006546001600160a01b031633146117df5760405162461bcd60e51b815260040161097190612c07565b6117e93382611ccc565b50565b6006546001600160a01b031633146118165760405162461bcd60e51b815260040161097190612c07565b6001600160a01b03811661187b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610971565b6117e981611d32565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118b982611132565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661196b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610971565b600061197683611132565b9050806001600160a01b0316846001600160a01b031614806119b15750836001600160a01b03166119a6846108fc565b6001600160a01b0316145b8061148d575061148d81856116ef565b826001600160a01b03166119d482611132565b6001600160a01b031614611a3c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610971565b6001600160a01b038216611a9e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610971565b611aa9600082611884565b6001600160a01b0383166000908152600360205260408120805460019290611ad2908490612e59565b90915550506001600160a01b0382166000908152600360205260408120805460019290611b00908490612cbb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60408051602880825260608281019093526000919060208201818036833701905050905060005b6014811015611ca1576000611b9e826013612e59565b611ba9906008612e19565b611bb4906002612d71565b611bc7906001600160a01b038716612cf8565b60f81b9050600060108260f81c611bde9190612d0c565b60f81b905060008160f81c6010611bf59190612e38565b8360f81c611c039190612e70565b60f81b9050611c1182611f93565b85611c1d866002612e19565b81518110611c2d57611c2d612f6b565b60200101906001600160f81b031916908160001a905350611c4d81611f93565b85611c59866002612e19565b611c64906001612cbb565b81518110611c7457611c74612f6b565b60200101906001600160f81b031916908160001a9053505050508080611c9990612efa565b915050611b88565b5092915050565b6000806000611cb78585611fd0565b91509150611cc481612040565b509392505050565b60005b81811015610aa7576001600160a01b0383166000908152601160205260408120805491611cfb83612efa565b9190505550611d0e600880546001019055565b611d2083611d1b60085490565b6121fb565b80611d2a81612efa565b915050611ccf565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611de65760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610971565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611e5e8484846119c1565b611e6a84848484612215565b6114f65760405162461bcd60e51b815260040161097190612b87565b60606009805461087990612ebf565b606081611eb95750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ee35780611ecd81612efa565b9150611edc9050600a83612cf8565b9150611ebd565b60008167ffffffffffffffff811115611efe57611efe612f81565b6040519080825280601f01601f191660200182016040528015611f28576020820181803683370190505b5090505b841561148d57611f3d600183612e59565b9150611f4a600a86612f15565b611f55906030612cbb565b60f81b818381518110611f6a57611f6a612f6b565b60200101906001600160f81b031916908160001a905350611f8c600a86612cf8565b9450611f2c565b6000600a60f883901c10611fb857611fb060f883901c6057612cd3565b60f81b610864565b611fc760f883901c6030612cd3565b60f81b92915050565b6000808251604114156120075760208301516040840151606085015160001a611ffb87828585612322565b94509450505050612039565b825160401415612031576020830151604084015161202686838361240f565b935093505050612039565b506000905060025b9250929050565b600081600481111561205457612054612f55565b141561205d5750565b600181600481111561207157612071612f55565b14156120bf5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610971565b60028160048111156120d3576120d3612f55565b14156121215760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610971565b600381600481111561213557612135612f55565b141561218e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610971565b60048160048111156121a2576121a2612f55565b14156117e95760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610971565b610ae982826040518060200160405280600081525061243e565b60006001600160a01b0384163b1561231757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612259903390899088908890600401612af3565b602060405180830381600087803b15801561227357600080fd5b505af19250505080156122a3575060408051601f3d908101601f191682019092526122a09181019061288c565b60015b6122fd573d8080156122d1576040519150601f19603f3d011682016040523d82523d6000602084013e6122d6565b606091505b5080516122f55760405162461bcd60e51b815260040161097190612b87565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061148d565b506001949350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156123595750600090506003612406565b8460ff16601b1415801561237157508460ff16601c14155b156123825750600090506004612406565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156123d6573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166123ff57600060019250925050612406565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161243087828885612322565b935093505050935093915050565b6124488383612471565b6124556000848484612215565b610aa75760405162461bcd60e51b815260040161097190612b87565b6001600160a01b0382166124c75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610971565b6000818152600260205260409020546001600160a01b03161561252c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610971565b6001600160a01b0382166000908152600360205260408120805460019290612555908490612cbb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546125bf90612ebf565b90600052602060002090601f0160209004810192826125e15760008555612627565b82601f106125fa57805160ff1916838001178555612627565b82800160010185558215612627579182015b8281111561262757825182559160200191906001019061260c565b50612633929150612637565b5090565b5b808211156126335760008155600101612638565b600067ffffffffffffffff8084111561266757612667612f81565b604051601f8501601f19908116603f0116810190828211818310171561268f5761268f612f81565b816040528093508581528686860111156126a857600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146126d957600080fd5b919050565b803580151581146126d957600080fd5b600082601f8301126126ff57600080fd5b6116648383356020850161264c565b60006020828403121561272057600080fd5b611664826126c2565b6000806040838503121561273c57600080fd5b612745836126c2565b9150612753602084016126c2565b90509250929050565b60008060006060848603121561277157600080fd5b61277a846126c2565b9250612788602085016126c2565b9150604084013590509250925092565b600080600080608085870312156127ae57600080fd5b6127b7856126c2565b93506127c5602086016126c2565b925060408501359150606085013567ffffffffffffffff8111156127e857600080fd5b6127f4878288016126ee565b91505092959194509250565b6000806040838503121561281357600080fd5b61281c836126c2565b9150612753602084016126de565b6000806040838503121561283d57600080fd5b612846836126c2565b946020939093013593505050565b60006020828403121561286657600080fd5b611664826126de565b60006020828403121561288157600080fd5b813561166481612f97565b60006020828403121561289e57600080fd5b815161166481612f97565b6000602082840312156128bb57600080fd5b813567ffffffffffffffff8111156128d257600080fd5b61148d848285016126ee565b600080604083850312156128f157600080fd5b823567ffffffffffffffff81111561290857600080fd5b612914858286016126ee565b95602094909401359450505050565b60006020828403121561293557600080fd5b813567ffffffffffffffff81111561294c57600080fd5b8201601f8101841361295d57600080fd5b61148d8482356020840161264c565b60006020828403121561297e57600080fd5b5035919050565b6000806040838503121561299857600080fd5b82359150612753602084016126c2565b600081518084526129c0816020860160208601612e93565b601f01601f19169290920160200192915050565b6000845160206129e78285838a01612e93565b8551918401916129fa8184848a01612e93565b8554920191600090600181811c9080831680612a1757607f831692505b858310811415612a3557634e487b7160e01b85526022600452602485fd5b808015612a495760018114612a5a57612a87565b60ff19851688528388019550612a87565b60008b81526020902060005b85811015612a7f5781548a820152908401908801612a66565b505083880195505b50939b9a5050505050505050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a000000000000815260008351612ad081601a850160208801612e93565b835190830190612ae781601a840160208801612e93565b01601a01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b26908301846129a8565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612b6857835183529284019291840191600101612b4c565b50909695505050505050565b60208152600061166460208301846129a8565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612cce57612cce612f29565b500190565b600060ff821660ff84168060ff03821115612cf057612cf0612f29565b019392505050565b600082612d0757612d07612f3f565b500490565b600060ff831680612d1f57612d1f612f3f565b8060ff84160491505092915050565b600181815b80851115612d69578160001904821115612d4f57612d4f612f29565b80851615612d5c57918102915b93841c9390800290612d33565b509250929050565b60006116648383600082612d8757506001610864565b81612d9457506000610864565b8160018114612daa5760028114612db457612dd0565b6001915050610864565b60ff841115612dc557612dc5612f29565b50506001821b610864565b5060208310610133831016604e8410600b8410161715612df3575081810a610864565b612dfd8383612d2e565b8060001904821115612e1157612e11612f29565b029392505050565b6000816000190483118215151615612e3357612e33612f29565b500290565b600060ff821660ff84168160ff0481118215151615612e1157612e11612f29565b600082821015612e6b57612e6b612f29565b500390565b600060ff821660ff841680821015612e8a57612e8a612f29565b90039392505050565b60005b83811015612eae578181015183820152602001612e96565b838111156114f65750506000910152565b600181811c90821680612ed357607f821691505b60208210811415612ef457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612f0e57612f0e612f29565b5060010190565b600082612f2457612f24612f3f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146117e957600080fdfea2646970667358221220352238302040cc660e4ef1880ae22a9965ea6147e9c0878d5f526078307ddb7d64736f6c63430008070033697066733a2f2f516d516e6362564755437733584a67756352486778687a474d6a76474d414636555168734147514b5733356b78662f48696464656e2e6a736f6e
Deployed Bytecode
0x6080604052600436106102885760003560e01c80636352211e1161015a578063a4a1edb1116100c1578063d720f9da1161007a578063d720f9da14610758578063e0a8085314610778578063e985e9c514610798578063efbd73f4146107b8578063f19e75d4146107d8578063f2fde38b146107f857600080fd5b8063a4a1edb1146106ac578063b071401b146106cc578063b88d4fde146106ec578063ba7d2c761461070c578063c87b56dd14610722578063d5abeb011461074257600080fd5b806395d89b411161011357806395d89b411461060f5780639c6add8e146106245780639c70b51214610644578063a0712d6814610664578063a22cb46514610677578063a45ba8e71461069757600080fd5b80636352211e1461056657806370a0823114610586578063715018a6146105a65780637ec4a659146105bb5780638da5cb5b146105db57806394354fd0146105f957600080fd5b80633c952764116101fe5780634e21dc40116101b75780634e21dc40146104d05780634fdd43cb146104e357806351830227146105035780635503a0e8146105225780635c975abb1461053757806362b99ad41461055157600080fd5b80633c952764146104195780633ccfd60b1461043957806340838f741461044e57806342842e0e14610463578063438b63001461048357806344a0d68a146104b057600080fd5b806316ba10e01161025057806316ba10e01461036257806316c38b3c1461038257806318160ddd146103a257806318cae269146103b757806323b872dd146103e4578063346d14ae1461040457600080fd5b806301ffc9a71461028d57806306fdde03146102c2578063081812fc146102e4578063095ea7b31461031c57806313faede61461033e575b600080fd5b34801561029957600080fd5b506102ad6102a836600461286f565b610818565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d761086a565b6040516102b99190612b74565b3480156102f057600080fd5b506103046102ff36600461296c565b6108fc565b6040516001600160a01b0390911681526020016102b9565b34801561032857600080fd5b5061033c61033736600461282a565b610996565b005b34801561034a57600080fd5b50610354600c5481565b6040519081526020016102b9565b34801561036e57600080fd5b5061033c61037d366004612923565b610aac565b34801561038e57600080fd5b5061033c61039d366004612854565b610aed565b3480156103ae57600080fd5b50610354610b2a565b3480156103c357600080fd5b506103546103d236600461270e565b60116020526000908152604090205481565b3480156103f057600080fd5b5061033c6103ff36600461275c565b610b3a565b34801561041057600080fd5b506102d7610b6b565b34801561042557600080fd5b5061033c610434366004612854565b610b76565b34801561044557600080fd5b5061033c610bbc565b34801561045a57600080fd5b50610354610cd4565b34801561046f57600080fd5b5061033c61047e36600461275c565b610ce1565b34801561048f57600080fd5b506104a361049e36600461270e565b610cfc565b6040516102b99190612b30565b3480156104bc57600080fd5b5061033c6104cb36600461296c565b610ddd565b61033c6104de3660046128de565b610e0c565b3480156104ef57600080fd5b5061033c6104fe366004612923565b61105a565b34801561050f57600080fd5b506010546102ad90610100900460ff1681565b34801561052e57600080fd5b506102d7611097565b34801561054357600080fd5b506010546102ad9060ff1681565b34801561055d57600080fd5b506102d7611125565b34801561057257600080fd5b5061030461058136600461296c565b611132565b34801561059257600080fd5b506103546105a136600461270e565b6111a9565b3480156105b257600080fd5b5061033c611230565b3480156105c757600080fd5b5061033c6105d6366004612923565b611266565b3480156105e757600080fd5b506006546001600160a01b0316610304565b34801561060557600080fd5b50610354600e5481565b34801561061b57600080fd5b506102d76112a3565b34801561063057600080fd5b506102d761063f3660046128a9565b6112b2565b34801561065057600080fd5b506010546102ad9062010000900460ff1681565b61033c61067236600461296c565b6112f9565b34801561068357600080fd5b5061033c610692366004612800565b611459565b3480156106a357600080fd5b506102d7611464565b3480156106b857600080fd5b506103046106c73660046128a9565b611471565b3480156106d857600080fd5b5061033c6106e736600461296c565b611495565b3480156106f857600080fd5b5061033c610707366004612798565b6114c4565b34801561071857600080fd5b50610354600f5481565b34801561072e57600080fd5b506102d761073d36600461296c565b6114fc565b34801561074e57600080fd5b50610354600d5481565b34801561076457600080fd5b50610354610773366004612923565b61166b565b34801561078457600080fd5b5061033c610793366004612854565b6116ab565b3480156107a457600080fd5b506102ad6107b3366004612729565b6116ef565b3480156107c457600080fd5b5061033c6107d3366004612985565b61171d565b3480156107e457600080fd5b5061033c6107f336600461296c565b6117b5565b34801561080457600080fd5b5061033c61081336600461270e565b6117ec565b60006001600160e01b031982166380ac58cd60e01b148061084957506001600160e01b03198216635b5e139f60e01b145b8061086457506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461087990612ebf565b80601f01602080910402602001604051908101604052809291908181526020018280546108a590612ebf565b80156108f25780601f106108c7576101008083540402835291602001916108f2565b820191906000526020600020905b8154815290600101906020018083116108d557829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661097a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109a182611132565b9050806001600160a01b0316836001600160a01b03161415610a0f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610971565b336001600160a01b0382161480610a2b5750610a2b81336116ef565b610a9d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610971565b610aa78383611884565b505050565b6006546001600160a01b03163314610ad65760405162461bcd60e51b815260040161097190612c07565b8051610ae990600a9060208401906125b3565b5050565b6006546001600160a01b03163314610b175760405162461bcd60e51b815260040161097190612c07565b6010805460ff1916911515919091179055565b6000610b3560085490565b905090565b610b4433826118f2565b610b605760405162461bcd60e51b815260040161097190612c6a565b610aa78383836119c1565b6060610b3533611b61565b6006546001600160a01b03163314610ba05760405162461bcd60e51b815260040161097190612c07565b60108054911515620100000262ff000019909216919091179055565b6006546001600160a01b03163314610be65760405162461bcd60e51b815260040161097190612c07565b600073c60058a8838714b1b0b4afb9191a79c2052808ae6064610c0a47605f612e19565b610c149190612cf8565b604051600081818185875af1925050503d8060008114610c50576040519150601f19603f3d011682016040523d82523d6000602084013e610c55565b606091505b5050905080610c6357600080fd5b6000610c776006546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610cc1576040519150601f19603f3d011682016040523d82523d6000602084013e610cc6565b606091505b5050905080610ae957600080fd5b6000610b35610773610b6b565b610aa7838383604051806020016040528060008152506114c4565b60606000610d09836111a9565b905060008167ffffffffffffffff811115610d2657610d26612f81565b604051908082528060200260200182016040528015610d4f578160200160208202803683370190505b509050600160005b8381108015610d685750600d548211155b15610dd3576000610d7883611132565b9050866001600160a01b0316816001600160a01b03161415610dc05782848381518110610da757610da7612f6b565b602090810291909101015281610dbc81612efa565b9250505b82610dca81612efa565b93505050610d57565b5090949350505050565b6006546001600160a01b03163314610e075760405162461bcd60e51b815260040161097190612c07565b600c55565b80600081118015610e1f5750600e548111155b610e3b5760405162461bcd60e51b815260040161097190612bd9565b600d5481610e4860085490565b610e529190612cbb565b1115610e705760405162461bcd60e51b815260040161097190612c3c565b826000610e7e610773610b6b565b90506000610e8c8284611ca8565b6007549091506001600160a01b03808316911614610eec5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642077686974656c697374207369676e617475726500000000006044820152606401610971565b60105460ff1615610f395760405162461bcd60e51b815260206004820152601760248201527654686520636f6e7472616374206973207061757365642160481b6044820152606401610971565b60105462010000900460ff16610f895760405162461bcd60e51b81526020600482015260156024820152745075626c6963206d6f64652069732061637469766560581b6044820152606401610971565b84600c54610f979190612e19565b341015610fdc5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610971565b33600090815260116020526040902054600f54610ff98783612cbb565b11156110475760405162461bcd60e51b815260206004820152601c60248201527f6d6178204e4654207065722061646472657373206578636565646564000000006044820152606401610971565b6110513387611ccc565b50505050505050565b6006546001600160a01b031633146110845760405162461bcd60e51b815260040161097190612c07565b8051610ae990600b9060208401906125b3565b600a80546110a490612ebf565b80601f01602080910402602001604051908101604052809291908181526020018280546110d090612ebf565b801561111d5780601f106110f25761010080835404028352916020019161111d565b820191906000526020600020905b81548152906001019060200180831161110057829003601f168201915b505050505081565b600980546110a490612ebf565b6000818152600260205260408120546001600160a01b0316806108645760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610971565b60006001600160a01b0382166112145760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610971565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b0316331461125a5760405162461bcd60e51b815260040161097190612c07565b6112646000611d32565b565b6006546001600160a01b031633146112905760405162461bcd60e51b815260040161097190612c07565b8051610ae99060099060208401906125b3565b60606001805461087990612ebf565b606060006112bf83611471565b6040516bffffffffffffffffffffffff19606083901b1660208201529091506034015b604051602081830303815290604052915050919050565b8060008111801561130c5750600e548111155b6113285760405162461bcd60e51b815260040161097190612bd9565b600d548161133560085490565b61133f9190612cbb565b111561135d5760405162461bcd60e51b815260040161097190612c3c565b60105460ff16156113aa5760405162461bcd60e51b815260206004820152601760248201527654686520636f6e7472616374206973207061757365642160481b6044820152606401610971565b60105462010000900460ff16156113fc5760405162461bcd60e51b815260206004820152601660248201527550726573616c65206d6f64652069732061637469766560501b6044820152606401610971565b81600c5461140a9190612e19565b34101561144f5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610971565b610ae93383611ccc565b610ae9338383611d84565b600b80546110a490612ebf565b60008061147f610773610b6b565b9050600061148d8285611ca8565b949350505050565b6006546001600160a01b031633146114bf5760405162461bcd60e51b815260040161097190612c07565b600e55565b6114ce33836118f2565b6114ea5760405162461bcd60e51b815260040161097190612c6a565b6114f684848484611e53565b50505050565b6000818152600260205260409020546060906001600160a01b031661157b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610971565b601054610100900460ff1661161c57600b805461159790612ebf565b80601f01602080910402602001604051908101604052809291908181526020018280546115c390612ebf565b80156116105780601f106115e557610100808354040283529160200191611610565b820191906000526020600020905b8154815290600101906020018083116115f357829003601f168201915b50505050509050919050565b6000611626611e86565b905060008151116116465760405180602001604052806000815250611664565b8061165084611e95565b600a6040516020016112e2939291906129d4565b9392505050565b60008082905061167b8151611e95565b8160405160200161168d929190612a98565b60405160208183030381529060405280519060200120915050919050565b6006546001600160a01b031633146116d55760405162461bcd60e51b815260040161097190612c07565b601080549115156101000261ff0019909216919091179055565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b816000811180156117305750600e548111155b61174c5760405162461bcd60e51b815260040161097190612bd9565b600d548161175960085490565b6117639190612cbb565b11156117815760405162461bcd60e51b815260040161097190612c3c565b6006546001600160a01b031633146117ab5760405162461bcd60e51b815260040161097190612c07565b610aa78284611ccc565b6006546001600160a01b031633146117df5760405162461bcd60e51b815260040161097190612c07565b6117e93382611ccc565b50565b6006546001600160a01b031633146118165760405162461bcd60e51b815260040161097190612c07565b6001600160a01b03811661187b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610971565b6117e981611d32565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118b982611132565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661196b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610971565b600061197683611132565b9050806001600160a01b0316846001600160a01b031614806119b15750836001600160a01b03166119a6846108fc565b6001600160a01b0316145b8061148d575061148d81856116ef565b826001600160a01b03166119d482611132565b6001600160a01b031614611a3c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610971565b6001600160a01b038216611a9e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610971565b611aa9600082611884565b6001600160a01b0383166000908152600360205260408120805460019290611ad2908490612e59565b90915550506001600160a01b0382166000908152600360205260408120805460019290611b00908490612cbb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60408051602880825260608281019093526000919060208201818036833701905050905060005b6014811015611ca1576000611b9e826013612e59565b611ba9906008612e19565b611bb4906002612d71565b611bc7906001600160a01b038716612cf8565b60f81b9050600060108260f81c611bde9190612d0c565b60f81b905060008160f81c6010611bf59190612e38565b8360f81c611c039190612e70565b60f81b9050611c1182611f93565b85611c1d866002612e19565b81518110611c2d57611c2d612f6b565b60200101906001600160f81b031916908160001a905350611c4d81611f93565b85611c59866002612e19565b611c64906001612cbb565b81518110611c7457611c74612f6b565b60200101906001600160f81b031916908160001a9053505050508080611c9990612efa565b915050611b88565b5092915050565b6000806000611cb78585611fd0565b91509150611cc481612040565b509392505050565b60005b81811015610aa7576001600160a01b0383166000908152601160205260408120805491611cfb83612efa565b9190505550611d0e600880546001019055565b611d2083611d1b60085490565b6121fb565b80611d2a81612efa565b915050611ccf565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611de65760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610971565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611e5e8484846119c1565b611e6a84848484612215565b6114f65760405162461bcd60e51b815260040161097190612b87565b60606009805461087990612ebf565b606081611eb95750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ee35780611ecd81612efa565b9150611edc9050600a83612cf8565b9150611ebd565b60008167ffffffffffffffff811115611efe57611efe612f81565b6040519080825280601f01601f191660200182016040528015611f28576020820181803683370190505b5090505b841561148d57611f3d600183612e59565b9150611f4a600a86612f15565b611f55906030612cbb565b60f81b818381518110611f6a57611f6a612f6b565b60200101906001600160f81b031916908160001a905350611f8c600a86612cf8565b9450611f2c565b6000600a60f883901c10611fb857611fb060f883901c6057612cd3565b60f81b610864565b611fc760f883901c6030612cd3565b60f81b92915050565b6000808251604114156120075760208301516040840151606085015160001a611ffb87828585612322565b94509450505050612039565b825160401415612031576020830151604084015161202686838361240f565b935093505050612039565b506000905060025b9250929050565b600081600481111561205457612054612f55565b141561205d5750565b600181600481111561207157612071612f55565b14156120bf5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610971565b60028160048111156120d3576120d3612f55565b14156121215760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610971565b600381600481111561213557612135612f55565b141561218e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610971565b60048160048111156121a2576121a2612f55565b14156117e95760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610971565b610ae982826040518060200160405280600081525061243e565b60006001600160a01b0384163b1561231757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612259903390899088908890600401612af3565b602060405180830381600087803b15801561227357600080fd5b505af19250505080156122a3575060408051601f3d908101601f191682019092526122a09181019061288c565b60015b6122fd573d8080156122d1576040519150601f19603f3d011682016040523d82523d6000602084013e6122d6565b606091505b5080516122f55760405162461bcd60e51b815260040161097190612b87565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061148d565b506001949350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156123595750600090506003612406565b8460ff16601b1415801561237157508460ff16601c14155b156123825750600090506004612406565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156123d6573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166123ff57600060019250925050612406565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161243087828885612322565b935093505050935093915050565b6124488383612471565b6124556000848484612215565b610aa75760405162461bcd60e51b815260040161097190612b87565b6001600160a01b0382166124c75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610971565b6000818152600260205260409020546001600160a01b03161561252c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610971565b6001600160a01b0382166000908152600360205260408120805460019290612555908490612cbb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546125bf90612ebf565b90600052602060002090601f0160209004810192826125e15760008555612627565b82601f106125fa57805160ff1916838001178555612627565b82800160010185558215612627579182015b8281111561262757825182559160200191906001019061260c565b50612633929150612637565b5090565b5b808211156126335760008155600101612638565b600067ffffffffffffffff8084111561266757612667612f81565b604051601f8501601f19908116603f0116810190828211818310171561268f5761268f612f81565b816040528093508581528686860111156126a857600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146126d957600080fd5b919050565b803580151581146126d957600080fd5b600082601f8301126126ff57600080fd5b6116648383356020850161264c565b60006020828403121561272057600080fd5b611664826126c2565b6000806040838503121561273c57600080fd5b612745836126c2565b9150612753602084016126c2565b90509250929050565b60008060006060848603121561277157600080fd5b61277a846126c2565b9250612788602085016126c2565b9150604084013590509250925092565b600080600080608085870312156127ae57600080fd5b6127b7856126c2565b93506127c5602086016126c2565b925060408501359150606085013567ffffffffffffffff8111156127e857600080fd5b6127f4878288016126ee565b91505092959194509250565b6000806040838503121561281357600080fd5b61281c836126c2565b9150612753602084016126de565b6000806040838503121561283d57600080fd5b612846836126c2565b946020939093013593505050565b60006020828403121561286657600080fd5b611664826126de565b60006020828403121561288157600080fd5b813561166481612f97565b60006020828403121561289e57600080fd5b815161166481612f97565b6000602082840312156128bb57600080fd5b813567ffffffffffffffff8111156128d257600080fd5b61148d848285016126ee565b600080604083850312156128f157600080fd5b823567ffffffffffffffff81111561290857600080fd5b612914858286016126ee565b95602094909401359450505050565b60006020828403121561293557600080fd5b813567ffffffffffffffff81111561294c57600080fd5b8201601f8101841361295d57600080fd5b61148d8482356020840161264c565b60006020828403121561297e57600080fd5b5035919050565b6000806040838503121561299857600080fd5b82359150612753602084016126c2565b600081518084526129c0816020860160208601612e93565b601f01601f19169290920160200192915050565b6000845160206129e78285838a01612e93565b8551918401916129fa8184848a01612e93565b8554920191600090600181811c9080831680612a1757607f831692505b858310811415612a3557634e487b7160e01b85526022600452602485fd5b808015612a495760018114612a5a57612a87565b60ff19851688528388019550612a87565b60008b81526020902060005b85811015612a7f5781548a820152908401908801612a66565b505083880195505b50939b9a5050505050505050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a000000000000815260008351612ad081601a850160208801612e93565b835190830190612ae781601a840160208801612e93565b01601a01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b26908301846129a8565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612b6857835183529284019291840191600101612b4c565b50909695505050505050565b60208152600061166460208301846129a8565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612cce57612cce612f29565b500190565b600060ff821660ff84168060ff03821115612cf057612cf0612f29565b019392505050565b600082612d0757612d07612f3f565b500490565b600060ff831680612d1f57612d1f612f3f565b8060ff84160491505092915050565b600181815b80851115612d69578160001904821115612d4f57612d4f612f29565b80851615612d5c57918102915b93841c9390800290612d33565b509250929050565b60006116648383600082612d8757506001610864565b81612d9457506000610864565b8160018114612daa5760028114612db457612dd0565b6001915050610864565b60ff841115612dc557612dc5612f29565b50506001821b610864565b5060208310610133831016604e8410600b8410161715612df3575081810a610864565b612dfd8383612d2e565b8060001904821115612e1157612e11612f29565b029392505050565b6000816000190483118215151615612e3357612e33612f29565b500290565b600060ff821660ff84168160ff0481118215151615612e1157612e11612f29565b600082821015612e6b57612e6b612f29565b500390565b600060ff821660ff841680821015612e8a57612e8a612f29565b90039392505050565b60005b83811015612eae578181015183820152602001612e96565b838111156114f65750506000910152565b600181811c90821680612ed357607f821691505b60208210811415612ef457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612f0e57612f0e612f29565b5060010190565b600082612f2457612f24612f3f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146117e957600080fdfea2646970667358221220352238302040cc660e4ef1880ae22a9965ea6147e9c0878d5f526078307ddb7d64736f6c63430008070033
Deployed Bytecode Sourcemap
50994:4938:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37293:305;;;;;;;;;;-1:-1:-1;37293:305:0;;;;;:::i;:::-;;:::i;:::-;;;9794:14:1;;9787:22;9769:41;;9757:2;9742:18;37293:305:0;;;;;;;;38238:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;39797:221::-;;;;;;;;;;-1:-1:-1;39797:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8455:32:1;;;8437:51;;8425:2;8410:18;39797:221:0;8291:203:1;39320:411:0;;;;;;;;;;-1:-1:-1;39320:411:0;;;;;:::i;:::-;;:::i;:::-;;51278:32;;;;;;;;;;;;;;;;;;;9967:25:1;;;9955:2;9940:18;51278:32:0;9821:177:1;54994:100:0;;;;;;;;;;-1:-1:-1;54994:100:0;;;;;:::i;:::-;;:::i;55100:77::-;;;;;;;;;;-1:-1:-1;55100:77:0;;;;;:::i;:::-;;:::i;52054:89::-;;;;;;;;;;;;;:::i;51542:55::-;;;;;;;;;;-1:-1:-1;51542:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;40547:339;;;;;;;;;;-1:-1:-1;40547:339:0;;;;;:::i;:::-;;:::i;26547:104::-;;;;;;;;;;;;;:::i;55183:95::-;;;;;;;;;;-1:-1:-1;55183:95:0;;;;;:::i;:::-;;:::i;55284:283::-;;;;;;;;;;;;;:::i;25854:117::-;;;;;;;;;;;;;:::i;40957:185::-;;;;;;;;;;-1:-1:-1;40957:185:0;;;;;:::i;:::-;;:::i;53306:635::-;;;;;;;;;;-1:-1:-1;53306:635:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;54534:74::-;;;;;;;;;;-1:-1:-1;54534:74:0;;;;;:::i;:::-;;:::i;52151:557::-;;;;;;:::i;:::-;;:::i;54750:132::-;;;;;;;;;;-1:-1:-1;54750:132:0;;;;;:::i;:::-;;:::i;51468:28::-;;;;;;;;;;-1:-1:-1;51468:28:0;;;;;;;;;;;51200:33;;;;;;;;;;;;;:::i;51438:25::-;;;;;;;;;;-1:-1:-1;51438:25:0;;;;;;;;51167:28;;;;;;;;;;;;;:::i;37932:239::-;;;;;;;;;;-1:-1:-1;37932:239:0;;;;;:::i;:::-;;:::i;37662:208::-;;;;;;;;;;-1:-1:-1;37662:208:0;;;;;:::i;:::-;;:::i;15798:103::-;;;;;;;;;;;;;:::i;54888:100::-;;;;;;;;;;-1:-1:-1;54888:100:0;;;;;:::i;:::-;;:::i;15147:87::-;;;;;;;;;;-1:-1:-1;15220:6:0;;-1:-1:-1;;;;;15220:6:0;15147:87;;51352:37;;;;;;;;;;;;;;;;38407:104;;;;;;;;;;;;;:::i;25418:189::-;;;;;;;;;;-1:-1:-1;25418:189:0;;;;;:::i;:::-;;:::i;51501:34::-;;;;;;;;;;-1:-1:-1;51501:34:0;;;;;;;;;;;52714:309;;;;;;:::i;:::-;;:::i;40090:155::-;;;;;;;;;;-1:-1:-1;40090:155:0;;;;;:::i;:::-;;:::i;51238:31::-;;;;;;;;;;;;;:::i;25613:235::-;;;;;;;;;;-1:-1:-1;25613:235:0;;;;;:::i;:::-;;:::i;54614:130::-;;;;;;;;;;-1:-1:-1;54614:130:0;;;;;:::i;:::-;;:::i;41213:328::-;;;;;;;;;;-1:-1:-1;41213:328:0;;;;;:::i;:::-;;:::i;51394:37::-;;;;;;;;;;;;;;;;53947:494;;;;;;;;;;-1:-1:-1;53947:494:0;;;;;:::i;:::-;;:::i;51315:32::-;;;;;;;;;;;;;;;;26268:273;;;;;;;;;;-1:-1:-1;26268:273:0;;;;;:::i;:::-;;:::i;54447:81::-;;;;;;;;;;-1:-1:-1;54447:81:0;;;;;:::i;:::-;;:::i;40316:164::-;;;;;;;;;;-1:-1:-1;40316:164:0;;;;;:::i;:::-;;:::i;53143:155::-;;;;;;;;;;-1:-1:-1;53143:155:0;;;;;:::i;:::-;;:::i;53029:106::-;;;;;;;;;;-1:-1:-1;53029:106:0;;;;;:::i;:::-;;:::i;16056:201::-;;;;;;;;;;-1:-1:-1;16056:201:0;;;;;:::i;:::-;;:::i;37293:305::-;37395:4;-1:-1:-1;;;;;;37432:40:0;;-1:-1:-1;;;37432:40:0;;:105;;-1:-1:-1;;;;;;;37489:48:0;;-1:-1:-1;;;37489:48:0;37432:105;:158;;;-1:-1:-1;;;;;;;;;;30171:40:0;;;37554:36;37412:178;37293:305;-1:-1:-1;;37293:305:0:o;38238:100::-;38292:13;38325:5;38318:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38238:100;:::o;39797:221::-;39873:7;43140:16;;;:7;:16;;;;;;-1:-1:-1;;;;;43140:16:0;39893:73;;;;-1:-1:-1;;;39893:73:0;;17241:2:1;39893:73:0;;;17223:21:1;17280:2;17260:18;;;17253:30;17319:34;17299:18;;;17292:62;-1:-1:-1;;;17370:18:1;;;17363:42;17422:19;;39893:73:0;;;;;;;;;-1:-1:-1;39986:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;39986:24:0;;39797:221::o;39320:411::-;39401:13;39417:23;39432:7;39417:14;:23::i;:::-;39401:39;;39465:5;-1:-1:-1;;;;;39459:11:0;:2;-1:-1:-1;;;;;39459:11:0;;;39451:57;;;;-1:-1:-1;;;39451:57:0;;19543:2:1;39451:57:0;;;19525:21:1;19582:2;19562:18;;;19555:30;19621:34;19601:18;;;19594:62;-1:-1:-1;;;19672:18:1;;;19665:31;19713:19;;39451:57:0;19341:397:1;39451:57:0;13951:10;-1:-1:-1;;;;;39543:21:0;;;;:62;;-1:-1:-1;39568:37:0;39585:5;13951:10;40316:164;:::i;39568:37::-;39521:168;;;;-1:-1:-1;;;39521:168:0;;15231:2:1;39521:168:0;;;15213:21:1;15270:2;15250:18;;;15243:30;15309:34;15289:18;;;15282:62;15380:26;15360:18;;;15353:54;15424:19;;39521:168:0;15029:420:1;39521:168:0;39702:21;39711:2;39715:7;39702:8;:21::i;:::-;39390:341;39320:411;;:::o;54994:100::-;15220:6;;-1:-1:-1;;;;;15220:6:0;13951:10;15367:23;15359:68;;;;-1:-1:-1;;;15359:68:0;;;;;;;:::i;:::-;55066:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;54994:100:::0;:::o;55100:77::-;15220:6;;-1:-1:-1;;;;;15220:6:0;13951:10;15367:23;15359:68;;;;-1:-1:-1;;;15359:68:0;;;;;;;:::i;:::-;55156:6:::1;:15:::0;;-1:-1:-1;;55156:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55100:77::o;52054:89::-;52098:7;52121:16;:6;1001:14;;909:114;52121:16;52114:23;;52054:89;:::o;40547:339::-;40742:41;13951:10;40775:7;40742:18;:41::i;:::-;40734:103;;;;-1:-1:-1;;;40734:103:0;;;;;;;:::i;:::-;40850:28;40860:4;40866:2;40870:7;40850:9;:28::i;26547:104::-;26591:13;26620:25;26634:10;26620:13;:25::i;55183:95::-;15220:6;;-1:-1:-1;;;;;15220:6:0;13951:10;15367:23;15359:68;;;;-1:-1:-1;;;15359:68:0;;;;;;;:::i;:::-;55248:15:::1;:24:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;55248:24:0;;::::1;::::0;;;::::1;::::0;;55183:95::o;55284:283::-;15220:6;;-1:-1:-1;;;;;15220:6:0;13951:10;15367:23;15359:68;;;;-1:-1:-1;;;15359:68:0;;;;;;;:::i;:::-;55329:7:::1;55350:42;55435:3;55406:26;:21;55430:2;55406:26;:::i;:::-;:32;;;;:::i;:::-;55342:101;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55328:115;;;55458:2;55450:11;;;::::0;::::1;;55471:7;55492;15220:6:::0;;-1:-1:-1;;;;;15220:6:0;;15147:87;55492:7:::1;-1:-1:-1::0;;;;;55484:21:0::1;55513;55484:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55470:69;;;55554:2;55546:11;;;::::0;::::1;25854:117:::0;25905:7;25928:37;25951:13;:11;:13::i;40957:185::-;41095:39;41112:4;41118:2;41122:7;41095:39;;;;;;;;;;;;:16;:39::i;53306:635::-;53381:16;53409:23;53435:17;53445:6;53435:9;:17::i;:::-;53409:43;;53459:30;53506:15;53492:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53492:30:0;-1:-1:-1;53459:63:0;-1:-1:-1;53554:1:0;53529:22;53598:309;53623:15;53605;:33;:64;;;;;53660:9;;53642:14;:27;;53605:64;53598:309;;;53680:25;53708:23;53716:14;53708:7;:23::i;:::-;53680:51;;53767:6;-1:-1:-1;;;;;53746:27:0;:17;-1:-1:-1;;;;;53746:27:0;;53742:131;;;53819:14;53786:13;53800:15;53786:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;53846:17;;;;:::i;:::-;;;;53742:131;53883:16;;;;:::i;:::-;;;;53671:236;53598:309;;;-1:-1:-1;53922:13:0;;53306:635;-1:-1:-1;;;;53306:635:0:o;54534:74::-;15220:6;;-1:-1:-1;;;;;15220:6:0;13951:10;15367:23;15359:68;;;;-1:-1:-1;;;15359:68:0;;;;;;;:::i;:::-;54590:4:::1;:12:::0;54534:74::o;52151:557::-;52259:11;51888:1;51874:11;:15;:52;;;;;51908:18;;51893:11;:33;;51874:52;51866:85;;;;-1:-1:-1;;;51866:85:0;;;;;;;:::i;:::-;52000:9;;51985:11;51966:16;:6;1001:14;;909:114;51966:16;:30;;;;:::i;:::-;:43;;51958:76;;;;-1:-1:-1;;;51958:76:0;;;;;;;:::i;:::-;52301:9:::1;25219:19;25241:37;25264:13;:11;:13::i;25241:37::-;25219:59:::0;-1:-1:-1;25285:14:0::1;25302:30;25219:59:::0;25322:9;25302:19:::1;:30::i;:::-;25359:7;::::0;25285:47;;-1:-1:-1;;;;;;25349:17:0;;::::1;25359:7:::0;::::1;25349:17;25341:57;;;::::0;-1:-1:-1;;;25341:57:0;;21063:2:1;25341:57:0::1;::::0;::::1;21045:21:1::0;21102:2;21082:18;;;21075:30;21141:29;21121:18;;;21114:57;21188:18;;25341:57:0::1;20861:351:1::0;25341:57:0::1;52331:6:::2;::::0;::::2;;52330:7;52322:43;;;::::0;-1:-1:-1;;;52322:43:0;;18015:2:1;52322:43:0::2;::::0;::::2;17997:21:1::0;18054:2;18034:18;;;18027:30;-1:-1:-1;;;18073:18:1;;;18066:53;18136:18;;52322:43:0::2;17813:347:1::0;52322:43:0::2;52380:15;::::0;;;::::2;;;52372:49;;;::::0;-1:-1:-1;;;52372:49:0;;18777:2:1;52372:49:0::2;::::0;::::2;18759:21:1::0;18816:2;18796:18;;;18789:30;-1:-1:-1;;;18835:18:1;;;18828:51;18896:18;;52372:49:0::2;18575:345:1::0;52372:49:0::2;52456:11;52449:4;;:18;;;;:::i;:::-;52436:9;:31;;52428:63;;;::::0;-1:-1:-1;;;52428:63:0;;21419:2:1;52428:63:0::2;::::0;::::2;21401:21:1::0;21458:2;21438:18;;;21431:30;-1:-1:-1;;;21477:18:1;;;21470:49;21536:18;;52428:63:0::2;21217:343:1::0;52428:63:0::2;52548:10;52500:24;52527:32:::0;;;:20:::2;:32;::::0;;;;;52608:18:::2;::::0;52574:30:::2;52593:11:::0;52527:32;52574:30:::2;:::i;:::-;:52;;52566:93;;;::::0;-1:-1:-1;;;52566:93:0;;13299:2:1;52566:93:0::2;::::0;::::2;13281:21:1::0;13338:2;13318:18;;;13311:30;13377;13357:18;;;13350:58;13425:18;;52566:93:0::2;13097:352:1::0;52566:93:0::2;52668:34;52678:10;52690:11;52668:9;:34::i;:::-;52315:393;25212:200:::1;;52041:1;52151:557:::0;;;:::o;54750:132::-;15220:6;;-1:-1:-1;;;;;15220:6:0;13951:10;15367:23;15359:68;;;;-1:-1:-1;;;15359:68:0;;;;;;;:::i;:::-;54838:38;;::::1;::::0;:17:::1;::::0;:38:::1;::::0;::::1;::::0;::::1;:::i;51200:33::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51167:28::-;;;;;;;:::i;37932:239::-;38004:7;38040:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38040:16:0;38075:19;38067:73;;;;-1:-1:-1;;;38067:73:0;;16067:2:1;38067:73:0;;;16049:21:1;16106:2;16086:18;;;16079:30;16145:34;16125:18;;;16118:62;-1:-1:-1;;;16196:18:1;;;16189:39;16245:19;;38067:73:0;15865:405:1;37662:208:0;37734:7;-1:-1:-1;;;;;37762:19:0;;37754:74;;;;-1:-1:-1;;;37754:74:0;;15656:2:1;37754:74:0;;;15638:21:1;15695:2;15675:18;;;15668:30;15734:34;15714:18;;;15707:62;-1:-1:-1;;;15785:18:1;;;15778:40;15835:19;;37754:74:0;15454:406:1;37754:74:0;-1:-1:-1;;;;;;37846:16:0;;;;;:9;:16;;;;;;;37662:208::o;15798:103::-;15220:6;;-1:-1:-1;;;;;15220:6:0;13951:10;15367:23;15359:68;;;;-1:-1:-1;;;15359:68:0;;;;;;;:::i;:::-;15863:30:::1;15890:1;15863:18;:30::i;:::-;15798:103::o:0;54888:100::-;15220:6;;-1:-1:-1;;;;;15220:6:0;13951:10;15367:23;15359:68;;;;-1:-1:-1;;;15359:68:0;;;;;;;:::i;:::-;54960:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;38407:104::-:0;38463:13;38496:7;38489:14;;;;;:::i;25418:189::-;25489:12;25510:23;25536:18;25544:9;25536:7;:18::i;:::-;25568:33;;-1:-1:-1;;5784:2:1;5780:15;;;5776:53;25568:33:0;;;5764:66:1;25510:44:0;;-1:-1:-1;5846:12:1;;25568:33:0;;;;;;;;;;;;;25561:40;;;25418:189;;;:::o;52714:309::-;52779:11;51888:1;51874:11;:15;:52;;;;;51908:18;;51893:11;:33;;51874:52;51866:85;;;;-1:-1:-1;;;51866:85:0;;;;;;;:::i;:::-;52000:9;;51985:11;51966:16;:6;1001:14;;909:114;51966:16;:30;;;;:::i;:::-;:43;;51958:76;;;;-1:-1:-1;;;51958:76:0;;;;;;;:::i;:::-;52808:6:::1;::::0;::::1;;52807:7;52799:43;;;::::0;-1:-1:-1;;;52799:43:0;;18015:2:1;52799:43:0::1;::::0;::::1;17997:21:1::0;18054:2;18034:18;;;18027:30;-1:-1:-1;;;18073:18:1;;;18066:53;18136:18;;52799:43:0::1;17813:347:1::0;52799:43:0::1;52858:15;::::0;;;::::1;;;52857:16;52849:51;;;::::0;-1:-1:-1;;;52849:51:0;;20712:2:1;52849:51:0::1;::::0;::::1;20694:21:1::0;20751:2;20731:18;;;20724:30;-1:-1:-1;;;20770:18:1;;;20763:52;20832:18;;52849:51:0::1;20510:346:1::0;52849:51:0::1;52935:11;52928:4;;:18;;;;:::i;:::-;52915:9;:31;;52907:63;;;::::0;-1:-1:-1;;;52907:63:0;;21419:2:1;52907:63:0::1;::::0;::::1;21401:21:1::0;21458:2;21438:18;;;21431:30;-1:-1:-1;;;21477:18:1;;;21470:49;21536:18;;52907:63:0::1;21217:343:1::0;52907:63:0::1;52983:34;52993:10;53005:11;52983:9;:34::i;40090:155::-:0;40185:52;13951:10;40218:8;40228;40185:18;:52::i;51238:31::-;;;;;;;:::i;25613:235::-;25675:7;25691:19;25713:37;25736:13;:11;:13::i;25713:37::-;25691:59;-1:-1:-1;25757:23:0;25783:30;25691:59;25803:9;25783:19;:30::i;:::-;25757:56;25613:235;-1:-1:-1;;;;25613:235:0:o;54614:130::-;15220:6;;-1:-1:-1;;;;;15220:6:0;13951:10;15367:23;15359:68;;;;-1:-1:-1;;;15359:68:0;;;;;;;:::i;:::-;54698:18:::1;:40:::0;54614:130::o;41213:328::-;41388:41;13951:10;41421:7;41388:18;:41::i;:::-;41380:103;;;;-1:-1:-1;;;41380:103:0;;;;;;;:::i;:::-;41494:39;41508:4;41514:2;41518:7;41527:5;41494:13;:39::i;:::-;41213:328;;;;:::o;53947:494::-;43116:4;43140:16;;;:7;:16;;;;;;54046:13;;-1:-1:-1;;;;;43140:16:0;54071:98;;;;-1:-1:-1;;;54071:98:0;;19127:2:1;54071:98:0;;;19109:21:1;19166:2;19146:18;;;19139:30;19205:34;19185:18;;;19178:62;-1:-1:-1;;;19256:18:1;;;19249:45;19311:19;;54071:98:0;18925:411:1;54071:98:0;54182:8;;;;;;;54178:64;;54217:17;54210:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53947:494;;;:::o;54178:64::-;54250:28;54281:10;:8;:10::i;:::-;54250:41;;54336:1;54311:14;54305:28;:32;:130;;;;;;;;;;;;;;;;;54373:14;54389:19;:8;:17;:19::i;:::-;54410:9;54356:64;;;;;;;;;;:::i;54305:130::-;54298:137;53947:494;-1:-1:-1;;;53947:494:0:o;26268:273::-;26338:7;26354:14;26377:1;26354:25;;26481:26;26498:1;:8;26481:16;:26::i;:::-;26518:1;26411:117;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26393:142;;;;;;26386:149;;;26268:273;;;:::o;54447:81::-;15220:6;;-1:-1:-1;;;;;15220:6:0;13951:10;15367:23;15359:68;;;;-1:-1:-1;;;15359:68:0;;;;;;;:::i;:::-;54505:8:::1;:17:::0;;;::::1;;;;-1:-1:-1::0;;54505:17:0;;::::1;::::0;;;::::1;::::0;;54447:81::o;40316:164::-;-1:-1:-1;;;;;40437:25:0;;;40413:4;40437:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;40316:164::o;53143:155::-;53229:11;51888:1;51874:11;:15;:52;;;;;51908:18;;51893:11;:33;;51874:52;51866:85;;;;-1:-1:-1;;;51866:85:0;;;;;;;:::i;:::-;52000:9;;51985:11;51966:16;:6;1001:14;;909:114;51966:16;:30;;;;:::i;:::-;:43;;51958:76;;;;-1:-1:-1;;;51958:76:0;;;;;;;:::i;:::-;15220:6;;-1:-1:-1;;;;;15220:6:0;13951:10;15367:23:::1;15359:68;;;;-1:-1:-1::0;;;15359:68:0::1;;;;;;;:::i;:::-;53259:33:::2;53269:9;53280:11;53259:9;:33::i;53029:106::-:0;15220:6;;-1:-1:-1;;;;;15220:6:0;13951:10;15367:23;15359:68;;;;-1:-1:-1;;;15359:68:0;;;;;;;:::i;:::-;53095:34:::1;53105:10;53117:11;53095:9;:34::i;:::-;53029:106:::0;:::o;16056:201::-;15220:6;;-1:-1:-1;;;;;15220:6:0;13951:10;15367:23;15359:68;;;;-1:-1:-1;;;15359:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16145:22:0;::::1;16137:73;;;::::0;-1:-1:-1;;;16137:73:0;;12186:2:1;16137:73:0::1;::::0;::::1;12168:21:1::0;12225:2;12205:18;;;12198:30;12264:34;12244:18;;;12237:62;-1:-1:-1;;;12315:18:1;;;12308:36;12361:19;;16137:73:0::1;11984:402:1::0;16137:73:0::1;16221:28;16240:8;16221:18;:28::i;47033:174::-:0;47108:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;47108:29:0;-1:-1:-1;;;;;47108:29:0;;;;;;;;:24;;47162:23;47108:24;47162:14;:23::i;:::-;-1:-1:-1;;;;;47153:46:0;;;;;;;;;;;47033:174;;:::o;43345:348::-;43438:4;43140:16;;;:7;:16;;;;;;-1:-1:-1;;;;;43140:16:0;43455:73;;;;-1:-1:-1;;;43455:73:0;;14818:2:1;43455:73:0;;;14800:21:1;14857:2;14837:18;;;14830:30;14896:34;14876:18;;;14869:62;-1:-1:-1;;;14947:18:1;;;14940:42;14999:19;;43455:73:0;14616:408:1;43455:73:0;43539:13;43555:23;43570:7;43555:14;:23::i;:::-;43539:39;;43608:5;-1:-1:-1;;;;;43597:16:0;:7;-1:-1:-1;;;;;43597:16:0;;:51;;;;43641:7;-1:-1:-1;;;;;43617:31:0;:20;43629:7;43617:11;:20::i;:::-;-1:-1:-1;;;;;43617:31:0;;43597:51;:87;;;;43652:32;43669:5;43676:7;43652:16;:32::i;46337:578::-;46496:4;-1:-1:-1;;;;;46469:31:0;:23;46484:7;46469:14;:23::i;:::-;-1:-1:-1;;;;;46469:31:0;;46461:85;;;;-1:-1:-1;;;46461:85:0;;18367:2:1;46461:85:0;;;18349:21:1;18406:2;18386:18;;;18379:30;18445:34;18425:18;;;18418:62;-1:-1:-1;;;18496:18:1;;;18489:39;18545:19;;46461:85:0;18165:405:1;46461:85:0;-1:-1:-1;;;;;46565:16:0;;46557:65;;;;-1:-1:-1;;;46557:65:0;;13656:2:1;46557:65:0;;;13638:21:1;13695:2;13675:18;;;13668:30;13734:34;13714:18;;;13707:62;-1:-1:-1;;;13785:18:1;;;13778:34;13829:19;;46557:65:0;13454:400:1;46557:65:0;46739:29;46756:1;46760:7;46739:8;:29::i;:::-;-1:-1:-1;;;;;46781:15:0;;;;;;:9;:15;;;;;:20;;46800:1;;46781:15;:20;;46800:1;;46781:20;:::i;:::-;;;;-1:-1:-1;;;;;;;46812:13:0;;;;;;:9;:13;;;;;:18;;46829:1;;46812:13;:18;;46829:1;;46812:18;:::i;:::-;;;;-1:-1:-1;;46841:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;46841:21:0;-1:-1:-1;;;;;46841:21:0;;;;;;;;;46880:27;;46841:16;;46880:27;;;;;;;46337:578;;;:::o;26657:423::-;26753:13;;;26763:2;26753:13;;;26714;26753;;;;;;26736:14;;26753:13;;;;;;;;;;;-1:-1:-1;26753:13:0;26736:30;;26780:9;26775:275;26799:2;26795:1;:6;26775:275;;;26817:8;26875:6;26880:1;26875:2;:6;:::i;:::-;26870:12;;:1;:12;:::i;:::-;26864:19;;:1;:19;:::i;:::-;26841:43;;-1:-1:-1;;;;;26841:19:0;;:43;:::i;:::-;26828:58;;26817:69;;26895:9;26925:2;26920:1;26914:8;;:13;;;;:::i;:::-;26907:21;;26895:33;;26937:9;26978:2;26972:9;;26967:2;:14;;;;:::i;:::-;26962:1;26956:8;;:25;;;;:::i;:::-;26949:33;;26937:45;;27002:8;27007:2;27002:4;:8::i;:::-;26991:1;26993:5;26997:1;26993;:5;:::i;:::-;26991:8;;;;;;;;:::i;:::-;;;;:19;-1:-1:-1;;;;;26991:19:0;;;;;;;;;27034:8;27039:2;27034:4;:8::i;:::-;27019:1;27021:5;27025:1;27021;:5;:::i;:::-;:9;;27029:1;27021:9;:::i;:::-;27019:12;;;;;;;;:::i;:::-;;;;:23;-1:-1:-1;;;;;27019:23:0;;;;;;;;;26808:242;;;26803:3;;;;;:::i;:::-;;;;26775:275;;;-1:-1:-1;27072:1:0;26657:423;-1:-1:-1;;26657:423:0:o;8028:231::-;8106:7;8127:17;8146:18;8168:27;8179:4;8185:9;8168:10;:27::i;:::-;8126:69;;;;8206:18;8218:5;8206:11;:18::i;:::-;-1:-1:-1;8242:9:0;8028:231;-1:-1:-1;;;8028:231:0:o;55573:246::-;55653:9;55648:166;55672:11;55668:1;:15;55648:166;;;-1:-1:-1;;;;;55699:31:0;;;;;;:20;:31;;;;;:33;;;;;;:::i;:::-;;;;;;55741:18;:6;1120:19;;1138:1;1120:19;;;1031:127;55741:18;55768:38;55778:9;55789:16;:6;1001:14;;909:114;55789:16;55768:9;:38::i;:::-;55685:3;;;;:::i;:::-;;;;55648:166;;16417:191;16510:6;;;-1:-1:-1;;;;;16527:17:0;;;-1:-1:-1;;;;;;16527:17:0;;;;;;;16560:40;;16510:6;;;16527:17;16510:6;;16560:40;;16491:16;;16560:40;16480:128;16417:191;:::o;47349:315::-;47504:8;-1:-1:-1;;;;;47495:17:0;:5;-1:-1:-1;;;;;47495:17:0;;;47487:55;;;;-1:-1:-1;;;47487:55:0;;14061:2:1;47487:55:0;;;14043:21:1;14100:2;14080:18;;;14073:30;14139:27;14119:18;;;14112:55;14184:18;;47487:55:0;13859:349:1;47487:55:0;-1:-1:-1;;;;;47553:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;47553:46:0;;;;;;;;;;47615:41;;9769::1;;;47615::0;;9742:18:1;47615:41:0;;;;;;;47349:315;;;:::o;42423:::-;42580:28;42590:4;42596:2;42600:7;42580:9;:28::i;:::-;42627:48;42650:4;42656:2;42660:7;42669:5;42627:22;:48::i;:::-;42619:111;;;;-1:-1:-1;;;42619:111:0;;;;;;;:::i;55825:104::-;55885:13;55914:9;55907:16;;;;;:::i;1867:723::-;1923:13;2144:10;2140:53;;-1:-1:-1;;2171:10:0;;;;;;;;;;;;-1:-1:-1;;;2171:10:0;;;;;1867:723::o;2140:53::-;2218:5;2203:12;2259:78;2266:9;;2259:78;;2292:8;;;;:::i;:::-;;-1:-1:-1;2315:10:0;;-1:-1:-1;2323:2:0;2315:10;;:::i;:::-;;;2259:78;;;2347:19;2379:6;2369:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2369:17:0;;2347:39;;2397:154;2404:10;;2397:154;;2431:11;2441:1;2431:11;;:::i;:::-;;-1:-1:-1;2500:10:0;2508:2;2500:5;:10;:::i;:::-;2487:24;;:2;:24;:::i;:::-;2474:39;;2457:6;2464;2457:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2457:56:0;;;;;;;;-1:-1:-1;2528:11:0;2537:2;2528:11;;:::i;:::-;;;2397:154;;27086:158;27133:8;27169:2;27158:8;;;;:13;27157:81;;27222:15;:8;;;;27233:4;27222:15;:::i;:::-;27215:23;;27157:81;;;27189:15;:8;;;;27200:4;27189:15;:::i;:::-;27182:23;;27150:88;27086:158;-1:-1:-1;;27086:158:0:o;5918:1308::-;5999:7;6008:12;6233:9;:16;6253:2;6233:22;6229:990;;;6529:4;6514:20;;6508:27;6579:4;6564:20;;6558:27;6637:4;6622:20;;6616:27;6272:9;6608:36;6680:25;6691:4;6608:36;6508:27;6558;6680:10;:25::i;:::-;6673:32;;;;;;;;;6229:990;6727:9;:16;6747:2;6727:22;6723:496;;;7002:4;6987:20;;6981:27;7053:4;7038:20;;7032:27;7095:23;7106:4;6981:27;7032;7095:10;:23::i;:::-;7088:30;;;;;;;;6723:496;-1:-1:-1;7167:1:0;;-1:-1:-1;7171:35:0;6723:496;5918:1308;;;;;:::o;4189:643::-;4267:20;4258:5;:29;;;;;;;;:::i;:::-;;4254:571;;;4189:643;:::o;4254:571::-;4365:29;4356:5;:38;;;;;;;;:::i;:::-;;4352:473;;;4411:34;;-1:-1:-1;;;4411:34:0;;11054:2:1;4411:34:0;;;11036:21:1;11093:2;11073:18;;;11066:30;11132:26;11112:18;;;11105:54;11176:18;;4411:34:0;10852:348:1;4352:473:0;4476:35;4467:5;:44;;;;;;;;:::i;:::-;;4463:362;;;4528:41;;-1:-1:-1;;;4528:41:0;;11407:2:1;4528:41:0;;;11389:21:1;11446:2;11426:18;;;11419:30;11485:33;11465:18;;;11458:61;11536:18;;4528:41:0;11205:355:1;4463:362:0;4600:30;4591:5;:39;;;;;;;;:::i;:::-;;4587:238;;;4647:44;;-1:-1:-1;;;4647:44:0;;14415:2:1;4647:44:0;;;14397:21:1;14454:2;14434:18;;;14427:30;14493:34;14473:18;;;14466:62;-1:-1:-1;;;14544:18:1;;;14537:32;14586:19;;4647:44:0;14213:398:1;4587:238:0;4722:30;4713:5;:39;;;;;;;;:::i;:::-;;4709:116;;;4769:44;;-1:-1:-1;;;4769:44:0;;16477:2:1;4769:44:0;;;16459:21:1;16516:2;16496:18;;;16489:30;16555:34;16535:18;;;16528:62;-1:-1:-1;;;16606:18:1;;;16599:32;16648:19;;4769:44:0;16275:398:1;44035:110:0;44111:26;44121:2;44125:7;44111:26;;;;;;;;;;;;:9;:26::i;48229:799::-;48384:4;-1:-1:-1;;;;;48405:13:0;;17758:20;17806:8;48401:620;;48441:72;;-1:-1:-1;;;48441:72:0;;-1:-1:-1;;;;;48441:36:0;;;;;:72;;13951:10;;48492:4;;48498:7;;48507:5;;48441:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48441:72:0;;;;;;;;-1:-1:-1;;48441:72:0;;;;;;;;;;;;:::i;:::-;;;48437:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48683:13:0;;48679:272;;48726:60;;-1:-1:-1;;;48726:60:0;;;;;;;:::i;48679:272::-;48901:6;48895:13;48886:6;48882:2;48878:15;48871:38;48437:529;-1:-1:-1;;;;;;48564:51:0;-1:-1:-1;;;48564:51:0;;-1:-1:-1;48557:58:0;;48401:620;-1:-1:-1;49005:4:0;48229:799;;;;;;:::o;9527:1632::-;9658:7;;10592:66;10579:79;;10575:163;;;-1:-1:-1;10691:1:0;;-1:-1:-1;10695:30:0;10675:51;;10575:163;10752:1;:7;;10757:2;10752:7;;:18;;;;;10763:1;:7;;10768:2;10763:7;;10752:18;10748:102;;;-1:-1:-1;10803:1:0;;-1:-1:-1;10807:30:0;10787:51;;10748:102;10964:24;;;10947:14;10964:24;;;;;;;;;10230:25:1;;;10303:4;10291:17;;10271:18;;;10264:45;;;;10325:18;;;10318:34;;;10368:18;;;10361:34;;;10964:24:0;;10202:19:1;;10964:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10964:24:0;;-1:-1:-1;;10964:24:0;;;-1:-1:-1;;;;;;;11003:20:0;;10999:103;;11056:1;11060:29;11040:50;;;;;;;10999:103;11122:6;-1:-1:-1;11130:20:0;;-1:-1:-1;9527:1632:0;;;;;;;;:::o;8522:391::-;8636:7;;-1:-1:-1;;;;;8737:75:0;;8839:3;8835:12;;;8849:2;8831:21;8880:25;8891:4;8831:21;8900:1;8737:75;8880:10;:25::i;:::-;8873:32;;;;;;8522:391;;;;;;:::o;44372:321::-;44502:18;44508:2;44512:7;44502:5;:18::i;:::-;44553:54;44584:1;44588:2;44592:7;44601:5;44553:22;:54::i;:::-;44531:154;;;;-1:-1:-1;;;44531:154:0;;;;;;;:::i;45029:382::-;-1:-1:-1;;;;;45109:16:0;;45101:61;;;;-1:-1:-1;;;45101:61:0;;16880:2:1;45101:61:0;;;16862:21:1;;;16899:18;;;16892:30;16958:34;16938:18;;;16931:62;17010:18;;45101:61:0;16678:356:1;45101:61:0;43116:4;43140:16;;;:7;:16;;;;;;-1:-1:-1;;;;;43140:16:0;:30;45173:58;;;;-1:-1:-1;;;45173:58:0;;12593:2:1;45173:58:0;;;12575:21:1;12632:2;12612:18;;;12605:30;12671;12651:18;;;12644:58;12719:18;;45173:58:0;12391:352:1;45173:58:0;-1:-1:-1;;;;;45302:13:0;;;;;;:9;:13;;;;;:18;;45319:1;;45302:13;:18;;45319:1;;45302:18;:::i;:::-;;;;-1:-1:-1;;45331:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;45331:21:0;-1:-1:-1;;;;;45331:21:0;;;;;;;;45370:33;;45331:16;;;45370:33;;45331:16;;45370:33;45029:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:160::-;893:20;;949:13;;942:21;932:32;;922:60;;978:1;975;968:12;993:220;1035:5;1088:3;1081:4;1073:6;1069:17;1065:27;1055:55;;1106:1;1103;1096:12;1055:55;1128:79;1203:3;1194:6;1181:20;1174:4;1166:6;1162:17;1128:79;:::i;1218:186::-;1277:6;1330:2;1318:9;1309:7;1305:23;1301:32;1298:52;;;1346:1;1343;1336:12;1298:52;1369:29;1388:9;1369:29;:::i;1409:260::-;1477:6;1485;1538:2;1526:9;1517:7;1513:23;1509:32;1506:52;;;1554:1;1551;1544:12;1506:52;1577:29;1596:9;1577:29;:::i;:::-;1567:39;;1625:38;1659:2;1648:9;1644:18;1625:38;:::i;:::-;1615:48;;1409:260;;;;;:::o;1674:328::-;1751:6;1759;1767;1820:2;1808:9;1799:7;1795:23;1791:32;1788:52;;;1836:1;1833;1826:12;1788:52;1859:29;1878:9;1859:29;:::i;:::-;1849:39;;1907:38;1941:2;1930:9;1926:18;1907:38;:::i;:::-;1897:48;;1992:2;1981:9;1977:18;1964:32;1954:42;;1674:328;;;;;:::o;2007:537::-;2102:6;2110;2118;2126;2179:3;2167:9;2158:7;2154:23;2150:33;2147:53;;;2196:1;2193;2186:12;2147:53;2219:29;2238:9;2219:29;:::i;:::-;2209:39;;2267:38;2301:2;2290:9;2286:18;2267:38;:::i;:::-;2257:48;;2352:2;2341:9;2337:18;2324:32;2314:42;;2407:2;2396:9;2392:18;2379:32;2434:18;2426:6;2423:30;2420:50;;;2466:1;2463;2456:12;2420:50;2489:49;2530:7;2521:6;2510:9;2506:22;2489:49;:::i;:::-;2479:59;;;2007:537;;;;;;;:::o;2549:254::-;2614:6;2622;2675:2;2663:9;2654:7;2650:23;2646:32;2643:52;;;2691:1;2688;2681:12;2643:52;2714:29;2733:9;2714:29;:::i;:::-;2704:39;;2762:35;2793:2;2782:9;2778:18;2762:35;:::i;2808:254::-;2876:6;2884;2937:2;2925:9;2916:7;2912:23;2908:32;2905:52;;;2953:1;2950;2943:12;2905:52;2976:29;2995:9;2976:29;:::i;:::-;2966:39;3052:2;3037:18;;;;3024:32;;-1:-1:-1;;;2808:254:1:o;3067:180::-;3123:6;3176:2;3164:9;3155:7;3151:23;3147:32;3144:52;;;3192:1;3189;3182:12;3144:52;3215:26;3231:9;3215:26;:::i;3252:245::-;3310:6;3363:2;3351:9;3342:7;3338:23;3334:32;3331:52;;;3379:1;3376;3369:12;3331:52;3418:9;3405:23;3437:30;3461:5;3437:30;:::i;3502:249::-;3571:6;3624:2;3612:9;3603:7;3599:23;3595:32;3592:52;;;3640:1;3637;3630:12;3592:52;3672:9;3666:16;3691:30;3715:5;3691:30;:::i;3756:320::-;3824:6;3877:2;3865:9;3856:7;3852:23;3848:32;3845:52;;;3893:1;3890;3883:12;3845:52;3933:9;3920:23;3966:18;3958:6;3955:30;3952:50;;;3998:1;3995;3988:12;3952:50;4021:49;4062:7;4053:6;4042:9;4038:22;4021:49;:::i;4081:388::-;4158:6;4166;4219:2;4207:9;4198:7;4194:23;4190:32;4187:52;;;4235:1;4232;4225:12;4187:52;4275:9;4262:23;4308:18;4300:6;4297:30;4294:50;;;4340:1;4337;4330:12;4294:50;4363:49;4404:7;4395:6;4384:9;4380:22;4363:49;:::i;:::-;4353:59;4459:2;4444:18;;;;4431:32;;-1:-1:-1;;;;4081:388:1:o;4474:450::-;4543:6;4596:2;4584:9;4575:7;4571:23;4567:32;4564:52;;;4612:1;4609;4602:12;4564:52;4652:9;4639:23;4685:18;4677:6;4674:30;4671:50;;;4717:1;4714;4707:12;4671:50;4740:22;;4793:4;4785:13;;4781:27;-1:-1:-1;4771:55:1;;4822:1;4819;4812:12;4771:55;4845:73;4910:7;4905:2;4892:16;4887:2;4883;4879:11;4845:73;:::i;4929:180::-;4988:6;5041:2;5029:9;5020:7;5016:23;5012:32;5009:52;;;5057:1;5054;5047:12;5009:52;-1:-1:-1;5080:23:1;;4929:180;-1:-1:-1;4929:180:1:o;5114:254::-;5182:6;5190;5243:2;5231:9;5222:7;5218:23;5214:32;5211:52;;;5259:1;5256;5249:12;5211:52;5295:9;5282:23;5272:33;;5324:38;5358:2;5347:9;5343:18;5324:38;:::i;5373:257::-;5414:3;5452:5;5446:12;5479:6;5474:3;5467:19;5495:63;5551:6;5544:4;5539:3;5535:14;5528:4;5521:5;5517:16;5495:63;:::i;:::-;5612:2;5591:15;-1:-1:-1;;5587:29:1;5578:39;;;;5619:4;5574:50;;5373:257;-1:-1:-1;;5373:257:1:o;5869:1527::-;6093:3;6131:6;6125:13;6157:4;6170:51;6214:6;6209:3;6204:2;6196:6;6192:15;6170:51;:::i;:::-;6284:13;;6243:16;;;;6306:55;6284:13;6243:16;6328:15;;;6306:55;:::i;:::-;6450:13;;6383:20;;;6423:1;;6510;6532:18;;;;6585;;;;6612:93;;6690:4;6680:8;6676:19;6664:31;;6612:93;6753:2;6743:8;6740:16;6720:18;6717:40;6714:167;;;-1:-1:-1;;;6780:33:1;;6836:4;6833:1;6826:15;6866:4;6787:3;6854:17;6714:167;6897:18;6924:110;;;;7048:1;7043:328;;;;6890:481;;6924:110;-1:-1:-1;;6959:24:1;;6945:39;;7004:20;;;;-1:-1:-1;6924:110:1;;7043:328;21820:1;21813:14;;;21857:4;21844:18;;7138:1;7152:169;7166:8;7163:1;7160:15;7152:169;;;7248:14;;7233:13;;;7226:37;7291:16;;;;7183:10;;7152:169;;;7156:3;;7352:8;7345:5;7341:20;7334:27;;6890:481;-1:-1:-1;7387:3:1;;5869:1527;-1:-1:-1;;;;;;;;;;;5869:1527:1:o;7401:675::-;7709:66;7704:3;7697:79;7679:3;7805:6;7799:13;7821:62;7876:6;7871:2;7866:3;7862:12;7855:4;7847:6;7843:17;7821:62;:::i;:::-;7943:13;;7902:16;;;;7965:63;7943:13;8014:2;8006:11;;7999:4;7987:17;;7965:63;:::i;:::-;8048:17;8067:2;8044:26;;7401:675;-1:-1:-1;;;;7401:675:1:o;8499:488::-;-1:-1:-1;;;;;8768:15:1;;;8750:34;;8820:15;;8815:2;8800:18;;8793:43;8867:2;8852:18;;8845:34;;;8915:3;8910:2;8895:18;;8888:31;;;8693:4;;8936:45;;8961:19;;8953:6;8936:45;:::i;:::-;8928:53;8499:488;-1:-1:-1;;;;;;8499:488:1:o;8992:632::-;9163:2;9215:21;;;9285:13;;9188:18;;;9307:22;;;9134:4;;9163:2;9386:15;;;;9360:2;9345:18;;;9134:4;9429:169;9443:6;9440:1;9437:13;9429:169;;;9504:13;;9492:26;;9573:15;;;;9538:12;;;;9465:1;9458:9;9429:169;;;-1:-1:-1;9615:3:1;;8992:632;-1:-1:-1;;;;;;8992:632:1:o;10406:217::-;10553:2;10542:9;10535:21;10516:4;10573:44;10613:2;10602:9;10598:18;10590:6;10573:44;:::i;11565:414::-;11767:2;11749:21;;;11806:2;11786:18;;;11779:30;11845:34;11840:2;11825:18;;11818:62;-1:-1:-1;;;11911:2:1;11896:18;;11889:48;11969:3;11954:19;;11565:414::o;12748:344::-;12950:2;12932:21;;;12989:2;12969:18;;;12962:30;-1:-1:-1;;;13023:2:1;13008:18;;13001:50;13083:2;13068:18;;12748:344::o;17452:356::-;17654:2;17636:21;;;17673:18;;;17666:30;17732:34;17727:2;17712:18;;17705:62;17799:2;17784:18;;17452:356::o;19743:344::-;19945:2;19927:21;;;19984:2;19964:18;;;19957:30;-1:-1:-1;;;20018:2:1;20003:18;;19996:50;20078:2;20063:18;;19743:344::o;20092:413::-;20294:2;20276:21;;;20333:2;20313:18;;;20306:30;20372:34;20367:2;20352:18;;20345:62;-1:-1:-1;;;20438:2:1;20423:18;;20416:47;20495:3;20480:19;;20092:413::o;21873:128::-;21913:3;21944:1;21940:6;21937:1;21934:13;21931:39;;;21950:18;;:::i;:::-;-1:-1:-1;21986:9:1;;21873:128::o;22006:204::-;22044:3;22080:4;22077:1;22073:12;22112:4;22109:1;22105:12;22147:3;22141:4;22137:14;22132:3;22129:23;22126:49;;;22155:18;;:::i;:::-;22191:13;;22006:204;-1:-1:-1;;;22006:204:1:o;22215:120::-;22255:1;22281;22271:35;;22286:18;;:::i;:::-;-1:-1:-1;22320:9:1;;22215:120::o;22340:165::-;22378:1;22412:4;22409:1;22405:12;22436:3;22426:37;;22443:18;;:::i;:::-;22495:3;22488:4;22485:1;22481:12;22477:22;22472:27;;;22340:165;;;;:::o;22510:422::-;22599:1;22642:5;22599:1;22656:270;22677:7;22667:8;22664:21;22656:270;;;22736:4;22732:1;22728:6;22724:17;22718:4;22715:27;22712:53;;;22745:18;;:::i;:::-;22795:7;22785:8;22781:22;22778:55;;;22815:16;;;;22778:55;22894:22;;;;22854:15;;;;22656:270;;;22660:3;22510:422;;;;;:::o;22937:131::-;22997:5;23026:36;23053:8;23047:4;23122:5;23152:8;23142:80;;-1:-1:-1;23193:1:1;23207:5;;23142:80;23241:4;23231:76;;-1:-1:-1;23278:1:1;23292:5;;23231:76;23323:4;23341:1;23336:59;;;;23409:1;23404:130;;;;23316:218;;23336:59;23366:1;23357:10;;23380:5;;;23404:130;23441:3;23431:8;23428:17;23425:43;;;23448:18;;:::i;:::-;-1:-1:-1;;23504:1:1;23490:16;;23519:5;;23316:218;;23618:2;23608:8;23605:16;23599:3;23593:4;23590:13;23586:36;23580:2;23570:8;23567:16;23562:2;23556:4;23553:12;23549:35;23546:77;23543:159;;;-1:-1:-1;23655:19:1;;;23687:5;;23543:159;23734:34;23759:8;23753:4;23734:34;:::i;:::-;23804:6;23800:1;23796:6;23792:19;23783:7;23780:32;23777:58;;;23815:18;;:::i;:::-;23853:20;;23073:806;-1:-1:-1;;;23073:806:1:o;23884:168::-;23924:7;23990:1;23986;23982:6;23978:14;23975:1;23972:21;23967:1;23960:9;23953:17;23949:45;23946:71;;;23997:18;;:::i;:::-;-1:-1:-1;24037:9:1;;23884:168::o;24057:238::-;24095:7;24135:4;24132:1;24128:12;24167:4;24164:1;24160:12;24227:3;24221:4;24217:14;24212:3;24209:23;24202:3;24195:11;24188:19;24184:49;24181:75;;;24236:18;;:::i;24300:125::-;24340:4;24368:1;24365;24362:8;24359:34;;;24373:18;;:::i;:::-;-1:-1:-1;24410:9:1;;24300:125::o;24430:195::-;24468:4;24505;24502:1;24498:12;24537:4;24534:1;24530:12;24562:3;24557;24554:12;24551:38;;;24569:18;;:::i;:::-;24606:13;;;24430:195;-1:-1:-1;;;24430:195:1:o;24630:258::-;24702:1;24712:113;24726:6;24723:1;24720:13;24712:113;;;24802:11;;;24796:18;24783:11;;;24776:39;24748:2;24741:10;24712:113;;;24843:6;24840:1;24837:13;24834:48;;;-1:-1:-1;;24878:1:1;24860:16;;24853:27;24630:258::o;24893:380::-;24972:1;24968:12;;;;25015;;;25036:61;;25090:4;25082:6;25078:17;25068:27;;25036:61;25143:2;25135:6;25132:14;25112:18;25109:38;25106:161;;;25189:10;25184:3;25180:20;25177:1;25170:31;25224:4;25221:1;25214:15;25252:4;25249:1;25242:15;25106:161;;24893:380;;;:::o;25278:135::-;25317:3;-1:-1:-1;;25338:17:1;;25335:43;;;25358:18;;:::i;:::-;-1:-1:-1;25405:1:1;25394:13;;25278:135::o;25418:112::-;25450:1;25476;25466:35;;25481:18;;:::i;:::-;-1:-1:-1;25515:9:1;;25418:112::o;25535:127::-;25596:10;25591:3;25587:20;25584:1;25577:31;25627:4;25624:1;25617:15;25651:4;25648:1;25641:15;25667:127;25728:10;25723:3;25719:20;25716:1;25709:31;25759:4;25756:1;25749:15;25783:4;25780:1;25773:15;25799:127;25860:10;25855:3;25851:20;25848:1;25841:31;25891:4;25888:1;25881:15;25915:4;25912:1;25905:15;25931:127;25992:10;25987:3;25983:20;25980:1;25973:31;26023:4;26020:1;26013:15;26047:4;26044:1;26037:15;26063:127;26124:10;26119:3;26115:20;26112:1;26105:31;26155:4;26152:1;26145:15;26179:4;26176:1;26169:15;26195:131;-1:-1:-1;;;;;;26269:32:1;;26259:43;;26249:71;;26316:1;26313;26306:12
Swarm Source
ipfs://352238302040cc660e4ef1880ae22a9965ea6147e9c0878d5f526078307ddb7d
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.