Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
6,998 CB.JELLY
Holders
1,401
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 CB.JELLYLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
JellyBabies
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Unlicense // Creator: CrudeBorne // ∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰ // ∰∰∰∰∰∰∰∰∰∰∰∰∰∰ __爪爪__ ∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰ // ∰∰∰∰∰∰∰∰∰∰∰∰ 爪ρρρρρρρρρρρρ爪 ∰∰∰∰∰∰∰∰∰∰∰∰∰ // ∰∰∰∰∰∰∰∰∰∰ 爪ρρρρρρρρρρρρρρρρρρρρ爪 ∰∰∰∰∰∰∰∰∰∰∰ // ∰∰∰∰∰∰∰∰Ω 爪ρρρρρρρρρρρρ☤☤ρρρρρρρρρρρρ爪 Ω∰∰∰∰∰∰∰∰∰ // ∰∰∰∰∰∰∰Ω 爪ρρρρρρρρρρρρρρρ☤☤ρρρρρρρρρρρρρρρ爪 Ω∰∰∰∰∰∰∰∰ // ∰∰∰∰∰∰Ω 爪ρρρρρρρρρρρρρρρρρ☤☤ρρρρρρρρρρρρρρρρρ爪 Ω∰∰∰∰∰∰∰ // ∰∰∰∰∰Ω 爪ρρρρρρρρρρρρρρρρρρ☤☤☤☤ρρρρρρρρρρρρρρρρρρ爪 Ω∰∰∰∰∰∰ // ∰∰∰∰∰ 爪ρρρρρρρρρρρρρρρρρρ☤☤☤☤☤☤ρρρρρρρρρρρρρρρρρρ爪 ∰∰∰∰∰∰ // ∰∰∰∰Ω 爪ρρρρρρρρρρρρρρρρρρ☤☤☤☤☤☤☤☤ρρρρρρρρρρρρρρρρρρ爪 Ω∰∰∰∰∰ // ∰∰∰∰ 爪ρρρρρρρρρρρρρρρρρ☤☤☤☤☤☤☤☤☤☤☤☤ρρρρρρρρρρρρρρρρρ爪 ∰∰∰∰∰ // ∰∰∰Ω 爪ρρρρρρρρρρρρρρρρ☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤ρρρρρρρρρρρρρρρρ爪 Ω∰∰∰∰ // ∰∰∰Ω 爪ρρρρρρρρρρρρρ☤☤☤☤☤☤☤☤EGGGGG☤☤☤☤☤☤☤☤ρρρρρρρρρρρρρ爪 Ω∰∰∰∰ // ∰∰∰Ω 爪ρρρρρρρρρρρρ☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤ρρρρρρρρρρρρ爪 Ω∰∰∰∰ // ∰∰∰Ω 爪ρρρρρρρρρρρρ☤☤☤☤☤☤☤☤☤☤ρ☤☤ρ☤☤☤☤☤☤☤☤☤☤ρρρρρρρρρρρρ爪 Ω∰∰∰∰ // ∰∰∰∰ 爪ρρρρρρρρρρρρρ☤☤☤☤☤☤ρρρ☤☤ρρρ☤☤☤☤☤☤ρρρρρρρρρρρρρ爪 ∰∰∰∰∰ // ∰∰∰∰Ω 爪ρρρρρρρρρρρρρρρρρρρρρ☤☤ρρρρρρρρρρρρρρρρρρρρρ爪 Ω∰∰∰∰∰ // ∰∰∰∰∰ 爪ρρρρρρρρρρρρρρρρρρ☤☤☤☤ρρρρρρρρρρρρρρρρρρ爪 ∰∰∰∰∰∰ // ∰∰∰∰∰∰Ω 爪ρρρρρρρρρρρρρ☤☤☤☤☤☤☤☤ρρρρρρρρρρρρρ爪 Ω∰∰∰∰∰∰∰ // ∰∰∰∰∰∰∰∰Ω 爪ρρρρρρρρρρρρρρρρρρρρρρρρ爪 Ω∰∰∰∰∰∰∰∰∰ // ∰∰∰∰∰∰∰∰∰∰ΩΩΩ °°°°爪爪爪爪°°°° ΩΩΩ∰∰∰∰∰∰∰∰∰∰ // ∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰ pragma solidity ^0.8.9; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "./ERC721.sol"; // ꃃꆂ꒓ꁒꍟ // ________ ________ __ __ _______ _________ // /⚚⚚⚚⚚⚚⚚⚚⚚\ ||.‾‾‾‾‾\\ ||. || ||.‾‾‾‾\\ |⚚.‾‾‾‾‾‾\\ // /⚚⚚/‾‾‾‾\⚚⚚\ ||. \\ ||. || ||. \\ ||. ‾ // /⚚⚚/ ‾‾‾ ||. // ||. || |⚚. \\ ||. // |⚚⚚| ||._____// ||. || ||. || ||.======| // \⚚⚚\ ___ |⚚.‾‾‾‾‾\\ \\. // ||. // ||. // \⚚⚚\____/⚚⚚/ ||. \\ \\. // ||. // ||. _ // \⚚⚚⚚⚚⚚⚚⚚⚚/ ||. || \⚚.__// ||.____// ||.______// // ‾‾‾‾‾‾‾‾ ‾‾ ‾‾ ‾‾‾‾‾ ‾‾‾‾‾‾‾ ‾‾‾‾‾‾‾‾‾ // ꃃꆂ꒓ꁒꍟ contract JellyBabies is ERC721, Ownable { using Strings for uint256; string public PROVENANCE; bool provenanceSet; bool public swimming; enum Timeline { Yate, Yeet, Yote } Timeline public wen = Timeline.Yate; mapping(address => uint256) private paymentInfo; uint256 totalReceived = 0; mapping(address => uint256) amountsWithdrawn; modifier onlyPayee() { _isPayee(); _; } function _isPayee() internal view virtual { require(paymentInfo[msg.sender] > 0, "not a royalty payee"); } mapping(address => bool) public authorized; mapping(uint256 => uint256) public companionFound; CrudeBorneEggs public cbeContract; string collectionDescription = "Would you like a jelly baby?"; string collecImg = ""; string externalLink = "https://crudeborne.wtf"; // ____ ____ // | | | | // |54|====----|74| // \ \ / / // \68\===---/49/ // \ \ / / // \65\=-/64/ // \ \/ / // \⇓⇓\ / // \⇓⇓\ // / \⇓⇓\ // / /\ \ // /6E/-=\42\ // / / \ \ // /69/---===\61\ // / / \ \ // |46|----====|73| // | | | | // |75|====----|65| // \ \ / / // \6F\===---/64/ // \ \ / / // \59\=-/43/ // \ \/ / // \⇑⇑\ / // \⇑⇑\ // / \⇑⇑\ // / /\ \ // /6F/-=\6E\ // / / \ \ // /64/---===\61\ // / / \ \ // |65|----====|43| // | | | | // ‾‾‾‾ ‾‾‾‾ constructor( address _cbeAddy, string memory _name, string memory _symbol, address[] memory _payees, uint128[] memory _basisPoints ) ERC721(_name, _symbol) { for (uint256 i = 0; i < _payees.length; i++) { paymentInfo[_payees[i]] = _basisPoints[i]; } cbeContract = CrudeBorneEggs(_cbeAddy); } // p̸͓̂ą̵̢̗̘̫̼̯̻̃û̶̦̰̝͉͋̈́ͅs̵͉̒̃̐e̶͓̐̋̂̽̀̂́̕͝.̶̢̼̮͚̪̲͐̿̀̉͐̅̊͌̈̚.̴̯̮͈͋̂͗͒͐͊̌͋.̴̧͕̣͓̗͓͛̔ ̵̡͇̩̟̭̖͔͎͒̊̕͘t̴̫͚͚͚͒̀͒̃̈̈̿̍̽ĥ̸̨͓̠͖͎͙̙̱̙̄i̸̤͖̪̥͓̪̬̰͍͆́̒̊̒̃̏͒̈n̸̼̩̼̖̾͐̂̃̈́̅̈́͊̚͘ķ̸̡̋.̶̳͕̱̫͍̮́͒̉.̷̨̲̝̰̮͖̳̈́̔̄͗͊̈́̀̕.̵̙̗̦͗̄͗͝ function addAuthorized(address toAuthorize) public onlyOwner { authorized[toAuthorize] = true; } function setProvenanceHash(string memory provenanceHash) public onlyOwner { require(!provenanceSet); PROVENANCE = provenanceHash; provenanceSet = true; } function swimOrSink() external onlyOwner { swimming = !swimming; } // ຟi๖๖lฯ ຟ໐๖๖lฯ function setTimeyWimey(Timeline _wen) public onlyOwner { require(_wen != Timeline.Yate); wen = _wen; } function setBaseURI(string memory baseURI) public onlyOwner { _setBaseURI(baseURI); } function hazCompanion(uint256 disEgg) public view returns (bool) { uint256 eggBlocc = disEgg/250; uint256 eggSlot = disEgg - eggBlocc*250; return ((companionFound[eggBlocc] >> eggSlot)%2 == 1); } function dontGoAlone(uint256[] memory eggz) public { require(wen == Timeline.Yeet || (authorized[msg.sender] && (wen == Timeline.Yate)), 'w'); uint256 curBlocc = 0; uint256 bloccUpdates = 0; uint256 eggBlocc; bool companionRequire = true; bool ownerRequire = true; // ʂơɱɛ ɬɧıŋɠʂ ɧą۷ɛ ƈơɱɛ ɬɧཞơųɠɧ ơųɬ ơʄ ơཞɖɛཞ for (uint256 i = 0; i < eggz.length; i++) { eggBlocc = eggz[i]/250; if (eggBlocc != curBlocc) { companionFound[curBlocc] = companionFound[curBlocc] | bloccUpdates; curBlocc = eggBlocc; bloccUpdates = 0; } uint256 eggSlot = eggz[i] - curBlocc*250; companionRequire = companionRequire && (companionFound[curBlocc] >> eggSlot)%2 == 0; ownerRequire = ownerRequire && cbeContract.ownerOf(eggz[i]) == msg.sender; bloccUpdates += (1 << eggSlot); } require(companionRequire, 'c'); require(ownerRequire, 'o'); companionFound[curBlocc] = companionFound[curBlocc] | bloccUpdates; _safeMint(msg.sender, eggz.length); } // ρ(௶؆ξ) ∺ 爪(ϒ६∑ナ)/∰(¥Ꭿ₸ໂ) // function setCollectionDescription(string memory _collectionDescription) public onlyOwner { collectionDescription = _collectionDescription; } function setCollecImg(string memory _collecImg) public onlyOwner { collecImg = _collecImg; } function setExternalLink(string memory _externalLink) public onlyOwner { externalLink = _externalLink; } // ᄃ8ん10刀4の2 function contractURI() public view returns (string memory) { return string( abi.encodePacked( "data:application/json;utf8,{\"name\":\"CrudeBorne: Jelly Babies\",", "\"description\":\"", collectionDescription, "\",", "\"image\":\"", collecImg, "\",", "\"external_link\":\"", externalLink, "\",", "\"seller_fee_basis_points\":420,\"fee_recipient\":\"", uint256(uint160(address(this))).toHexString(), "\"}" ) ); } /////////////////////// // 鷹 // // ☢☢☢☢☢☢☢☢☢☢☢☢☢☢☢☢ // ///////////////////// receive() external payable { totalReceived += msg.value; } function withdraw() public onlyPayee { uint256 totalForPayee = (totalReceived/10000)*paymentInfo[msg.sender]; uint256 toWithdraw = totalForPayee - amountsWithdrawn[msg.sender]; amountsWithdrawn[msg.sender] = totalForPayee; (bool success, ) = payable(msg.sender).call{value: toWithdraw}(""); require(success, "Payment failed!"); } } // ⟨ρ|∞⟩ abstract contract CrudeBorneEggs { function balanceOf(address owner) public view virtual returns (uint256); function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual returns (uint256); function ownerOf(uint256 tokenId) public view virtual returns (address); } ////////////////////////////////////////
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @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) { 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. /// @solidity memory-safe-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 { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: Unlicense // Creator: CrudeBorne pragma solidity ^0.8.9; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; uint256 private currentIndex = 0; // Token name string private _name; // Token symbol string private _symbol; // Base URI string private _baseURI; string private _preRevealURI; mapping(uint256 => address) private _ownerships; mapping(address => uint256) private _balances; address public immutable burnAddress = 0x000000000000000000000000000000000000dEaD; uint256 private numTokensBurned; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor( string memory name_, string memory symbol_ ) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return (currentIndex - numTokensBurned); } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "g"); require(ownerOf(index) != burnAddress, "b"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "b"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { address ownership = _ownerships[i]; if (ownership != address(0)) { currOwnershipAddr = ownership; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("u"); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "0"); return uint256(_balances[owner]); } // function ownershipOf(uint256 tokenId) internal view returns (address) { // require(tokenId < currentIndex, "t"); // //// uint256 lowestTokenToCheck; //// // if (tokenId >= maxBatchSize) { //// // lowestTokenToCheck = tokenId - maxBatchSize + 1; //// // } //// if (tokenId >= maxOwnerBatchSize) { //// lowestTokenToCheck = tokenId - maxOwnerBatchSize + 1; //// } // //// for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { // for (uint256 curr = tokenId; curr >= 0; curr--) { // address ownership = _ownerships[curr]; // if (ownership != address(0)) { // return ownership; // } // } // // revert("o"); // } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { // return ownershipOf(tokenId); require(tokenId < currentIndex, "t"); for (uint256 curr = tokenId; curr >= 0; curr--) { address ownership = _ownerships[curr]; if (ownership != address(0)) { return ownership; } } revert("o"); } /** * @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), "z"); if (bytes(_baseURI).length > 0) { return string(abi.encodePacked(_baseURI, "/", tokenId.toString(), ".json")); } else { return _preRevealURI; } } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function baseURI() public view virtual returns (string memory) { return _baseURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}, * or to the token ID if {tokenURI} is empty. */ function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } function preRevealURI() public view virtual returns (string memory) { return _preRevealURI; } function _setPreRevealURI(string memory preRevealURI_) internal virtual { _preRevealURI = preRevealURI_; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "o"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "a" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "a"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "a"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "z" ); } function burnToken(uint256 tokenId) public { _transfer(ownerOf(tokenId), burnAddress, tokenId); numTokensBurned++; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return (tokenId < currentIndex && ownerOf(tokenId) != burnAddress); } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "0"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "a"); // if (from != address(0)) { // _beforeTokenTransfers(address(0), from, startTokenId, quantity); // } // if (from != to) { // _beforeTokenTransfers(from, to, startTokenId, quantity); // } // _beforeTokenTransfers(address(0), to, startTokenId, quantity); // AddressData memory addressData = _addressData[to]; // _addressData[to] = AddressData( // addressData.balance + uint128(quantity), // addressData.numberMinted + uint128(quantity) // ); // _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); _balances[to] = quantity; _ownerships[startTokenId] = to; uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { // if (from != address(0)) { // emit Transfer(address(0), from, updatedIndex); // } // if (from != to) { // emit Transfer(from, to, updatedIndex); // } emit Transfer(address(0), to, updatedIndex); require( // _checkOnERC721Received(address(0), from, updatedIndex, _data) && _checkOnERC721Received(from, to, updatedIndex, _data), _checkOnERC721Received(address(0), to, updatedIndex, _data), "z" ); updatedIndex++; } currentIndex = updatedIndex; // if (from != address(0)) { // _afterTokenTransfers(address(0), from, startTokenId, quantity); // } // if (from != to) { // _afterTokenTransfers(from, to, startTokenId, quantity); // } // _afterTokenTransfers(address(0), to, startTokenId, quantity); } function _transfer( address from, address to, uint256 tokenId ) private { address prevOwnership = ownerOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership, _msgSender())); require(isApprovedOrOwner, "a"); require(prevOwnership == from, "o"); require(to != address(0), "0"); // _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership); _balances[from] -= 1; _balances[to] += 1; _ownerships[tokenId] = to; // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId] == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = prevOwnership; } } emit Transfer(from, to, tokenId); // _afterTokenTransfers(from, to, tokenId, 1); } function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /******************/ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("z"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } } ////////////////////////////////////////
// SPDX-License-Identifier: MIT // 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // 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); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_cbeAddy","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address[]","name":"_payees","type":"address[]"},{"internalType":"uint128[]","name":"_basisPoints","type":"uint128[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toAuthorize","type":"address"}],"name":"addAuthorized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cbeContract","outputs":[{"internalType":"contract CrudeBorneEggs","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"companionFound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"eggz","type":"uint256[]"}],"name":"dontGoAlone","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"disEgg","type":"uint256"}],"name":"hazCompanion","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preRevealURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_collecImg","type":"string"}],"name":"setCollecImg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_collectionDescription","type":"string"}],"name":"setCollectionDescription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_externalLink","type":"string"}],"name":"setExternalLink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum JellyBabies.Timeline","name":"_wen","type":"uint8"}],"name":"setTimeyWimey","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":"swimOrSink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swimming","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wen","outputs":[{"internalType":"enum JellyBabies.Timeline","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040526000805561dead73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff168152506000600c60026101000a81548160ff021916908360028111156200006657620000656200043b565b5b02179055506000600e556040518060400160405280601c81526020017f576f756c6420796f75206c696b652061206a656c6c7920626162793f0000000081525060139080519060200190620000bd9291906200038b565b506040518060200160405280600081525060149080519060200190620000e59291906200038b565b506040518060400160405280601681526020017f68747470733a2f2f6372756465626f726e652e7774660000000000000000000081525060159080519060200190620001339291906200038b565b503480156200014157600080fd5b50604051620054e5380380620054e583398181016040528101906200016791906200086a565b83838160019080519060200190620001819291906200038b565b5080600290805190602001906200019a9291906200038b565b505050620001bd620001b1620002bd60201b60201c565b620002c560201b60201c565b60005b82518110156200027057818181518110620001e057620001df6200096e565b5b60200260200101516fffffffffffffffffffffffffffffffff16600d60008584815181106200021457620002136200096e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806200026790620009d6565b915050620001c0565b5084601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505062000a89565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003999062000a53565b90600052602060002090601f016020900481019282620003bd576000855562000409565b82601f10620003d857805160ff191683800117855562000409565b8280016001018555821562000409579182015b8281111562000408578251825591602001919060010190620003eb565b5b5090506200041891906200041c565b5090565b5b80821115620004375760008160009055506001016200041d565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620004ab826200047e565b9050919050565b620004bd816200049e565b8114620004c957600080fd5b50565b600081519050620004dd81620004b2565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200053882620004ed565b810181811067ffffffffffffffff821117156200055a5762000559620004fe565b5b80604052505050565b60006200056f6200046a565b90506200057d82826200052d565b919050565b600067ffffffffffffffff821115620005a0576200059f620004fe565b5b620005ab82620004ed565b9050602081019050919050565b60005b83811015620005d8578082015181840152602081019050620005bb565b83811115620005e8576000848401525b50505050565b600062000605620005ff8462000582565b62000563565b905082815260208101848484011115620006245762000623620004e8565b5b62000631848285620005b8565b509392505050565b600082601f830112620006515762000650620004e3565b5b815162000663848260208601620005ee565b91505092915050565b600067ffffffffffffffff8211156200068a5762000689620004fe565b5b602082029050602081019050919050565b600080fd5b6000620006b7620006b1846200066c565b62000563565b90508083825260208201905060208402830185811115620006dd57620006dc6200069b565b5b835b818110156200070a5780620006f58882620004cc565b845260208401935050602081019050620006df565b5050509392505050565b600082601f8301126200072c576200072b620004e3565b5b81516200073e848260208601620006a0565b91505092915050565b600067ffffffffffffffff821115620007655762000764620004fe565b5b602082029050602081019050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200079d8162000776565b8114620007a957600080fd5b50565b600081519050620007bd8162000792565b92915050565b6000620007da620007d48462000747565b62000563565b905080838252602082019050602084028301858111156200080057620007ff6200069b565b5b835b818110156200082d5780620008188882620007ac565b84526020840193505060208101905062000802565b5050509392505050565b600082601f8301126200084f576200084e620004e3565b5b815162000861848260208601620007c3565b91505092915050565b600080600080600060a0868803121562000889576200088862000474565b5b60006200089988828901620004cc565b955050602086015167ffffffffffffffff811115620008bd57620008bc62000479565b5b620008cb8882890162000639565b945050604086015167ffffffffffffffff811115620008ef57620008ee62000479565b5b620008fd8882890162000639565b935050606086015167ffffffffffffffff81111562000921576200092062000479565b5b6200092f8882890162000714565b925050608086015167ffffffffffffffff81111562000953576200095262000479565b5b620009618882890162000837565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b6000620009e382620009cc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000a195762000a186200099d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a6c57607f821691505b6020821081141562000a835762000a8262000a24565b5b50919050565b608051614a2b62000aba600039600081816111ba01528181611a3701528181611b0d01526122470152614a2b6000f3fe60806040526004361061024a5760003560e01c80636373a6b11161013957806395d89b41116100b6578063c0ef0bad1161007a578063c0ef0bad1461089c578063c87b56dd146108c7578063cf1c316a14610904578063e8a3d4851461092d578063e985e9c514610958578063f2fde38b146109955761026a565b806395d89b41146107b7578063a22cb465146107e2578063a4a997f81461080b578063b88d4fde14610836578063b91816111461085f5761026a565b8063715018a6116100fd578063715018a6146106f857806379b6ed361461070f5780637b47ec1a1461073a5780638da5cb5b146107635780639471302e1461078e5761026a565b80636373a6b1146106115780636bc0cb6c1461063c5780636c0360eb1461066557806370a082311461069057806370d5ae05146106cd5761026a565b80632f745c59116101c757806355f804b31161018b57806355f804b3146105085780635a45c81f146105315780635cb7c2a01461056e57806360b384e7146105ab5780636352211e146105d45761026a565b80632f745c59146104255780633ccfd60b1461046257806342842e0e146104795780634f6ccce7146104a257806352c2dd16146104df5761026a565b8063095ea7b31161020e578063095ea7b314610356578063109695231461037f57806318160ddd146103a85780631f917921146103d357806323b872dd146103fc5761026a565b806301ffc9a71461026f57806306c67d9e146102ac57806306fdde03146102c357806307824c06146102ee578063081812fc146103195761026a565b3661026a5734600e600082825461026191906131e3565b92505081905550005b600080fd5b34801561027b57600080fd5b50610296600480360381019061029191906132a5565b6109be565b6040516102a391906132ed565b60405180910390f35b3480156102b857600080fd5b506102c1610b08565b005b3480156102cf57600080fd5b506102d8610b3c565b6040516102e591906133a1565b60405180910390f35b3480156102fa57600080fd5b50610303610bce565b604051610310919061343a565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190613481565b610be1565b60405161034d91906134ef565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190613536565b610c66565b005b34801561038b57600080fd5b506103a660048036038101906103a191906136ab565b610d7f565b005b3480156103b457600080fd5b506103bd610dd6565b6040516103ca9190613703565b60405180910390f35b3480156103df57600080fd5b506103fa60048036038101906103f591906136ab565b610ded565b005b34801561040857600080fd5b50610423600480360381019061041e919061371e565b610e0f565b005b34801561043157600080fd5b5061044c60048036038101906104479190613536565b610e1f565b6040516104599190613703565b60405180910390f35b34801561046e57600080fd5b50610477610fa3565b005b34801561048557600080fd5b506104a0600480360381019061049b919061371e565b61114d565b005b3480156104ae57600080fd5b506104c960048036038101906104c49190613481565b61116d565b6040516104d69190613703565b60405180910390f35b3480156104eb57600080fd5b50610506600480360381019061050191906136ab565b611257565b005b34801561051457600080fd5b5061052f600480360381019061052a91906136ab565b611279565b005b34801561053d57600080fd5b5061055860048036038101906105539190613481565b61128d565b60405161056591906132ed565b60405180910390f35b34801561057a57600080fd5b5061059560048036038101906105909190613481565b6112ea565b6040516105a29190613703565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd9190613839565b611302565b005b3480156105e057600080fd5b506105fb60048036038101906105f69190613481565b6116d8565b60405161060891906134ef565b60405180910390f35b34801561061d57600080fd5b506106266117f6565b60405161063391906133a1565b60405180910390f35b34801561064857600080fd5b50610663600480360381019061065e91906138a7565b611884565b005b34801561067157600080fd5b5061067a6118eb565b60405161068791906133a1565b60405180910390f35b34801561069c57600080fd5b506106b760048036038101906106b291906138d4565b61197d565b6040516106c49190613703565b60405180910390f35b3480156106d957600080fd5b506106e2611a35565b6040516106ef91906134ef565b60405180910390f35b34801561070457600080fd5b5061070d611a59565b005b34801561071b57600080fd5b50610724611a6d565b60405161073191906133a1565b60405180910390f35b34801561074657600080fd5b50610761600480360381019061075c9190613481565b611aff565b005b34801561076f57600080fd5b50610778611b4d565b60405161078591906134ef565b60405180910390f35b34801561079a57600080fd5b506107b560048036038101906107b091906136ab565b611b77565b005b3480156107c357600080fd5b506107cc611b99565b6040516107d991906133a1565b60405180910390f35b3480156107ee57600080fd5b506108096004803603810190610804919061392d565b611c2b565b005b34801561081757600080fd5b50610820611dac565b60405161082d91906139cc565b60405180910390f35b34801561084257600080fd5b5061085d60048036038101906108589190613a88565b611dd2565b005b34801561086b57600080fd5b50610886600480360381019061088191906138d4565b611e2e565b60405161089391906132ed565b60405180910390f35b3480156108a857600080fd5b506108b1611e4e565b6040516108be91906132ed565b60405180910390f35b3480156108d357600080fd5b506108ee60048036038101906108e99190613481565b611e61565b6040516108fb91906133a1565b60405180910390f35b34801561091057600080fd5b5061092b600480360381019061092691906138d4565b611f87565b005b34801561093957600080fd5b50610942611fea565b60405161094f91906133a1565b60405180910390f35b34801561096457600080fd5b5061097f600480360381019061097a9190613b0b565b612038565b60405161098c91906132ed565b60405180910390f35b3480156109a157600080fd5b506109bc60048036038101906109b791906138d4565b6120cc565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610af157507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b015750610b0082612150565b5b9050919050565b610b106121ba565b600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b606060018054610b4b90613b7a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7790613b7a565b8015610bc45780601f10610b9957610100808354040283529160200191610bc4565b820191906000526020600020905b815481529060010190602001808311610ba757829003601f168201915b5050505050905090565b600c60029054906101000a900460ff1681565b6000610bec82612238565b610c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2290613bf8565b60405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c71826116d8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd990613c64565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d016122a5565b73ffffffffffffffffffffffffffffffffffffffff161480610d305750610d2f81610d2a6122a5565b612038565b5b610d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6690613bf8565b60405180910390fd5b610d7a8383836122ad565b505050565b610d876121ba565b600c60009054906101000a900460ff1615610da157600080fd5b80600b9080519060200190610db7929190613107565b506001600c60006101000a81548160ff02191690831515021790555050565b6000600754600054610de89190613c84565b905090565b610df56121ba565b8060159080519060200190610e0b929190613107565b5050565b610e1a83838361235f565b505050565b6000610e2a8361197d565b8210610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6290613d04565b60405180910390fd5b6000610e75610dd6565b905060008060005b83811015610f615760006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ef5578092505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f4d5786841415610f3e578195505050505050610f9d565b8380610f4990613d24565b9450505b508080610f5990613d24565b915050610e7d565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9490613db9565b60405180910390fd5b92915050565b610fab61276b565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612710600e54610ffd9190613e08565b6110079190613e39565b90506000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826110569190613c84565b905081600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060003373ffffffffffffffffffffffffffffffffffffffff16826040516110c290613ec4565b60006040518083038185875af1925050503d80600081146110ff576040519150601f19603f3d011682016040523d82523d6000602084013e611104565b606091505b5050905080611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113f90613f25565b60405180910390fd5b505050565b61116883838360405180602001604052806000815250611dd2565b505050565b6000611177610dd6565b82106111b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111af90613f91565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166111f8836116d8565b73ffffffffffffffffffffffffffffffffffffffff16141561124f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124690613d04565b60405180910390fd5b819050919050565b61125f6121ba565b8060149080519060200190611275929190613107565b5050565b6112816121ba565b61128a816127ef565b50565b60008060fa8361129d9190613e08565b9050600060fa826112ae9190613e39565b846112b99190613c84565b905060016002826011600086815260200190815260200160002054901c6112e09190613fb1565b1492505050919050565b60116020528060005260406000206000915090505481565b60016002811115611316576113156133c3565b5b600c60029054906101000a900460ff166002811115611338576113376133c3565b5b14806113cc5750601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156113cb5750600060028111156113a7576113a66133c3565b5b600c60029054906101000a900460ff1660028111156113c9576113c86133c3565b5b145b5b61140b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114029061402e565b60405180910390fd5b6000806000806001905060006001905060005b86518110156116175760fa87828151811061143c5761143b61404e565b5b602002602001015161144e9190613e08565b935085841461148c57846011600088815260200190815260200160002054176011600088815260200190815260200160002081905550839550600094505b600060fa8761149b9190613e39565b8883815181106114ae576114ad61404e565b5b60200260200101516114c09190613c84565b90508380156114f157506000600282601160008b815260200190815260200160002054901c6114ef9190613fb1565b145b93508280156115ef57503373ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8a85815181106115635761156261404e565b5b60200260200101516040518263ffffffff1660e01b81526004016115879190613703565b60206040518083038186803b15801561159f57600080fd5b505afa1580156115b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d79190614092565b73ffffffffffffffffffffffffffffffffffffffff16145b9250806001901b8661160191906131e3565b955050808061160f90613d24565b91505061141e565b5081611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164f9061410b565b60405180910390fd5b80611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90613c64565b60405180910390fd5b8360116000878152602001908152602001600020541760116000878152602001908152602001600020819055506116d0338751612809565b505050505050565b60008054821061171d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171490614177565b60405180910390fd5b60008290505b600081106117b55760006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117a15780925050506117f1565b5080806117ad90614197565b915050611723565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e890613c64565b60405180910390fd5b919050565b600b805461180390613b7a565b80601f016020809104026020016040519081016040528092919081815260200182805461182f90613b7a565b801561187c5780601f106118515761010080835404028352916020019161187c565b820191906000526020600020905b81548152906001019060200180831161185f57829003601f168201915b505050505081565b61188c6121ba565b600060028111156118a05761189f6133c3565b5b8160028111156118b3576118b26133c3565b5b14156118be57600080fd5b80600c60026101000a81548160ff021916908360028111156118e3576118e26133c3565b5b021790555050565b6060600380546118fa90613b7a565b80601f016020809104026020016040519081016040528092919081815260200182805461192690613b7a565b80156119735780601f1061194857610100808354040283529160200191611973565b820191906000526020600020905b81548152906001019060200180831161195657829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e59061420d565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b611a616121ba565b611a6b6000612827565b565b606060048054611a7c90613b7a565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa890613b7a565b8015611af55780601f10611aca57610100808354040283529160200191611af5565b820191906000526020600020905b815481529060010190602001808311611ad857829003601f168201915b5050505050905090565b611b32611b0b826116d8565b7f00000000000000000000000000000000000000000000000000000000000000008361235f565b60076000815480929190611b4590613d24565b919050555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b7f6121ba565b8060139080519060200190611b95929190613107565b5050565b606060028054611ba890613b7a565b80601f0160208091040260200160405190810160405280929190818152602001828054611bd490613b7a565b8015611c215780601f10611bf657610100808354040283529160200191611c21565b820191906000526020600020905b815481529060010190602001808311611c0457829003601f168201915b5050505050905090565b611c336122a5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9890613bf8565b60405180910390fd5b8060096000611cae6122a5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d5b6122a5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611da091906132ed565b60405180910390a35050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ddd84848461235f565b611de9848484846128ed565b611e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1f90614279565b60405180910390fd5b50505050565b60106020528060005260406000206000915054906101000a900460ff1681565b600c60019054906101000a900460ff1681565b6060611e6c82612238565b611eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea290614279565b60405180910390fd5b600060038054611eba90613b7a565b90501115611ef4576003611ecd83612a84565b604051602001611ede929190614401565b6040516020818303038152906040529050611f82565b60048054611f0190613b7a565b80601f0160208091040260200160405190810160405280929190818152602001828054611f2d90613b7a565b8015611f7a5780601f10611f4f57610100808354040283529160200191611f7a565b820191906000526020600020905b815481529060010190602001808311611f5d57829003601f168201915b505050505090505b919050565b611f8f6121ba565b6001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60606013601460156120113073ffffffffffffffffffffffffffffffffffffffff16612be5565b604051602001612024949392919061469b565b604051602081830303815290604052905090565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120d46121ba565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213b906147ae565b60405180910390fd5b61214d81612827565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121c26122a5565b73ffffffffffffffffffffffffffffffffffffffff166121e0611b4d565b73ffffffffffffffffffffffffffffffffffffffff1614612236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222d9061481a565b60405180910390fd5b565b600080548210801561229e57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612285836116d8565b73ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b600033905090565b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061236a826116d8565b905060008173ffffffffffffffffffffffffffffffffffffffff1661238d6122a5565b73ffffffffffffffffffffffffffffffffffffffff1614806123e957506123b26122a5565b73ffffffffffffffffffffffffffffffffffffffff166123d184610be1565b73ffffffffffffffffffffffffffffffffffffffff16145b806124015750612400826123fb6122a5565b612038565b5b905080612443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243a90613bf8565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146124b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a890613c64565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612521576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125189061420d565b60405180910390fd5b61252d600084846122ad565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461257d9190613c84565b925050819055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125d491906131e3565b92505081905550836005600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060018461263c91906131e3565b9050600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612708576126af81612238565b1561270757826005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116127ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e490614886565b60405180910390fd5b565b8060039080519060200190612805929190613107565b5050565b612823828260405180602001604052806000815250612c6b565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061290e8473ffffffffffffffffffffffffffffffffffffffff16612ea8565b15612a77578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129376122a5565b8786866040518563ffffffff1660e01b815260040161295994939291906148fb565b602060405180830381600087803b15801561297357600080fd5b505af19250505080156129a457506040513d601f19601f820116820180604052508101906129a1919061495c565b60015b612a27573d80600081146129d4576040519150601f19603f3d011682016040523d82523d6000602084013e6129d9565b606091505b50600081511415612a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1690614279565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a7c565b600190505b949350505050565b60606000821415612acc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612be0565b600082905060005b60008214612afe578080612ae790613d24565b915050600a82612af79190613e08565b9150612ad4565b60008167ffffffffffffffff811115612b1a57612b19613580565b5b6040519080825280601f01601f191660200182016040528015612b4c5781602001600182028036833780820191505090505b5090505b60008514612bd957600182612b659190613c84565b9150600a85612b749190613fb1565b6030612b8091906131e3565b60f81b818381518110612b9657612b9561404e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bd29190613e08565b9450612b50565b8093505050505b919050565b60606000821415612c2d576040518060400160405280600481526020017f30783030000000000000000000000000000000000000000000000000000000008152509050612c66565b600082905060005b60008214612c57578080612c4890613d24565b915050600882901c9150612c35565b612c618482612ecb565b925050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd89061420d565b60405180910390fd5b612cea81612238565b15612d2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2190613bf8565b60405180910390fd5b82600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600081905060005b84811015612e9957818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e3960008784876128ed565b612e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6f90614279565b60405180910390fd5b8180612e8390613d24565b9250508080612e9190613d24565b915050612dc8565b50806000819055505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060006002836002612ede9190613e39565b612ee891906131e3565b67ffffffffffffffff811115612f0157612f00613580565b5b6040519080825280601f01601f191660200182016040528015612f335781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612f6b57612f6a61404e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612fcf57612fce61404e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261300f9190613e39565b61301991906131e3565b90505b60018111156130b9577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061305b5761305a61404e565b5b1a60f81b8282815181106130725761307161404e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806130b290614197565b905061301c565b50600084146130fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f4906149d5565b60405180910390fd5b8091505092915050565b82805461311390613b7a565b90600052602060002090601f016020900481019282613135576000855561317c565b82601f1061314e57805160ff191683800117855561317c565b8280016001018555821561317c579182015b8281111561317b578251825591602001919060010190613160565b5b509050613189919061318d565b5090565b5b808211156131a657600081600090555060010161318e565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006131ee826131aa565b91506131f9836131aa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561322e5761322d6131b4565b5b828201905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132828161324d565b811461328d57600080fd5b50565b60008135905061329f81613279565b92915050565b6000602082840312156132bb576132ba613243565b5b60006132c984828501613290565b91505092915050565b60008115159050919050565b6132e7816132d2565b82525050565b600060208201905061330260008301846132de565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613342578082015181840152602081019050613327565b83811115613351576000848401525b50505050565b6000601f19601f8301169050919050565b600061337382613308565b61337d8185613313565b935061338d818560208601613324565b61339681613357565b840191505092915050565b600060208201905081810360008301526133bb8184613368565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613403576134026133c3565b5b50565b6000819050613414826133f2565b919050565b600061342482613406565b9050919050565b61343481613419565b82525050565b600060208201905061344f600083018461342b565b92915050565b61345e816131aa565b811461346957600080fd5b50565b60008135905061347b81613455565b92915050565b60006020828403121561349757613496613243565b5b60006134a58482850161346c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134d9826134ae565b9050919050565b6134e9816134ce565b82525050565b600060208201905061350460008301846134e0565b92915050565b613513816134ce565b811461351e57600080fd5b50565b6000813590506135308161350a565b92915050565b6000806040838503121561354d5761354c613243565b5b600061355b85828601613521565b925050602061356c8582860161346c565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6135b882613357565b810181811067ffffffffffffffff821117156135d7576135d6613580565b5b80604052505050565b60006135ea613239565b90506135f682826135af565b919050565b600067ffffffffffffffff82111561361657613615613580565b5b61361f82613357565b9050602081019050919050565b82818337600083830152505050565b600061364e613649846135fb565b6135e0565b90508281526020810184848401111561366a5761366961357b565b5b61367584828561362c565b509392505050565b600082601f83011261369257613691613576565b5b81356136a284826020860161363b565b91505092915050565b6000602082840312156136c1576136c0613243565b5b600082013567ffffffffffffffff8111156136df576136de613248565b5b6136eb8482850161367d565b91505092915050565b6136fd816131aa565b82525050565b600060208201905061371860008301846136f4565b92915050565b60008060006060848603121561373757613736613243565b5b600061374586828701613521565b935050602061375686828701613521565b92505060406137678682870161346c565b9150509250925092565b600067ffffffffffffffff82111561378c5761378b613580565b5b602082029050602081019050919050565b600080fd5b60006137b56137b084613771565b6135e0565b905080838252602082019050602084028301858111156137d8576137d761379d565b5b835b8181101561380157806137ed888261346c565b8452602084019350506020810190506137da565b5050509392505050565b600082601f8301126138205761381f613576565b5b81356138308482602086016137a2565b91505092915050565b60006020828403121561384f5761384e613243565b5b600082013567ffffffffffffffff81111561386d5761386c613248565b5b6138798482850161380b565b91505092915050565b6003811061388f57600080fd5b50565b6000813590506138a181613882565b92915050565b6000602082840312156138bd576138bc613243565b5b60006138cb84828501613892565b91505092915050565b6000602082840312156138ea576138e9613243565b5b60006138f884828501613521565b91505092915050565b61390a816132d2565b811461391557600080fd5b50565b60008135905061392781613901565b92915050565b6000806040838503121561394457613943613243565b5b600061395285828601613521565b925050602061396385828601613918565b9150509250929050565b6000819050919050565b600061399261398d613988846134ae565b61396d565b6134ae565b9050919050565b60006139a482613977565b9050919050565b60006139b682613999565b9050919050565b6139c6816139ab565b82525050565b60006020820190506139e160008301846139bd565b92915050565b600067ffffffffffffffff821115613a0257613a01613580565b5b613a0b82613357565b9050602081019050919050565b6000613a2b613a26846139e7565b6135e0565b905082815260208101848484011115613a4757613a4661357b565b5b613a5284828561362c565b509392505050565b600082601f830112613a6f57613a6e613576565b5b8135613a7f848260208601613a18565b91505092915050565b60008060008060808587031215613aa257613aa1613243565b5b6000613ab087828801613521565b9450506020613ac187828801613521565b9350506040613ad28782880161346c565b925050606085013567ffffffffffffffff811115613af357613af2613248565b5b613aff87828801613a5a565b91505092959194509250565b60008060408385031215613b2257613b21613243565b5b6000613b3085828601613521565b9250506020613b4185828601613521565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613b9257607f821691505b60208210811415613ba657613ba5613b4b565b5b50919050565b7f6100000000000000000000000000000000000000000000000000000000000000600082015250565b6000613be2600183613313565b9150613bed82613bac565b602082019050919050565b60006020820190508181036000830152613c1181613bd5565b9050919050565b7f6f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000613c4e600183613313565b9150613c5982613c18565b602082019050919050565b60006020820190508181036000830152613c7d81613c41565b9050919050565b6000613c8f826131aa565b9150613c9a836131aa565b925082821015613cad57613cac6131b4565b5b828203905092915050565b7f6200000000000000000000000000000000000000000000000000000000000000600082015250565b6000613cee600183613313565b9150613cf982613cb8565b602082019050919050565b60006020820190508181036000830152613d1d81613ce1565b9050919050565b6000613d2f826131aa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d6257613d616131b4565b5b600182019050919050565b7f7500000000000000000000000000000000000000000000000000000000000000600082015250565b6000613da3600183613313565b9150613dae82613d6d565b602082019050919050565b60006020820190508181036000830152613dd281613d96565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e13826131aa565b9150613e1e836131aa565b925082613e2e57613e2d613dd9565b5b828204905092915050565b6000613e44826131aa565b9150613e4f836131aa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e8857613e876131b4565b5b828202905092915050565b600081905092915050565b50565b6000613eae600083613e93565b9150613eb982613e9e565b600082019050919050565b6000613ecf82613ea1565b9150819050919050565b7f5061796d656e74206661696c6564210000000000000000000000000000000000600082015250565b6000613f0f600f83613313565b9150613f1a82613ed9565b602082019050919050565b60006020820190508181036000830152613f3e81613f02565b9050919050565b7f6700000000000000000000000000000000000000000000000000000000000000600082015250565b6000613f7b600183613313565b9150613f8682613f45565b602082019050919050565b60006020820190508181036000830152613faa81613f6e565b9050919050565b6000613fbc826131aa565b9150613fc7836131aa565b925082613fd757613fd6613dd9565b5b828206905092915050565b7f7700000000000000000000000000000000000000000000000000000000000000600082015250565b6000614018600183613313565b915061402382613fe2565b602082019050919050565b600060208201905081810360008301526140478161400b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151905061408c8161350a565b92915050565b6000602082840312156140a8576140a7613243565b5b60006140b68482850161407d565b91505092915050565b7f6300000000000000000000000000000000000000000000000000000000000000600082015250565b60006140f5600183613313565b9150614100826140bf565b602082019050919050565b60006020820190508181036000830152614124816140e8565b9050919050565b7f7400000000000000000000000000000000000000000000000000000000000000600082015250565b6000614161600183613313565b915061416c8261412b565b602082019050919050565b6000602082019050818103600083015261419081614154565b9050919050565b60006141a2826131aa565b915060008214156141b6576141b56131b4565b5b600182039050919050565b7f3000000000000000000000000000000000000000000000000000000000000000600082015250565b60006141f7600183613313565b9150614202826141c1565b602082019050919050565b60006020820190508181036000830152614226816141ea565b9050919050565b7f7a00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614263600183613313565b915061426e8261422d565b602082019050919050565b6000602082019050818103600083015261429281614256565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546142c681613b7a565b6142d08186614299565b945060018216600081146142eb57600181146142fc5761432f565b60ff1983168652818601935061432f565b614305856142a4565b60005b8381101561432757815481890152600182019150602081019050614308565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b600061436e600183614299565b915061437982614338565b600182019050919050565b600061438f82613308565b6143998185614299565b93506143a9818560208601613324565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006143eb600583614299565b91506143f6826143b5565b600582019050919050565b600061440d82856142b9565b915061441882614361565b91506144248284614384565b915061442f826143de565b91508190509392505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226e616d60008201527f65223a224372756465426f726e653a204a656c6c7920426162696573222c0000602082015250565b6000614497603e83614299565b91506144a28261443b565b603e82019050919050565b7f226465736372697074696f6e223a220000000000000000000000000000000000600082015250565b60006144e3600f83614299565b91506144ee826144ad565b600f82019050919050565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b600061452f600283614299565b915061453a826144f9565b600282019050919050565b7f22696d616765223a220000000000000000000000000000000000000000000000600082015250565b600061457b600983614299565b915061458682614545565b600982019050919050565b7f2265787465726e616c5f6c696e6b223a22000000000000000000000000000000600082015250565b60006145c7601183614299565b91506145d282614591565b601182019050919050565b7f2273656c6c65725f6665655f62617369735f706f696e7473223a3432302c226660008201527f65655f726563697069656e74223a220000000000000000000000000000000000602082015250565b6000614639602f83614299565b9150614644826145dd565b602f82019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b6000614685600283614299565b91506146908261464f565b600282019050919050565b60006146a68261448a565b91506146b1826144d6565b91506146bd82876142b9565b91506146c882614522565b91506146d38261456e565b91506146df82866142b9565b91506146ea82614522565b91506146f5826145ba565b915061470182856142b9565b915061470c82614522565b91506147178261462c565b91506147238284614384565b915061472e82614678565b915081905095945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614798602683613313565b91506147a38261473c565b604082019050919050565b600060208201905081810360008301526147c78161478b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614804602083613313565b915061480f826147ce565b602082019050919050565b60006020820190508181036000830152614833816147f7565b9050919050565b7f6e6f74206120726f79616c747920706179656500000000000000000000000000600082015250565b6000614870601383613313565b915061487b8261483a565b602082019050919050565b6000602082019050818103600083015261489f81614863565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006148cd826148a6565b6148d781856148b1565b93506148e7818560208601613324565b6148f081613357565b840191505092915050565b600060808201905061491060008301876134e0565b61491d60208301866134e0565b61492a60408301856136f4565b818103606083015261493c81846148c2565b905095945050505050565b60008151905061495681613279565b92915050565b60006020828403121561497257614971613243565b5b600061498084828501614947565b91505092915050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006149bf602083613313565b91506149ca82614989565b602082019050919050565b600060208201905081810360008301526149ee816149b2565b905091905056fea264697066735822122071b90a0a8de4fb16c1dcaddc5c1a125e370012f94a33996e966586c745b281a664736f6c634300080900330000000000000000000000006c5a06ae6b773457480c12f12c2fb22627507a3a00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000174372756465426f726e65204a656c6c7920426162696573000000000000000000000000000000000000000000000000000000000000000000000000000000000843422e4a454c4c59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000066f3794178997a12779527b36a2f042e001625af0000000000000000000000005d5ee1d6b3c12b07519020b0b14a495d518be78d000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000005dc0000000000000000000000000000000000000000000000000000000000002134
Deployed Bytecode
0x60806040526004361061024a5760003560e01c80636373a6b11161013957806395d89b41116100b6578063c0ef0bad1161007a578063c0ef0bad1461089c578063c87b56dd146108c7578063cf1c316a14610904578063e8a3d4851461092d578063e985e9c514610958578063f2fde38b146109955761026a565b806395d89b41146107b7578063a22cb465146107e2578063a4a997f81461080b578063b88d4fde14610836578063b91816111461085f5761026a565b8063715018a6116100fd578063715018a6146106f857806379b6ed361461070f5780637b47ec1a1461073a5780638da5cb5b146107635780639471302e1461078e5761026a565b80636373a6b1146106115780636bc0cb6c1461063c5780636c0360eb1461066557806370a082311461069057806370d5ae05146106cd5761026a565b80632f745c59116101c757806355f804b31161018b57806355f804b3146105085780635a45c81f146105315780635cb7c2a01461056e57806360b384e7146105ab5780636352211e146105d45761026a565b80632f745c59146104255780633ccfd60b1461046257806342842e0e146104795780634f6ccce7146104a257806352c2dd16146104df5761026a565b8063095ea7b31161020e578063095ea7b314610356578063109695231461037f57806318160ddd146103a85780631f917921146103d357806323b872dd146103fc5761026a565b806301ffc9a71461026f57806306c67d9e146102ac57806306fdde03146102c357806307824c06146102ee578063081812fc146103195761026a565b3661026a5734600e600082825461026191906131e3565b92505081905550005b600080fd5b34801561027b57600080fd5b50610296600480360381019061029191906132a5565b6109be565b6040516102a391906132ed565b60405180910390f35b3480156102b857600080fd5b506102c1610b08565b005b3480156102cf57600080fd5b506102d8610b3c565b6040516102e591906133a1565b60405180910390f35b3480156102fa57600080fd5b50610303610bce565b604051610310919061343a565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190613481565b610be1565b60405161034d91906134ef565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190613536565b610c66565b005b34801561038b57600080fd5b506103a660048036038101906103a191906136ab565b610d7f565b005b3480156103b457600080fd5b506103bd610dd6565b6040516103ca9190613703565b60405180910390f35b3480156103df57600080fd5b506103fa60048036038101906103f591906136ab565b610ded565b005b34801561040857600080fd5b50610423600480360381019061041e919061371e565b610e0f565b005b34801561043157600080fd5b5061044c60048036038101906104479190613536565b610e1f565b6040516104599190613703565b60405180910390f35b34801561046e57600080fd5b50610477610fa3565b005b34801561048557600080fd5b506104a0600480360381019061049b919061371e565b61114d565b005b3480156104ae57600080fd5b506104c960048036038101906104c49190613481565b61116d565b6040516104d69190613703565b60405180910390f35b3480156104eb57600080fd5b50610506600480360381019061050191906136ab565b611257565b005b34801561051457600080fd5b5061052f600480360381019061052a91906136ab565b611279565b005b34801561053d57600080fd5b5061055860048036038101906105539190613481565b61128d565b60405161056591906132ed565b60405180910390f35b34801561057a57600080fd5b5061059560048036038101906105909190613481565b6112ea565b6040516105a29190613703565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd9190613839565b611302565b005b3480156105e057600080fd5b506105fb60048036038101906105f69190613481565b6116d8565b60405161060891906134ef565b60405180910390f35b34801561061d57600080fd5b506106266117f6565b60405161063391906133a1565b60405180910390f35b34801561064857600080fd5b50610663600480360381019061065e91906138a7565b611884565b005b34801561067157600080fd5b5061067a6118eb565b60405161068791906133a1565b60405180910390f35b34801561069c57600080fd5b506106b760048036038101906106b291906138d4565b61197d565b6040516106c49190613703565b60405180910390f35b3480156106d957600080fd5b506106e2611a35565b6040516106ef91906134ef565b60405180910390f35b34801561070457600080fd5b5061070d611a59565b005b34801561071b57600080fd5b50610724611a6d565b60405161073191906133a1565b60405180910390f35b34801561074657600080fd5b50610761600480360381019061075c9190613481565b611aff565b005b34801561076f57600080fd5b50610778611b4d565b60405161078591906134ef565b60405180910390f35b34801561079a57600080fd5b506107b560048036038101906107b091906136ab565b611b77565b005b3480156107c357600080fd5b506107cc611b99565b6040516107d991906133a1565b60405180910390f35b3480156107ee57600080fd5b506108096004803603810190610804919061392d565b611c2b565b005b34801561081757600080fd5b50610820611dac565b60405161082d91906139cc565b60405180910390f35b34801561084257600080fd5b5061085d60048036038101906108589190613a88565b611dd2565b005b34801561086b57600080fd5b50610886600480360381019061088191906138d4565b611e2e565b60405161089391906132ed565b60405180910390f35b3480156108a857600080fd5b506108b1611e4e565b6040516108be91906132ed565b60405180910390f35b3480156108d357600080fd5b506108ee60048036038101906108e99190613481565b611e61565b6040516108fb91906133a1565b60405180910390f35b34801561091057600080fd5b5061092b600480360381019061092691906138d4565b611f87565b005b34801561093957600080fd5b50610942611fea565b60405161094f91906133a1565b60405180910390f35b34801561096457600080fd5b5061097f600480360381019061097a9190613b0b565b612038565b60405161098c91906132ed565b60405180910390f35b3480156109a157600080fd5b506109bc60048036038101906109b791906138d4565b6120cc565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610af157507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b015750610b0082612150565b5b9050919050565b610b106121ba565b600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b606060018054610b4b90613b7a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7790613b7a565b8015610bc45780601f10610b9957610100808354040283529160200191610bc4565b820191906000526020600020905b815481529060010190602001808311610ba757829003601f168201915b5050505050905090565b600c60029054906101000a900460ff1681565b6000610bec82612238565b610c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2290613bf8565b60405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c71826116d8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd990613c64565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d016122a5565b73ffffffffffffffffffffffffffffffffffffffff161480610d305750610d2f81610d2a6122a5565b612038565b5b610d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6690613bf8565b60405180910390fd5b610d7a8383836122ad565b505050565b610d876121ba565b600c60009054906101000a900460ff1615610da157600080fd5b80600b9080519060200190610db7929190613107565b506001600c60006101000a81548160ff02191690831515021790555050565b6000600754600054610de89190613c84565b905090565b610df56121ba565b8060159080519060200190610e0b929190613107565b5050565b610e1a83838361235f565b505050565b6000610e2a8361197d565b8210610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6290613d04565b60405180910390fd5b6000610e75610dd6565b905060008060005b83811015610f615760006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ef5578092505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f4d5786841415610f3e578195505050505050610f9d565b8380610f4990613d24565b9450505b508080610f5990613d24565b915050610e7d565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9490613db9565b60405180910390fd5b92915050565b610fab61276b565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612710600e54610ffd9190613e08565b6110079190613e39565b90506000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826110569190613c84565b905081600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060003373ffffffffffffffffffffffffffffffffffffffff16826040516110c290613ec4565b60006040518083038185875af1925050503d80600081146110ff576040519150601f19603f3d011682016040523d82523d6000602084013e611104565b606091505b5050905080611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113f90613f25565b60405180910390fd5b505050565b61116883838360405180602001604052806000815250611dd2565b505050565b6000611177610dd6565b82106111b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111af90613f91565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000dead73ffffffffffffffffffffffffffffffffffffffff166111f8836116d8565b73ffffffffffffffffffffffffffffffffffffffff16141561124f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124690613d04565b60405180910390fd5b819050919050565b61125f6121ba565b8060149080519060200190611275929190613107565b5050565b6112816121ba565b61128a816127ef565b50565b60008060fa8361129d9190613e08565b9050600060fa826112ae9190613e39565b846112b99190613c84565b905060016002826011600086815260200190815260200160002054901c6112e09190613fb1565b1492505050919050565b60116020528060005260406000206000915090505481565b60016002811115611316576113156133c3565b5b600c60029054906101000a900460ff166002811115611338576113376133c3565b5b14806113cc5750601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156113cb5750600060028111156113a7576113a66133c3565b5b600c60029054906101000a900460ff1660028111156113c9576113c86133c3565b5b145b5b61140b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114029061402e565b60405180910390fd5b6000806000806001905060006001905060005b86518110156116175760fa87828151811061143c5761143b61404e565b5b602002602001015161144e9190613e08565b935085841461148c57846011600088815260200190815260200160002054176011600088815260200190815260200160002081905550839550600094505b600060fa8761149b9190613e39565b8883815181106114ae576114ad61404e565b5b60200260200101516114c09190613c84565b90508380156114f157506000600282601160008b815260200190815260200160002054901c6114ef9190613fb1565b145b93508280156115ef57503373ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8a85815181106115635761156261404e565b5b60200260200101516040518263ffffffff1660e01b81526004016115879190613703565b60206040518083038186803b15801561159f57600080fd5b505afa1580156115b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d79190614092565b73ffffffffffffffffffffffffffffffffffffffff16145b9250806001901b8661160191906131e3565b955050808061160f90613d24565b91505061141e565b5081611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164f9061410b565b60405180910390fd5b80611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90613c64565b60405180910390fd5b8360116000878152602001908152602001600020541760116000878152602001908152602001600020819055506116d0338751612809565b505050505050565b60008054821061171d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171490614177565b60405180910390fd5b60008290505b600081106117b55760006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117a15780925050506117f1565b5080806117ad90614197565b915050611723565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e890613c64565b60405180910390fd5b919050565b600b805461180390613b7a565b80601f016020809104026020016040519081016040528092919081815260200182805461182f90613b7a565b801561187c5780601f106118515761010080835404028352916020019161187c565b820191906000526020600020905b81548152906001019060200180831161185f57829003601f168201915b505050505081565b61188c6121ba565b600060028111156118a05761189f6133c3565b5b8160028111156118b3576118b26133c3565b5b14156118be57600080fd5b80600c60026101000a81548160ff021916908360028111156118e3576118e26133c3565b5b021790555050565b6060600380546118fa90613b7a565b80601f016020809104026020016040519081016040528092919081815260200182805461192690613b7a565b80156119735780601f1061194857610100808354040283529160200191611973565b820191906000526020600020905b81548152906001019060200180831161195657829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e59061420d565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f000000000000000000000000000000000000000000000000000000000000dead81565b611a616121ba565b611a6b6000612827565b565b606060048054611a7c90613b7a565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa890613b7a565b8015611af55780601f10611aca57610100808354040283529160200191611af5565b820191906000526020600020905b815481529060010190602001808311611ad857829003601f168201915b5050505050905090565b611b32611b0b826116d8565b7f000000000000000000000000000000000000000000000000000000000000dead8361235f565b60076000815480929190611b4590613d24565b919050555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b7f6121ba565b8060139080519060200190611b95929190613107565b5050565b606060028054611ba890613b7a565b80601f0160208091040260200160405190810160405280929190818152602001828054611bd490613b7a565b8015611c215780601f10611bf657610100808354040283529160200191611c21565b820191906000526020600020905b815481529060010190602001808311611c0457829003601f168201915b5050505050905090565b611c336122a5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9890613bf8565b60405180910390fd5b8060096000611cae6122a5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d5b6122a5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611da091906132ed565b60405180910390a35050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ddd84848461235f565b611de9848484846128ed565b611e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1f90614279565b60405180910390fd5b50505050565b60106020528060005260406000206000915054906101000a900460ff1681565b600c60019054906101000a900460ff1681565b6060611e6c82612238565b611eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea290614279565b60405180910390fd5b600060038054611eba90613b7a565b90501115611ef4576003611ecd83612a84565b604051602001611ede929190614401565b6040516020818303038152906040529050611f82565b60048054611f0190613b7a565b80601f0160208091040260200160405190810160405280929190818152602001828054611f2d90613b7a565b8015611f7a5780601f10611f4f57610100808354040283529160200191611f7a565b820191906000526020600020905b815481529060010190602001808311611f5d57829003601f168201915b505050505090505b919050565b611f8f6121ba565b6001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60606013601460156120113073ffffffffffffffffffffffffffffffffffffffff16612be5565b604051602001612024949392919061469b565b604051602081830303815290604052905090565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120d46121ba565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213b906147ae565b60405180910390fd5b61214d81612827565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121c26122a5565b73ffffffffffffffffffffffffffffffffffffffff166121e0611b4d565b73ffffffffffffffffffffffffffffffffffffffff1614612236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222d9061481a565b60405180910390fd5b565b600080548210801561229e57507f000000000000000000000000000000000000000000000000000000000000dead73ffffffffffffffffffffffffffffffffffffffff16612285836116d8565b73ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b600033905090565b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061236a826116d8565b905060008173ffffffffffffffffffffffffffffffffffffffff1661238d6122a5565b73ffffffffffffffffffffffffffffffffffffffff1614806123e957506123b26122a5565b73ffffffffffffffffffffffffffffffffffffffff166123d184610be1565b73ffffffffffffffffffffffffffffffffffffffff16145b806124015750612400826123fb6122a5565b612038565b5b905080612443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243a90613bf8565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146124b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a890613c64565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612521576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125189061420d565b60405180910390fd5b61252d600084846122ad565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461257d9190613c84565b925050819055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125d491906131e3565b92505081905550836005600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060018461263c91906131e3565b9050600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612708576126af81612238565b1561270757826005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116127ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e490614886565b60405180910390fd5b565b8060039080519060200190612805929190613107565b5050565b612823828260405180602001604052806000815250612c6b565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061290e8473ffffffffffffffffffffffffffffffffffffffff16612ea8565b15612a77578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129376122a5565b8786866040518563ffffffff1660e01b815260040161295994939291906148fb565b602060405180830381600087803b15801561297357600080fd5b505af19250505080156129a457506040513d601f19601f820116820180604052508101906129a1919061495c565b60015b612a27573d80600081146129d4576040519150601f19603f3d011682016040523d82523d6000602084013e6129d9565b606091505b50600081511415612a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1690614279565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a7c565b600190505b949350505050565b60606000821415612acc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612be0565b600082905060005b60008214612afe578080612ae790613d24565b915050600a82612af79190613e08565b9150612ad4565b60008167ffffffffffffffff811115612b1a57612b19613580565b5b6040519080825280601f01601f191660200182016040528015612b4c5781602001600182028036833780820191505090505b5090505b60008514612bd957600182612b659190613c84565b9150600a85612b749190613fb1565b6030612b8091906131e3565b60f81b818381518110612b9657612b9561404e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bd29190613e08565b9450612b50565b8093505050505b919050565b60606000821415612c2d576040518060400160405280600481526020017f30783030000000000000000000000000000000000000000000000000000000008152509050612c66565b600082905060005b60008214612c57578080612c4890613d24565b915050600882901c9150612c35565b612c618482612ecb565b925050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd89061420d565b60405180910390fd5b612cea81612238565b15612d2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2190613bf8565b60405180910390fd5b82600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600081905060005b84811015612e9957818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e3960008784876128ed565b612e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6f90614279565b60405180910390fd5b8180612e8390613d24565b9250508080612e9190613d24565b915050612dc8565b50806000819055505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060006002836002612ede9190613e39565b612ee891906131e3565b67ffffffffffffffff811115612f0157612f00613580565b5b6040519080825280601f01601f191660200182016040528015612f335781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612f6b57612f6a61404e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612fcf57612fce61404e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261300f9190613e39565b61301991906131e3565b90505b60018111156130b9577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061305b5761305a61404e565b5b1a60f81b8282815181106130725761307161404e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806130b290614197565b905061301c565b50600084146130fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f4906149d5565b60405180910390fd5b8091505092915050565b82805461311390613b7a565b90600052602060002090601f016020900481019282613135576000855561317c565b82601f1061314e57805160ff191683800117855561317c565b8280016001018555821561317c579182015b8281111561317b578251825591602001919060010190613160565b5b509050613189919061318d565b5090565b5b808211156131a657600081600090555060010161318e565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006131ee826131aa565b91506131f9836131aa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561322e5761322d6131b4565b5b828201905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132828161324d565b811461328d57600080fd5b50565b60008135905061329f81613279565b92915050565b6000602082840312156132bb576132ba613243565b5b60006132c984828501613290565b91505092915050565b60008115159050919050565b6132e7816132d2565b82525050565b600060208201905061330260008301846132de565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613342578082015181840152602081019050613327565b83811115613351576000848401525b50505050565b6000601f19601f8301169050919050565b600061337382613308565b61337d8185613313565b935061338d818560208601613324565b61339681613357565b840191505092915050565b600060208201905081810360008301526133bb8184613368565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613403576134026133c3565b5b50565b6000819050613414826133f2565b919050565b600061342482613406565b9050919050565b61343481613419565b82525050565b600060208201905061344f600083018461342b565b92915050565b61345e816131aa565b811461346957600080fd5b50565b60008135905061347b81613455565b92915050565b60006020828403121561349757613496613243565b5b60006134a58482850161346c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134d9826134ae565b9050919050565b6134e9816134ce565b82525050565b600060208201905061350460008301846134e0565b92915050565b613513816134ce565b811461351e57600080fd5b50565b6000813590506135308161350a565b92915050565b6000806040838503121561354d5761354c613243565b5b600061355b85828601613521565b925050602061356c8582860161346c565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6135b882613357565b810181811067ffffffffffffffff821117156135d7576135d6613580565b5b80604052505050565b60006135ea613239565b90506135f682826135af565b919050565b600067ffffffffffffffff82111561361657613615613580565b5b61361f82613357565b9050602081019050919050565b82818337600083830152505050565b600061364e613649846135fb565b6135e0565b90508281526020810184848401111561366a5761366961357b565b5b61367584828561362c565b509392505050565b600082601f83011261369257613691613576565b5b81356136a284826020860161363b565b91505092915050565b6000602082840312156136c1576136c0613243565b5b600082013567ffffffffffffffff8111156136df576136de613248565b5b6136eb8482850161367d565b91505092915050565b6136fd816131aa565b82525050565b600060208201905061371860008301846136f4565b92915050565b60008060006060848603121561373757613736613243565b5b600061374586828701613521565b935050602061375686828701613521565b92505060406137678682870161346c565b9150509250925092565b600067ffffffffffffffff82111561378c5761378b613580565b5b602082029050602081019050919050565b600080fd5b60006137b56137b084613771565b6135e0565b905080838252602082019050602084028301858111156137d8576137d761379d565b5b835b8181101561380157806137ed888261346c565b8452602084019350506020810190506137da565b5050509392505050565b600082601f8301126138205761381f613576565b5b81356138308482602086016137a2565b91505092915050565b60006020828403121561384f5761384e613243565b5b600082013567ffffffffffffffff81111561386d5761386c613248565b5b6138798482850161380b565b91505092915050565b6003811061388f57600080fd5b50565b6000813590506138a181613882565b92915050565b6000602082840312156138bd576138bc613243565b5b60006138cb84828501613892565b91505092915050565b6000602082840312156138ea576138e9613243565b5b60006138f884828501613521565b91505092915050565b61390a816132d2565b811461391557600080fd5b50565b60008135905061392781613901565b92915050565b6000806040838503121561394457613943613243565b5b600061395285828601613521565b925050602061396385828601613918565b9150509250929050565b6000819050919050565b600061399261398d613988846134ae565b61396d565b6134ae565b9050919050565b60006139a482613977565b9050919050565b60006139b682613999565b9050919050565b6139c6816139ab565b82525050565b60006020820190506139e160008301846139bd565b92915050565b600067ffffffffffffffff821115613a0257613a01613580565b5b613a0b82613357565b9050602081019050919050565b6000613a2b613a26846139e7565b6135e0565b905082815260208101848484011115613a4757613a4661357b565b5b613a5284828561362c565b509392505050565b600082601f830112613a6f57613a6e613576565b5b8135613a7f848260208601613a18565b91505092915050565b60008060008060808587031215613aa257613aa1613243565b5b6000613ab087828801613521565b9450506020613ac187828801613521565b9350506040613ad28782880161346c565b925050606085013567ffffffffffffffff811115613af357613af2613248565b5b613aff87828801613a5a565b91505092959194509250565b60008060408385031215613b2257613b21613243565b5b6000613b3085828601613521565b9250506020613b4185828601613521565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613b9257607f821691505b60208210811415613ba657613ba5613b4b565b5b50919050565b7f6100000000000000000000000000000000000000000000000000000000000000600082015250565b6000613be2600183613313565b9150613bed82613bac565b602082019050919050565b60006020820190508181036000830152613c1181613bd5565b9050919050565b7f6f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000613c4e600183613313565b9150613c5982613c18565b602082019050919050565b60006020820190508181036000830152613c7d81613c41565b9050919050565b6000613c8f826131aa565b9150613c9a836131aa565b925082821015613cad57613cac6131b4565b5b828203905092915050565b7f6200000000000000000000000000000000000000000000000000000000000000600082015250565b6000613cee600183613313565b9150613cf982613cb8565b602082019050919050565b60006020820190508181036000830152613d1d81613ce1565b9050919050565b6000613d2f826131aa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d6257613d616131b4565b5b600182019050919050565b7f7500000000000000000000000000000000000000000000000000000000000000600082015250565b6000613da3600183613313565b9150613dae82613d6d565b602082019050919050565b60006020820190508181036000830152613dd281613d96565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e13826131aa565b9150613e1e836131aa565b925082613e2e57613e2d613dd9565b5b828204905092915050565b6000613e44826131aa565b9150613e4f836131aa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e8857613e876131b4565b5b828202905092915050565b600081905092915050565b50565b6000613eae600083613e93565b9150613eb982613e9e565b600082019050919050565b6000613ecf82613ea1565b9150819050919050565b7f5061796d656e74206661696c6564210000000000000000000000000000000000600082015250565b6000613f0f600f83613313565b9150613f1a82613ed9565b602082019050919050565b60006020820190508181036000830152613f3e81613f02565b9050919050565b7f6700000000000000000000000000000000000000000000000000000000000000600082015250565b6000613f7b600183613313565b9150613f8682613f45565b602082019050919050565b60006020820190508181036000830152613faa81613f6e565b9050919050565b6000613fbc826131aa565b9150613fc7836131aa565b925082613fd757613fd6613dd9565b5b828206905092915050565b7f7700000000000000000000000000000000000000000000000000000000000000600082015250565b6000614018600183613313565b915061402382613fe2565b602082019050919050565b600060208201905081810360008301526140478161400b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151905061408c8161350a565b92915050565b6000602082840312156140a8576140a7613243565b5b60006140b68482850161407d565b91505092915050565b7f6300000000000000000000000000000000000000000000000000000000000000600082015250565b60006140f5600183613313565b9150614100826140bf565b602082019050919050565b60006020820190508181036000830152614124816140e8565b9050919050565b7f7400000000000000000000000000000000000000000000000000000000000000600082015250565b6000614161600183613313565b915061416c8261412b565b602082019050919050565b6000602082019050818103600083015261419081614154565b9050919050565b60006141a2826131aa565b915060008214156141b6576141b56131b4565b5b600182039050919050565b7f3000000000000000000000000000000000000000000000000000000000000000600082015250565b60006141f7600183613313565b9150614202826141c1565b602082019050919050565b60006020820190508181036000830152614226816141ea565b9050919050565b7f7a00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614263600183613313565b915061426e8261422d565b602082019050919050565b6000602082019050818103600083015261429281614256565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546142c681613b7a565b6142d08186614299565b945060018216600081146142eb57600181146142fc5761432f565b60ff1983168652818601935061432f565b614305856142a4565b60005b8381101561432757815481890152600182019150602081019050614308565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b600061436e600183614299565b915061437982614338565b600182019050919050565b600061438f82613308565b6143998185614299565b93506143a9818560208601613324565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006143eb600583614299565b91506143f6826143b5565b600582019050919050565b600061440d82856142b9565b915061441882614361565b91506144248284614384565b915061442f826143de565b91508190509392505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226e616d60008201527f65223a224372756465426f726e653a204a656c6c7920426162696573222c0000602082015250565b6000614497603e83614299565b91506144a28261443b565b603e82019050919050565b7f226465736372697074696f6e223a220000000000000000000000000000000000600082015250565b60006144e3600f83614299565b91506144ee826144ad565b600f82019050919050565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b600061452f600283614299565b915061453a826144f9565b600282019050919050565b7f22696d616765223a220000000000000000000000000000000000000000000000600082015250565b600061457b600983614299565b915061458682614545565b600982019050919050565b7f2265787465726e616c5f6c696e6b223a22000000000000000000000000000000600082015250565b60006145c7601183614299565b91506145d282614591565b601182019050919050565b7f2273656c6c65725f6665655f62617369735f706f696e7473223a3432302c226660008201527f65655f726563697069656e74223a220000000000000000000000000000000000602082015250565b6000614639602f83614299565b9150614644826145dd565b602f82019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b6000614685600283614299565b91506146908261464f565b600282019050919050565b60006146a68261448a565b91506146b1826144d6565b91506146bd82876142b9565b91506146c882614522565b91506146d38261456e565b91506146df82866142b9565b91506146ea82614522565b91506146f5826145ba565b915061470182856142b9565b915061470c82614522565b91506147178261462c565b91506147238284614384565b915061472e82614678565b915081905095945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614798602683613313565b91506147a38261473c565b604082019050919050565b600060208201905081810360008301526147c78161478b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614804602083613313565b915061480f826147ce565b602082019050919050565b60006020820190508181036000830152614833816147f7565b9050919050565b7f6e6f74206120726f79616c747920706179656500000000000000000000000000600082015250565b6000614870601383613313565b915061487b8261483a565b602082019050919050565b6000602082019050818103600083015261489f81614863565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006148cd826148a6565b6148d781856148b1565b93506148e7818560208601613324565b6148f081613357565b840191505092915050565b600060808201905061491060008301876134e0565b61491d60208301866134e0565b61492a60408301856136f4565b818103606083015261493c81846148c2565b905095945050505050565b60008151905061495681613279565b92915050565b60006020828403121561497257614971613243565b5b600061498084828501614947565b91505092915050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006149bf602083613313565b91506149ca82614989565b602082019050919050565b600060208201905081810360008301526149ee816149b2565b905091905056fea264697066735822122071b90a0a8de4fb16c1dcaddc5c1a125e370012f94a33996e966586c745b281a664736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006c5a06ae6b773457480c12f12c2fb22627507a3a00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000174372756465426f726e65204a656c6c7920426162696573000000000000000000000000000000000000000000000000000000000000000000000000000000000843422e4a454c4c59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000066f3794178997a12779527b36a2f042e001625af0000000000000000000000005d5ee1d6b3c12b07519020b0b14a495d518be78d000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000005dc0000000000000000000000000000000000000000000000000000000000002134
-----Decoded View---------------
Arg [0] : _cbeAddy (address): 0x6C5a06AE6b773457480c12F12C2fB22627507A3A
Arg [1] : _name (string): CrudeBorne Jelly Babies
Arg [2] : _symbol (string): CB.JELLY
Arg [3] : _payees (address[]): 0x66F3794178997a12779527B36a2F042e001625aF,0x5d5EE1d6b3C12b07519020b0B14A495d518be78D
Arg [4] : _basisPoints (uint128[]): 1500,8500
-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 0000000000000000000000006c5a06ae6b773457480c12f12c2fb22627507a3a
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [6] : 4372756465426f726e65204a656c6c7920426162696573000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [8] : 43422e4a454c4c59000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [10] : 00000000000000000000000066f3794178997a12779527b36a2f042e001625af
Arg [11] : 0000000000000000000000005d5ee1d6b3c12b07519020b0b14a495d518be78d
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [13] : 00000000000000000000000000000000000000000000000000000000000005dc
Arg [14] : 0000000000000000000000000000000000000000000000000000000000002134
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.