Overview
TokenID
7465
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Moonlings
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// ============ Imports ============ import {ERC721} from "./ERC721.sol"; // Solmate: ERC721 import {MerkleProof} from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; // OZ: MerkleProof import {PaymentSplitter} from "@openzeppelin/contracts/finance/PaymentSplitter.sol"; /// @title MerkleClaim721 /// @notice ERC721 claimable by members of a merkle tree contract Moonlings is ERC721, PaymentSplitter { /// ============ Immutable storage ============ uint256 public constant maxSupply = 10000; uint256 public constant price = 69000000000000000; /// ============ Mutable storage ============ bytes32 public merkleRoot; bool public publicSaleIsOpen; bool public whitelistIsOpen; bool public isRevealed; address public owner; uint256 public currentSupply; string public baseURI = "ipfs://QmSNKJDGXjA8hj7LyD7F4C2R1wV7zTWkdpgLPwFmLLXSPx"; /// @notice Mapping of addresses who have claimed tokens mapping(address => uint256) public hasClaimed; /// ============ Errors ============ /// @notice Thrown if address has already claimed error AlreadyClaimed(); /// @notice Thrown if address/amount are not part of Merkle tree error NotInMerkle(); /// @notice Thrown if bad price error PaymentNotCorrect(); error NotOwner(); error MintExceedsMaxSupply(); error TooManyMintsPerTransaction(); error AllowlistSaleNotStarted(); error PublicSaleNotStarted(); /// ============ Constructor ============ /// @notice Creates a new MerkleClaimERC721 contract constructor( string memory name, string memory symbol, address[] memory payees, uint256[] memory shares ) ERC721(name, symbol) PaymentSplitter(payees, shares) { owner = msg.sender; } /// ============ Events ============ /// @notice Emitted after a successful token claim /// @param to recipient of claim /// @param amount of tokens claimed event Claim(address indexed to, uint256 amount); event Mint(address indexed to, uint256 amount); /// ============ Public Functions ============ /// @notice Allows claiming tokens if address is part of merkle tree /// @param to address of claimee /// @param proofAmount of tokens owed to claimee in merkle tree /// @param mintAmount of tokens claimee wants to mint in this call /// @param proof merkle proof to prove address and amount are in tree function claim( address to, uint256 proofAmount, uint256 mintAmount, bytes32[] calldata proof ) external payable { if (!whitelistIsOpen) revert AllowlistSaleNotStarted(); if (mintAmount > proofAmount) revert(); // Verify merkle proof, or revert if not in tree bytes32 leaf = keccak256(abi.encodePacked(to, proofAmount)); bool isValidLeaf = MerkleProof.verify(proof, merkleRoot, leaf); if (!isValidLeaf) revert NotInMerkle(); unchecked { // Throw if address has already claimed tokens if (hasClaimed[to] + mintAmount > proofAmount) revert AlreadyClaimed(); if (msg.value != price * mintAmount) revert PaymentNotCorrect(); // Set address to claimed hasClaimed[to] += mintAmount; // Mint tokens to address for (uint256 i = 0; i < mintAmount; i++) { _mint(to, ++currentSupply); } } // Emit claim event emit Claim(to, mintAmount); } function publicMint(uint256 amount) external payable { if (!publicSaleIsOpen) revert PublicSaleNotStarted(); if (amount > 5) revert TooManyMintsPerTransaction(); unchecked { if (currentSupply + amount > maxSupply) revert MintExceedsMaxSupply(); if (msg.value != price * amount) revert PaymentNotCorrect(); for (uint256 i = 0; i < amount; i++) { _mint(msg.sender, ++currentSupply); } } emit Mint(msg.sender, amount); } function tokenURI(uint256 id) public view override returns (string memory) { if (isRevealed) { return string(abi.encodePacked(baseURI, uint2str(id))); } else { return baseURI; } } /// ============ Owner Functions ============ function setOwner(address newOwner) external { if (msg.sender != owner) revert NotOwner(); owner = newOwner; } function ownerMint(address to, uint256 amount) external { if (msg.sender != owner) revert NotOwner(); unchecked { for (uint256 i = 0; i < amount; i++) { _mint(to, ++currentSupply); } } } function setRoot(bytes32 _merkleRoot) external { if (msg.sender != owner) revert NotOwner(); merkleRoot = _merkleRoot; } function reveal(string calldata _baseURI) external { if (msg.sender != owner) revert NotOwner(); baseURI = _baseURI; isRevealed = true; } function setBools(bool whitelist, bool publicSale) external { if (msg.sender != owner) revert NotOwner(); whitelistIsOpen = whitelist; publicSaleIsOpen = publicSale; } /// ========= Internal Functions ======== function uint2str(uint256 _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint256 j = _i; uint256 len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint256 k = len; while (_i != 0) { k = k - 1; uint8 temp = (48 + uint8(_i - (_i / 10) * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol) pragma solidity ^0.8.0; import "../token/ERC20/utils/SafeERC20.sol"; import "../utils/Address.sol"; import "../utils/Context.sol"; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; mapping(IERC20 => uint256) private _erc20TotalReleased; mapping(IERC20 => mapping(address => uint256)) private _erc20Released; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20 * contract. */ function totalReleased(IERC20 token) public view returns (uint256) { return _erc20TotalReleased[token]; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an * IERC20 contract. */ function released(IERC20 token, address account) public view returns (uint256) { return _erc20Released[token][account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = address(this).balance + totalReleased(); uint256 payment = _pendingPayment(account, totalReceived, released(account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] += payment; _totalReleased += payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 * contract. */ function release(IERC20 token, address account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token); uint256 payment = _pendingPayment(account, totalReceived, released(token, account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _erc20Released[token][account] += payment; _erc20TotalReleased[token] += payment; SafeERC20.safeTransfer(token, account, payment); emit ERC20PaymentReleased(token, account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Modern, minimalist, and gas efficient ERC-721 implementation. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol) /// @dev Note that balanceOf does not revert if passed the zero address, in defiance of the ERC. abstract contract ERC721 { /*/////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 indexed id); event Approval(address indexed owner, address indexed spender, uint256 indexed id); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /*/////////////////////////////////////////////////////////////// METADATA STORAGE/LOGIC //////////////////////////////////////////////////////////////*/ string public name; string public symbol; function tokenURI(uint256 id) public view virtual returns (string memory); /*/////////////////////////////////////////////////////////////// ERC721 STORAGE //////////////////////////////////////////////////////////////*/ mapping(address => uint256) public balanceOf; mapping(uint256 => address) public ownerOf; mapping(uint256 => address) public getApproved; mapping(address => mapping(address => bool)) public isApprovedForAll; /*/////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor(string memory _name, string memory _symbol) { name = _name; symbol = _symbol; } /*/////////////////////////////////////////////////////////////// ERC721 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 id) public virtual { address owner = ownerOf[id]; require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED"); getApproved[id] = spender; emit Approval(owner, spender, id); } function setApprovalForAll(address operator, bool approved) public virtual { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } function transferFrom( address from, address to, uint256 id ) public virtual { require(from == ownerOf[id], "WRONG_FROM"); require(to != address(0), "INVALID_RECIPIENT"); require( msg.sender == from || msg.sender == getApproved[id] || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED" ); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. unchecked { balanceOf[from]--; balanceOf[to]++; } ownerOf[id] = to; delete getApproved[id]; emit Transfer(from, to, id); } function safeTransferFrom( address from, address to, uint256 id ) public virtual { transferFrom(from, to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function safeTransferFrom( address from, address to, uint256 id, bytes memory data ) public virtual { transferFrom(from, to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } /*/////////////////////////////////////////////////////////////// ERC165 LOGIC //////////////////////////////////////////////////////////////*/ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165 interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721 interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata } /*/////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 id) internal virtual { require(to != address(0), "INVALID_RECIPIENT"); require(ownerOf[id] == address(0), "ALREADY_MINTED"); // Counter overflow is incredibly unrealistic. unchecked { balanceOf[to]++; } ownerOf[id] = to; emit Transfer(address(0), to, id); } function _burn(uint256 id) internal virtual { address owner = ownerOf[id]; require(ownerOf[id] != address(0), "NOT_MINTED"); // Ownership check above ensures no underflow. unchecked { balanceOf[owner]--; } delete ownerOf[id]; delete getApproved[id]; emit Transfer(owner, address(0), id); } /*/////////////////////////////////////////////////////////////// INTERNAL SAFE MINT LOGIC //////////////////////////////////////////////////////////////*/ function _safeMint(address to, uint256 id) internal virtual { _mint(to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function _safeMint( address to, uint256 id, bytes memory data ) internal virtual { _mint(to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } } /// @notice A generic interface for a contract which properly accepts ERC721 tokens. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol) interface ERC721TokenReceiver { function onERC721Received( address operator, address from, uint256 id, bytes calldata data ) external returns (bytes4); }
// 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.5.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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address[]","name":"payees","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AllowlistSaleNotStarted","type":"error"},{"inputs":[],"name":"AlreadyClaimed","type":"error"},{"inputs":[],"name":"MintExceedsMaxSupply","type":"error"},{"inputs":[],"name":"NotInMerkle","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"PaymentNotCorrect","type":"error"},{"inputs":[],"name":"PublicSaleNotStarted","type":"error"},{"inputs":[],"name":"TooManyMintsPerTransaction","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","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":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","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":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"proofAmount","type":"uint256"},{"internalType":"uint256","name":"mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"currentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleIsOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","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":"id","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":"bool","name":"whitelist","type":"bool"},{"internalType":"bool","name":"publicSale","type":"bool"}],"name":"setBools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","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":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistIsOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526040518060600160405280603581526020016200533f60359139601090805190602001906200003592919062000426565b503480156200004357600080fd5b5060405162005374380380620053748339818101604052810190620000699190620006de565b8181858581600090805190602001906200008592919062000426565b5080600190805190602001906200009e92919062000426565b5050508051825114620000e8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000df9062000900565b60405180910390fd5b60008251116200012f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001269062000944565b60405180910390fd5b60005b82518110156200019e576200018883828151811062000156576200015562000c3f565b5b602002602001015183838151811062000174576200017362000c3f565b5b6020026020010151620001ec60201b60201c565b8080620001959062000b93565b91505062000132565b50505033600e60036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505062000e3a565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200025f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200025690620008de565b60405180910390fd5b60008111620002a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200029c9062000966565b60405180910390fd5b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146200032a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003219062000922565b60405180910390fd5b600a829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600654620003e1919062000a56565b6006819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac82826040516200041a929190620008b1565b60405180910390a15050565b828054620004349062000b27565b90600052602060002090601f016020900481019282620004585760008555620004a4565b82601f106200047357805160ff1916838001178555620004a4565b82800160010185558215620004a4579182015b82811115620004a357825182559160200191906001019062000486565b5b509050620004b39190620004b7565b5090565b5b80821115620004d2576000816000905550600101620004b8565b5090565b6000620004ed620004e784620009b1565b62000988565b9050808382526020820190508285602086028201111562000513576200051262000ca2565b5b60005b858110156200054757816200052c888262000617565b84526020840193506020830192505060018101905062000516565b5050509392505050565b6000620005686200056284620009e0565b62000988565b905080838252602082019050828560208602820111156200058e576200058d62000ca2565b5b60005b85811015620005c25781620005a78882620006c7565b84526020840193506020830192505060018101905062000591565b5050509392505050565b6000620005e3620005dd8462000a0f565b62000988565b90508281526020810184848401111562000602576200060162000ca7565b5b6200060f84828562000af1565b509392505050565b600081519050620006288162000e06565b92915050565b600082601f83011262000646576200064562000c9d565b5b815162000658848260208601620004d6565b91505092915050565b600082601f83011262000679576200067862000c9d565b5b81516200068b84826020860162000551565b91505092915050565b600082601f830112620006ac57620006ab62000c9d565b5b8151620006be848260208601620005cc565b91505092915050565b600081519050620006d88162000e20565b92915050565b60008060008060808587031215620006fb57620006fa62000cb1565b5b600085015167ffffffffffffffff8111156200071c576200071b62000cac565b5b6200072a8782880162000694565b945050602085015167ffffffffffffffff8111156200074e576200074d62000cac565b5b6200075c8782880162000694565b935050604085015167ffffffffffffffff81111562000780576200077f62000cac565b5b6200078e878288016200062e565b925050606085015167ffffffffffffffff811115620007b257620007b162000cac565b5b620007c08782880162000661565b91505092959194509250565b620007d78162000ab3565b82525050565b6000620007ec602c8362000a45565b9150620007f98262000cc7565b604082019050919050565b60006200081360328362000a45565b9150620008208262000d16565b604082019050919050565b60006200083a602b8362000a45565b9150620008478262000d65565b604082019050919050565b600062000861601a8362000a45565b91506200086e8262000db4565b602082019050919050565b600062000888601d8362000a45565b9150620008958262000ddd565b602082019050919050565b620008ab8162000ae7565b82525050565b6000604082019050620008c86000830185620007cc565b620008d76020830184620008a0565b9392505050565b60006020820190508181036000830152620008f981620007dd565b9050919050565b600060208201905081810360008301526200091b8162000804565b9050919050565b600060208201905081810360008301526200093d816200082b565b9050919050565b600060208201905081810360008301526200095f8162000852565b9050919050565b60006020820190508181036000830152620009818162000879565b9050919050565b600062000994620009a7565b9050620009a2828262000b5d565b919050565b6000604051905090565b600067ffffffffffffffff821115620009cf57620009ce62000c6e565b5b602082029050602081019050919050565b600067ffffffffffffffff821115620009fe57620009fd62000c6e565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000a2d5762000a2c62000c6e565b5b62000a388262000cb6565b9050602081019050919050565b600082825260208201905092915050565b600062000a638262000ae7565b915062000a708362000ae7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000aa85762000aa762000be1565b5b828201905092915050565b600062000ac08262000ac7565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000b1157808201518184015260208101905062000af4565b8381111562000b21576000848401525b50505050565b6000600282049050600182168062000b4057607f821691505b6020821081141562000b575762000b5662000c10565b5b50919050565b62000b688262000cb6565b810181811067ffffffffffffffff8211171562000b8a5762000b8962000c6e565b5b80604052505050565b600062000ba08262000ae7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000bd65762000bd562000be1565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b62000e118162000ab3565b811462000e1d57600080fd5b50565b62000e2b8162000ae7565b811462000e3757600080fd5b50565b6144f58062000e4a6000396000f3fe6080604052600436106102345760003560e01c806370a082311161012e578063b88d4fde116100ab578063d79779b21161006f578063d79779b2146108b6578063da7eacb9146108f3578063dab5f3401461091e578063e33b7de314610947578063e985e9c5146109725761027b565b8063b88d4fde146107bd578063b8e4e175146107e6578063c87b56dd14610811578063ce7c2ac21461084e578063d5abeb011461088b5761027b565b806395d89b41116100f257806395d89b41146106d85780639852595c14610703578063a035b1fe14610740578063a22cb4651461076b578063a7bba541146107945761027b565b806370a08231146105cb57806373b2e80e14610608578063771282f6146106455780638b83209b146106705780638da5cb5b146106ad5761027b565b80632eb4a7ab116101bc57806348b750441161018057806348b75044146104e65780634c2612471461050f57806354214f69146105385780636352211e146105635780636c0360eb146105a05761027b565b80632eb4a7ab146104015780633a98ef391461042c578063406072a91461045757806342842e0e14610494578063484b973c146104bd5761027b565b806313af40351161020357806313af40351461034e578063172bd6de14610377578063191655871461039357806323b872dd146103bc5780632db11544146103e55761027b565b806301ffc9a71461028057806306fdde03146102bd578063081812fc146102e8578063095ea7b3146103255761027b565b3661027b577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102626109af565b34604051610271929190613a28565b60405180910390a1005b600080fd5b34801561028c57600080fd5b506102a760048036038101906102a291906133ae565b6109b7565b6040516102b49190613a51565b60405180910390f35b3480156102c957600080fd5b506102d2610a49565b6040516102df9190613a87565b60405180910390f35b3480156102f457600080fd5b5061030f600480360381019061030a91906134c2565b610ad7565b60405161031c919061394e565b60405180910390f35b34801561033157600080fd5b5061034c6004803603810190610347919061324c565b610b0a565b005b34801561035a57600080fd5b506103756004803603810190610370919061309c565b610cf3565b005b610391600480360381019061038c919061328c565b610dbe565b005b34801561039f57600080fd5b506103ba60048036038101906103b591906130c9565b611059565b005b3480156103c857600080fd5b506103e360048036038101906103de9190613136565b611204565b005b6103ff60048036038101906103fa91906134c2565b611604565b005b34801561040d57600080fd5b50610416611789565b6040516104239190613a6c565b60405180910390f35b34801561043857600080fd5b5061044161178f565b60405161044e9190613c29565b60405180910390f35b34801561046357600080fd5b5061047e60048036038101906104799190613435565b611799565b60405161048b9190613c29565b60405180910390f35b3480156104a057600080fd5b506104bb60048036038101906104b69190613136565b611820565b005b3480156104c957600080fd5b506104e460048036038101906104df919061324c565b611967565b005b3480156104f257600080fd5b5061050d60048036038101906105089190613435565b611a23565b005b34801561051b57600080fd5b5061053660048036038101906105319190613475565b611ceb565b005b34801561054457600080fd5b5061054d611da3565b60405161055a9190613a51565b60405180910390f35b34801561056f57600080fd5b5061058a600480360381019061058591906134c2565b611db6565b604051610597919061394e565b60405180910390f35b3480156105ac57600080fd5b506105b5611de9565b6040516105c29190613a87565b60405180910390f35b3480156105d757600080fd5b506105f260048036038101906105ed919061309c565b611e77565b6040516105ff9190613c29565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a919061309c565b611e8f565b60405161063c9190613c29565b60405180910390f35b34801561065157600080fd5b5061065a611ea7565b6040516106679190613c29565b60405180910390f35b34801561067c57600080fd5b50610697600480360381019061069291906134c2565b611ead565b6040516106a4919061394e565b60405180910390f35b3480156106b957600080fd5b506106c2611ef5565b6040516106cf919061394e565b60405180910390f35b3480156106e457600080fd5b506106ed611f1b565b6040516106fa9190613a87565b60405180910390f35b34801561070f57600080fd5b5061072a6004803603810190610725919061309c565b611fa9565b6040516107379190613c29565b60405180910390f35b34801561074c57600080fd5b50610755611ff2565b6040516107629190613c29565b60405180910390f35b34801561077757600080fd5b50610792600480360381019061078d919061320c565b611ffd565b005b3480156107a057600080fd5b506107bb60048036038101906107b69190613341565b6120fa565b005b3480156107c957600080fd5b506107e460048036038101906107df9190613189565b6121b9565b005b3480156107f257600080fd5b506107fb612303565b6040516108089190613a51565b60405180910390f35b34801561081d57600080fd5b50610838600480360381019061083391906134c2565b612316565b6040516108459190613a87565b60405180910390f35b34801561085a57600080fd5b506108756004803603810190610870919061309c565b6123f2565b6040516108829190613c29565b60405180910390f35b34801561089757600080fd5b506108a061243b565b6040516108ad9190613c29565b60405180910390f35b3480156108c257600080fd5b506108dd60048036038101906108d89190613408565b612441565b6040516108ea9190613c29565b60405180910390f35b3480156108ff57600080fd5b5061090861248a565b6040516109159190613a51565b60405180910390f35b34801561092a57600080fd5b5061094560048036038101906109409190613381565b61249d565b005b34801561095357600080fd5b5061095c61252e565b6040516109699190613c29565b60405180910390f35b34801561097e57600080fd5b50610999600480360381019061099491906130f6565b612538565b6040516109a69190613a51565b60405180910390f35b600033905090565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a1257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a425750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60008054610a5690613f70565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8290613f70565b8015610acf5780601f10610aa457610100808354040283529160200191610acf565b820191906000526020600020905b815481529060010190602001808311610ab257829003601f168201915b505050505081565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610c025750600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3890613be9565b60405180910390fd5b826004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d7a576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600e60036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e60019054906101000a900460ff16610e04576040517f55a5151f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83831115610e1157600080fd5b60008585604051602001610e269291906138d2565b6040516020818303038152906040528051906020012090506000610e8e848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d5484612567565b905080610ec7576040517f8a585be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8585601160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054011115610f42576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8466f5232269808000023414610f84576040517f3c7215a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84601160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060005b8581101561100157610ff488600f6000815460010191905081905561257e565b8080600101915050610fd4565b508673ffffffffffffffffffffffffffffffffffffffff167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4866040516110489190613c29565b60405180910390a250505050505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116110db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d290613aa9565b60405180910390fd5b60006110e561252e565b476110f09190613cfd565b90506000611107838361110286611fa9565b612791565b9050600081141561114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114490613b29565b60405180910390fd5b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461119c9190613cfd565b9250508190555080600760008282546111b59190613cfd565b925050819055506111c683826127ff565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05683826040516111f7929190613969565b60405180910390a1505050565b6003600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146112a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129c90613c09565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130c90613b49565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806113ad57506004600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061143e5750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61147d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147490613be9565b60405180910390fd5b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600e60009054906101000a900460ff1661164a576040517fac4d09c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005811115611685576040517f345ac22a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61271081600f540111156116c5576040517f3e0866c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8066f5232269808000023414611707576040517f3c7215a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156117375761172a33600f6000815460010191905081905561257e565b808060010191505061170a565b503373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161177e9190613c29565b60405180910390a250565b600d5481565b6000600654905090565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61182b838383611204565b60008273ffffffffffffffffffffffffffffffffffffffff163b1480611923575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b81526004016118b0939291906139de565b602060405180830381600087803b1580156118ca57600080fd5b505af11580156118de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190291906133db565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b611962576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195990613b69565b60405180910390fd5b505050565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119ee576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015611a1e57611a1183600f6000815460010191905081905561257e565b80806001019150506119f1565b505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9c90613aa9565b60405180910390fd5b6000611ab083612441565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611ae9919061394e565b60206040518083038186803b158015611b0157600080fd5b505afa158015611b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3991906134ef565b611b439190613cfd565b90506000611b5b8383611b568787611799565b612791565b90506000811415611ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9890613b29565b60405180910390fd5b80600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c2d9190613cfd565b9250508190555080600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c839190613cfd565b92505081905550611c958484836128f3565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a8483604051611cdd929190613a28565b60405180910390a250505050565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d72576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160109190611d83929190612e0b565b506001600e60026101000a81548160ff0219169083151502179055505050565b600e60029054906101000a900460ff1681565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60108054611df690613f70565b80601f0160208091040260200160405190810160405280929190818152602001828054611e2290613f70565b8015611e6f5780601f10611e4457610100808354040283529160200191611e6f565b820191906000526020600020905b815481529060010190602001808311611e5257829003601f168201915b505050505081565b60026020528060005260406000206000915090505481565b60116020528060005260406000206000915090505481565b600f5481565b6000600a8281548110611ec357611ec26140d7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60018054611f2890613f70565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5490613f70565b8015611fa15780601f10611f7657610100808354040283529160200191611fa1565b820191906000526020600020905b815481529060010190602001808311611f8457829003601f168201915b505050505081565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b66f523226980800081565b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120ee9190613a51565b60405180910390a35050565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612181576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600e60016101000a81548160ff02191690831515021790555080600e60006101000a81548160ff0219169083151502179055505050565b6121c4848484611204565b60008373ffffffffffffffffffffffffffffffffffffffff163b14806122be575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b815260040161224b9493929190613992565b602060405180830381600087803b15801561226557600080fd5b505af1158015612279573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229d91906133db565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b6122fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f490613b69565b60405180910390fd5b50505050565b600e60009054906101000a900460ff1681565b6060600e60029054906101000a900460ff161561235f57601061233883612979565b604051602001612349929190613915565b60405160208183030381529060405290506123ed565b6010805461236c90613f70565b80601f016020809104026020016040519081016040528092919081815260200182805461239890613f70565b80156123e55780601f106123ba576101008083540402835291602001916123e5565b820191906000526020600020905b8154815290600101906020018083116123c857829003601f168201915b505050505090505b919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61271081565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600e60019054906101000a900460ff1681565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612524576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d8190555050565b6000600754905090565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b6000826125748584612b02565b1490509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e590613b49565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268790613bc9565b60405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600081600654600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856127e29190613dbb565b6127ec9190613d8a565b6127f69190613e15565b90509392505050565b80471015612842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283990613ae9565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161286890613939565b60006040518083038185875af1925050503d80600081146128a5576040519150601f19603f3d011682016040523d82523d6000602084013e6128aa565b606091505b50509050806128ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e590613ac9565b60405180910390fd5b505050565b6129748363a9059cbb60e01b8484604051602401612912929190613a28565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612b77565b505050565b606060008214156129c1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612afd565b600082905060005b600082146129f35780806129dc90613fd3565b915050600a826129ec9190613d8a565b91506129c9565b60008167ffffffffffffffff811115612a0f57612a0e614106565b5b6040519080825280601f01601f191660200182016040528015612a415781602001600182028036833780820191505090505b50905060008290505b60008614612af557600181612a5f9190613e15565b90506000600a8088612a719190613d8a565b612a7b9190613dbb565b87612a869190613e15565b6030612a929190613d53565b905060008160f81b905080848481518110612ab057612aaf6140d7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a88612aec9190613d8a565b97505050612a4a565b819450505050505b919050565b60008082905060005b8451811015612b6c576000858281518110612b2957612b286140d7565b5b60200260200101519050808311612b4b57612b448382612c3e565b9250612b58565b612b558184612c3e565b92505b508080612b6490613fd3565b915050612b0b565b508091505092915050565b6000612bd9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c559092919063ffffffff16565b9050600081511115612c395780806020019051810190612bf99190613314565b612c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2f90613ba9565b60405180910390fd5b5b505050565b600082600052816020526040600020905092915050565b6060612c648484600085612c6d565b90509392505050565b606082471015612cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca990613b09565b60405180910390fd5b612cbb85612d81565b612cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf190613b89565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612d2391906138fe565b60006040518083038185875af1925050503d8060008114612d60576040519150601f19603f3d011682016040523d82523d6000602084013e612d65565b606091505b5091509150612d75828286612da4565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315612db457829050612e04565b600083511115612dc75782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfb9190613a87565b60405180910390fd5b9392505050565b828054612e1790613f70565b90600052602060002090601f016020900481019282612e395760008555612e80565b82601f10612e5257803560ff1916838001178555612e80565b82800160010185558215612e80579182015b82811115612e7f578235825591602001919060010190612e64565b5b509050612e8d9190612e91565b5090565b5b80821115612eaa576000816000905550600101612e92565b5090565b6000612ec1612ebc84613c69565b613c44565b905082815260208101848484011115612edd57612edc614144565b5b612ee8848285613f2e565b509392505050565b600081359050612eff8161441e565b92915050565b600081359050612f1481614435565b92915050565b60008083601f840112612f3057612f2f61413a565b5b8235905067ffffffffffffffff811115612f4d57612f4c614135565b5b602083019150836020820283011115612f6957612f6861413f565b5b9250929050565b600081359050612f7f8161444c565b92915050565b600081519050612f948161444c565b92915050565b600081359050612fa981614463565b92915050565b600081359050612fbe8161447a565b92915050565b600081519050612fd38161447a565b92915050565b600082601f830112612fee57612fed61413a565b5b8135612ffe848260208601612eae565b91505092915050565b60008135905061301681614491565b92915050565b60008083601f8401126130325761303161413a565b5b8235905067ffffffffffffffff81111561304f5761304e614135565b5b60208301915083600182028301111561306b5761306a61413f565b5b9250929050565b600081359050613081816144a8565b92915050565b600081519050613096816144a8565b92915050565b6000602082840312156130b2576130b161414e565b5b60006130c084828501612ef0565b91505092915050565b6000602082840312156130df576130de61414e565b5b60006130ed84828501612f05565b91505092915050565b6000806040838503121561310d5761310c61414e565b5b600061311b85828601612ef0565b925050602061312c85828601612ef0565b9150509250929050565b60008060006060848603121561314f5761314e61414e565b5b600061315d86828701612ef0565b935050602061316e86828701612ef0565b925050604061317f86828701613072565b9150509250925092565b600080600080608085870312156131a3576131a261414e565b5b60006131b187828801612ef0565b94505060206131c287828801612ef0565b93505060406131d387828801613072565b925050606085013567ffffffffffffffff8111156131f4576131f3614149565b5b61320087828801612fd9565b91505092959194509250565b600080604083850312156132235761322261414e565b5b600061323185828601612ef0565b925050602061324285828601612f70565b9150509250929050565b600080604083850312156132635761326261414e565b5b600061327185828601612ef0565b925050602061328285828601613072565b9150509250929050565b6000806000806000608086880312156132a8576132a761414e565b5b60006132b688828901612ef0565b95505060206132c788828901613072565b94505060406132d888828901613072565b935050606086013567ffffffffffffffff8111156132f9576132f8614149565b5b61330588828901612f1a565b92509250509295509295909350565b60006020828403121561332a5761332961414e565b5b600061333884828501612f85565b91505092915050565b600080604083850312156133585761335761414e565b5b600061336685828601612f70565b925050602061337785828601612f70565b9150509250929050565b6000602082840312156133975761339661414e565b5b60006133a584828501612f9a565b91505092915050565b6000602082840312156133c4576133c361414e565b5b60006133d284828501612faf565b91505092915050565b6000602082840312156133f1576133f061414e565b5b60006133ff84828501612fc4565b91505092915050565b60006020828403121561341e5761341d61414e565b5b600061342c84828501613007565b91505092915050565b6000806040838503121561344c5761344b61414e565b5b600061345a85828601613007565b925050602061346b85828601612ef0565b9150509250929050565b6000806020838503121561348c5761348b61414e565b5b600083013567ffffffffffffffff8111156134aa576134a9614149565b5b6134b68582860161301c565b92509250509250929050565b6000602082840312156134d8576134d761414e565b5b60006134e684828501613072565b91505092915050565b6000602082840312156135055761350461414e565b5b600061351384828501613087565b91505092915050565b61352581613ef8565b82525050565b61353481613e49565b82525050565b61354b61354682613e49565b61401c565b82525050565b61355a81613e6d565b82525050565b61356981613e79565b82525050565b600061357a82613caf565b6135848185613cc5565b9350613594818560208601613f3d565b61359d81614153565b840191505092915050565b60006135b382613caf565b6135bd8185613cd6565b93506135cd818560208601613f3d565b80840191505092915050565b60006135e482613cba565b6135ee8185613ce1565b93506135fe818560208601613f3d565b61360781614153565b840191505092915050565b600061361d82613cba565b6136278185613cf2565b9350613637818560208601613f3d565b80840191505092915050565b6000815461365081613f70565b61365a8186613cf2565b945060018216600081146136755760018114613686576136b9565b60ff198316865281860193506136b9565b61368f85613c9a565b60005b838110156136b157815481890152600182019150602081019050613692565b838801955050505b50505092915050565b60006136cf602683613ce1565b91506136da82614171565b604082019050919050565b60006136f2603a83613ce1565b91506136fd826141c0565b604082019050919050565b6000613715601d83613ce1565b91506137208261420f565b602082019050919050565b6000613738602683613ce1565b915061374382614238565b604082019050919050565b600061375b602b83613ce1565b915061376682614287565b604082019050919050565b600061377e601183613ce1565b9150613789826142d6565b602082019050919050565b60006137a1601083613ce1565b91506137ac826142ff565b602082019050919050565b60006137c4600083613cc5565b91506137cf82614328565b600082019050919050565b60006137e7600083613cd6565b91506137f282614328565b600082019050919050565b600061380a601d83613ce1565b91506138158261432b565b602082019050919050565b600061382d602a83613ce1565b915061383882614354565b604082019050919050565b6000613850600e83613ce1565b915061385b826143a3565b602082019050919050565b6000613873600e83613ce1565b915061387e826143cc565b602082019050919050565b6000613896600a83613ce1565b91506138a1826143f5565b602082019050919050565b6138b581613ee1565b82525050565b6138cc6138c782613ee1565b614040565b82525050565b60006138de828561353a565b6014820191506138ee82846138bb565b6020820191508190509392505050565b600061390a82846135a8565b915081905092915050565b60006139218285613643565b915061392d8284613612565b91508190509392505050565b6000613944826137da565b9150819050919050565b6000602082019050613963600083018461352b565b92915050565b600060408201905061397e600083018561351c565b61398b60208301846138ac565b9392505050565b60006080820190506139a7600083018761352b565b6139b4602083018661352b565b6139c160408301856138ac565b81810360608301526139d3818461356f565b905095945050505050565b60006080820190506139f3600083018661352b565b613a00602083018561352b565b613a0d60408301846138ac565b8181036060830152613a1e816137b7565b9050949350505050565b6000604082019050613a3d600083018561352b565b613a4a60208301846138ac565b9392505050565b6000602082019050613a666000830184613551565b92915050565b6000602082019050613a816000830184613560565b92915050565b60006020820190508181036000830152613aa181846135d9565b905092915050565b60006020820190508181036000830152613ac2816136c2565b9050919050565b60006020820190508181036000830152613ae2816136e5565b9050919050565b60006020820190508181036000830152613b0281613708565b9050919050565b60006020820190508181036000830152613b228161372b565b9050919050565b60006020820190508181036000830152613b428161374e565b9050919050565b60006020820190508181036000830152613b6281613771565b9050919050565b60006020820190508181036000830152613b8281613794565b9050919050565b60006020820190508181036000830152613ba2816137fd565b9050919050565b60006020820190508181036000830152613bc281613820565b9050919050565b60006020820190508181036000830152613be281613843565b9050919050565b60006020820190508181036000830152613c0281613866565b9050919050565b60006020820190508181036000830152613c2281613889565b9050919050565b6000602082019050613c3e60008301846138ac565b92915050565b6000613c4e613c5f565b9050613c5a8282613fa2565b919050565b6000604051905090565b600067ffffffffffffffff821115613c8457613c83614106565b5b613c8d82614153565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d0882613ee1565b9150613d1383613ee1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d4857613d4761404a565b5b828201905092915050565b6000613d5e82613eeb565b9150613d6983613eeb565b92508260ff03821115613d7f57613d7e61404a565b5b828201905092915050565b6000613d9582613ee1565b9150613da083613ee1565b925082613db057613daf614079565b5b828204905092915050565b6000613dc682613ee1565b9150613dd183613ee1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e0a57613e0961404a565b5b828202905092915050565b6000613e2082613ee1565b9150613e2b83613ee1565b925082821015613e3e57613e3d61404a565b5b828203905092915050565b6000613e5482613ec1565b9050919050565b6000613e6682613ec1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000613eba82613e49565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000613f0382613f0a565b9050919050565b6000613f1582613f1c565b9050919050565b6000613f2782613ec1565b9050919050565b82818337600083830152505050565b60005b83811015613f5b578082015181840152602081019050613f40565b83811115613f6a576000848401525b50505050565b60006002820490506001821680613f8857607f821691505b60208210811415613f9c57613f9b6140a8565b5b50919050565b613fab82614153565b810181811067ffffffffffffffff82111715613fca57613fc9614106565b5b80604052505050565b6000613fde82613ee1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140115761401061404a565b5b600182019050919050565b60006140278261402e565b9050919050565b600061403982614164565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f494e56414c49445f524543495049454e54000000000000000000000000000000600082015250565b7f554e534146455f524543495049454e5400000000000000000000000000000000600082015250565b50565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f414c52454144595f4d494e544544000000000000000000000000000000000000600082015250565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b7f57524f4e475f46524f4d00000000000000000000000000000000000000000000600082015250565b61442781613e49565b811461443257600080fd5b50565b61443e81613e5b565b811461444957600080fd5b50565b61445581613e6d565b811461446057600080fd5b50565b61446c81613e79565b811461447757600080fd5b50565b61448381613e83565b811461448e57600080fd5b50565b61449a81613eaf565b81146144a557600080fd5b50565b6144b181613ee1565b81146144bc57600080fd5b5056fea26469706673582212205337b9cf935a64b56d3ce7689b07e45830db83db88a3c54d6dc9869fd0e04e5564736f6c63430008070033697066733a2f2f516d534e4b4a4447586a4138686a374c7944374634433252317756377a54576b6470674c5077466d4c4c58535078000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000094d6f6f6e6c696e6773000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d4f4f4e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000069dc1e5b2b5ae220d91f80ea500192ca4234d554000000000000000000000000e8096f98e90daaebfd4822ed391b6806b377436c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003
Deployed Bytecode
0x6080604052600436106102345760003560e01c806370a082311161012e578063b88d4fde116100ab578063d79779b21161006f578063d79779b2146108b6578063da7eacb9146108f3578063dab5f3401461091e578063e33b7de314610947578063e985e9c5146109725761027b565b8063b88d4fde146107bd578063b8e4e175146107e6578063c87b56dd14610811578063ce7c2ac21461084e578063d5abeb011461088b5761027b565b806395d89b41116100f257806395d89b41146106d85780639852595c14610703578063a035b1fe14610740578063a22cb4651461076b578063a7bba541146107945761027b565b806370a08231146105cb57806373b2e80e14610608578063771282f6146106455780638b83209b146106705780638da5cb5b146106ad5761027b565b80632eb4a7ab116101bc57806348b750441161018057806348b75044146104e65780634c2612471461050f57806354214f69146105385780636352211e146105635780636c0360eb146105a05761027b565b80632eb4a7ab146104015780633a98ef391461042c578063406072a91461045757806342842e0e14610494578063484b973c146104bd5761027b565b806313af40351161020357806313af40351461034e578063172bd6de14610377578063191655871461039357806323b872dd146103bc5780632db11544146103e55761027b565b806301ffc9a71461028057806306fdde03146102bd578063081812fc146102e8578063095ea7b3146103255761027b565b3661027b577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102626109af565b34604051610271929190613a28565b60405180910390a1005b600080fd5b34801561028c57600080fd5b506102a760048036038101906102a291906133ae565b6109b7565b6040516102b49190613a51565b60405180910390f35b3480156102c957600080fd5b506102d2610a49565b6040516102df9190613a87565b60405180910390f35b3480156102f457600080fd5b5061030f600480360381019061030a91906134c2565b610ad7565b60405161031c919061394e565b60405180910390f35b34801561033157600080fd5b5061034c6004803603810190610347919061324c565b610b0a565b005b34801561035a57600080fd5b506103756004803603810190610370919061309c565b610cf3565b005b610391600480360381019061038c919061328c565b610dbe565b005b34801561039f57600080fd5b506103ba60048036038101906103b591906130c9565b611059565b005b3480156103c857600080fd5b506103e360048036038101906103de9190613136565b611204565b005b6103ff60048036038101906103fa91906134c2565b611604565b005b34801561040d57600080fd5b50610416611789565b6040516104239190613a6c565b60405180910390f35b34801561043857600080fd5b5061044161178f565b60405161044e9190613c29565b60405180910390f35b34801561046357600080fd5b5061047e60048036038101906104799190613435565b611799565b60405161048b9190613c29565b60405180910390f35b3480156104a057600080fd5b506104bb60048036038101906104b69190613136565b611820565b005b3480156104c957600080fd5b506104e460048036038101906104df919061324c565b611967565b005b3480156104f257600080fd5b5061050d60048036038101906105089190613435565b611a23565b005b34801561051b57600080fd5b5061053660048036038101906105319190613475565b611ceb565b005b34801561054457600080fd5b5061054d611da3565b60405161055a9190613a51565b60405180910390f35b34801561056f57600080fd5b5061058a600480360381019061058591906134c2565b611db6565b604051610597919061394e565b60405180910390f35b3480156105ac57600080fd5b506105b5611de9565b6040516105c29190613a87565b60405180910390f35b3480156105d757600080fd5b506105f260048036038101906105ed919061309c565b611e77565b6040516105ff9190613c29565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a919061309c565b611e8f565b60405161063c9190613c29565b60405180910390f35b34801561065157600080fd5b5061065a611ea7565b6040516106679190613c29565b60405180910390f35b34801561067c57600080fd5b50610697600480360381019061069291906134c2565b611ead565b6040516106a4919061394e565b60405180910390f35b3480156106b957600080fd5b506106c2611ef5565b6040516106cf919061394e565b60405180910390f35b3480156106e457600080fd5b506106ed611f1b565b6040516106fa9190613a87565b60405180910390f35b34801561070f57600080fd5b5061072a6004803603810190610725919061309c565b611fa9565b6040516107379190613c29565b60405180910390f35b34801561074c57600080fd5b50610755611ff2565b6040516107629190613c29565b60405180910390f35b34801561077757600080fd5b50610792600480360381019061078d919061320c565b611ffd565b005b3480156107a057600080fd5b506107bb60048036038101906107b69190613341565b6120fa565b005b3480156107c957600080fd5b506107e460048036038101906107df9190613189565b6121b9565b005b3480156107f257600080fd5b506107fb612303565b6040516108089190613a51565b60405180910390f35b34801561081d57600080fd5b50610838600480360381019061083391906134c2565b612316565b6040516108459190613a87565b60405180910390f35b34801561085a57600080fd5b506108756004803603810190610870919061309c565b6123f2565b6040516108829190613c29565b60405180910390f35b34801561089757600080fd5b506108a061243b565b6040516108ad9190613c29565b60405180910390f35b3480156108c257600080fd5b506108dd60048036038101906108d89190613408565b612441565b6040516108ea9190613c29565b60405180910390f35b3480156108ff57600080fd5b5061090861248a565b6040516109159190613a51565b60405180910390f35b34801561092a57600080fd5b5061094560048036038101906109409190613381565b61249d565b005b34801561095357600080fd5b5061095c61252e565b6040516109699190613c29565b60405180910390f35b34801561097e57600080fd5b50610999600480360381019061099491906130f6565b612538565b6040516109a69190613a51565b60405180910390f35b600033905090565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a1257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a425750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60008054610a5690613f70565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8290613f70565b8015610acf5780601f10610aa457610100808354040283529160200191610acf565b820191906000526020600020905b815481529060010190602001808311610ab257829003601f168201915b505050505081565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610c025750600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3890613be9565b60405180910390fd5b826004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d7a576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600e60036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e60019054906101000a900460ff16610e04576040517f55a5151f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83831115610e1157600080fd5b60008585604051602001610e269291906138d2565b6040516020818303038152906040528051906020012090506000610e8e848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d5484612567565b905080610ec7576040517f8a585be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8585601160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054011115610f42576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8466f5232269808000023414610f84576040517f3c7215a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84601160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060005b8581101561100157610ff488600f6000815460010191905081905561257e565b8080600101915050610fd4565b508673ffffffffffffffffffffffffffffffffffffffff167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4866040516110489190613c29565b60405180910390a250505050505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116110db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d290613aa9565b60405180910390fd5b60006110e561252e565b476110f09190613cfd565b90506000611107838361110286611fa9565b612791565b9050600081141561114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114490613b29565b60405180910390fd5b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461119c9190613cfd565b9250508190555080600760008282546111b59190613cfd565b925050819055506111c683826127ff565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05683826040516111f7929190613969565b60405180910390a1505050565b6003600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146112a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129c90613c09565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130c90613b49565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806113ad57506004600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061143e5750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61147d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147490613be9565b60405180910390fd5b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600e60009054906101000a900460ff1661164a576040517fac4d09c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005811115611685576040517f345ac22a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61271081600f540111156116c5576040517f3e0866c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8066f5232269808000023414611707576040517f3c7215a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156117375761172a33600f6000815460010191905081905561257e565b808060010191505061170a565b503373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161177e9190613c29565b60405180910390a250565b600d5481565b6000600654905090565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61182b838383611204565b60008273ffffffffffffffffffffffffffffffffffffffff163b1480611923575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b81526004016118b0939291906139de565b602060405180830381600087803b1580156118ca57600080fd5b505af11580156118de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190291906133db565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b611962576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195990613b69565b60405180910390fd5b505050565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119ee576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015611a1e57611a1183600f6000815460010191905081905561257e565b80806001019150506119f1565b505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9c90613aa9565b60405180910390fd5b6000611ab083612441565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611ae9919061394e565b60206040518083038186803b158015611b0157600080fd5b505afa158015611b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3991906134ef565b611b439190613cfd565b90506000611b5b8383611b568787611799565b612791565b90506000811415611ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9890613b29565b60405180910390fd5b80600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c2d9190613cfd565b9250508190555080600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c839190613cfd565b92505081905550611c958484836128f3565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a8483604051611cdd929190613a28565b60405180910390a250505050565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d72576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160109190611d83929190612e0b565b506001600e60026101000a81548160ff0219169083151502179055505050565b600e60029054906101000a900460ff1681565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60108054611df690613f70565b80601f0160208091040260200160405190810160405280929190818152602001828054611e2290613f70565b8015611e6f5780601f10611e4457610100808354040283529160200191611e6f565b820191906000526020600020905b815481529060010190602001808311611e5257829003601f168201915b505050505081565b60026020528060005260406000206000915090505481565b60116020528060005260406000206000915090505481565b600f5481565b6000600a8281548110611ec357611ec26140d7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60018054611f2890613f70565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5490613f70565b8015611fa15780601f10611f7657610100808354040283529160200191611fa1565b820191906000526020600020905b815481529060010190602001808311611f8457829003601f168201915b505050505081565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b66f523226980800081565b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120ee9190613a51565b60405180910390a35050565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612181576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600e60016101000a81548160ff02191690831515021790555080600e60006101000a81548160ff0219169083151502179055505050565b6121c4848484611204565b60008373ffffffffffffffffffffffffffffffffffffffff163b14806122be575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b815260040161224b9493929190613992565b602060405180830381600087803b15801561226557600080fd5b505af1158015612279573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229d91906133db565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b6122fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f490613b69565b60405180910390fd5b50505050565b600e60009054906101000a900460ff1681565b6060600e60029054906101000a900460ff161561235f57601061233883612979565b604051602001612349929190613915565b60405160208183030381529060405290506123ed565b6010805461236c90613f70565b80601f016020809104026020016040519081016040528092919081815260200182805461239890613f70565b80156123e55780601f106123ba576101008083540402835291602001916123e5565b820191906000526020600020905b8154815290600101906020018083116123c857829003601f168201915b505050505090505b919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61271081565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600e60019054906101000a900460ff1681565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612524576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d8190555050565b6000600754905090565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b6000826125748584612b02565b1490509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e590613b49565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268790613bc9565b60405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600081600654600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856127e29190613dbb565b6127ec9190613d8a565b6127f69190613e15565b90509392505050565b80471015612842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283990613ae9565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161286890613939565b60006040518083038185875af1925050503d80600081146128a5576040519150601f19603f3d011682016040523d82523d6000602084013e6128aa565b606091505b50509050806128ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e590613ac9565b60405180910390fd5b505050565b6129748363a9059cbb60e01b8484604051602401612912929190613a28565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612b77565b505050565b606060008214156129c1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612afd565b600082905060005b600082146129f35780806129dc90613fd3565b915050600a826129ec9190613d8a565b91506129c9565b60008167ffffffffffffffff811115612a0f57612a0e614106565b5b6040519080825280601f01601f191660200182016040528015612a415781602001600182028036833780820191505090505b50905060008290505b60008614612af557600181612a5f9190613e15565b90506000600a8088612a719190613d8a565b612a7b9190613dbb565b87612a869190613e15565b6030612a929190613d53565b905060008160f81b905080848481518110612ab057612aaf6140d7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a88612aec9190613d8a565b97505050612a4a565b819450505050505b919050565b60008082905060005b8451811015612b6c576000858281518110612b2957612b286140d7565b5b60200260200101519050808311612b4b57612b448382612c3e565b9250612b58565b612b558184612c3e565b92505b508080612b6490613fd3565b915050612b0b565b508091505092915050565b6000612bd9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c559092919063ffffffff16565b9050600081511115612c395780806020019051810190612bf99190613314565b612c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2f90613ba9565b60405180910390fd5b5b505050565b600082600052816020526040600020905092915050565b6060612c648484600085612c6d565b90509392505050565b606082471015612cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca990613b09565b60405180910390fd5b612cbb85612d81565b612cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf190613b89565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612d2391906138fe565b60006040518083038185875af1925050503d8060008114612d60576040519150601f19603f3d011682016040523d82523d6000602084013e612d65565b606091505b5091509150612d75828286612da4565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315612db457829050612e04565b600083511115612dc75782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfb9190613a87565b60405180910390fd5b9392505050565b828054612e1790613f70565b90600052602060002090601f016020900481019282612e395760008555612e80565b82601f10612e5257803560ff1916838001178555612e80565b82800160010185558215612e80579182015b82811115612e7f578235825591602001919060010190612e64565b5b509050612e8d9190612e91565b5090565b5b80821115612eaa576000816000905550600101612e92565b5090565b6000612ec1612ebc84613c69565b613c44565b905082815260208101848484011115612edd57612edc614144565b5b612ee8848285613f2e565b509392505050565b600081359050612eff8161441e565b92915050565b600081359050612f1481614435565b92915050565b60008083601f840112612f3057612f2f61413a565b5b8235905067ffffffffffffffff811115612f4d57612f4c614135565b5b602083019150836020820283011115612f6957612f6861413f565b5b9250929050565b600081359050612f7f8161444c565b92915050565b600081519050612f948161444c565b92915050565b600081359050612fa981614463565b92915050565b600081359050612fbe8161447a565b92915050565b600081519050612fd38161447a565b92915050565b600082601f830112612fee57612fed61413a565b5b8135612ffe848260208601612eae565b91505092915050565b60008135905061301681614491565b92915050565b60008083601f8401126130325761303161413a565b5b8235905067ffffffffffffffff81111561304f5761304e614135565b5b60208301915083600182028301111561306b5761306a61413f565b5b9250929050565b600081359050613081816144a8565b92915050565b600081519050613096816144a8565b92915050565b6000602082840312156130b2576130b161414e565b5b60006130c084828501612ef0565b91505092915050565b6000602082840312156130df576130de61414e565b5b60006130ed84828501612f05565b91505092915050565b6000806040838503121561310d5761310c61414e565b5b600061311b85828601612ef0565b925050602061312c85828601612ef0565b9150509250929050565b60008060006060848603121561314f5761314e61414e565b5b600061315d86828701612ef0565b935050602061316e86828701612ef0565b925050604061317f86828701613072565b9150509250925092565b600080600080608085870312156131a3576131a261414e565b5b60006131b187828801612ef0565b94505060206131c287828801612ef0565b93505060406131d387828801613072565b925050606085013567ffffffffffffffff8111156131f4576131f3614149565b5b61320087828801612fd9565b91505092959194509250565b600080604083850312156132235761322261414e565b5b600061323185828601612ef0565b925050602061324285828601612f70565b9150509250929050565b600080604083850312156132635761326261414e565b5b600061327185828601612ef0565b925050602061328285828601613072565b9150509250929050565b6000806000806000608086880312156132a8576132a761414e565b5b60006132b688828901612ef0565b95505060206132c788828901613072565b94505060406132d888828901613072565b935050606086013567ffffffffffffffff8111156132f9576132f8614149565b5b61330588828901612f1a565b92509250509295509295909350565b60006020828403121561332a5761332961414e565b5b600061333884828501612f85565b91505092915050565b600080604083850312156133585761335761414e565b5b600061336685828601612f70565b925050602061337785828601612f70565b9150509250929050565b6000602082840312156133975761339661414e565b5b60006133a584828501612f9a565b91505092915050565b6000602082840312156133c4576133c361414e565b5b60006133d284828501612faf565b91505092915050565b6000602082840312156133f1576133f061414e565b5b60006133ff84828501612fc4565b91505092915050565b60006020828403121561341e5761341d61414e565b5b600061342c84828501613007565b91505092915050565b6000806040838503121561344c5761344b61414e565b5b600061345a85828601613007565b925050602061346b85828601612ef0565b9150509250929050565b6000806020838503121561348c5761348b61414e565b5b600083013567ffffffffffffffff8111156134aa576134a9614149565b5b6134b68582860161301c565b92509250509250929050565b6000602082840312156134d8576134d761414e565b5b60006134e684828501613072565b91505092915050565b6000602082840312156135055761350461414e565b5b600061351384828501613087565b91505092915050565b61352581613ef8565b82525050565b61353481613e49565b82525050565b61354b61354682613e49565b61401c565b82525050565b61355a81613e6d565b82525050565b61356981613e79565b82525050565b600061357a82613caf565b6135848185613cc5565b9350613594818560208601613f3d565b61359d81614153565b840191505092915050565b60006135b382613caf565b6135bd8185613cd6565b93506135cd818560208601613f3d565b80840191505092915050565b60006135e482613cba565b6135ee8185613ce1565b93506135fe818560208601613f3d565b61360781614153565b840191505092915050565b600061361d82613cba565b6136278185613cf2565b9350613637818560208601613f3d565b80840191505092915050565b6000815461365081613f70565b61365a8186613cf2565b945060018216600081146136755760018114613686576136b9565b60ff198316865281860193506136b9565b61368f85613c9a565b60005b838110156136b157815481890152600182019150602081019050613692565b838801955050505b50505092915050565b60006136cf602683613ce1565b91506136da82614171565b604082019050919050565b60006136f2603a83613ce1565b91506136fd826141c0565b604082019050919050565b6000613715601d83613ce1565b91506137208261420f565b602082019050919050565b6000613738602683613ce1565b915061374382614238565b604082019050919050565b600061375b602b83613ce1565b915061376682614287565b604082019050919050565b600061377e601183613ce1565b9150613789826142d6565b602082019050919050565b60006137a1601083613ce1565b91506137ac826142ff565b602082019050919050565b60006137c4600083613cc5565b91506137cf82614328565b600082019050919050565b60006137e7600083613cd6565b91506137f282614328565b600082019050919050565b600061380a601d83613ce1565b91506138158261432b565b602082019050919050565b600061382d602a83613ce1565b915061383882614354565b604082019050919050565b6000613850600e83613ce1565b915061385b826143a3565b602082019050919050565b6000613873600e83613ce1565b915061387e826143cc565b602082019050919050565b6000613896600a83613ce1565b91506138a1826143f5565b602082019050919050565b6138b581613ee1565b82525050565b6138cc6138c782613ee1565b614040565b82525050565b60006138de828561353a565b6014820191506138ee82846138bb565b6020820191508190509392505050565b600061390a82846135a8565b915081905092915050565b60006139218285613643565b915061392d8284613612565b91508190509392505050565b6000613944826137da565b9150819050919050565b6000602082019050613963600083018461352b565b92915050565b600060408201905061397e600083018561351c565b61398b60208301846138ac565b9392505050565b60006080820190506139a7600083018761352b565b6139b4602083018661352b565b6139c160408301856138ac565b81810360608301526139d3818461356f565b905095945050505050565b60006080820190506139f3600083018661352b565b613a00602083018561352b565b613a0d60408301846138ac565b8181036060830152613a1e816137b7565b9050949350505050565b6000604082019050613a3d600083018561352b565b613a4a60208301846138ac565b9392505050565b6000602082019050613a666000830184613551565b92915050565b6000602082019050613a816000830184613560565b92915050565b60006020820190508181036000830152613aa181846135d9565b905092915050565b60006020820190508181036000830152613ac2816136c2565b9050919050565b60006020820190508181036000830152613ae2816136e5565b9050919050565b60006020820190508181036000830152613b0281613708565b9050919050565b60006020820190508181036000830152613b228161372b565b9050919050565b60006020820190508181036000830152613b428161374e565b9050919050565b60006020820190508181036000830152613b6281613771565b9050919050565b60006020820190508181036000830152613b8281613794565b9050919050565b60006020820190508181036000830152613ba2816137fd565b9050919050565b60006020820190508181036000830152613bc281613820565b9050919050565b60006020820190508181036000830152613be281613843565b9050919050565b60006020820190508181036000830152613c0281613866565b9050919050565b60006020820190508181036000830152613c2281613889565b9050919050565b6000602082019050613c3e60008301846138ac565b92915050565b6000613c4e613c5f565b9050613c5a8282613fa2565b919050565b6000604051905090565b600067ffffffffffffffff821115613c8457613c83614106565b5b613c8d82614153565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d0882613ee1565b9150613d1383613ee1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d4857613d4761404a565b5b828201905092915050565b6000613d5e82613eeb565b9150613d6983613eeb565b92508260ff03821115613d7f57613d7e61404a565b5b828201905092915050565b6000613d9582613ee1565b9150613da083613ee1565b925082613db057613daf614079565b5b828204905092915050565b6000613dc682613ee1565b9150613dd183613ee1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e0a57613e0961404a565b5b828202905092915050565b6000613e2082613ee1565b9150613e2b83613ee1565b925082821015613e3e57613e3d61404a565b5b828203905092915050565b6000613e5482613ec1565b9050919050565b6000613e6682613ec1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000613eba82613e49565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000613f0382613f0a565b9050919050565b6000613f1582613f1c565b9050919050565b6000613f2782613ec1565b9050919050565b82818337600083830152505050565b60005b83811015613f5b578082015181840152602081019050613f40565b83811115613f6a576000848401525b50505050565b60006002820490506001821680613f8857607f821691505b60208210811415613f9c57613f9b6140a8565b5b50919050565b613fab82614153565b810181811067ffffffffffffffff82111715613fca57613fc9614106565b5b80604052505050565b6000613fde82613ee1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140115761401061404a565b5b600182019050919050565b60006140278261402e565b9050919050565b600061403982614164565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f494e56414c49445f524543495049454e54000000000000000000000000000000600082015250565b7f554e534146455f524543495049454e5400000000000000000000000000000000600082015250565b50565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f414c52454144595f4d494e544544000000000000000000000000000000000000600082015250565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b7f57524f4e475f46524f4d00000000000000000000000000000000000000000000600082015250565b61442781613e49565b811461443257600080fd5b50565b61443e81613e5b565b811461444957600080fd5b50565b61445581613e6d565b811461446057600080fd5b50565b61446c81613e79565b811461447757600080fd5b50565b61448381613e83565b811461448e57600080fd5b50565b61449a81613eaf565b81146144a557600080fd5b50565b6144b181613ee1565b81146144bc57600080fd5b5056fea26469706673582212205337b9cf935a64b56d3ce7689b07e45830db83db88a3c54d6dc9869fd0e04e5564736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000094d6f6f6e6c696e6773000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d4f4f4e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000069dc1e5b2b5ae220d91f80ea500192ca4234d554000000000000000000000000e8096f98e90daaebfd4822ed391b6806b377436c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003
-----Decoded View---------------
Arg [0] : name (string): Moonlings
Arg [1] : symbol (string): MOON
Arg [2] : payees (address[]): 0x69dC1e5b2b5AE220D91f80ea500192cA4234D554,0xE8096F98e90daAEBFd4822ED391b6806b377436C
Arg [3] : shares (uint256[]): 1,3
-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [5] : 4d6f6f6e6c696e67730000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 4d4f4f4e00000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [9] : 00000000000000000000000069dc1e5b2b5ae220d91f80ea500192ca4234d554
Arg [10] : 000000000000000000000000e8096f98e90daaebfd4822ed391b6806b377436c
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000003
Loading...
Loading
Loading...
Loading
[ 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.