Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 758 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 24560700 | 5 days ago | IN | 0 ETH | 0.00009443 | ||||
| Set Approval For... | 24550807 | 6 days ago | IN | 0 ETH | 0.00000381 | ||||
| Set Approval For... | 18802788 | 810 days ago | IN | 0 ETH | 0.00079222 | ||||
| Set Approval For... | 18694652 | 825 days ago | IN | 0 ETH | 0.00146341 | ||||
| Safe Transfer Fr... | 18495140 | 853 days ago | IN | 0 ETH | 0.00056249 | ||||
| Set Approval For... | 18487372 | 854 days ago | IN | 0 ETH | 0.00058063 | ||||
| Set Approval For... | 18450229 | 860 days ago | IN | 0 ETH | 0.0010207 | ||||
| Safe Transfer Fr... | 18442238 | 861 days ago | IN | 0 ETH | 0.00117369 | ||||
| Set Approval For... | 18375825 | 870 days ago | IN | 0 ETH | 0.00028289 | ||||
| Safe Transfer Fr... | 18362493 | 872 days ago | IN | 0 ETH | 0.00043674 | ||||
| Set Approval For... | 18340048 | 875 days ago | IN | 0 ETH | 0.00026557 | ||||
| Safe Transfer Fr... | 18326909 | 877 days ago | IN | 0 ETH | 0.00038741 | ||||
| Set Approval For... | 18311420 | 879 days ago | IN | 0 ETH | 0.00025981 | ||||
| Set Approval For... | 18287844 | 882 days ago | IN | 0 ETH | 0.00028679 | ||||
| Set Approval For... | 18274845 | 884 days ago | IN | 0 ETH | 0.00027892 | ||||
| Safe Transfer Fr... | 18179395 | 897 days ago | IN | 0 ETH | 0.00150529 | ||||
| Safe Transfer Fr... | 18129302 | 904 days ago | IN | 0 ETH | 0.00083899 | ||||
| Safe Transfer Fr... | 18114516 | 907 days ago | IN | 0 ETH | 0.00141993 | ||||
| Safe Transfer Fr... | 18114412 | 907 days ago | IN | 0 ETH | 0.00158516 | ||||
| Safe Transfer Fr... | 18095737 | 909 days ago | IN | 0 ETH | 0.00048904 | ||||
| Set Approval For... | 17903778 | 936 days ago | IN | 0 ETH | 0.00049822 | ||||
| Safe Transfer Fr... | 17875634 | 940 days ago | IN | 0 ETH | 0.00070699 | ||||
| Safe Transfer Fr... | 17859988 | 942 days ago | IN | 0 ETH | 0.00079623 | ||||
| Safe Transfer Fr... | 17836200 | 945 days ago | IN | 0 ETH | 0.00171817 | ||||
| Safe Transfer Fr... | 17823263 | 947 days ago | IN | 0 ETH | 0.00082077 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 17098310 | 1049 days ago | 0.84 ETH | ||||
| Transfer | 17075345 | 1052 days ago | 0.42 ETH | ||||
| Transfer | 17049710 | 1056 days ago | 0.48 ETH | ||||
| Transfer | 17018966 | 1061 days ago | 0.3 ETH | ||||
| Transfer | 16985516 | 1065 days ago | 0.42 ETH | ||||
| Transfer | 16969975 | 1068 days ago | 0.12 ETH | ||||
| Transfer | 16936546 | 1072 days ago | 0.18 ETH | ||||
| Transfer | 16933435 | 1073 days ago | 0.3 ETH | ||||
| Transfer | 16921819 | 1074 days ago | 0.18 ETH | ||||
| Transfer | 16910624 | 1076 days ago | 0.36 ETH | ||||
| Transfer | 16703477 | 1105 days ago | 0.36 ETH | ||||
| Transfer | 16414948 | 1145 days ago | 0.12 ETH | ||||
| Transfer | 16267032 | 1166 days ago | 0.12 ETH | ||||
| Transfer | 16263642 | 1166 days ago | 0.72 ETH | ||||
| Transfer | 16178758 | 1178 days ago | 0.24 ETH | ||||
| Transfer | 16113610 | 1187 days ago | 0.06 ETH | ||||
| Transfer | 16062867 | 1195 days ago | 0.12 ETH | ||||
| Transfer | 15973992 | 1207 days ago | 0.12 ETH | ||||
| Transfer | 15943986 | 1211 days ago | 0.06 ETH | ||||
| Transfer | 15913268 | 1215 days ago | 0.36 ETH | ||||
| Transfer | 15883574 | 1220 days ago | 0.12 ETH | ||||
| Transfer | 15843189 | 1225 days ago | 0.12 ETH | ||||
| Transfer | 15812179 | 1230 days ago | 1.14 ETH | ||||
| Transfer | 15725123 | 1242 days ago | 0.12 ETH | ||||
| Transfer | 15664472 | 1250 days ago | 0.3 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
CryptoCloudPunks
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-07-16
*/
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "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");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or 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 {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/ERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/IERC1155Receiver.sol
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)
pragma solidity ^0.8.0;
/**
* @dev _Available since v3.1._
*/
interface IERC1155Receiver is IERC165 {
/**
* @dev Handles the receipt of a single ERC1155 token type. This function is
* called at the end of a `safeTransferFrom` after the balance has been updated.
*
* NOTE: To accept the transfer, this must return
* `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
* (i.e. 0xf23a6e61, or its own function selector).
*
* @param operator The address which initiated the transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param id The ID of the token being transferred
* @param value The amount of tokens being transferred
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
*/
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
) external returns (bytes4);
/**
* @dev Handles the receipt of a multiple ERC1155 token types. This function
* is called at the end of a `safeBatchTransferFrom` after the balances have
* been updated.
*
* NOTE: To accept the transfer(s), this must return
* `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
* (i.e. 0xbc197c81, or its own function selector).
*
* @param operator The address which initiated the batch transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param ids An array containing ids of each token being transferred (order and length must match values array)
* @param values An array containing amounts of each token being transferred (order and length must match ids array)
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
*/
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
) external returns (bytes4);
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/IERC1155.sol
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)
pragma solidity ^0.8.0;
/**
* @dev Required interface of an ERC1155 compliant contract, as defined in the
* https://eips.ethereum.org/EIPS/eip-1155[EIP].
*
* _Available since v3.1._
*/
interface IERC1155 is IERC165 {
/**
* @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
*/
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
/**
* @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
* transfers.
*/
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
/**
* @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
* `approved`.
*/
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
/**
* @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
*
* If an {URI} event was emitted for `id`, the standard
* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
* returned by {IERC1155MetadataURI-uri}.
*/
event URI(string value, uint256 indexed id);
/**
* @dev Returns the amount of tokens of token type `id` owned by `account`.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) external view returns (uint256);
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
external
view
returns (uint256[] memory);
/**
* @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
*
* Emits an {ApprovalForAll} event.
*
* Requirements:
*
* - `operator` cannot be the caller.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address account, address operator) external view returns (bool);
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
* - `from` must have a balance of tokens of type `id` of at least `amount`.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes calldata data
) external;
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) external;
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the optional ERC1155MetadataExtension interface, as defined
* in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
*
* _Available since v3.1._
*/
interface IERC1155MetadataURI is IERC1155 {
/**
* @dev Returns the URI for token type `id`.
*
* If the `\{id\}` substring is present in the URI, it must be replaced by
* clients with the actual token type ID.
*/
function uri(uint256 id) external view returns (string memory);
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/ERC1155.sol
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the basic standard multi-token.
* See https://eips.ethereum.org/EIPS/eip-1155
* Originally based on code by Enjin: https://github.com/enjin/erc-1155
*
* _Available since v3.1._
*/
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
using Address for address;
// Mapping from token ID to account balances
mapping(uint256 => mapping(address => uint256)) private _balances;
// Mapping from account to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
// Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
string private _uri;
/**
* @dev See {_setURI}.
*/
constructor(string memory uri_) {
_setURI(uri_);
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC1155).interfaceId ||
interfaceId == type(IERC1155MetadataURI).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC1155MetadataURI-uri}.
*
* This implementation returns the same URI for *all* token types. It relies
* on the token type ID substitution mechanism
* https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
*
* Clients calling this function must replace the `\{id\}` substring with the
* actual token type ID.
*/
function uri(uint256) public view virtual override returns (string memory) {
return _uri;
}
/**
* @dev See {IERC1155-balanceOf}.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
require(account != address(0), "ERC1155: address zero is not a valid owner");
return _balances[id][account];
}
/**
* @dev See {IERC1155-balanceOfBatch}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
public
view
virtual
override
returns (uint256[] memory)
{
require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");
uint256[] memory batchBalances = new uint256[](accounts.length);
for (uint256 i = 0; i < accounts.length; ++i) {
batchBalances[i] = balanceOf(accounts[i], ids[i]);
}
return batchBalances;
}
/**
* @dev See {IERC1155-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC1155-isApprovedForAll}.
*/
function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
return _operatorApprovals[account][operator];
}
/**
* @dev See {IERC1155-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) public virtual override {
require(
from == _msgSender() || isApprovedForAll(from, _msgSender()),
"ERC1155: caller is not token owner nor approved"
);
_safeTransferFrom(from, to, id, amount, data);
}
/**
* @dev See {IERC1155-safeBatchTransferFrom}.
*/
function safeBatchTransferFrom(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) public virtual override {
require(
from == _msgSender() || isApprovedForAll(from, _msgSender()),
"ERC1155: caller is not token owner nor approved"
);
_safeBatchTransferFrom(from, to, ids, amounts, data);
}
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `from` must have a balance of tokens of type `id` of at least `amount`.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function _safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) internal virtual {
require(to != address(0), "ERC1155: transfer to the zero address");
address operator = _msgSender();
uint256[] memory ids = _asSingletonArray(id);
uint256[] memory amounts = _asSingletonArray(amount);
_beforeTokenTransfer(operator, from, to, ids, amounts, data);
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
unchecked {
_balances[id][from] = fromBalance - amount;
}
_balances[id][to] += amount;
emit TransferSingle(operator, from, to, id, amount);
_afterTokenTransfer(operator, from, to, ids, amounts, data);
_doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function _safeBatchTransferFrom(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
require(to != address(0), "ERC1155: transfer to the zero address");
address operator = _msgSender();
_beforeTokenTransfer(operator, from, to, ids, amounts, data);
for (uint256 i = 0; i < ids.length; ++i) {
uint256 id = ids[i];
uint256 amount = amounts[i];
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
unchecked {
_balances[id][from] = fromBalance - amount;
}
_balances[id][to] += amount;
}
emit TransferBatch(operator, from, to, ids, amounts);
_afterTokenTransfer(operator, from, to, ids, amounts, data);
_doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
}
/**
* @dev Sets a new URI for all token types, by relying on the token type ID
* substitution mechanism
* https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
*
* By this mechanism, any occurrence of the `\{id\}` substring in either the
* URI or any of the amounts in the JSON file at said URI will be replaced by
* clients with the token type ID.
*
* For example, the `https://token-cdn-domain/\{id\}.json` URI would be
* interpreted by clients as
* `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
* for token type ID 0x4cce0.
*
* See {uri}.
*
* Because these URIs cannot be meaningfully represented by the {URI} event,
* this function emits no events.
*/
function _setURI(string memory newuri) internal virtual {
_uri = newuri;
}
/**
* @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function _mint(
address to,
uint256 id,
uint256 amount,
bytes memory data
) internal virtual {
require(to != address(0), "ERC1155: mint to the zero address");
address operator = _msgSender();
uint256[] memory ids = _asSingletonArray(id);
uint256[] memory amounts = _asSingletonArray(amount);
_beforeTokenTransfer(operator, address(0), to, ids, amounts, data);
_balances[id][to] += amount;
emit TransferSingle(operator, address(0), to, id, amount);
_afterTokenTransfer(operator, address(0), to, ids, amounts, data);
_doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function _mintBatch(
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
require(to != address(0), "ERC1155: mint to the zero address");
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
address operator = _msgSender();
_beforeTokenTransfer(operator, address(0), to, ids, amounts, data);
for (uint256 i = 0; i < ids.length; i++) {
_balances[ids[i]][to] += amounts[i];
}
emit TransferBatch(operator, address(0), to, ids, amounts);
_afterTokenTransfer(operator, address(0), to, ids, amounts, data);
_doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
}
/**
* @dev Destroys `amount` tokens of token type `id` from `from`
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `from` must have at least `amount` tokens of token type `id`.
*/
function _burn(
address from,
uint256 id,
uint256 amount
) internal virtual {
require(from != address(0), "ERC1155: burn from the zero address");
address operator = _msgSender();
uint256[] memory ids = _asSingletonArray(id);
uint256[] memory amounts = _asSingletonArray(amount);
_beforeTokenTransfer(operator, from, address(0), ids, amounts, "");
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
unchecked {
_balances[id][from] = fromBalance - amount;
}
emit TransferSingle(operator, from, address(0), id, amount);
_afterTokenTransfer(operator, from, address(0), ids, amounts, "");
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
*/
function _burnBatch(
address from,
uint256[] memory ids,
uint256[] memory amounts
) internal virtual {
require(from != address(0), "ERC1155: burn from the zero address");
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
address operator = _msgSender();
_beforeTokenTransfer(operator, from, address(0), ids, amounts, "");
for (uint256 i = 0; i < ids.length; i++) {
uint256 id = ids[i];
uint256 amount = amounts[i];
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
unchecked {
_balances[id][from] = fromBalance - amount;
}
}
emit TransferBatch(operator, from, address(0), ids, amounts);
_afterTokenTransfer(operator, from, address(0), ids, amounts, "");
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC1155: setting approval status for self");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning, as well as batched variants.
*
* The same hook is called on both single and batched variants. For single
* transfers, the length of the `ids` and `amounts` arrays will be 1.
*
* Calling conditions (for each `id` and `amount` pair):
*
* - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* of token type `id` will be transferred to `to`.
* - When `from` is zero, `amount` tokens of token type `id` will be minted
* for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
* will be burned.
* - `from` and `to` are never both zero.
* - `ids` and `amounts` have the same, non-zero length.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {}
/**
* @dev Hook that is called after any token transfer. This includes minting
* and burning, as well as batched variants.
*
* The same hook is called on both single and batched variants. For single
* transfers, the length of the `id` and `amount` arrays will be 1.
*
* Calling conditions (for each `id` and `amount` pair):
*
* - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* of token type `id` will be transferred to `to`.
* - When `from` is zero, `amount` tokens of token type `id` will be minted
* for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
* will be burned.
* - `from` and `to` are never both zero.
* - `ids` and `amounts` have the same, non-zero length.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {}
function _doSafeTransferAcceptanceCheck(
address operator,
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) private {
if (to.isContract()) {
try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
if (response != IERC1155Receiver.onERC1155Received.selector) {
revert("ERC1155: ERC1155Receiver rejected tokens");
}
} catch Error(string memory reason) {
revert(reason);
} catch {
revert("ERC1155: transfer to non-ERC1155Receiver implementer");
}
}
}
function _doSafeBatchTransferAcceptanceCheck(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) private {
if (to.isContract()) {
try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
bytes4 response
) {
if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
revert("ERC1155: ERC1155Receiver rejected tokens");
}
} catch Error(string memory reason) {
revert(reason);
} catch {
revert("ERC1155: transfer to non-ERC1155Receiver implementer");
}
}
}
function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
uint256[] memory array = new uint256[](1);
array[0] = element;
return array;
}
}
// File: contracts/CryptoCloudPunks.sol
pragma solidity ^ 0.8.7;
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#########################################################
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&####################################################################
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#################################################################################
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&########################################################################################
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#############################################################################################
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&###############################################################################################
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&##BBBBBBB#####&&#############&&&####BBBBBBBB#####&#######BGGGGGBBBBBBBBBBBB####&&#########################
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&##BPY?7!~~~!7?JJJYPGGP55B###########GPY?7!~~~!7??JJYPGGP55B####G~^~~~!!7?JJYPGPPYJ??7777J5B#######################
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#BB5JJJJJYY55PPGGGGGGBBGGY~P#######BG5JJJJJYY55PPGGGGGGBBGBY~G###GJ^Y5PGGGGBBBBBBBBBGGGP5Y?7~~75#####################
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&GYPBBGGBBBB#BBBBBBBBBBBBG55~?55&&#GYPBBGGBBBBBBBBBBBGBGBBBG55~7P5&G5!JGPGBBBBGGGGGGGGGBBBBBBBBG5Y??G###################
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&P?JPBBBBBBBGGGPPPPPPP5PPPP55!.5JP&P?JPBBBBBBBGGGPPPPPPPPPPPP557.5J5#PPJGGGGGGGGPPG5YYYY55PPPPPGGBBGGG5B##################
// &&&&&&&&&&&&&&&&&&&&&&&&&&&B7~JGGB#BBGGGPPP55Y55555YYYYYJ.~PYG7~JGGBBBBGGGPP555Y55555YYYYYJ.~PJ#BBPBBGGPPPPPGGP??J?!^755555PPGBGGBY55B################
// &&&&&&&&&&&&&&&&&&&&&&&&&&P:^YPGBBBGGGP5J7!?Y5GBBBGP5Y?7!~PGY:^YPGBBBGGGP5Y7!7Y5PBBBGP5Y?7!~5GG##Y5BGGGPPPPGGBGYG##B!.J5PP5PPPGPPG??YG################
// &&&&&&&&&&&&&&&&&&&&&&&&&G^^YPBBBGGGP5J~:7PBG5JJ?JY5PB#BBG#P^^YPGBBGGGP5J~:?5GG5YJJJ5PPB#BGG####P!5BGGGGGGGGBPJ5GGGJ:~Y5GPPPPPGP5Y^JPG################
// &&&&&&&&&&&&&&&&&&&&&&&&#?~5PGBBGGGG5J:^PB5JJY5PPGGGPG#####?~5PGBBGGGG5Y^~PB5YJY55PGGGPG######BB!!PGBBGGGGGGG5???777JPGBGGPPPPPYJ:^P5B################
// &&&&&&&&&&&&&&&&&&&&&&&&G7YGGBBGGGGP5!~G#5G#&&&&&######B##G7YGGBBGGGGP57!G#PYG###B########BB##G?.?PPGGGGGGBGGGGGPPBBB##BGGGPP5J7:!PY5#################
// &&&&&&&&&&&&&&&&&&&&&&&&Y!PGGBBGGGGP5~7B##############BB##5!PGGBBGGGGPP?YB##PB###PB#######BB#BP^^5PGGGGGGBBBB#B#PGBBBBGGGGPPY?775P?J##################
// &&&&&&&&&&&&&&&&&&&&&&&&Y!PGGBBBBBBPP77B&#############BB##Y!PGGBBBBBBGG55BBBGBBBB5BBBB####BB#BY~JPGBBBBBGGG5YJ????JJJJYY5PGGPPGPJ?P###################
// &&&&&&&&&&&&&&&&&&&&&&#&G75GGBBBBB#BGGPPGBBBBBGGGPPP5PPG##G75GGBBBBBBBBBGGGGPGPPPY5PPPGBBBBGBBYYGGBBBBBGGGJ!!~~~~~!7?J5PB#BBP5YYP#####################
// &&&&&&&&&&&&&&&&&&&&#####?!PPGBBBB##BBBBPJJ?7!!~~~~!!~?G###JJGGBBBBBGGGP55YYYYYJJ7??JJY5PGGPBBPBBBBBBBBGBGYYGBBBBB######BGP5PGB#######################
// &&&&&&&&&&&&&&&&&&#######P:~Y5GBBB######BBGGGGGGGGGG57YYB##GJYGGGPP5555Y????7??7777777?J5P5YBBBBBBBBBBBB#GBB#BBBBBB#B#################################
// &&&&&&&&&&&&&&&&&########BP^:?5GBB###############BBBPP5JBBBBPJYYJJ?7?JJJJ?7?7777??????JJ5P5JGGBBBBBBBBB#BJG#####BB####################################
// &&&&&&&&&&&&&&&&#########GGBY77YGGBBBBBB##BB##BBBB#BG#P5BBG5J7!!777!!7????777?7?????JJJYYPY?GGGBBBGGPPPGJ?B#####BB####################################
// &&&&&&&&&&&&&&&###########P5B#G5GGP555555YYJJJJJJYYJPBPPBPJ!~!!!!!7!!!!7???7?JJJJ?????JY55YJGGPPPGG5YJJJJP######BB####################################
// &&&&&&&&&&&&&&&############B5Y5GB#BPYJJ7!!~^~~!7?Y5GBBPPP!^^~~~~^^~!7!~!7?J??JJJJJJJYY55PP5YGPPP5PGGGGBBBB######BB####################################
// &&&&&&&&&&&&&&&##############B5J??JYPPGPPPPGBB#####BBBGY~::^^^^^^^^!!~!7?JY?JJ55YYY55PPPPPP5GGP55PGGGGBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
// &&&&&&&&&&&&&&################&&#BP5YYYYYY5G###BBBBBBB5~:::^^^:^^^~~~!7?JJYJ5Y555JY555555555P55YYPGBBBBBBB#BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
// &&&&&&&&&&&&&####################################BBBBG7^::::^^^^~~!~!!?JJJYJY5YYY5GGGGGPP55YYJJYY5GBBBB#BG#BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
// &&&&&&&&&&&&&####################################BBBBG?~^::^^^^^~~~~~7YYYYYYYYY?J5GGGGGGGGGP555YYPPGBBB#BP#BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
// &&&&&&&&&&&&#####################################BBBBB5~~^^~^^:^~^~!!?55PPGGGGP5PGGGGGGBBBGGGGP5YPGBBBB#BP##BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
// &&&&&&&&&&&&####################################BBBBBB5~^^^~^^:^~~~~!!?YGBBBBBBBBBBBBBBBBBBGBBGPPGBBBBB#BG#B##########################################
// &&&&&&&&&&&######################################BBBBBJ:::^^~7!77!~~!!7J5PGBBBBBBBBBBBBBBBGGBBBBBBBBBBB#BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
// &&&&&&&&&&&#######################################BBBBPJJ7~?YPJ5P5YY55PGGGPPGBBBBBBBBBBGP5PBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
// &&&&&&&&&&########################################BBBBGPGGG5JPY5GBBBBGGBBGGGGGBBBBBBBGPY5GBBBBBBBBBBB#BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
// &&&&&&&&&&########################################BBBBBBBP5PJJYYGBGGBPPGGPYGGGPPPPGGGGGGBBBBBBBBBBBGB#BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
// &&&&&&&&&######################################B####BBBBBBY7!7J?JY55GP555J5GPPGGBBBBBBBBBBBBBBBBB#BGBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
// &&&&&&&&#######################################BB####BBBBB57?JYJJ777JJJYJPGPGGBBBBBBBBBBBGBBBBBBB#BPBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
// &&&&&&&&#######################################BB######BBBGPGGPY5YY55YYPGGGGBBBBBBBBBBBBGGGBBBBBB#BPB#BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
// &&&&&&&&#######################################BB######BBBBBBBGGPGGPP55BBBBBBBBBBBBBBBBBBBGBBBBBB#B5B#BB#BBBBBBBB#BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
// &&&&&&&&&######################################BB######BB#BBBBPPBGPPY5PGGGBBBBBBBBBBBBBBBBGGGB#BB#BJB#BB#BBBBBBBB#BB#BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
// &&&&&&&&&###############################BB#####BB######BB##BBBGJ5Y5YJYP5GGGBBBBBBBBBBBBBBBGGPB#BB#B?G#BB#BBBBBBBB#GG#BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
// &&&&&&&&&&##############################BB#####GB######BB###BBBP5YYJYYGGPBBBBBBGBBGGBBBBBGGBGBBBB#BJB#BB#BBBBB#BB#PP#BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
// &&&&&&&&&&##############################BB#####GG######B#####BBB5YY5PPGBBBBBBBGPGGGBGBBBBBBBBBBBB#B5B#GG#BBBBBBBB#GG#BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
// &&&&&&&&&&&#############################BB#####PPB#####BB#####BBBGBBBGGBBBBBGGPYGBBBGBBB###BGG#BBBBPB#PP#B#BGB#BB#BB#BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
// &&&&&&&&&&&#########################B###GG#####55B#####BB######B##BGGGGGGBGGPPPPBBBBGB#####BGG#BBBBGB#GG#B#BGB#BB#BB#BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
// &&&&&&&&&&&&########################G###GP#####YJB#####BB#########BBBGGGGPPGGGPPBB#BGB######PG#BBBBGB#BB#B#GPB#B##BB#BBBB#BBB#BBBBBBBBBBBBBBBBBBBBBBBB
// &&&&&&&&&&&&&#######################B###P5####BJ?GBBBB#GB#BBB####BBGG5Y55Y5PGGP5BBBGPBBBBBBBJYBBBBBBB#BB###G5BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
// &&&&&&&&&&&&&################BBBBBBBBBBBYJBBBGGJJGBGGPP?JYYJ???JYYYYJ?JYYYYJJ57~?Y5Y75P5YJYY~7P5PPPPGBGPPPGY7GBBBGGGGGGGGGGGBBBBBBBBBBBBBBBBBBBBBBBBBB
// &&&&&&&&&&&&&&##############BBBBBBBGGGGP7!55YY?:.~~!??7^~!!77?7!::~!~^~7Y5PJ!7~:~YPY~YYJ??J7:.^^^~~~~~^!?JJ!^?JJJYYY5YPPPGGGBBBBBBBBBBBBBBBBBBBBBBBBBB
// &&&&&&&&#####################BBBGGP5YJ??!!?7!77~~7!:^7J~?555YYYJJJ?JJJJJJJJJJJJJJJJ7:?JJJJJJ^~777!~!??7!~^:..^^:^~7JYJPGGBBBBBB#########BBBBBBBBBBBBBB
// &&&&&&&#########BBBBBBBBGGGGPPP555YJ7!~^..^:^!7?YP5YYYJ^~7?JJJJYYY55555PPPPPPPPPPPPJ~Y55YYYJ~~J?JJJ?JJJJ??J7~JYJ?777!^~7??JYY55PPPGGGBBBBBBBBBBBBBB###
// &&&&&&&&&&&&&######BBBBGGGPP555Y?!?J5PPPJ?Y5PP5??JJ??J?^7J5PGGGBBBBBBB#############GYBBBBBBGY5P55YJ????JYYY7!YYJ!~^^:.....:~!7??JY55PPGGGGBBBBBBBBB###
// ###############BBBBBGGGP55YJJ7~^~7J??7?PPPGP55Y????JY5P?55GBB######################BPB#####BGGBBGGGP5YJ???J7~?5PPY!:~!??7^.~??JYY55PPPGGGGGBBBBBBBBBBB
// #########BBBBBBBBBGGGGGPPP55J!:?5YJ7~:?GP55?JYJ?7!J5PPG5P5G########################BGB######BBBBBBGGP5Y?7????YY5PGGY~!!7?7^.^7?JYY55PPPGGGGGGGGGBBBBBB
// &&&&&############BBBGGP55YJ?~..^7!~:. ~PGPPYJYYJJ77JY5PYP5GBBBB####################BB######BBBBBGGPP5J???JJ?!?YPGGP5PGGGBGJ:!YPPPGGGBBBBBBB###########
// &&&&&&&&&&#####BBGGP5YYJ7!~^^: .!YPP5Y~7YPGBGP5YY7?JJJ?7??YPPPPGBBBBBBB#BB#######BBBGBBBBGGGP555YJJ???JJYJJJYPGPY7^^~!??7!^^!?JJYY55PPGGGGBBBBB#######
// &&&&&&&######BBBBGGPPP55YJJ???7!^^7YPGJ5J7!!7J5PGJ5P55Y???JJJ?!JYYYYY5555?555555555YJYYYYJJJ??JJJJJY555PPP5Y5P5J7!!~:.:. .:^~!77?JYY55PPPGGGGBBBBBB###
// &&&##########BBBBBBBBGGGP55YJ?77!!^:^^::!7JJJY5YJ~!?JY5Y55PPPY755YYYYYYYY7YYYJJYYYYYJY55Y55555PPPPPGGGGP5?!::^7??77!~!7??77!!!!!7?JY55PPGGGGGBBBBBBBBB
// &###############BBBBGGGGGGPPPPPPP5555YJJYJ?7!!^:..:~~^^:!?Y5PY7PPPGGGGGPYJYYYYPGGGP5J??J??7!!?YPPPPPPPP55Y?7~. ::^^!7JJYY55PPPPPPPPPPPPGGGGGBBBBBBBBBB
// &&&&&&&&&&################BBBBBGGGGGP5?7~^:^~!!!~:::~!77?JYYYJ?PPGBBBBPJ. ^~J~JGGGPY!: ::^~^..^~!7!~^:.^JYYY555YJ??JYY5PPGGGGPPGGGGGBBBBBBBBBBBBBBBB##
// &&&&&&&&&&&&&&&&&############BBBGGP5YJJYY555YJJ?JJY55YYYYYJJJJJPGBBBGPY!.:!JYY~75P5Y?!^. :^~~~~^::^!77!7JYPGGBBBBBBGGPPPPPGGBBBBBBBBBGGGGBBBBBBBBBBBBB
// &&&&&&&&&&&&&&&&&&&#########BBBBGGBBBBBGGPPPPGGGGPPPGGGGGGGGBBB#####BGPY?JPPPG7!5GGGPPYJ!!?JJY555J??JY5PGGGGGBBB########BBBBGGBBBB########BBBBBBBBBBBB
// &&&&&&&&&&&&&&&&&&&&&&###########BBBGGGBBBB#BBBBBBBB##BB############BBGPPPGBGB5J5BBBBBBGP5555PGGBBGGPP5PGBB#######################BBBBB#############BB
// &&&&&&&&&&&&&&&&&&&&&&&&&####BBBBBBB#################################BBGGBBBB#G5PB######BBGGGGBBBBBBBBBBGGGBB#########################################
// &&&&&&&&&&&&&&&&&&&&&&####BBBB#######################################BBGBB####BGGB#########BBBBB##########BBBBBB######################################
// &&&&&&&&&&&&&&&&&&&############&&&&&&&&&&&###########################BBBB#####BGGB############################BBBB####################################
// &&&&&&&&&&&&&&&&&&&#&&&&&&&&&&&&&&&&&&&&&&&&&########################BBB######BBBB####################################################################
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&################################BBB####################################################################
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&###################################################################################################
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&################################################################################################
contract CryptoCloudPunks is ERC1155, Ownable {
// editing section starts below here
string public name = "Crypto Cloud Punks"; //name your NFT collection
string public symbol = "CCPS"; //few letters to represent the symbol of your collection
string private ipfsCID = "QmWAE7eWhf1Mq8jeRGuE7brP3186Vpv28QLTDhhrYJVgCU"; // ipfs metadata folder CID as the starting or hidden NFT
uint256 public collectionTotal = 8888; // total number of NFTs to start your collection
uint256 public cost = 0.01 ether; // Phase 1 price per mint
uint256 public maxMintAmount = 20; // max amount a user other than owner can mint at in one session
uint256 public maxBatchMintAmount = 20; // max batch amount a user other than owner can mint at in one session
uint256 public whitelisterLimit = 88; // max amount a whitelisted user can mint during presale
// editing section end
bool public paused = false;
bool public revealed = false;
bool public mintInOrder = true;
uint256 public ogCollectionTotal; // the original collection total
uint256 public tokenNextToMint; //next token index to mint
mapping(uint => string) private tokenURI;
mapping(uint256 => uint256) private currentSupply;
mapping(uint256 => bool) private hasMaxSupply;
mapping(uint256 => uint256) public maxSupply;
mapping(uint256 => bool) private createdToken; // if true token has been minted at least one time or was updated into the collection total
bool public onlyWhitelisted = true;
address[] public whitelistedAddresses;
mapping(address => uint256) public whitelisterMintedBalance;
address payable public payments; //0xCc4e40f98C507501F5DF1BCc8BAE21b4637d6f7b the payout address for the withdraw function
address public admin_1 = 0x522ee4130B819355e10218E40d6Ab0c495219690;
constructor() ERC1155(""){
ogCollectionTotal = collectionTotal;
maxSupply[1] = 1;
hasMaxSupply[1] = true;
createdToken[1] = true;
currentSupply[1] = 1; //sets current supply to the amount minted on deploy
tokenNextToMint = 2; //sets the next token index to mint on deploy
_mint(msg.sender, 1, 1, ""); //sends Owner, NFT id 1, amount 1
}
/**
* @dev The contract developer's website.
*/
function contractDev() public pure returns(string memory){
string memory dev = unicode"🐸 HalfSuperShop.com 🐸";
return dev;
}
/**
* @dev Admin can set the PAUSE state.
* true = closed to Admin Only
* false = open for Presale or Public
*/
function pause(bool _state) public onlyAdmins {
paused = _state;
}
/**
* @dev Allows Admins, Whitelisters, and Public to Mint NFTs in Order from 1-ogCollectionTotal.
* Can only be called by the Public when onlyWhitelisted is false.
*/
function _mintInOrder(uint _numberOfTokensToMint) public payable {
require(mintInOrder, "This Can Only Be Used When mintInOrder is True");
require(!paused, "Contract Paused");
require(!exists(8888), "Collection Minted Out");
require(_numberOfTokensToMint + tokenNextToMint <= ogCollectionTotal + 1, "Exceeds Collection Total, Please Lower Amount");
if (!checkIfAdmin()) {
if (onlyWhitelisted) {
require(isWhitelisted(msg.sender), "Not Whitelisted");
uint256 whitelisterMintedCount = whitelisterMintedBalance[msg.sender];
require(whitelisterMintedCount + _numberOfTokensToMint <= whitelisterLimit, "Exceeded Max Whitelist Mint Limit");
}
require(msg.value >= (_numberOfTokensToMint * costPhase()), "Insufficient Funds");
}
whitelisterMintedBalance[msg.sender] += _numberOfTokensToMint;
uint256[] memory _ids = new uint256[](_numberOfTokensToMint);
uint256[] memory _amounts = new uint256[](_numberOfTokensToMint);
for (uint256 i = 0; i < _numberOfTokensToMint; i++) {
uint256 _id = tokenNextToMint;
if (!exists(_id)) {
createdToken[_id] = true;
maxSupply[_id] = 1;
hasMaxSupply[_id] = true;
currentSupply[_id] = 1;
}
_ids[i] = tokenNextToMint;
_amounts[i] = 1;
tokenNextToMint++;
}
_mintBatch(msg.sender, _ids, _amounts, "");
}
function costPhase() public view returns(uint256){
if (tokenNextToMint <= 100){
return 10000000000000000;
}
if (tokenNextToMint >= 101 && tokenNextToMint <= 300){
return 30000000000000000;
}
if (tokenNextToMint >= 301 && tokenNextToMint <= 8888){
return 60000000000000000;
}
return cost;
}
/**
* @dev Allows Owner, Whitelisters, and Public to Mint a single NFT.
* Can only be called by the Public when onlyWhitelisted is false.
*/
function mint(address _to, uint _id, uint _amount) public payable {
require(!mintInOrder, "Only Can Use the Mint In Order Function At This Time");
require(!paused, "Contract Paused");
require(canMintChecker(_id, _amount), "CANNOT MINT");
if (_id <= ogCollectionTotal){
require(oneOfOneOnly(_id, _amount), "Amount must be 1 for this NFT");
require(!createdToken[_id], "Token Already Minted");
maxSupply[_id] = 1;
hasMaxSupply[_id] = true;
}
if (!checkIfAdmin()) {
if (onlyWhitelisted == true) {
require(isWhitelisted(msg.sender), "Not Whitelisted");
uint256 whitelisterMintedCount = whitelisterMintedBalance[msg.sender];
require(whitelisterMintedCount + _amount <= whitelisterLimit, "Exceeded Max Whitelist Mint Limit");
}
require(msg.value >= (_amount * cost), "Insufficient Funds");
}
whitelisterMintedBalance[msg.sender] += _amount;
currentSupply[_id] += _amount;
if (!exists(_id)) {
createdToken[_id] = true;
}
_mint(_to, _id, _amount, "");
}
function canMintChecker(uint _id, uint _amount) private view returns(bool){
if (hasMaxSupply[_id]) {
if (_amount > 0 && _amount <= maxMintAmount && _id > 0 && _id <= collectionTotal && currentSupply[_id] + _amount <= maxSupply[_id]) {
// CAN MINT
}
else {
// CANNOT MINT
return false;
}
}
else {
if (_amount > 0 && _amount <= maxMintAmount && _id > 0 && _id <= collectionTotal) {
// CAN MINT
}
else {
// CANNOT MINT
return false;
}
}
return true;
}
/**
* @dev Allows Owner, Whitelisters, and Public to Mint multiple NFTs.
* Can only be called by the Public when onlyWhitelisted is false.
* Note: Only mint a max of {mintMaxAmount} or less NFT IDs with a totaling amount of {maxBatchMintAmount} at a time.
* Example to Mint 3 of each Token IDs 1, 2, 3, 4:
* _ids = [1,2,3,4]
* _amounts = [3,3,3,3]
* 4 seperate NFTs with a quantity of 3 each has a totaling amount of 12.
*/
function mintBatch(address _to, uint[] memory _ids, uint[] memory _amounts) public payable {
require(!mintInOrder, "Only Can Use the Mint In Order Function At This Time");
require(!paused, "Contract Paused");
require(_ids.length <= maxMintAmount, "Batch Token IDs Limit Exceeded");
require(_ids.length == _amounts.length, "IDs Array Not Equal To Amounts Array");
require(canMintBatchChecker(_ids, _amounts), "CANNOT MINT BATCH");
uint256 _totalBatchAmount;
for (uint256 i = 0; i < _amounts.length; i++) {
uint256 _id = _ids[i];
uint256 _amount = _amounts[i];
if (_id <= ogCollectionTotal){
require(oneOfOneOnly(_id, _amount), "Amount must be 1 for this NFT");
require(!createdToken[_id], "Token Already Minted");
maxSupply[_id] = 1;
hasMaxSupply[_id] = true;
}
_totalBatchAmount += _amounts[i];
}
require(_totalBatchAmount <= maxBatchMintAmount, "Batch Amount Limit Exceeded");
if (!checkIfAdmin()) {
if (onlyWhitelisted) {
require(isWhitelisted(msg.sender), "Not Whitelisted");
uint256 whitelisterMintedCount = whitelisterMintedBalance[msg.sender];
require(whitelisterMintedCount + _totalBatchAmount <= whitelisterLimit, "Exceeded Max Whitelist Mint Limit");
}
require(msg.value >= (_totalBatchAmount * cost), "Insufficient Funds");
}
whitelisterMintedBalance[msg.sender] += _totalBatchAmount;
for (uint256 k = 0; k < _ids.length; k++) {
currentSupply[_ids[k]] += _amounts[k];
uint256 _id = _ids[k];
if (!exists(_id)) {
createdToken[_id] = true;
}
}
_mintBatch(_to, _ids, _amounts, "");
}
function canMintBatchChecker(uint[] memory _ids, uint[] memory _amounts)private view returns(bool){
for (uint256 i = 0; i < _ids.length; i++) {
uint256 _id = _ids[i];
uint256 _amount = _amounts[i];
if (hasMaxSupply[_id]) {
if (_amount > 0 && _amount <= maxMintAmount && _id > 0 && _id <= collectionTotal && currentSupply[_id] + _amount <= maxSupply[_id]) {
// CAN MINT
}
else {
// CANNOT MINT
return false;
}
}
else {
if (_amount > 0 && _amount <= maxMintAmount && _id > 0 && _id <= collectionTotal) {
// CAN MINT
}
else {
// CANNOT MINT
return false;
}
}
}
return true;
}
/**
* @dev Allows Admin to Mint a single NEW NFT.
* Can only be called by the current owner.
* Note: NEW NFT means above and beyond the original collection total.
*/
function adminMint(address _to, uint _id, uint _amount) external onlyAdmins {
require(_id > ogCollectionTotal, "ID Must Not Be From Original Collection");
if (!exists(_id)) {
createdToken[_id] = true;
collectionTotal++;
}
currentSupply[_id] += _amount;
_mint(_to, _id, _amount, "");
}
/**
* @dev Allows Admin to Mint multiple NEW NFTs.
* Can only be called by the current owner.
* Note: NEW NFT means above and beyond the original collection total.
* Ideally it's best to only mint a max of 70 or less NFT IDs at a time.
* Example to Mint 3 of each Token IDs 1, 2, 3, 4:
* _ids = [1,2,3,4]
* _amounts = [3,3,3,3]
*/
function adminMintBatch(address _to, uint[] memory _ids, uint[] memory _amounts) external onlyAdmins {
require(!checkIfOriginal(_ids), "ID Must Not Be From Original Collection");
for (uint256 i = 0; i < _ids.length; ++i) {
uint256 _id = _ids[i];
if (!exists(_id)) {
createdToken[_id] = true;
collectionTotal++;
}
currentSupply[_id] += _amounts[i];
}
_mintBatch(_to, _ids, _amounts, "");
}
/**
* @dev Allows User to DESTROY a single token they own.
*/
function burn(uint _id, uint _amount) external {
currentSupply[_id] -= _amount;
_burn(msg.sender, _id, _amount);
}
/**
* @dev Allows User to DESTROY multiple tokens they own.
*/
function burnBatch(uint[] memory _ids, uint[] memory _amounts) external {
for (uint256 i = 0; i < _ids.length; ++i) {
uint256 _id = _ids[i];
currentSupply[_id] -= _amounts[i];
}
_burnBatch(msg.sender, _ids, _amounts);
}
/**
* @dev Allows Admin to REVEAL the original collection.
* Can only be called by the current owner once.
* WARNING: Please ensure the CID is 100% correct before execution.
*/
function reveal(string memory _uri) external onlyAdmins {
require(!revealed, "Already set to Revealed");
ipfsCID = _uri;
revealed = true;
}
/**
* @dev Allows Admin to set the URI of a single token.
* Note: Original Token URIs cannot be changed.
* Set _isIpfsCID to true if using only IPFS CID for the _uri.
*/
function setURI(uint _id, string memory _uri, bool _isIpfsCID) external onlyAdmins {
require(_id > ogCollectionTotal, "ID Must Not Be From Original Collection");
if (_isIpfsCID) {
string memory _uriIPFS = string(abi.encodePacked(
"ipfs://",
_uri,
"/",
Strings.toString(_id),
".json"
));
tokenURI[_id] = _uriIPFS;
emit URI(_uriIPFS, _id);
}
else {
tokenURI[_id] = _uri;
emit URI(_uri, _id);
}
}
/**
* @dev Allows Admin to set the URI of multiple tokens.
* Note: Original Token URIs cannot be changed.
* Set _isIpfsCID to true if using only IPFS CID for the _uri.
*/
function setBatchURI(uint[] memory _ids, string memory _uri, bool _isIpfsCID) external onlyAdmins {
require(_ids.length > 1, "Must have at least 2 ids");
require(!checkIfOriginal(_ids), "ID Must Not Be From Original Collection");
for (uint256 i = 0; i < _ids.length; ++i) {
uint256 _id = _ids[i];
if (_isIpfsCID) {
string memory _uriIPFS = string(abi.encodePacked(
"ipfs://",
_uri,
"/",
Strings.toString(_id),
".json"
));
tokenURI[_id] = _uriIPFS;
emit URI(_uriIPFS, _id);
}
else {
tokenURI[_id] = _uri;
emit URI(_uri, _id);
}
}
}
function uri(uint256 _id) override public view returns(string memory){
if (_id > 0 && _id <= ogCollectionTotal) {
if(!revealed){
return (
string(abi.encodePacked(
"ipfs://",
ipfsCID,
"/",
"hidden",
".json"
)));
}
else{
return (
string(abi.encodePacked(
"ipfs://",
ipfsCID,
"/",
Strings.toString(_id),
".json"
)));
}
}
else {
return tokenURI[_id];
}
}
function checkIfOriginal(uint[] memory _ids) private view returns(bool){
for (uint256 i = 0; i < _ids.length; ++i) {
uint256 _id = _ids[i];
if (_id <= ogCollectionTotal) {
// original
}
else {
// new
return false;
}
}
return true;
}
function oneOfOneOnly (uint _id, uint _amount) private view returns (bool){
if (_id <= ogCollectionTotal && _amount == 1){
return true;
}
else{
return false;
}
}
/**
* @dev Total amount of tokens in with a given id.
*/
function totalSupply(uint256 _id) public view returns(uint256) {
return currentSupply[_id];
}
/**
* @dev Indicates whether any token exist with a given id, or not.
*/
function exists(uint256 _id) public view returns(bool) {
return createdToken[_id];
}
/**
* @dev Checks max supply of token with the given id.
*/
function checkMaxSupply(uint256 _id) public view returns(uint256) {
if(_id <= ogCollectionTotal){
return 1;
}
else{
return maxSupply[_id];
}
}
/**
* @dev Admin can set a supply limit.
* Note: If supply amount is set to 0 that will make the supply limitless.
*/
function setMaxSupplies(uint[] memory _ids, uint[] memory _supplies) external onlyAdmins {
for (uint256 i = 0; i < _ids.length; i++) {
uint256 _id = _ids[i];
maxSupply[_id] += _supplies[i];
if (_supplies[i] > 0) {
// has a max limit
hasMaxSupply[i] = true;
}
else {
// infinite supply, because you wouldn't create a token max supply with an amount of zero
hasMaxSupply[i] = false;
}
}
}
/**
* @dev Admin can update the collection total to allow minting the newly added NFTs.
*/
function updateCollectionTotal(uint _amountToAdd) external onlyAdmins {
collectionTotal += _amountToAdd;
}
/**
* @dev Check if address is whitelisted.
*/
function isWhitelisted(address _user) public view returns(bool) {
for (uint256 i = 0; i < whitelistedAddresses.length; i++) {
if (whitelistedAddresses[i] == _user) {
return true;
}
}
return false;
}
/**
* @dev Admin can set the amount of NFTs a user can mint in one session.
*/
function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyAdmins {
maxMintAmount = _newmaxMintAmount;
}
/**
* @dev Admin can set the max amount of NFTs a whitelister can mint during presale.
*/
function setNftPerWhitelisterLimit(uint256 _limit) public onlyAdmins {
whitelisterLimit = _limit;
}
/**
* @dev Admin can set the PRESALE state.
* true = presale ongoing for whitelisters only
* false = sale open to public
*/
function setOnlyWhitelisted(bool _state) public onlyAdmins {
onlyWhitelisted = _state;
}
/**
* @dev Admin can set the addresses as whitelisters.
* Example: ["0xADDRESS1", "0xADDRESS2", "0xADDRESS3"]
*/
function whitelistUsers(address[] calldata _users) public onlyAdmins {
delete whitelistedAddresses;
whitelistedAddresses = _users;
}
/**
* @dev Admin can set the new cost in WEI.
* 1 ETH = 10^18 WEI
* Use https://coinguides.org/ethereum-unit-converter-gwei-ether/ for conversions.
*/
function setCost(uint256 _newCost) public onlyAdmins {
cost = _newCost;
}
/**
* @dev Admin can set the payout address.
*/
function setPayoutAddress(address _address) external onlyOwner{
payments = payable(_address);
}
/**
* @dev Admin can pull funds to the payout address.
*/
function withdraw() public payable onlyAdmins {
require(payments != 0x0000000000000000000000000000000000000000, "Payout Address Must Be Set First");
(bool success, ) = payable(payments).call{ value: address(this).balance } ("");
require(success);
}
/**
* @dev Auto send funds to the payout address.
Triggers only if funds were sent directly to this address.
*/
receive() payable external {
require(payments != 0x0000000000000000000000000000000000000000, "Payout Address Must Be Set First");
uint256 payout = msg.value;
payments.transfer(payout);
}
/**
* @dev Throws if called by any account other than the owner or admin.
*/
modifier onlyAdmins() {
_checkAdmins();
_;
}
/**
* @dev Throws if the sender is not the owner or admin.
*/
function _checkAdmins() internal view virtual {
require(msg.sender == owner() || msg.sender == admin_1, "Admin Only: caller is not an admin");
}
function checkIfAdmin() public view returns(bool) {
if (msg.sender == owner() || msg.sender == admin_1){
return true;
}
else{
return false;
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"uint256","name":"_numberOfTokensToMint","type":"uint256"}],"name":"_mintInOrder","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"adminMintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin_1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkIfAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"checkMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractDev","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costPhase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBatchMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"mintBatch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintInOrder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogCollectionTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payments","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","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":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"bool","name":"_isIpfsCID","type":"bool"}],"name":"setBatchURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_supplies","type":"uint256[]"}],"name":"setMaxSupplies","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerWhitelisterLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setPayoutAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"bool","name":"_isIpfsCID","type":"bool"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenNextToMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountToAdd","type":"uint256"}],"name":"updateCollectionTotal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelisterLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisterMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60c0604052601260808190527143727970746f20436c6f75642050756e6b7360701b60a0908152620000359160049190620005d6565b50604080518082019091526004808252634343505360e01b60209092019182526200006391600591620005d6565b506040518060600160405280602e815260200162004d80602e913980516200009491600691602090910190620005d6565b506122b8600755662386f26fc1000060085560146009819055600a8190556058600b55600c805462ffffff191662010000179055805460ff19166001179055601880546001600160a01b03191673522ee4130b819355e10218e40d6ab0c4952196901790553480156200010657600080fd5b50604080516020810190915260008152620001218162000207565b506200012d3362000220565b600754600d55600160008181527f71a67924699a20698523213e55fe499d539379d7769cd5567e2c45d583f815a38290557f17bc176d2408558f6e4111feebc3cab4e16b63e967be91cde721f4c8a488b552805460ff1990811684179091557f4155c2f711f2cdd34f8262ab8fb9b7020a700fe7b6948222152f7670d1fdf34d805490911683179055601060209081527f8c6065603763fec3f5742441d3833f3f43b982453612d76adb39a885e3006b5f8390556002600e5560408051918201905290815262000201913391819062000272565b620008bc565b80516200021c906002906020840190620005d6565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038416620002d85760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084015b60405180910390fd5b336000620002e68562000394565b90506000620002f58562000394565b90506000868152602081815260408083206001600160a01b038b16845290915281208054879290620003299084906200075b565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46200038b83600089898989620003ea565b50505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110620003d157620003d1620007fa565b602090810291909101015292915050565b505050505050565b62000409846001600160a01b0316620005c760201b620024961760201c565b15620003e25760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190620004459089908990889088908890600401620006ff565b602060405180830381600087803b1580156200046057600080fd5b505af192505050801562000493575060408051601f3d908101601f1916820190925262000490918101906200067c565b60015b6200055457620004a262000810565b806308c379a01415620004e35750620004ba6200082d565b80620004c75750620004e5565b8060405162461bcd60e51b8152600401620002cf919062000746565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401620002cf565b6001600160e01b0319811663f23a6e6160e01b146200038b5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b6064820152608401620002cf565b6001600160a01b03163b151590565b828054620005e49062000782565b90600052602060002090601f01602090048101928262000608576000855562000653565b82601f106200062357805160ff191683800117855562000653565b8280016001018555821562000653579182015b828111156200065357825182559160200191906001019062000636565b506200066192915062000665565b5090565b5b8082111562000661576000815560010162000666565b6000602082840312156200068f57600080fd5b81516001600160e01b031981168114620006a857600080fd5b9392505050565b6000815180845260005b81811015620006d757602081850181015186830182015201620006b9565b81811115620006ea576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906200073b90830184620006af565b979650505050505050565b602081526000620006a86020830184620006af565b600082198211156200077d57634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200079757607f821691505b60208210811415620007b957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b0381118282101715620007f357634e487b7160e01b600052604160045260246000fd5b6040525050565b634e487b7160e01b600052603260045260246000fd5b600060033d11156200082a5760046000803e5060005160e01c5b90565b600060443d10156200083c5790565b6040516003193d81016004833e81513d6001600160401b0380831160248401831017156200086c57505050505090565b8285019150815181811115620008855750505050505090565b843d8701016020828501011115620008a05750505050505090565b620008b160208286010187620007bf565b509095945050505050565b6144b480620008cc6000396000f3fe60806040526004361061036d5760003560e01c8063715018a6116101c6578063ba4e5c49116100f7578063d81d0a1511610095578063ed00e6531161006f578063ed00e65314610aab578063edec5f2714610ac0578063f242432a14610ae0578063f2fde38b14610b0057600080fd5b8063d81d0a1514610a39578063e985e9c514610a4c578063ea7aef5c14610a9557600080fd5b8063c6b1fe58116100d1578063c6b1fe58146109b9578063cc979f27146109d9578063d261b6e4146109f9578063d44395a614610a1957600080fd5b8063ba4e5c491461094c578063bb36ced01461096c578063bd85b0391461098c57600080fd5b806395d89b4111610164578063a22cb4651161013e578063a22cb465146108cc578063a48fc3a9146108ec578063a6d23e101461090c578063b390c0ab1461092c57600080fd5b806395d89b41146108885780639613bf621461089d5780639c70b512146108b257600080fd5b806383ca4b6f116101a057806383ca4b6f146107e95780638674c69414610809578063869f7594146108295780638da5cb5b1461085657600080fd5b8063715018a61461076e5780637724bad8146107835780637f00c7a6146107c957600080fd5b80633af32abf116102a05780634e1273f41161023e57806351ede7911161021857806351ede791146107085780635c975abb14610728578063644e54ab14610742578063650e926f1461075857600080fd5b80634e1273f41461068c5780634f558e79146106b957806351830227146106e957600080fd5b806344a0d68a1161027a57806344a0d68a1461060957806345697134146106295780634c261247146106565780634cafdb6d1461067657600080fd5b80633af32abf146105c15780633c952764146105e15780633ccfd60b1461060157600080fd5b8063156e29f61161030d5780632eb2c2d6116102e75780632eb2c2d61461055857806333ea51a814610578578063359cf6871461059857806339ba02d0146105ae57600080fd5b8063156e29f61461050f578063239c70ae146105225780632a9abcb91461053857600080fd5b806302329a291161034957806302329a291461049757806306fdde03146104b75780630e89341c146104d957806313faede6146104f957600080fd5b80624a84cb14610412578062fdd58e1461043457806301ffc9a71461046757600080fd5b3661040d576017546001600160a01b03166103cf5760405162461bcd60e51b815260206004820181905260248201527f5061796f75742041646472657373204d7573742042652053657420466972737460448201526064015b60405180910390fd5b60175460405134916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610409573d6000803e3d6000fd5b5050005b600080fd5b34801561041e57600080fd5b5061043261042d366004613846565b610b20565b005b34801561044057600080fd5b5061045461044f36600461381c565b610bd1565b6040519081526020015b60405180910390f35b34801561047357600080fd5b50610487610482366004613a97565b610c65565b604051901515815260200161045e565b3480156104a357600080fd5b506104326104b2366004613a7c565b610cb5565b3480156104c357600080fd5b506104cc610cd0565b60405161045e9190613e62565b3480156104e557600080fd5b506104cc6104f4366004613b05565b610d5e565b34801561050557600080fd5b5061045460085481565b61043261051d366004613846565b610e6d565b34801561052e57600080fd5b5061045460095481565b34801561054457600080fd5b50610432610553366004613b1e565b611119565b34801561056457600080fd5b50610432610573366004613672565b61120f565b34801561058457600080fd5b5061043261059336600461361d565b61125b565b3480156105a457600080fd5b50610454600d5481565b6104326105bc366004613b05565b611285565b3480156105cd57600080fd5b506104876105dc36600461361d565b611653565b3480156105ed57600080fd5b506104326105fc366004613a7c565b6116bd565b6104326116d8565b34801561061557600080fd5b50610432610624366004613b05565b61179b565b34801561063557600080fd5b5061045461064436600461361d565b60166020526000908152604090205481565b34801561066257600080fd5b50610432610671366004613ad1565b6117a8565b34801561068257600080fd5b5061045460075481565b34801561069857600080fd5b506106ac6106a73660046138ed565b61182e565b60405161045e9190613e21565b3480156106c557600080fd5b506104876106d4366004613b05565b60009081526013602052604090205460ff1690565b3480156106f557600080fd5b50600c5461048790610100900460ff1681565b34801561071457600080fd5b50610432610723366004613b05565b611957565b34801561073457600080fd5b50600c546104879060ff1681565b34801561074e57600080fd5b50610454600a5481565b34801561076457600080fd5b50610454600e5481565b34801561077a57600080fd5b50610432611964565b34801561078f57600080fd5b5060408051808201909152601b81527ff09f90b82048616c66537570657253686f702e636f6d20f09f90b8000000000060208201526104cc565b3480156107d557600080fd5b506104326107e4366004613b05565b611978565b3480156107f557600080fd5b506104326108043660046139bd565b611985565b34801561081557600080fd5b506104326108243660046139bd565b611a13565b34801561083557600080fd5b50610454610844366004613b05565b60126020526000908152604090205481565b34801561086257600080fd5b506003546001600160a01b03165b6040516001600160a01b03909116815260200161045e565b34801561089457600080fd5b506104cc611af2565b3480156108a957600080fd5b50610454611aff565b3480156108be57600080fd5b506014546104879060ff1681565b3480156108d857600080fd5b506104326108e73660046137f2565b611b6f565b3480156108f857600080fd5b50600c546104879062010000900460ff1681565b34801561091857600080fd5b50601754610870906001600160a01b031681565b34801561093857600080fd5b50610432610947366004613b5c565b611b7a565b34801561095857600080fd5b50610870610967366004613b05565b611ba9565b34801561097857600080fd5b50610432610987366004613a09565b611bd3565b34801561099857600080fd5b506104546109a7366004613b05565b60009081526010602052604090205490565b3480156109c557600080fd5b506104546109d4366004613b05565b611d5c565b3480156109e557600080fd5b506104326109f436600461377f565b611d82565b348015610a0557600080fd5b50610432610a14366004613b05565b611e94565b348015610a2557600080fd5b50601854610870906001600160a01b031681565b610432610a4736600461377f565b611eb6565b348015610a5857600080fd5b50610487610a6736600461363f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b348015610aa157600080fd5b50610454600b5481565b348015610ab757600080fd5b5061048761236a565b348015610acc57600080fd5b50610432610adb366004613879565b6123bb565b348015610aec57600080fd5b50610432610afb36600461371b565b6123db565b348015610b0c57600080fd5b50610432610b1b36600461361d565b612420565b610b286124a5565b600d548211610b495760405162461bcd60e51b81526004016103c69061404e565b60008281526013602052604090205460ff16610b8c576000828152601360205260408120805460ff191660011790556007805491610b868361431d565b91905055505b60008281526010602052604081208054839290610baa908490614228565b92505081905550610bcc8383836040518060200160405280600081525061251f565b505050565b60006001600160a01b038316610c3c5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084016103c6565b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b1480610c9657506001600160e01b031982166303a24d0760e21b145b80610c5f57506301ffc9a760e01b6001600160e01b0319831614610c5f565b610cbd6124a5565b600c805460ff1916911515919091179055565b60048054610cdd906142b6565b80601f0160208091040260200160405190810160405280929190818152602001828054610d09906142b6565b8015610d565780601f10610d2b57610100808354040283529160200191610d56565b820191906000526020600020905b815481529060010190602001808311610d3957829003601f168201915b505050505081565b6060600082118015610d725750600d548211155b15610dca57600c54610100900460ff16610dae576006604051602001610d989190613d34565b6040516020818303038152906040529050919050565b6006610db9836125f9565b604051602001610d98929190613ce0565b6000828152600f602052604090208054610de3906142b6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0f906142b6565b8015610e5c5780601f10610e3157610100808354040283529160200191610e5c565b820191906000526020600020905b815481529060010190602001808311610e3f57829003601f168201915b50505050509050919050565b919050565b600c5462010000900460ff1615610e965760405162461bcd60e51b81526004016103c690614170565b600c5460ff1615610eb95760405162461bcd60e51b81526004016103c690614147565b610ec382826126fe565b610efd5760405162461bcd60e51b815260206004820152600b60248201526a10d0539393d5081352539560aa1b60448201526064016103c6565b600d548211610fdd57610f1082826127bb565b610f5c5760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d757374206265203120666f722074686973204e465400000060448201526064016103c6565b60008281526013602052604090205460ff1615610fb25760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88105b1c9958591e48135a5b9d195960621b60448201526064016103c6565b60008281526012602090815260408083206001908190556011909252909120805460ff191690911790555b610fe561236a565b6110875760145460ff1615156001141561105b5761100233611653565b61101e5760405162461bcd60e51b81526004016103c6906140dd565b33600090815260166020526040902054600b5461103b8383614228565b11156110595760405162461bcd60e51b81526004016103c6906141c4565b505b6008546110689082614254565b3410156110875760405162461bcd60e51b81526004016103c690613f50565b33600090815260166020526040812080548392906110a6908490614228565b9091555050600082815260106020526040812080548392906110c9908490614228565b909155505060008281526013602052604090205460ff166110fe576000828152601360205260409020805460ff191660011790555b610bcc8383836040518060200160405280600081525061251f565b6111216124a5565b600d5483116111425760405162461bcd60e51b81526004016103c69061404e565b80156111c457600082611154856125f9565b604051602001611165929190613c7f565b60408051601f198184030181529181526000868152600f60209081529190208251929350611197929091840190613402565b508360008051602061445f833981519152826040516111b69190613e62565b60405180910390a250505050565b6000838152600f6020908152604090912083516111e392850190613402565b508260008051602061445f833981519152836040516112029190613e62565b60405180910390a2505050565b6001600160a01b03851633148061122b575061122b8533610a67565b6112475760405162461bcd60e51b81526004016103c690613e75565b61125485858585856127dc565b5050505050565b611263612978565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b600c5462010000900460ff166112f45760405162461bcd60e51b815260206004820152602e60248201527f546869732043616e204f6e6c792042652055736564205768656e206d696e744960448201526d6e4f72646572206973205472756560901b60648201526084016103c6565b600c5460ff16156113175760405162461bcd60e51b81526004016103c690614147565b6122b860005260136020527fcbfd43b7ce99b7292caf9404615826f5d0195dc84dbb20b78c77d5f2c6b11ea55460ff161561138c5760405162461bcd60e51b815260206004820152601560248201527410dbdb1b1958dd1a5bdb88135a5b9d19590813dd5d605a1b60448201526064016103c6565b600d5461139a906001614228565b600e546113a79083614228565b111561140b5760405162461bcd60e51b815260206004820152602d60248201527f4578636565647320436f6c6c656374696f6e20546f74616c2c20506c6561736560448201526c08131bddd95c88105b5bdd5b9d609a1b60648201526084016103c6565b61141361236a565b6114b55760145460ff16156114845761142b33611653565b6114475760405162461bcd60e51b81526004016103c6906140dd565b33600090815260166020526040902054600b546114648383614228565b11156114825760405162461bcd60e51b81526004016103c6906141c4565b505b61148c611aff565b6114969082614254565b3410156114b55760405162461bcd60e51b81526004016103c690613f50565b33600090815260166020526040812080548392906114d4908490614228565b9091555060009050816001600160401b038111156114f4576114f461438e565b60405190808252806020026020018201604052801561151d578160200160208202803683370190505b5090506000826001600160401b0381111561153a5761153a61438e565b604051908082528060200260200182016040528015611563578160200160208202803683370190505b50905060005b8381101561163757600e5460008181526013602052604090205460ff166115ce5760008181526013602090815260408083208054600160ff19918216811790925560128452828520829055601184528285208054909116821790556010909252909120555b600e548483815181106115e3576115e3614378565b602002602001018181525050600183838151811061160357611603614378565b6020908102919091010152600e805490600061161e8361431d565b919050555050808061162f9061431d565b915050611569565b50610bcc338383604051806020016040528060008152506129d2565b6000805b6015548110156116b457826001600160a01b03166015828154811061167e5761167e614378565b6000918252602090912001546001600160a01b031614156116a25750600192915050565b806116ac8161431d565b915050611657565b50600092915050565b6116c56124a5565b6014805460ff1916911515919091179055565b6116e06124a5565b6017546001600160a01b03166117385760405162461bcd60e51b815260206004820181905260248201527f5061796f75742041646472657373204d7573742042652053657420466972737460448201526064016103c6565b6017546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611785576040519150601f19603f3d011682016040523d82523d6000602084013e61178a565b606091505b505090508061179857600080fd5b50565b6117a36124a5565b600855565b6117b06124a5565b600c54610100900460ff16156118085760405162461bcd60e51b815260206004820152601760248201527f416c72656164792073657420746f2052657665616c656400000000000000000060448201526064016103c6565b805161181b906006906020840190613402565b5050600c805461ff001916610100179055565b606081518351146118935760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016103c6565b600083516001600160401b038111156118ae576118ae61438e565b6040519080825280602002602001820160405280156118d7578160200160208202803683370190505b50905060005b845181101561194f576119228582815181106118fb576118fb614378565b602002602001015185838151811061191557611915614378565b6020026020010151610bd1565b82828151811061193457611934614378565b60209081029190910101526119488161431d565b90506118dd565b509392505050565b61195f6124a5565b600b55565b61196c612978565b6119766000612b1d565b565b6119806124a5565b600955565b60005b8251811015611a035760008382815181106119a5576119a5614378565b602002602001015190508282815181106119c1576119c1614378565b60200260200101516010600083815260200190815260200160002060008282546119eb9190614273565b909155506119fc915082905061431d565b9050611988565b50611a0f338383612b6f565b5050565b611a1b6124a5565b60005b8251811015610bcc576000838281518110611a3b57611a3b614378565b60200260200101519050828281518110611a5757611a57614378565b6020026020010151601260008381526020019081526020016000206000828254611a819190614228565b925050819055506000838381518110611a9c57611a9c614378565b60200260200101511115611ac8576000828152601160205260409020805460ff19166001179055611adf565b6000828152601160205260409020805460ff191690555b5080611aea8161431d565b915050611a1e565b60058054610cdd906142b6565b60006064600e5411611b175750662386f26fc1000090565b6065600e5410158015611b2e575061012c600e5411155b15611b3f5750666a94d74f43000090565b61012d600e5410158015611b5757506122b8600e5411155b15611b68575066d529ae9e86000090565b5060085490565b611a0f338383612cf9565b60008281526010602052604081208054839290611b98908490614273565b90915550611a0f9050338383612dda565b60158181548110611bb957600080fd5b6000918252602090912001546001600160a01b0316905081565b611bdb6124a5565b6001835111611c2c5760405162461bcd60e51b815260206004820152601860248201527f4d7573742068617665206174206c65617374203220696473000000000000000060448201526064016103c6565b611c3583612ede565b15611c525760405162461bcd60e51b81526004016103c69061404e565b60005b8351811015611d56576000848281518110611c7257611c72614378565b602002602001015190508215611cfe57600084611c8e836125f9565b604051602001611c9f929190613c7f565b60408051601f198184030181529181526000848152600f60209081529190208251929350611cd1929091840190613402565b508160008051602061445f83398151915282604051611cf09190613e62565b60405180910390a250611d45565b6000818152600f602090815260409091208551611d1d92870190613402565b508060008051602061445f83398151915285604051611d3c9190613e62565b60405180910390a25b50611d4f8161431d565b9050611c55565b50505050565b6000600d548211611d6f57506001919050565b5060009081526012602052604090205490565b611d8a6124a5565b611d9382612ede565b15611db05760405162461bcd60e51b81526004016103c69061404e565b60005b8251811015611e78576000838281518110611dd057611dd0614378565b60200260200101519050611df38160009081526013602052604090205460ff1690565b611e24576000818152601360205260408120805460ff191660011790556007805491611e1e8361431d565b91905055505b828281518110611e3657611e36614378565b6020026020010151601060008381526020019081526020016000206000828254611e609190614228565b90915550611e71915082905061431d565b9050611db3565b50610bcc838383604051806020016040528060008152506129d2565b611e9c6124a5565b8060076000828254611eae9190614228565b909155505050565b600c5462010000900460ff1615611edf5760405162461bcd60e51b81526004016103c690614170565b600c5460ff1615611f025760405162461bcd60e51b81526004016103c690614147565b60095482511115611f555760405162461bcd60e51b815260206004820152601e60248201527f426174636820546f6b656e20494473204c696d6974204578636565646564000060448201526064016103c6565b8051825114611fb25760405162461bcd60e51b8152602060048201526024808201527f494473204172726179204e6f7420457175616c20546f20416d6f756e747320416044820152637272617960e01b60648201526084016103c6565b611fbc8282612f32565b611ffc5760405162461bcd60e51b8152602060048201526011602482015270086829c9c9ea8409a929ca8408482a8869607b1b60448201526064016103c6565b6000805b825181101561216157600084828151811061201d5761201d614378565b60200260200101519050600084838151811061203b5761203b614378565b60200260200101519050600d5482116121255761205882826127bb565b6120a45760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d757374206265203120666f722074686973204e465400000060448201526064016103c6565b60008281526013602052604090205460ff16156120fa5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88105b1c9958591e48135a5b9d195960621b60448201526064016103c6565b60008281526012602090815260408083206001908190556011909252909120805460ff191690911790555b84838151811061213757612137614378565b60200260200101518461214a9190614228565b9350505080806121599061431d565b915050612000565b50600a548111156121b45760405162461bcd60e51b815260206004820152601b60248201527f426174636820416d6f756e74204c696d6974204578636565646564000000000060448201526064016103c6565b6121bc61236a565b6122595760145460ff161561222d576121d433611653565b6121f05760405162461bcd60e51b81526004016103c6906140dd565b33600090815260166020526040902054600b5461220d8383614228565b111561222b5760405162461bcd60e51b81526004016103c6906141c4565b505b60085461223a9082614254565b3410156122595760405162461bcd60e51b81526004016103c690613f50565b3360009081526016602052604081208054839290612278908490614228565b90915550600090505b835181101561234e5782818151811061229c5761229c614378565b6020026020010151601060008684815181106122ba576122ba614378565b6020026020010151815260200190815260200160002060008282546122df9190614228565b9250508190555060008482815181106122fa576122fa614378565b6020026020010151905061231d8160009081526013602052604090205460ff1690565b61233b576000818152601360205260409020805460ff191660011790555b50806123468161431d565b915050612281565b50611d56848484604051806020016040528060008152506129d2565b600061237e6003546001600160a01b031690565b6001600160a01b0316336001600160a01b031614806123a757506018546001600160a01b031633145b156123b25750600190565b50600090565b90565b6123c36124a5565b6123cf60156000613486565b610bcc601583836134a4565b6001600160a01b0385163314806123f757506123f78533610a67565b6124135760405162461bcd60e51b81526004016103c690613e75565b6112548585858585613058565b612428612978565b6001600160a01b03811661248d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103c6565b61179881612b1d565b6001600160a01b03163b151590565b6003546001600160a01b03163314806124c857506018546001600160a01b031633145b6119765760405162461bcd60e51b815260206004820152602260248201527f41646d696e204f6e6c793a2063616c6c6572206973206e6f7420616e2061646d60448201526134b760f11b60648201526084016103c6565b6001600160a01b0384166125455760405162461bcd60e51b81526004016103c690614106565b33600061255185613182565b9050600061255e85613182565b90506000868152602081815260408083206001600160a01b038b16845290915281208054879290612590908490614228565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46125f0836000898989896131cd565b50505050505050565b60608161261d5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561264757806126318161431d565b91506126409050600a83614240565b9150612621565b6000816001600160401b038111156126615761266161438e565b6040519080825280601f01601f19166020018201604052801561268b576020820181803683370190505b5090505b84156126f6576126a0600183614273565b91506126ad600a86614338565b6126b8906030614228565b60f81b8183815181106126cd576126cd614378565b60200101906001600160f81b031916908160001a9053506126ef600a86614240565b945061268f565b949350505050565b60008281526011602052604081205460ff16156127835760008211801561272757506009548211155b80156127335750600083115b801561274157506007548311155b8015612771575060008381526012602090815260408083205460109092529091205461276e908490614228565b11155b1561277b576127b2565b506000610c5f565b60008211801561279557506009548211155b80156127a15750600083115b80156127715750600754831161277b575b50600192915050565b6000600d5483111580156127cf5750816001145b1561277b57506001610c5f565b81518351146127fd5760405162461bcd60e51b81526004016103c690614095565b6001600160a01b0384166128235760405162461bcd60e51b81526004016103c690613f7c565b3360005b845181101561290a57600085828151811061284457612844614378565b60200260200101519050600085838151811061286257612862614378565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156128b25760405162461bcd60e51b81526004016103c690614004565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906128ef908490614228565b92505081905550505050806129039061431d565b9050612827565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161295a929190613e34565b60405180910390a4612970818787878787613338565b505050505050565b6003546001600160a01b031633146119765760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103c6565b6001600160a01b0384166129f85760405162461bcd60e51b81526004016103c690614106565b8151835114612a195760405162461bcd60e51b81526004016103c690614095565b3360005b8451811015612ab557838181518110612a3857612a38614378565b6020026020010151600080878481518110612a5557612a55614378565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000206000828254612a9d9190614228565b90915550819050612aad8161431d565b915050612a1d565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612b06929190613e34565b60405180910390a461125481600087878787613338565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316612b955760405162461bcd60e51b81526004016103c690613fc1565b8051825114612bb65760405162461bcd60e51b81526004016103c690614095565b604080516020810190915260009081905233905b8351811015612c8c576000848281518110612be757612be7614378565b602002602001015190506000848381518110612c0557612c05614378565b602090810291909101810151600084815280835260408082206001600160a01b038c168352909352919091205490915081811015612c555760405162461bcd60e51b81526004016103c690613f0c565b6000928352602083815260408085206001600160a01b038b1686529091529092209103905580612c848161431d565b915050612bca565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612cdd929190613e34565b60405180910390a4604080516020810190915260009052611d56565b816001600160a01b0316836001600160a01b03161415612d6d5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016103c6565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038316612e005760405162461bcd60e51b81526004016103c690613fc1565b336000612e0c84613182565b90506000612e1984613182565b60408051602080820183526000918290528882528181528282206001600160a01b038b1683529052205490915084811015612e665760405162461bcd60e51b81526004016103c690613f0c565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46040805160208101909152600090526125f0565b6000805b82518110156127b2576000838281518110612eff57612eff614378565b60200260200101519050600d548111612f1757612f21565b5060009392505050565b50612f2b8161431d565b9050612ee2565b6000805b835181101561304e576000848281518110612f5357612f53614378565b602002602001015190506000848381518110612f7157612f71614378565b6020908102919091018101516000848152601190925260409091205490915060ff161561300a57600081118015612faa57506009548111155b8015612fb65750600082115b8015612fc457506007548211155b8015612ff45750600082815260126020908152604080832054601090925290912054612ff1908390614228565b11155b15612ffe57613039565b60009350505050610c5f565b60008111801561301c57506009548111155b80156130285750600082115b8015612ff457506007548211612ffe575b505080806130469061431d565b915050612f36565b5060019392505050565b6001600160a01b03841661307e5760405162461bcd60e51b81526004016103c690613f7c565b33600061308a85613182565b9050600061309785613182565b90506000868152602081815260408083206001600160a01b038c168452909152902054858110156130da5760405162461bcd60e51b81526004016103c690614004565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290613117908490614228565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4613177848a8a8a8a8a6131cd565b505050505050505050565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106131bc576131bc614378565b602090810291909101015292915050565b6001600160a01b0384163b156129705760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906132119089908990889088908890600401613ddc565b602060405180830381600087803b15801561322b57600080fd5b505af192505050801561325b575060408051601f3d908101601f1916820190925261325891810190613ab4565b60015b613308576132676143a4565b806308c379a014156132a1575061327c6143bf565b8061328757506132a3565b8060405162461bcd60e51b81526004016103c69190613e62565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016103c6565b6001600160e01b0319811663f23a6e6160e01b146125f05760405162461bcd60e51b81526004016103c690613ec4565b6001600160a01b0384163b156129705760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061337c9089908990889088908890600401613d7e565b602060405180830381600087803b15801561339657600080fd5b505af19250505080156133c6575060408051601f3d908101601f191682019092526133c391810190613ab4565b60015b6133d2576132676143a4565b6001600160e01b0319811663bc197c8160e01b146125f05760405162461bcd60e51b81526004016103c690613ec4565b82805461340e906142b6565b90600052602060002090601f0160209004810192826134305760008555613476565b82601f1061344957805160ff1916838001178555613476565b82800160010185558215613476579182015b8281111561347657825182559160200191906001019061345b565b506134829291506134f7565b5090565b508054600082559060005260206000209081019061179891906134f7565b828054828255906000526020600020908101928215613476579160200282015b828111156134765781546001600160a01b0319166001600160a01b038435161782556020909201916001909101906134c4565b5b8082111561348257600081556001016134f8565b80356001600160a01b0381168114610e6857600080fd5b600082601f83011261353457600080fd5b8135602061354182614205565b60405161354e82826142f1565b8381528281019150858301600585901b8701840188101561356e57600080fd5b60005b8581101561358d57813584529284019290840190600101613571565b5090979650505050505050565b80358015158114610e6857600080fd5b600082601f8301126135bb57600080fd5b81356001600160401b038111156135d4576135d461438e565b6040516135eb601f8301601f1916602001826142f1565b81815284602083860101111561360057600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561362f57600080fd5b6136388261350c565b9392505050565b6000806040838503121561365257600080fd5b61365b8361350c565b91506136696020840161350c565b90509250929050565b600080600080600060a0868803121561368a57600080fd5b6136938661350c565b94506136a16020870161350c565b935060408601356001600160401b03808211156136bd57600080fd5b6136c989838a01613523565b945060608801359150808211156136df57600080fd5b6136eb89838a01613523565b9350608088013591508082111561370157600080fd5b5061370e888289016135aa565b9150509295509295909350565b600080600080600060a0868803121561373357600080fd5b61373c8661350c565b945061374a6020870161350c565b9350604086013592506060860135915060808601356001600160401b0381111561377357600080fd5b61370e888289016135aa565b60008060006060848603121561379457600080fd5b61379d8461350c565b925060208401356001600160401b03808211156137b957600080fd5b6137c587838801613523565b935060408601359150808211156137db57600080fd5b506137e886828701613523565b9150509250925092565b6000806040838503121561380557600080fd5b61380e8361350c565b91506136696020840161359a565b6000806040838503121561382f57600080fd5b6138388361350c565b946020939093013593505050565b60008060006060848603121561385b57600080fd5b6138648461350c565b95602085013595506040909401359392505050565b6000806020838503121561388c57600080fd5b82356001600160401b03808211156138a357600080fd5b818501915085601f8301126138b757600080fd5b8135818111156138c657600080fd5b8660208260051b85010111156138db57600080fd5b60209290920196919550909350505050565b6000806040838503121561390057600080fd5b82356001600160401b038082111561391757600080fd5b818501915085601f83011261392b57600080fd5b8135602061393882614205565b60405161394582826142f1565b8381528281019150858301600585901b870184018b101561396557600080fd5b600096505b8487101561398f5761397b8161350c565b83526001969096019591830191830161396a565b50965050860135925050808211156139a657600080fd5b506139b385828601613523565b9150509250929050565b600080604083850312156139d057600080fd5b82356001600160401b03808211156139e757600080fd5b6139f386838701613523565b935060208501359150808211156139a657600080fd5b600080600060608486031215613a1e57600080fd5b83356001600160401b0380821115613a3557600080fd5b613a4187838801613523565b94506020860135915080821115613a5757600080fd5b50613a64868287016135aa565b925050613a736040850161359a565b90509250925092565b600060208284031215613a8e57600080fd5b6136388261359a565b600060208284031215613aa957600080fd5b813561363881614448565b600060208284031215613ac657600080fd5b815161363881614448565b600060208284031215613ae357600080fd5b81356001600160401b03811115613af957600080fd5b6126f6848285016135aa565b600060208284031215613b1757600080fd5b5035919050565b600080600060608486031215613b3357600080fd5b8335925060208401356001600160401b03811115613b5057600080fd5b613a64868287016135aa565b60008060408385031215613b6f57600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b83811015613bae57815187529582019590820190600101613b92565b509495945050505050565b60008151808452613bd181602086016020860161428a565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680613bff57607f831692505b6020808410821415613c2157634e487b7160e01b600052602260045260246000fd5b818015613c355760018114613c4657613c73565b60ff19861689528489019650613c73565b60008881526020902060005b86811015613c6b5781548b820152908501908301613c52565b505084890196505b50505050505092915050565b66697066733a2f2f60c81b815260008351613ca181600785016020880161428a565b602f60f81b6007918401918201528351613cc281600884016020880161428a565b64173539b7b760d91b60089290910191820152600d01949350505050565b66697066733a2f2f60c81b81526000613cfc6007830185613be5565b602f60f81b81528351613d1681600184016020880161428a565b64173539b7b760d91b60019290910191820152600601949350505050565b66697066733a2f2f60c81b81526000613d506007830184613be5565b602f60f81b8152653434b23232b760d11b600182015264173539b7b760d91b6007820152600c019392505050565b6001600160a01b0386811682528516602082015260a060408201819052600090613daa90830186613b7e565b8281036060840152613dbc8186613b7e565b90508281036080840152613dd08185613bb9565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090613e1690830184613bb9565b979650505050505050565b6020815260006136386020830184613b7e565b604081526000613e476040830185613b7e565b8281036020840152613e598185613b7e565b95945050505050565b6020815260006136386020830184613bb9565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b602080825260129082015271496e73756666696369656e742046756e647360701b604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60208082526027908201527f4944204d757374204e6f742042652046726f6d204f726967696e616c20436f6c6040820152663632b1ba34b7b760c91b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b6020808252600f908201526e139bdd0815da1a5d195b1a5cdd1959608a1b604082015260600190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252600f908201526e10dbdb9d1c9858dd0814185d5cd959608a1b604082015260600190565b60208082526034908201527f4f6e6c792043616e2055736520746865204d696e7420496e204f726465722046604082015273756e6374696f6e20417420546869732054696d6560601b606082015260800190565b60208082526021908201527f4578636565646564204d61782057686974656c697374204d696e74204c696d696040820152601d60fa1b606082015260800190565b60006001600160401b0382111561421e5761421e61438e565b5060051b60200190565b6000821982111561423b5761423b61434c565b500190565b60008261424f5761424f614362565b500490565b600081600019048311821515161561426e5761426e61434c565b500290565b6000828210156142855761428561434c565b500390565b60005b838110156142a557818101518382015260200161428d565b83811115611d565750506000910152565b600181811c908216806142ca57607f821691505b602082108114156142eb57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b03811182821017156143165761431661438e565b6040525050565b60006000198214156143315761433161434c565b5060010190565b60008261434757614347614362565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d11156123b85760046000803e5060005160e01c90565b600060443d10156143cd5790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156143fc57505050505090565b82850191508151818111156144145750505050505090565b843d870101602082850101111561442e5750505050505090565b61443d602082860101876142f1565b509095945050505050565b6001600160e01b03198116811461179857600080fdfe6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529ba26469706673582212208d52f78b1d96e6308725cb3f1beff8e214a51b9fe9d048848e815a6eece2597b64736f6c63430008070033516d5741453765576866314d71386a655247754537627250333138365670763238514c5444686872594a56674355
Deployed Bytecode
0x60806040526004361061036d5760003560e01c8063715018a6116101c6578063ba4e5c49116100f7578063d81d0a1511610095578063ed00e6531161006f578063ed00e65314610aab578063edec5f2714610ac0578063f242432a14610ae0578063f2fde38b14610b0057600080fd5b8063d81d0a1514610a39578063e985e9c514610a4c578063ea7aef5c14610a9557600080fd5b8063c6b1fe58116100d1578063c6b1fe58146109b9578063cc979f27146109d9578063d261b6e4146109f9578063d44395a614610a1957600080fd5b8063ba4e5c491461094c578063bb36ced01461096c578063bd85b0391461098c57600080fd5b806395d89b4111610164578063a22cb4651161013e578063a22cb465146108cc578063a48fc3a9146108ec578063a6d23e101461090c578063b390c0ab1461092c57600080fd5b806395d89b41146108885780639613bf621461089d5780639c70b512146108b257600080fd5b806383ca4b6f116101a057806383ca4b6f146107e95780638674c69414610809578063869f7594146108295780638da5cb5b1461085657600080fd5b8063715018a61461076e5780637724bad8146107835780637f00c7a6146107c957600080fd5b80633af32abf116102a05780634e1273f41161023e57806351ede7911161021857806351ede791146107085780635c975abb14610728578063644e54ab14610742578063650e926f1461075857600080fd5b80634e1273f41461068c5780634f558e79146106b957806351830227146106e957600080fd5b806344a0d68a1161027a57806344a0d68a1461060957806345697134146106295780634c261247146106565780634cafdb6d1461067657600080fd5b80633af32abf146105c15780633c952764146105e15780633ccfd60b1461060157600080fd5b8063156e29f61161030d5780632eb2c2d6116102e75780632eb2c2d61461055857806333ea51a814610578578063359cf6871461059857806339ba02d0146105ae57600080fd5b8063156e29f61461050f578063239c70ae146105225780632a9abcb91461053857600080fd5b806302329a291161034957806302329a291461049757806306fdde03146104b75780630e89341c146104d957806313faede6146104f957600080fd5b80624a84cb14610412578062fdd58e1461043457806301ffc9a71461046757600080fd5b3661040d576017546001600160a01b03166103cf5760405162461bcd60e51b815260206004820181905260248201527f5061796f75742041646472657373204d7573742042652053657420466972737460448201526064015b60405180910390fd5b60175460405134916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610409573d6000803e3d6000fd5b5050005b600080fd5b34801561041e57600080fd5b5061043261042d366004613846565b610b20565b005b34801561044057600080fd5b5061045461044f36600461381c565b610bd1565b6040519081526020015b60405180910390f35b34801561047357600080fd5b50610487610482366004613a97565b610c65565b604051901515815260200161045e565b3480156104a357600080fd5b506104326104b2366004613a7c565b610cb5565b3480156104c357600080fd5b506104cc610cd0565b60405161045e9190613e62565b3480156104e557600080fd5b506104cc6104f4366004613b05565b610d5e565b34801561050557600080fd5b5061045460085481565b61043261051d366004613846565b610e6d565b34801561052e57600080fd5b5061045460095481565b34801561054457600080fd5b50610432610553366004613b1e565b611119565b34801561056457600080fd5b50610432610573366004613672565b61120f565b34801561058457600080fd5b5061043261059336600461361d565b61125b565b3480156105a457600080fd5b50610454600d5481565b6104326105bc366004613b05565b611285565b3480156105cd57600080fd5b506104876105dc36600461361d565b611653565b3480156105ed57600080fd5b506104326105fc366004613a7c565b6116bd565b6104326116d8565b34801561061557600080fd5b50610432610624366004613b05565b61179b565b34801561063557600080fd5b5061045461064436600461361d565b60166020526000908152604090205481565b34801561066257600080fd5b50610432610671366004613ad1565b6117a8565b34801561068257600080fd5b5061045460075481565b34801561069857600080fd5b506106ac6106a73660046138ed565b61182e565b60405161045e9190613e21565b3480156106c557600080fd5b506104876106d4366004613b05565b60009081526013602052604090205460ff1690565b3480156106f557600080fd5b50600c5461048790610100900460ff1681565b34801561071457600080fd5b50610432610723366004613b05565b611957565b34801561073457600080fd5b50600c546104879060ff1681565b34801561074e57600080fd5b50610454600a5481565b34801561076457600080fd5b50610454600e5481565b34801561077a57600080fd5b50610432611964565b34801561078f57600080fd5b5060408051808201909152601b81527ff09f90b82048616c66537570657253686f702e636f6d20f09f90b8000000000060208201526104cc565b3480156107d557600080fd5b506104326107e4366004613b05565b611978565b3480156107f557600080fd5b506104326108043660046139bd565b611985565b34801561081557600080fd5b506104326108243660046139bd565b611a13565b34801561083557600080fd5b50610454610844366004613b05565b60126020526000908152604090205481565b34801561086257600080fd5b506003546001600160a01b03165b6040516001600160a01b03909116815260200161045e565b34801561089457600080fd5b506104cc611af2565b3480156108a957600080fd5b50610454611aff565b3480156108be57600080fd5b506014546104879060ff1681565b3480156108d857600080fd5b506104326108e73660046137f2565b611b6f565b3480156108f857600080fd5b50600c546104879062010000900460ff1681565b34801561091857600080fd5b50601754610870906001600160a01b031681565b34801561093857600080fd5b50610432610947366004613b5c565b611b7a565b34801561095857600080fd5b50610870610967366004613b05565b611ba9565b34801561097857600080fd5b50610432610987366004613a09565b611bd3565b34801561099857600080fd5b506104546109a7366004613b05565b60009081526010602052604090205490565b3480156109c557600080fd5b506104546109d4366004613b05565b611d5c565b3480156109e557600080fd5b506104326109f436600461377f565b611d82565b348015610a0557600080fd5b50610432610a14366004613b05565b611e94565b348015610a2557600080fd5b50601854610870906001600160a01b031681565b610432610a4736600461377f565b611eb6565b348015610a5857600080fd5b50610487610a6736600461363f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b348015610aa157600080fd5b50610454600b5481565b348015610ab757600080fd5b5061048761236a565b348015610acc57600080fd5b50610432610adb366004613879565b6123bb565b348015610aec57600080fd5b50610432610afb36600461371b565b6123db565b348015610b0c57600080fd5b50610432610b1b36600461361d565b612420565b610b286124a5565b600d548211610b495760405162461bcd60e51b81526004016103c69061404e565b60008281526013602052604090205460ff16610b8c576000828152601360205260408120805460ff191660011790556007805491610b868361431d565b91905055505b60008281526010602052604081208054839290610baa908490614228565b92505081905550610bcc8383836040518060200160405280600081525061251f565b505050565b60006001600160a01b038316610c3c5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084016103c6565b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b1480610c9657506001600160e01b031982166303a24d0760e21b145b80610c5f57506301ffc9a760e01b6001600160e01b0319831614610c5f565b610cbd6124a5565b600c805460ff1916911515919091179055565b60048054610cdd906142b6565b80601f0160208091040260200160405190810160405280929190818152602001828054610d09906142b6565b8015610d565780601f10610d2b57610100808354040283529160200191610d56565b820191906000526020600020905b815481529060010190602001808311610d3957829003601f168201915b505050505081565b6060600082118015610d725750600d548211155b15610dca57600c54610100900460ff16610dae576006604051602001610d989190613d34565b6040516020818303038152906040529050919050565b6006610db9836125f9565b604051602001610d98929190613ce0565b6000828152600f602052604090208054610de3906142b6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0f906142b6565b8015610e5c5780601f10610e3157610100808354040283529160200191610e5c565b820191906000526020600020905b815481529060010190602001808311610e3f57829003601f168201915b50505050509050919050565b919050565b600c5462010000900460ff1615610e965760405162461bcd60e51b81526004016103c690614170565b600c5460ff1615610eb95760405162461bcd60e51b81526004016103c690614147565b610ec382826126fe565b610efd5760405162461bcd60e51b815260206004820152600b60248201526a10d0539393d5081352539560aa1b60448201526064016103c6565b600d548211610fdd57610f1082826127bb565b610f5c5760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d757374206265203120666f722074686973204e465400000060448201526064016103c6565b60008281526013602052604090205460ff1615610fb25760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88105b1c9958591e48135a5b9d195960621b60448201526064016103c6565b60008281526012602090815260408083206001908190556011909252909120805460ff191690911790555b610fe561236a565b6110875760145460ff1615156001141561105b5761100233611653565b61101e5760405162461bcd60e51b81526004016103c6906140dd565b33600090815260166020526040902054600b5461103b8383614228565b11156110595760405162461bcd60e51b81526004016103c6906141c4565b505b6008546110689082614254565b3410156110875760405162461bcd60e51b81526004016103c690613f50565b33600090815260166020526040812080548392906110a6908490614228565b9091555050600082815260106020526040812080548392906110c9908490614228565b909155505060008281526013602052604090205460ff166110fe576000828152601360205260409020805460ff191660011790555b610bcc8383836040518060200160405280600081525061251f565b6111216124a5565b600d5483116111425760405162461bcd60e51b81526004016103c69061404e565b80156111c457600082611154856125f9565b604051602001611165929190613c7f565b60408051601f198184030181529181526000868152600f60209081529190208251929350611197929091840190613402565b508360008051602061445f833981519152826040516111b69190613e62565b60405180910390a250505050565b6000838152600f6020908152604090912083516111e392850190613402565b508260008051602061445f833981519152836040516112029190613e62565b60405180910390a2505050565b6001600160a01b03851633148061122b575061122b8533610a67565b6112475760405162461bcd60e51b81526004016103c690613e75565b61125485858585856127dc565b5050505050565b611263612978565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b600c5462010000900460ff166112f45760405162461bcd60e51b815260206004820152602e60248201527f546869732043616e204f6e6c792042652055736564205768656e206d696e744960448201526d6e4f72646572206973205472756560901b60648201526084016103c6565b600c5460ff16156113175760405162461bcd60e51b81526004016103c690614147565b6122b860005260136020527fcbfd43b7ce99b7292caf9404615826f5d0195dc84dbb20b78c77d5f2c6b11ea55460ff161561138c5760405162461bcd60e51b815260206004820152601560248201527410dbdb1b1958dd1a5bdb88135a5b9d19590813dd5d605a1b60448201526064016103c6565b600d5461139a906001614228565b600e546113a79083614228565b111561140b5760405162461bcd60e51b815260206004820152602d60248201527f4578636565647320436f6c6c656374696f6e20546f74616c2c20506c6561736560448201526c08131bddd95c88105b5bdd5b9d609a1b60648201526084016103c6565b61141361236a565b6114b55760145460ff16156114845761142b33611653565b6114475760405162461bcd60e51b81526004016103c6906140dd565b33600090815260166020526040902054600b546114648383614228565b11156114825760405162461bcd60e51b81526004016103c6906141c4565b505b61148c611aff565b6114969082614254565b3410156114b55760405162461bcd60e51b81526004016103c690613f50565b33600090815260166020526040812080548392906114d4908490614228565b9091555060009050816001600160401b038111156114f4576114f461438e565b60405190808252806020026020018201604052801561151d578160200160208202803683370190505b5090506000826001600160401b0381111561153a5761153a61438e565b604051908082528060200260200182016040528015611563578160200160208202803683370190505b50905060005b8381101561163757600e5460008181526013602052604090205460ff166115ce5760008181526013602090815260408083208054600160ff19918216811790925560128452828520829055601184528285208054909116821790556010909252909120555b600e548483815181106115e3576115e3614378565b602002602001018181525050600183838151811061160357611603614378565b6020908102919091010152600e805490600061161e8361431d565b919050555050808061162f9061431d565b915050611569565b50610bcc338383604051806020016040528060008152506129d2565b6000805b6015548110156116b457826001600160a01b03166015828154811061167e5761167e614378565b6000918252602090912001546001600160a01b031614156116a25750600192915050565b806116ac8161431d565b915050611657565b50600092915050565b6116c56124a5565b6014805460ff1916911515919091179055565b6116e06124a5565b6017546001600160a01b03166117385760405162461bcd60e51b815260206004820181905260248201527f5061796f75742041646472657373204d7573742042652053657420466972737460448201526064016103c6565b6017546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611785576040519150601f19603f3d011682016040523d82523d6000602084013e61178a565b606091505b505090508061179857600080fd5b50565b6117a36124a5565b600855565b6117b06124a5565b600c54610100900460ff16156118085760405162461bcd60e51b815260206004820152601760248201527f416c72656164792073657420746f2052657665616c656400000000000000000060448201526064016103c6565b805161181b906006906020840190613402565b5050600c805461ff001916610100179055565b606081518351146118935760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016103c6565b600083516001600160401b038111156118ae576118ae61438e565b6040519080825280602002602001820160405280156118d7578160200160208202803683370190505b50905060005b845181101561194f576119228582815181106118fb576118fb614378565b602002602001015185838151811061191557611915614378565b6020026020010151610bd1565b82828151811061193457611934614378565b60209081029190910101526119488161431d565b90506118dd565b509392505050565b61195f6124a5565b600b55565b61196c612978565b6119766000612b1d565b565b6119806124a5565b600955565b60005b8251811015611a035760008382815181106119a5576119a5614378565b602002602001015190508282815181106119c1576119c1614378565b60200260200101516010600083815260200190815260200160002060008282546119eb9190614273565b909155506119fc915082905061431d565b9050611988565b50611a0f338383612b6f565b5050565b611a1b6124a5565b60005b8251811015610bcc576000838281518110611a3b57611a3b614378565b60200260200101519050828281518110611a5757611a57614378565b6020026020010151601260008381526020019081526020016000206000828254611a819190614228565b925050819055506000838381518110611a9c57611a9c614378565b60200260200101511115611ac8576000828152601160205260409020805460ff19166001179055611adf565b6000828152601160205260409020805460ff191690555b5080611aea8161431d565b915050611a1e565b60058054610cdd906142b6565b60006064600e5411611b175750662386f26fc1000090565b6065600e5410158015611b2e575061012c600e5411155b15611b3f5750666a94d74f43000090565b61012d600e5410158015611b5757506122b8600e5411155b15611b68575066d529ae9e86000090565b5060085490565b611a0f338383612cf9565b60008281526010602052604081208054839290611b98908490614273565b90915550611a0f9050338383612dda565b60158181548110611bb957600080fd5b6000918252602090912001546001600160a01b0316905081565b611bdb6124a5565b6001835111611c2c5760405162461bcd60e51b815260206004820152601860248201527f4d7573742068617665206174206c65617374203220696473000000000000000060448201526064016103c6565b611c3583612ede565b15611c525760405162461bcd60e51b81526004016103c69061404e565b60005b8351811015611d56576000848281518110611c7257611c72614378565b602002602001015190508215611cfe57600084611c8e836125f9565b604051602001611c9f929190613c7f565b60408051601f198184030181529181526000848152600f60209081529190208251929350611cd1929091840190613402565b508160008051602061445f83398151915282604051611cf09190613e62565b60405180910390a250611d45565b6000818152600f602090815260409091208551611d1d92870190613402565b508060008051602061445f83398151915285604051611d3c9190613e62565b60405180910390a25b50611d4f8161431d565b9050611c55565b50505050565b6000600d548211611d6f57506001919050565b5060009081526012602052604090205490565b611d8a6124a5565b611d9382612ede565b15611db05760405162461bcd60e51b81526004016103c69061404e565b60005b8251811015611e78576000838281518110611dd057611dd0614378565b60200260200101519050611df38160009081526013602052604090205460ff1690565b611e24576000818152601360205260408120805460ff191660011790556007805491611e1e8361431d565b91905055505b828281518110611e3657611e36614378565b6020026020010151601060008381526020019081526020016000206000828254611e609190614228565b90915550611e71915082905061431d565b9050611db3565b50610bcc838383604051806020016040528060008152506129d2565b611e9c6124a5565b8060076000828254611eae9190614228565b909155505050565b600c5462010000900460ff1615611edf5760405162461bcd60e51b81526004016103c690614170565b600c5460ff1615611f025760405162461bcd60e51b81526004016103c690614147565b60095482511115611f555760405162461bcd60e51b815260206004820152601e60248201527f426174636820546f6b656e20494473204c696d6974204578636565646564000060448201526064016103c6565b8051825114611fb25760405162461bcd60e51b8152602060048201526024808201527f494473204172726179204e6f7420457175616c20546f20416d6f756e747320416044820152637272617960e01b60648201526084016103c6565b611fbc8282612f32565b611ffc5760405162461bcd60e51b8152602060048201526011602482015270086829c9c9ea8409a929ca8408482a8869607b1b60448201526064016103c6565b6000805b825181101561216157600084828151811061201d5761201d614378565b60200260200101519050600084838151811061203b5761203b614378565b60200260200101519050600d5482116121255761205882826127bb565b6120a45760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d757374206265203120666f722074686973204e465400000060448201526064016103c6565b60008281526013602052604090205460ff16156120fa5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88105b1c9958591e48135a5b9d195960621b60448201526064016103c6565b60008281526012602090815260408083206001908190556011909252909120805460ff191690911790555b84838151811061213757612137614378565b60200260200101518461214a9190614228565b9350505080806121599061431d565b915050612000565b50600a548111156121b45760405162461bcd60e51b815260206004820152601b60248201527f426174636820416d6f756e74204c696d6974204578636565646564000000000060448201526064016103c6565b6121bc61236a565b6122595760145460ff161561222d576121d433611653565b6121f05760405162461bcd60e51b81526004016103c6906140dd565b33600090815260166020526040902054600b5461220d8383614228565b111561222b5760405162461bcd60e51b81526004016103c6906141c4565b505b60085461223a9082614254565b3410156122595760405162461bcd60e51b81526004016103c690613f50565b3360009081526016602052604081208054839290612278908490614228565b90915550600090505b835181101561234e5782818151811061229c5761229c614378565b6020026020010151601060008684815181106122ba576122ba614378565b6020026020010151815260200190815260200160002060008282546122df9190614228565b9250508190555060008482815181106122fa576122fa614378565b6020026020010151905061231d8160009081526013602052604090205460ff1690565b61233b576000818152601360205260409020805460ff191660011790555b50806123468161431d565b915050612281565b50611d56848484604051806020016040528060008152506129d2565b600061237e6003546001600160a01b031690565b6001600160a01b0316336001600160a01b031614806123a757506018546001600160a01b031633145b156123b25750600190565b50600090565b90565b6123c36124a5565b6123cf60156000613486565b610bcc601583836134a4565b6001600160a01b0385163314806123f757506123f78533610a67565b6124135760405162461bcd60e51b81526004016103c690613e75565b6112548585858585613058565b612428612978565b6001600160a01b03811661248d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103c6565b61179881612b1d565b6001600160a01b03163b151590565b6003546001600160a01b03163314806124c857506018546001600160a01b031633145b6119765760405162461bcd60e51b815260206004820152602260248201527f41646d696e204f6e6c793a2063616c6c6572206973206e6f7420616e2061646d60448201526134b760f11b60648201526084016103c6565b6001600160a01b0384166125455760405162461bcd60e51b81526004016103c690614106565b33600061255185613182565b9050600061255e85613182565b90506000868152602081815260408083206001600160a01b038b16845290915281208054879290612590908490614228565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46125f0836000898989896131cd565b50505050505050565b60608161261d5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561264757806126318161431d565b91506126409050600a83614240565b9150612621565b6000816001600160401b038111156126615761266161438e565b6040519080825280601f01601f19166020018201604052801561268b576020820181803683370190505b5090505b84156126f6576126a0600183614273565b91506126ad600a86614338565b6126b8906030614228565b60f81b8183815181106126cd576126cd614378565b60200101906001600160f81b031916908160001a9053506126ef600a86614240565b945061268f565b949350505050565b60008281526011602052604081205460ff16156127835760008211801561272757506009548211155b80156127335750600083115b801561274157506007548311155b8015612771575060008381526012602090815260408083205460109092529091205461276e908490614228565b11155b1561277b576127b2565b506000610c5f565b60008211801561279557506009548211155b80156127a15750600083115b80156127715750600754831161277b575b50600192915050565b6000600d5483111580156127cf5750816001145b1561277b57506001610c5f565b81518351146127fd5760405162461bcd60e51b81526004016103c690614095565b6001600160a01b0384166128235760405162461bcd60e51b81526004016103c690613f7c565b3360005b845181101561290a57600085828151811061284457612844614378565b60200260200101519050600085838151811061286257612862614378565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156128b25760405162461bcd60e51b81526004016103c690614004565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906128ef908490614228565b92505081905550505050806129039061431d565b9050612827565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161295a929190613e34565b60405180910390a4612970818787878787613338565b505050505050565b6003546001600160a01b031633146119765760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103c6565b6001600160a01b0384166129f85760405162461bcd60e51b81526004016103c690614106565b8151835114612a195760405162461bcd60e51b81526004016103c690614095565b3360005b8451811015612ab557838181518110612a3857612a38614378565b6020026020010151600080878481518110612a5557612a55614378565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000206000828254612a9d9190614228565b90915550819050612aad8161431d565b915050612a1d565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612b06929190613e34565b60405180910390a461125481600087878787613338565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316612b955760405162461bcd60e51b81526004016103c690613fc1565b8051825114612bb65760405162461bcd60e51b81526004016103c690614095565b604080516020810190915260009081905233905b8351811015612c8c576000848281518110612be757612be7614378565b602002602001015190506000848381518110612c0557612c05614378565b602090810291909101810151600084815280835260408082206001600160a01b038c168352909352919091205490915081811015612c555760405162461bcd60e51b81526004016103c690613f0c565b6000928352602083815260408085206001600160a01b038b1686529091529092209103905580612c848161431d565b915050612bca565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612cdd929190613e34565b60405180910390a4604080516020810190915260009052611d56565b816001600160a01b0316836001600160a01b03161415612d6d5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016103c6565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038316612e005760405162461bcd60e51b81526004016103c690613fc1565b336000612e0c84613182565b90506000612e1984613182565b60408051602080820183526000918290528882528181528282206001600160a01b038b1683529052205490915084811015612e665760405162461bcd60e51b81526004016103c690613f0c565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46040805160208101909152600090526125f0565b6000805b82518110156127b2576000838281518110612eff57612eff614378565b60200260200101519050600d548111612f1757612f21565b5060009392505050565b50612f2b8161431d565b9050612ee2565b6000805b835181101561304e576000848281518110612f5357612f53614378565b602002602001015190506000848381518110612f7157612f71614378565b6020908102919091018101516000848152601190925260409091205490915060ff161561300a57600081118015612faa57506009548111155b8015612fb65750600082115b8015612fc457506007548211155b8015612ff45750600082815260126020908152604080832054601090925290912054612ff1908390614228565b11155b15612ffe57613039565b60009350505050610c5f565b60008111801561301c57506009548111155b80156130285750600082115b8015612ff457506007548211612ffe575b505080806130469061431d565b915050612f36565b5060019392505050565b6001600160a01b03841661307e5760405162461bcd60e51b81526004016103c690613f7c565b33600061308a85613182565b9050600061309785613182565b90506000868152602081815260408083206001600160a01b038c168452909152902054858110156130da5760405162461bcd60e51b81526004016103c690614004565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290613117908490614228565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4613177848a8a8a8a8a6131cd565b505050505050505050565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106131bc576131bc614378565b602090810291909101015292915050565b6001600160a01b0384163b156129705760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906132119089908990889088908890600401613ddc565b602060405180830381600087803b15801561322b57600080fd5b505af192505050801561325b575060408051601f3d908101601f1916820190925261325891810190613ab4565b60015b613308576132676143a4565b806308c379a014156132a1575061327c6143bf565b8061328757506132a3565b8060405162461bcd60e51b81526004016103c69190613e62565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016103c6565b6001600160e01b0319811663f23a6e6160e01b146125f05760405162461bcd60e51b81526004016103c690613ec4565b6001600160a01b0384163b156129705760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061337c9089908990889088908890600401613d7e565b602060405180830381600087803b15801561339657600080fd5b505af19250505080156133c6575060408051601f3d908101601f191682019092526133c391810190613ab4565b60015b6133d2576132676143a4565b6001600160e01b0319811663bc197c8160e01b146125f05760405162461bcd60e51b81526004016103c690613ec4565b82805461340e906142b6565b90600052602060002090601f0160209004810192826134305760008555613476565b82601f1061344957805160ff1916838001178555613476565b82800160010185558215613476579182015b8281111561347657825182559160200191906001019061345b565b506134829291506134f7565b5090565b508054600082559060005260206000209081019061179891906134f7565b828054828255906000526020600020908101928215613476579160200282015b828111156134765781546001600160a01b0319166001600160a01b038435161782556020909201916001909101906134c4565b5b8082111561348257600081556001016134f8565b80356001600160a01b0381168114610e6857600080fd5b600082601f83011261353457600080fd5b8135602061354182614205565b60405161354e82826142f1565b8381528281019150858301600585901b8701840188101561356e57600080fd5b60005b8581101561358d57813584529284019290840190600101613571565b5090979650505050505050565b80358015158114610e6857600080fd5b600082601f8301126135bb57600080fd5b81356001600160401b038111156135d4576135d461438e565b6040516135eb601f8301601f1916602001826142f1565b81815284602083860101111561360057600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561362f57600080fd5b6136388261350c565b9392505050565b6000806040838503121561365257600080fd5b61365b8361350c565b91506136696020840161350c565b90509250929050565b600080600080600060a0868803121561368a57600080fd5b6136938661350c565b94506136a16020870161350c565b935060408601356001600160401b03808211156136bd57600080fd5b6136c989838a01613523565b945060608801359150808211156136df57600080fd5b6136eb89838a01613523565b9350608088013591508082111561370157600080fd5b5061370e888289016135aa565b9150509295509295909350565b600080600080600060a0868803121561373357600080fd5b61373c8661350c565b945061374a6020870161350c565b9350604086013592506060860135915060808601356001600160401b0381111561377357600080fd5b61370e888289016135aa565b60008060006060848603121561379457600080fd5b61379d8461350c565b925060208401356001600160401b03808211156137b957600080fd5b6137c587838801613523565b935060408601359150808211156137db57600080fd5b506137e886828701613523565b9150509250925092565b6000806040838503121561380557600080fd5b61380e8361350c565b91506136696020840161359a565b6000806040838503121561382f57600080fd5b6138388361350c565b946020939093013593505050565b60008060006060848603121561385b57600080fd5b6138648461350c565b95602085013595506040909401359392505050565b6000806020838503121561388c57600080fd5b82356001600160401b03808211156138a357600080fd5b818501915085601f8301126138b757600080fd5b8135818111156138c657600080fd5b8660208260051b85010111156138db57600080fd5b60209290920196919550909350505050565b6000806040838503121561390057600080fd5b82356001600160401b038082111561391757600080fd5b818501915085601f83011261392b57600080fd5b8135602061393882614205565b60405161394582826142f1565b8381528281019150858301600585901b870184018b101561396557600080fd5b600096505b8487101561398f5761397b8161350c565b83526001969096019591830191830161396a565b50965050860135925050808211156139a657600080fd5b506139b385828601613523565b9150509250929050565b600080604083850312156139d057600080fd5b82356001600160401b03808211156139e757600080fd5b6139f386838701613523565b935060208501359150808211156139a657600080fd5b600080600060608486031215613a1e57600080fd5b83356001600160401b0380821115613a3557600080fd5b613a4187838801613523565b94506020860135915080821115613a5757600080fd5b50613a64868287016135aa565b925050613a736040850161359a565b90509250925092565b600060208284031215613a8e57600080fd5b6136388261359a565b600060208284031215613aa957600080fd5b813561363881614448565b600060208284031215613ac657600080fd5b815161363881614448565b600060208284031215613ae357600080fd5b81356001600160401b03811115613af957600080fd5b6126f6848285016135aa565b600060208284031215613b1757600080fd5b5035919050565b600080600060608486031215613b3357600080fd5b8335925060208401356001600160401b03811115613b5057600080fd5b613a64868287016135aa565b60008060408385031215613b6f57600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b83811015613bae57815187529582019590820190600101613b92565b509495945050505050565b60008151808452613bd181602086016020860161428a565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680613bff57607f831692505b6020808410821415613c2157634e487b7160e01b600052602260045260246000fd5b818015613c355760018114613c4657613c73565b60ff19861689528489019650613c73565b60008881526020902060005b86811015613c6b5781548b820152908501908301613c52565b505084890196505b50505050505092915050565b66697066733a2f2f60c81b815260008351613ca181600785016020880161428a565b602f60f81b6007918401918201528351613cc281600884016020880161428a565b64173539b7b760d91b60089290910191820152600d01949350505050565b66697066733a2f2f60c81b81526000613cfc6007830185613be5565b602f60f81b81528351613d1681600184016020880161428a565b64173539b7b760d91b60019290910191820152600601949350505050565b66697066733a2f2f60c81b81526000613d506007830184613be5565b602f60f81b8152653434b23232b760d11b600182015264173539b7b760d91b6007820152600c019392505050565b6001600160a01b0386811682528516602082015260a060408201819052600090613daa90830186613b7e565b8281036060840152613dbc8186613b7e565b90508281036080840152613dd08185613bb9565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090613e1690830184613bb9565b979650505050505050565b6020815260006136386020830184613b7e565b604081526000613e476040830185613b7e565b8281036020840152613e598185613b7e565b95945050505050565b6020815260006136386020830184613bb9565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b602080825260129082015271496e73756666696369656e742046756e647360701b604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60208082526027908201527f4944204d757374204e6f742042652046726f6d204f726967696e616c20436f6c6040820152663632b1ba34b7b760c91b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b6020808252600f908201526e139bdd0815da1a5d195b1a5cdd1959608a1b604082015260600190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252600f908201526e10dbdb9d1c9858dd0814185d5cd959608a1b604082015260600190565b60208082526034908201527f4f6e6c792043616e2055736520746865204d696e7420496e204f726465722046604082015273756e6374696f6e20417420546869732054696d6560601b606082015260800190565b60208082526021908201527f4578636565646564204d61782057686974656c697374204d696e74204c696d696040820152601d60fa1b606082015260800190565b60006001600160401b0382111561421e5761421e61438e565b5060051b60200190565b6000821982111561423b5761423b61434c565b500190565b60008261424f5761424f614362565b500490565b600081600019048311821515161561426e5761426e61434c565b500290565b6000828210156142855761428561434c565b500390565b60005b838110156142a557818101518382015260200161428d565b83811115611d565750506000910152565b600181811c908216806142ca57607f821691505b602082108114156142eb57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b03811182821017156143165761431661438e565b6040525050565b60006000198214156143315761433161434c565b5060010190565b60008261434757614347614362565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d11156123b85760046000803e5060005160e01c90565b600060443d10156143cd5790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156143fc57505050505090565b82850191508151818111156144145750505050505090565b843d870101602082850101111561442e5750505050505090565b61443d602082860101876142f1565b509095945050505050565b6001600160e01b03198116811461179857600080fdfe6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529ba26469706673582212208d52f78b1d96e6308725cb3f1beff8e214a51b9fe9d048848e815a6eece2597b64736f6c63430008070033
Deployed Bytecode Sourcemap
54141:20927:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74258:8;;-1:-1:-1;;;;;74258:8:0;74250:99;;;;-1:-1:-1;;;74250:99:0;;22790:2:1;74250:99:0;;;22772:21:1;;;22809:18;;;22802:30;22868:34;22848:18;;;22841:62;22920:18;;74250:99:0;;;;;;;;;74397:8;;:25;;74377:9;;-1:-1:-1;;;;;74397:8:0;;:25;;;;;74377:9;;74360:14;74397:25;74360:14;74397:25;74377:9;74397:8;:25;;;;;;;;;;;;;;;;;;;;;74239:191;54141:20927;;;;;64743:360;;;;;;;;;;-1:-1:-1;64743:360:0;;;;;:::i;:::-;;:::i;:::-;;27526:230;;;;;;;;;;-1:-1:-1;27526:230:0;;;;;:::i;:::-;;:::i;:::-;;;30822:25:1;;;30810:2;30795:18;27526:230:0;;;;;;;;26549:310;;;;;;;;;;-1:-1:-1;26549:310:0;;;;;:::i;:::-;;:::i;:::-;;;17316:14:1;;17309:22;17291:41;;17279:2;17264:18;26549:310:0;17151:187:1;56785:80:0;;;;;;;;;;-1:-1:-1;56785:80:0;;;;;:::i;:::-;;:::i;54236:41::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;68858:786::-;;;;;;;;;;-1:-1:-1;68858:786:0;;;;;:::i;:::-;;:::i;54635:32::-;;;;;;;;;;;;;;;;59225:1229;;;;;;:::i;:::-;;:::i;54701:33::-;;;;;;;;;;;;;;;;67185:608;;;;;;;;;;-1:-1:-1;67185:608:0;;;;;:::i;:::-;;:::i;29470:439::-;;;;;;;;;;-1:-1:-1;29470:439:0;;;;;:::i;:::-;;:::i;73594:109::-;;;;;;;;;;-1:-1:-1;73594:109:0;;;;;:::i;:::-;;:::i;55161:32::-;;;;;;;;;;;;;;;;57064:1585;;;;;;:::i;:::-;;:::i;71956:273::-;;;;;;;;;;-1:-1:-1;71956:273:0;;;;;:::i;:::-;;:::i;72845:102::-;;;;;;;;;;-1:-1:-1;72845:102:0;;;;;:::i;:::-;;:::i;73786:280::-;;;:::i;73434:87::-;;;;;;;;;;-1:-1:-1;73434:87:0;;;;;:::i;:::-;;:::i;55734:59::-;;;;;;;;;;-1:-1:-1;55734:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;66805:171;;;;;;;;;;-1:-1:-1;66805:171:0;;;;;:::i;:::-;;:::i;54542:37::-;;;;;;;;;;;;;;;;27922:524;;;;;;;;;;-1:-1:-1;27922:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;70553:98::-;;;;;;;;;;-1:-1:-1;70553:98:0;;;;;:::i;:::-;70602:4;70626:17;;;:12;:17;;;;;;;;;70553:98;55087:28;;;;;;;;;;-1:-1:-1;55087:28:0;;;;;;;;;;;72571:113;;;;;;;;;;-1:-1:-1;72571:113:0;;;;;:::i;:::-;;:::i;55054:26::-;;;;;;;;;;-1:-1:-1;55054:26:0;;;;;;;;54806:38;;;;;;;;;;;;;;;;55233:30;;;;;;;;;;;;;;;;5432:103;;;;;;;;;;;;;:::i;56483:153::-;;;;;;;;;;-1:-1:-1;56551:56:0;;;;;;;;;;;;;;;;;56483:153;;72333:123;;;;;;;;;;-1:-1:-1;72333:123:0;;;;;:::i;:::-;;:::i;66318:277::-;;;;;;;;;;-1:-1:-1;66318:277:0;;;;;:::i;:::-;;:::i;71092:556::-;;;;;;;;;;-1:-1:-1;71092:556:0;;;;;:::i;:::-;;:::i;55452:44::-;;;;;;;;;;-1:-1:-1;55452:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;4784:87;;;;;;;;;;-1:-1:-1;4857:6:0;;-1:-1:-1;;;;;4857:6:0;4784:87;;;-1:-1:-1;;;;;14751:32:1;;;14733:51;;14721:2;14706:18;4784:87:0;14587:203:1;54311:29:0;;;;;;;;;;;;;:::i;58657:396::-;;;;;;;;;;;;;:::i;55649:34::-;;;;;;;;;;-1:-1:-1;55649:34:0;;;;;;;;28519:155;;;;;;;;;;-1:-1:-1;28519:155:0;;;;;:::i;:::-;;:::i;55122:30::-;;;;;;;;;;-1:-1:-1;55122:30:0;;;;;;;;;;;55802:31;;;;;;;;;;-1:-1:-1;55802:31:0;;;;-1:-1:-1;;;;;55802:31:0;;;66095:137;;;;;;;;;;-1:-1:-1;66095:137:0;;;;;:::i;:::-;;:::i;55690:37::-;;;;;;;;;;-1:-1:-1;55690:37:0;;;;;:::i;:::-;;:::i;68003:847::-;;;;;;;;;;-1:-1:-1;68003:847:0;;;;;:::i;:::-;;:::i;70348:107::-;;;;;;;;;;-1:-1:-1;70348:107:0;;;;;:::i;:::-;70402:7;70429:18;;;:13;:18;;;;;;;70348:107;70734:209;;;;;;;;;;-1:-1:-1;70734:209:0;;;;;:::i;:::-;;:::i;65495:515::-;;;;;;;;;;-1:-1:-1;65495:515:0;;;;;:::i;:::-;;:::i;71764:120::-;;;;;;;;;;-1:-1:-1;71764:120:0;;;;;:::i;:::-;;:::i;55930:67::-;;;;;;;;;;-1:-1:-1;55930:67:0;;;;-1:-1:-1;;;;;55930:67:0;;;61655:1931;;;;;;:::i;:::-;;:::i;28746:168::-;;;;;;;;;;-1:-1:-1;28746:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;28869:27:0;;;28845:4;28869:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;28746:168;54923:36;;;;;;;;;;;;;;;;74853:210;;;;;;;;;;;;;:::i;73091:155::-;;;;;;;;;;-1:-1:-1;73091:155:0;;;;;:::i;:::-;;:::i;28986:407::-;;;;;;;;;;-1:-1:-1;28986:407:0;;;;;:::i;:::-;;:::i;5690:201::-;;;;;;;;;;-1:-1:-1;5690:201:0;;;;;:::i;:::-;;:::i;64743:360::-;74566:14;:12;:14::i;:::-;64844:17:::1;;64838:3;:23;64830:75;;;;-1:-1:-1::0;;;64830:75:0::1;;;;;;;:::i;:::-;70602:4:::0;70626:17;;;:12;:17;;;;;;;;64916:101:::1;;64949:17;::::0;;;:12:::1;:17;::::0;;;;:24;;-1:-1:-1;;64949:24:0::1;64969:4;64949:24;::::0;;64988:15:::1;:17:::0;;;::::1;::::0;::::1;:::i;:::-;;;;;;64916:101;65027:18;::::0;;;:13:::1;:18;::::0;;;;:29;;65049:7;;65027:18;:29:::1;::::0;65049:7;;65027:29:::1;:::i;:::-;;;;;;;;65067:28;65073:3;65078;65083:7;65067:28;;;;;;;;;;;::::0;:5:::1;:28::i;:::-;64743:360:::0;;;:::o;27526:230::-;27612:7;-1:-1:-1;;;;;27640:21:0;;27632:76;;;;-1:-1:-1;;;27632:76:0;;21974:2:1;27632:76:0;;;21956:21:1;22013:2;21993:18;;;21986:30;22052:34;22032:18;;;22025:62;-1:-1:-1;;;22103:18:1;;;22096:40;22153:19;;27632:76:0;21772:406:1;27632:76:0;-1:-1:-1;27726:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;27726:22:0;;;;;;;;;;27526:230;;;;;:::o;26549:310::-;26651:4;-1:-1:-1;;;;;;26688:41:0;;-1:-1:-1;;;26688:41:0;;:110;;-1:-1:-1;;;;;;;26746:52:0;;-1:-1:-1;;;26746:52:0;26688:110;:163;;;-1:-1:-1;;;;;;;;;;17727:40:0;;;26815:36;17618:157;56785:80;74566:14;:12;:14::i;:::-;56842:6:::1;:15:::0;;-1:-1:-1;;56842:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;56785:80::o;54236:41::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68858:786::-;68913:13;68948:1;68942:3;:7;:35;;;;;68960:17;;68953:3;:24;;68942:35;68938:699;;;68998:8;;;;;;;68994:552;;69130:7;69059:184;;;;;;;;:::i;:::-;;;;;;;;;;;;;69026:219;;68858:786;;;:::o;68994:552::-;69402:7;69458:21;69475:3;69458:16;:21::i;:::-;69331:197;;;;;;;;;:::i;68938:699::-;69612:13;;;;:8;:13;;;;;69605:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68858:786;;;:::o;68938:699::-;68858:786;;;:::o;59225:1229::-;59311:11;;;;;;;59310:12;59302:77;;;;-1:-1:-1;;;59302:77:0;;;;;;;:::i;:::-;59399:6;;;;59398:7;59390:35;;;;-1:-1:-1;;;59390:35:0;;;;;;;:::i;:::-;59444:28;59459:3;59464:7;59444:14;:28::i;:::-;59436:52;;;;-1:-1:-1;;;59436:52:0;;19302:2:1;59436:52:0;;;19284:21:1;19341:2;19321:18;;;19314:30;-1:-1:-1;;;19360:18:1;;;19353:41;19411:18;;59436:52:0;19100:335:1;59436:52:0;59510:17;;59503:3;:24;59499:262;;59551:26;59564:3;59569:7;59551:12;:26::i;:::-;59543:68;;;;-1:-1:-1;;;59543:68:0;;17769:2:1;59543:68:0;;;17751:21:1;17808:2;17788:18;;;17781:30;17847:31;17827:18;;;17820:59;17896:18;;59543:68:0;17567:353:1;59543:68:0;59635:17;;;;:12;:17;;;;;;;;59634:18;59626:51;;;;-1:-1:-1;;;59626:51:0;;26966:2:1;59626:51:0;;;26948:21:1;27005:2;26985:18;;;26978:30;-1:-1:-1;;;27024:18:1;;;27017:50;27084:18;;59626:51:0;26764:344:1;59626:51:0;59692:14;;;;:9;:14;;;;;;;;59709:1;59692:18;;;;59725:12;:17;;;;;;:24;;-1:-1:-1;;59725:24:0;;;;;;59499:262;59778:14;:12;:14::i;:::-;59773:444;;59813:15;;;;:23;;:15;:23;59809:322;;;59865:25;59879:10;59865:13;:25::i;:::-;59857:53;;;;-1:-1:-1;;;59857:53:0;;;;;;;:::i;:::-;59987:10;59929:30;59962:36;;;:24;:36;;;;;;60061:16;;60025:32;60050:7;59962:36;60025:32;:::i;:::-;:52;;60017:98;;;;-1:-1:-1;;;60017:98:0;;;;;;;:::i;:::-;59838:293;59809:322;60177:4;;60167:14;;:7;:14;:::i;:::-;60153:9;:29;;60145:60;;;;-1:-1:-1;;;60145:60:0;;;;;;;:::i;:::-;60254:10;60229:36;;;;:24;:36;;;;;:47;;60269:7;;60229:36;:47;;60269:7;;60229:47;:::i;:::-;;;;-1:-1:-1;;60287:18:0;;;;:13;:18;;;;;:29;;60309:7;;60287:18;:29;;60309:7;;60287:29;:::i;:::-;;;;-1:-1:-1;;70602:4:0;70626:17;;;:12;:17;;;;;;;;60327:81;;60360:17;;;;:12;:17;;;;;:24;;-1:-1:-1;;60360:24:0;60380:4;60360:24;;;60327:81;60418:28;60424:3;60429;60434:7;60418:28;;;;;;;;;;;;:5;:28::i;67185:608::-;74566:14;:12;:14::i;:::-;67293:17:::1;;67287:3;:23;67279:75;;;;-1:-1:-1::0;;;67279:75:0::1;;;;;;;:::i;:::-;67369:10;67365:421;;;67396:22;67491:4;67536:21;67553:3;67536:16;:21::i;:::-;67428:170;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;67428:170:0;;::::1;::::0;;;;;;67616:13:::1;::::0;;;:8:::1;67428:170;67616:13:::0;;;;;;:24;;67428:170;;-1:-1:-1;67616:24:0::1;::::0;:13;;:24;::::1;::::0;::::1;:::i;:::-;;67674:3;-1:-1:-1::0;;;;;;;;;;;67664:8:0::1;67660:18;;;;;;:::i;:::-;;;;;;;;67381:309;64743:360:::0;;;:::o;67365:421::-:1;67720:13;::::0;;;:8:::1;:13;::::0;;;;;;;:20;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;67770:3;-1:-1:-1::0;;;;;;;;;;;67764:4:0::1;67760:14;;;;;;:::i;:::-;;;;;;;;67185:608:::0;;;:::o;29470:439::-;-1:-1:-1;;;;;29703:20:0;;3362:10;29703:20;;:60;;-1:-1:-1;29727:36:0;29744:4;3362:10;28746:168;:::i;29727:36::-;29681:157;;;;-1:-1:-1;;;29681:157:0;;;;;;;:::i;:::-;29849:52;29872:4;29878:2;29882:3;29887:7;29896:4;29849:22;:52::i;:::-;29470:439;;;;;:::o;73594:109::-;4670:13;:11;:13::i;:::-;73667:8:::1;:28:::0;;-1:-1:-1;;;;;;73667:28:0::1;-1:-1:-1::0;;;;;73667:28:0;;;::::1;::::0;;;::::1;::::0;;73594:109::o;57064:1585::-;57148:11;;;;;;;57140:70;;;;-1:-1:-1;;;57140:70:0;;25071:2:1;57140:70:0;;;25053:21:1;25110:2;25090:18;;;25083:30;25149:34;25129:18;;;25122:62;-1:-1:-1;;;25200:18:1;;;25193:44;25254:19;;57140:70:0;24869:410:1;57140:70:0;57230:6;;;;57229:7;57221:35;;;;-1:-1:-1;;;57221:35:0;;;;;;;:::i;:::-;57283:4;70602;70626:17;:12;:17;;;;;;57275:13;57267:47;;;;-1:-1:-1;;;57267:47:0;;18952:2:1;57267:47:0;;;18934:21:1;18991:2;18971:18;;;18964:30;-1:-1:-1;;;19010:18:1;;;19003:51;19071:18;;57267:47:0;18750:345:1;57267:47:0;57376:17;;:21;;57396:1;57376:21;:::i;:::-;57357:15;;57333:39;;:21;:39;:::i;:::-;:64;;57325:122;;;;-1:-1:-1;;;57325:122:0;;21213:2:1;57325:122:0;;;21195:21:1;21252:2;21232:18;;;21225:30;21291:34;21271:18;;;21264:62;-1:-1:-1;;;21342:18:1;;;21335:43;21395:19;;57325:122:0;21011:409:1;57325:122:0;57465:14;:12;:14::i;:::-;57460:471;;57500:15;;;;57496:328;;;57544:25;57558:10;57544:13;:25::i;:::-;57536:53;;;;-1:-1:-1;;;57536:53:0;;;;;;;:::i;:::-;57666:10;57608:30;57641:36;;;:24;:36;;;;;;57754:16;;57704:46;57729:21;57641:36;57704:46;:::i;:::-;:66;;57696:112;;;;-1:-1:-1;;;57696:112:0;;;;;;;:::i;:::-;57517:307;57496:328;57884:11;:9;:11::i;:::-;57860:35;;:21;:35;:::i;:::-;57846:9;:50;;57838:81;;;;-1:-1:-1;;;57838:81:0;;;;;;;:::i;:::-;57968:10;57943:36;;;;:24;:36;;;;;:61;;57983:21;;57943:36;:61;;57983:21;;57943:61;:::i;:::-;;;;-1:-1:-1;58017:21:0;;-1:-1:-1;58055:21:0;-1:-1:-1;;;;;58041:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58041:36:0;;58017:60;;58088:25;58130:21;-1:-1:-1;;;;;58116:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58116:36:0;;58088:64;;58168:9;58163:424;58187:21;58183:1;:25;58163:424;;;58244:15;;70602:4;70626:17;;;:12;:17;;;;;;;;58274:198;;58311:17;;;;:12;:17;;;;;;;;:24;;58331:4;-1:-1:-1;;58311:24:0;;;;;;;;58354:9;:14;;;;;:18;;;58391:12;:17;;;;;:24;;;;;;;;;58434:13;:18;;;;;;:22;58274:198;58498:15;;58488:4;58493:1;58488:7;;;;;;;;:::i;:::-;;;;;;:25;;;;;58542:1;58528:8;58537:1;58528:11;;;;;;;;:::i;:::-;;;;;;;;;;:15;58558;:17;;;:15;:17;;;:::i;:::-;;;;;;58215:372;58210:3;;;;;:::i;:::-;;;;58163:424;;;;58599:42;58610:10;58622:4;58628:8;58599:42;;;;;;;;;;;;:10;:42::i;71956:273::-;72014:4;;72031:168;72055:20;:27;72051:31;;72031:168;;;72135:5;-1:-1:-1;;;;;72108:32:0;:20;72129:1;72108:23;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;72108:23:0;:32;72104:84;;;-1:-1:-1;72168:4:0;;71956:273;-1:-1:-1;;71956:273:0:o;72104:84::-;72084:3;;;;:::i;:::-;;;;72031:168;;;-1:-1:-1;72216:5:0;;71956:273;-1:-1:-1;;71956:273:0:o;72845:102::-;74566:14;:12;:14::i;:::-;72915:15:::1;:24:::0;;-1:-1:-1;;72915:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;72845:102::o;73786:280::-;74566:14;:12;:14::i;:::-;73851:8:::1;::::0;-1:-1:-1;;;;;73851:8:0::1;73843:99;;;::::0;-1:-1:-1;;;73843:99:0;;22790:2:1;73843:99:0::1;::::0;::::1;22772:21:1::0;;;22809:18;;;22802:30;22868:34;22848:18;;;22841:62;22920:18;;73843:99:0::1;22588:356:1::0;73843:99:0::1;73980:8;::::0;73972:59:::1;::::0;73954:12:::1;::::0;-1:-1:-1;;;;;73980:8:0::1;::::0;74003:21:::1;::::0;73954:12;73972:59;73954:12;73972:59;74003:21;73980:8;73972:59:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73953:78;;;74050:7;74042:16;;;::::0;::::1;;73832:234;73786:280::o:0;73434:87::-;74566:14;:12;:14::i;:::-;73498:4:::1;:15:::0;73434:87::o;66805:171::-;74566:14;:12;:14::i;:::-;66881:8:::1;::::0;::::1;::::0;::::1;;;66880:9;66872:45;;;::::0;-1:-1:-1;;;66872:45:0;;26614:2:1;66872:45:0::1;::::0;::::1;26596:21:1::0;26653:2;26633:18;;;26626:30;26692:25;26672:18;;;26665:53;26735:18;;66872:45:0::1;26412:347:1::0;66872:45:0::1;66928:14:::0;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;66953:8:0::1;:15:::0;;-1:-1:-1;;66953:15:0::1;;;::::0;;66805:171::o;27922:524::-;28078:16;28139:3;:10;28120:8;:15;:29;28112:83;;;;-1:-1:-1;;;28112:83:0;;27725:2:1;28112:83:0;;;27707:21:1;27764:2;27744:18;;;27737:30;27803:34;27783:18;;;27776:62;-1:-1:-1;;;27854:18:1;;;27847:39;27903:19;;28112:83:0;27523:405:1;28112:83:0;28208:30;28255:8;:15;-1:-1:-1;;;;;28241:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28241:30:0;;28208:63;;28289:9;28284:122;28308:8;:15;28304:1;:19;28284:122;;;28364:30;28374:8;28383:1;28374:11;;;;;;;;:::i;:::-;;;;;;;28387:3;28391:1;28387:6;;;;;;;;:::i;:::-;;;;;;;28364:9;:30::i;:::-;28345:13;28359:1;28345:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;28325:3;;;:::i;:::-;;;28284:122;;;-1:-1:-1;28425:13:0;27922:524;-1:-1:-1;;;27922:524:0:o;72571:113::-;74566:14;:12;:14::i;:::-;72651:16:::1;:25:::0;72571:113::o;5432:103::-;4670:13;:11;:13::i;:::-;5497:30:::1;5524:1;5497:18;:30::i;:::-;5432:103::o:0;72333:123::-;74566:14;:12;:14::i;:::-;72415:13:::1;:33:::0;72333:123::o;66318:277::-;66406:9;66401:138;66425:4;:11;66421:1;:15;66401:138;;;66458:11;66472:4;66477:1;66472:7;;;;;;;;:::i;:::-;;;;;;;66458:21;;66516:8;66525:1;66516:11;;;;;;;;:::i;:::-;;;;;;;66494:13;:18;66508:3;66494:18;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;66438:3:0;;-1:-1:-1;66438:3:0;;-1:-1:-1;66438:3:0;:::i;:::-;;;66401:138;;;;66549:38;66560:10;66572:4;66578:8;66549:10;:38::i;:::-;66318:277;;:::o;71092:556::-;74566:14;:12;:14::i;:::-;71197:9:::1;71192:449;71216:4;:11;71212:1;:15;71192:449;;;71249:11;71263:4;71268:1;71263:7;;;;;;;;:::i;:::-;;;;;;;71249:21;;71303:9;71313:1;71303:12;;;;;;;;:::i;:::-;;;;;;;71285:9;:14;71295:3;71285:14;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;71349:1;71334:9;71344:1;71334:12;;;;;;;;:::i;:::-;;;;;;;:16;71330:300;;;71407:15;::::0;;;:12:::1;:15;::::0;;;;:22;;-1:-1:-1;;71407:22:0::1;71425:4;71407:22;::::0;;71330:300:::1;;;71609:5;71591:15:::0;;;:12:::1;:15;::::0;;;;:23;;-1:-1:-1;;71591:23:0::1;::::0;;71330:300:::1;-1:-1:-1::0;71229:3:0;::::1;::::0;::::1;:::i;:::-;;;;71192:449;;54311:29:::0;;;;;;;:::i;58657:396::-;58698:7;58740:3;58721:15;;:22;58717:78;;-1:-1:-1;58766:17:0;;58657:396::o;58717:78::-;58828:3;58809:15;;:22;;:48;;;;;58854:3;58835:15;;:22;;58809:48;58805:104;;;-1:-1:-1;58880:17:0;;58657:396::o;58805:104::-;58942:3;58923:15;;:22;;:49;;;;;58968:4;58949:15;;:23;;58923:49;58919:105;;;-1:-1:-1;58995:17:0;;58657:396::o;58919:105::-;-1:-1:-1;59041:4:0;;;58657:396::o;28519:155::-;28614:52;3362:10;28647:8;28657;28614:18;:52::i;66095:137::-;66153:18;;;;:13;:18;;;;;:29;;66175:7;;66153:18;:29;;66175:7;;66153:29;:::i;:::-;;;;-1:-1:-1;66193:31:0;;-1:-1:-1;66199:10:0;66211:3;66216:7;66193:5;:31::i;55690:37::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55690:37:0;;-1:-1:-1;55690:37:0;:::o;68003:847::-;74566:14;:12;:14::i;:::-;68134:1:::1;68120:4;:11;:15;68112:52;;;::::0;-1:-1:-1;;;68112:52:0;;23557:2:1;68112:52:0::1;::::0;::::1;23539:21:1::0;23596:2;23576:18;;;23569:30;23635:26;23615:18;;;23608:54;23679:18;;68112:52:0::1;23355:348:1::0;68112:52:0::1;68184:21;68200:4;68184:15;:21::i;:::-;68183:22;68175:74;;;;-1:-1:-1::0;;;68175:74:0::1;;;;;;;:::i;:::-;68267:9;68262:581;68286:4;:11;68282:1;:15;68262:581;;;68319:11;68333:4;68338:1;68333:7;;;;;;;;:::i;:::-;;;;;;;68319:21;;68359:10;68355:477;;;68390:22;68493:4;68546:21;68563:3;68546:16;:21::i;:::-;68422:194;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;68422:194:0;;::::1;::::0;;;;;;68638:13:::1;::::0;;;:8:::1;68422:194;68638:13:::0;;;;;;:24;;68422:194;;-1:-1:-1;68638:24:0::1;::::0;:13;;:24;::::1;::::0;::::1;:::i;:::-;;68700:3;-1:-1:-1::0;;;;;;;;;;;68690:8:0::1;68686:18;;;;;;:::i;:::-;;;;;;;;68371:349;68355:477;;;68758:13;::::0;;;:8:::1;:13;::::0;;;;;;;:20;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;68812:3;-1:-1:-1::0;;;;;;;;;;;68806:4:0::1;68802:14;;;;;;:::i;:::-;;;;;;;;68355:477;-1:-1:-1::0;68299:3:0::1;::::0;::::1;:::i;:::-;;;68262:581;;;;68003:847:::0;;;:::o;70734:209::-;70791:7;70821:17;;70814:3;:24;70811:125;;-1:-1:-1;70861:1:0;;70734:209;-1:-1:-1;70734:209:0:o;70811:125::-;-1:-1:-1;70910:14:0;;;;:9;:14;;;;;;;70734:209::o;65495:515::-;74566:14;:12;:14::i;:::-;65616:21:::1;65632:4;65616:15;:21::i;:::-;65615:22;65607:74;;;;-1:-1:-1::0;;;65607:74:0::1;;;;;;;:::i;:::-;65697:9;65692:265;65716:4;:11;65712:1;:15;65692:265;;;65749:11;65763:4;65768:1;65763:7;;;;;;;;:::i;:::-;;;;;;;65749:21;;65790:11;65797:3;70602:4:::0;70626:17;;;:12;:17;;;;;;;;;70553:98;65790:11:::1;65785:113;;65822:17;::::0;;;:12:::1;:17;::::0;;;;:24;;-1:-1:-1;;65822:24:0::1;65842:4;65822:24;::::0;;65865:15:::1;:17:::0;;;::::1;::::0;::::1;:::i;:::-;;;;;;65785:113;65934:8;65943:1;65934:11;;;;;;;;:::i;:::-;;;;;;;65912:13;:18;65926:3;65912:18;;;;;;;;;;;;:33;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;65729:3:0::1;::::0;-1:-1:-1;65729:3:0;;-1:-1:-1;65729:3:0::1;:::i;:::-;;;65692:265;;;;65967:35;65978:3;65983:4;65989:8;65967:35;;;;;;;;;;;::::0;:10:::1;:35::i;71764:120::-:0;74566:14;:12;:14::i;:::-;71864:12:::1;71845:15;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;71764:120:0:o;61655:1931::-;61766:11;;;;;;;61765:12;61757:77;;;;-1:-1:-1;;;61757:77:0;;;;;;;:::i;:::-;61854:6;;;;61853:7;61845:35;;;;-1:-1:-1;;;61845:35:0;;;;;;;:::i;:::-;61914:13;;61899:4;:11;:28;;61891:71;;;;-1:-1:-1;;;61891:71:0;;25486:2:1;61891:71:0;;;25468:21:1;25525:2;25505:18;;;25498:30;25564:32;25544:18;;;25537:60;25614:18;;61891:71:0;25284:354:1;61891:71:0;61996:8;:15;61981:4;:11;:30;61973:79;;;;-1:-1:-1;;;61973:79:0;;22385:2:1;61973:79:0;;;22367:21:1;22424:2;22404:18;;;22397:30;22463:34;22443:18;;;22436:62;-1:-1:-1;;;22514:18:1;;;22507:34;22558:19;;61973:79:0;22183:400:1;61973:79:0;62071:35;62091:4;62097:8;62071:19;:35::i;:::-;62063:65;;;;-1:-1:-1;;;62063:65:0;;23910:2:1;62063:65:0;;;23892:21:1;23949:2;23929:18;;;23922:30;-1:-1:-1;;;23968:18:1;;;23961:47;24025:18;;62063:65:0;23708:341:1;62063:65:0;62141:25;;62177:481;62201:8;:15;62197:1;:19;62177:481;;;62238:11;62252:4;62257:1;62252:7;;;;;;;;:::i;:::-;;;;;;;62238:21;;62274:15;62292:8;62301:1;62292:11;;;;;;;;:::i;:::-;;;;;;;62274:29;;62329:17;;62322:3;:24;62318:282;;62374:26;62387:3;62392:7;62374:12;:26::i;:::-;62366:68;;;;-1:-1:-1;;;62366:68:0;;17769:2:1;62366:68:0;;;17751:21:1;17808:2;17788:18;;;17781:30;17847:31;17827:18;;;17820:59;17896:18;;62366:68:0;17567:353:1;62366:68:0;62462:17;;;;:12;:17;;;;;;;;62461:18;62453:51;;;;-1:-1:-1;;;62453:51:0;;26966:2:1;62453:51:0;;;26948:21:1;27005:2;26985:18;;;26978:30;-1:-1:-1;;;27024:18:1;;;27017:50;27084:18;;62453:51:0;26764:344:1;62453:51:0;62523:14;;;;:9;:14;;;;;;;;62540:1;62523:18;;;;62560:12;:17;;;;;;:24;;-1:-1:-1;;62560:24:0;;;;;;62318:282;62635:8;62644:1;62635:11;;;;;;;;:::i;:::-;;;;;;;62614:32;;;;;:::i;:::-;;;62223:435;;62218:3;;;;;:::i;:::-;;;;62177:481;;;;62697:18;;62676:17;:39;;62668:79;;;;-1:-1:-1;;;62668:79:0;;19642:2:1;62668:79:0;;;19624:21:1;19681:2;19661:18;;;19654:30;19720:29;19700:18;;;19693:57;19767:18;;62668:79:0;19440:351:1;62668:79:0;62765:14;:12;:14::i;:::-;62760:456;;62800:15;;;;62796:324;;;62844:25;62858:10;62844:13;:25::i;:::-;62836:53;;;;-1:-1:-1;;;62836:53:0;;;;;;;:::i;:::-;62966:10;62908:30;62941:36;;;:24;:36;;;;;;63050:16;;63004:42;63029:17;62941:36;63004:42;:::i;:::-;:62;;62996:108;;;;-1:-1:-1;;;62996:108:0;;;;;;;:::i;:::-;62817:303;62796:324;63176:4;;63156:24;;:17;:24;:::i;:::-;63142:9;:39;;63134:70;;;;-1:-1:-1;;;63134:70:0;;;;;;;:::i;:::-;63253:10;63228:36;;;;:24;:36;;;;;:57;;63268:17;;63228:36;:57;;63268:17;;63228:57;:::i;:::-;;;;-1:-1:-1;63303:9:0;;-1:-1:-1;63298:233:0;63322:4;:11;63318:1;:15;63298:233;;;63381:8;63390:1;63381:11;;;;;;;;:::i;:::-;;;;;;;63355:13;:22;63369:4;63374:1;63369:7;;;;;;;;:::i;:::-;;;;;;;63355:22;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;63407:11;63421:4;63426:1;63421:7;;;;;;;;:::i;:::-;;;;;;;63407:21;;63448:11;63455:3;70602:4;70626:17;;;:12;:17;;;;;;;;;70553:98;63448:11;63443:77;;63480:17;;;;:12;:17;;;;;:24;;-1:-1:-1;;63480:24:0;63500:4;63480:24;;;63443:77;-1:-1:-1;63335:3:0;;;;:::i;:::-;;;;63298:233;;;;63543:35;63554:3;63559:4;63565:8;63543:35;;;;;;;;;;;;:10;:35::i;74853:210::-;74897:4;74932:7;4857:6;;-1:-1:-1;;;;;4857:6:0;;4784:87;74932:7;-1:-1:-1;;;;;74918:21:0;:10;-1:-1:-1;;;;;74918:21:0;;:46;;;-1:-1:-1;74957:7:0;;-1:-1:-1;;;;;74957:7:0;74943:10;:21;74918:46;74914:142;;;-1:-1:-1;74987:4:0;;74853:210::o;74914:142::-;-1:-1:-1;75039:5:0;;74853:210::o;74914:142::-;74853:210;:::o;73091:155::-;74566:14;:12;:14::i;:::-;73171:27:::1;73178:20;;73171:27;:::i;:::-;73209:29;:20;73232:6:::0;;73209:29:::1;:::i;28986:407::-:0;-1:-1:-1;;;;;29194:20:0;;3362:10;29194:20;;:60;;-1:-1:-1;29218:36:0;29235:4;3362:10;28746:168;:::i;29218:36::-;29172:157;;;;-1:-1:-1;;;29172:157:0;;;;;;;:::i;:::-;29340:45;29358:4;29364:2;29368;29372:6;29380:4;29340:17;:45::i;5690:201::-;4670:13;:11;:13::i;:::-;-1:-1:-1;;;;;5779:22:0;::::1;5771:73;;;::::0;-1:-1:-1;;;5771:73:0;;19998:2:1;5771:73:0::1;::::0;::::1;19980:21:1::0;20037:2;20017:18;;;20010:30;20076:34;20056:18;;;20049:62;-1:-1:-1;;;20127:18:1;;;20120:36;20173:19;;5771:73:0::1;19796:402:1::0;5771:73:0::1;5855:28;5874:8;5855:18;:28::i;7535:326::-:0;-1:-1:-1;;;;;7830:19:0;;:23;;;7535:326::o;74687:158::-;4857:6;;-1:-1:-1;;;;;4857:6:0;74752:10;:21;;:46;;-1:-1:-1;74791:7:0;;-1:-1:-1;;;;;74791:7:0;74777:10;:21;74752:46;74744:93;;;;-1:-1:-1;;;74744:93:0;;20810:2:1;74744:93:0;;;20792:21:1;20849:2;20829:18;;;20822:30;20888:34;20868:18;;;20861:62;-1:-1:-1;;;20939:18:1;;;20932:32;20981:19;;74744:93:0;20608:398:1;34169:729:0;-1:-1:-1;;;;;34322:16:0;;34314:62;;;;-1:-1:-1;;;34314:62:0;;;;;;;:::i;:::-;3362:10;34389:16;34454:21;34472:2;34454:17;:21::i;:::-;34431:44;;34486:24;34513:25;34531:6;34513:17;:25::i;:::-;34486:52;;34630:9;:13;;;;;;;;;;;-1:-1:-1;;;;;34630:17:0;;;;;;;;;:27;;34651:6;;34630:9;:27;;34651:6;;34630:27;:::i;:::-;;;;-1:-1:-1;;34673:52:0;;;31032:25:1;;;31088:2;31073:18;;31066:34;;;-1:-1:-1;;;;;34673:52:0;;;;34706:1;;34673:52;;;;;;31005:18:1;34673:52:0;;;;;;;34816:74;34847:8;34865:1;34869:2;34873;34877:6;34885:4;34816:30;:74::i;:::-;34303:595;;;34169:729;;;;:::o;483:723::-;539:13;760:10;756:53;;-1:-1:-1;;787:10:0;;;;;;;;;;;;-1:-1:-1;;;787:10:0;;;;;483:723::o;756:53::-;834:5;819:12;875:78;882:9;;875:78;;908:8;;;;:::i;:::-;;-1:-1:-1;931:10:0;;-1:-1:-1;939:2:0;931:10;;:::i;:::-;;;875:78;;;963:19;995:6;-1:-1:-1;;;;;985:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;985:17:0;;963:39;;1013:154;1020:10;;1013:154;;1047:11;1057:1;1047:11;;:::i;:::-;;-1:-1:-1;1116:10:0;1124:2;1116:5;:10;:::i;:::-;1103:24;;:2;:24;:::i;:::-;1090:39;;1073:6;1080;1073:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1073:56:0;;;;;;;;-1:-1:-1;1144:11:0;1153:2;1144:11;;:::i;:::-;;;1013:154;;;1191:6;483:723;-1:-1:-1;;;;483:723:0:o;60462:708::-;60531:4;60551:17;;;:12;:17;;;;;;;;60547:592;;;60599:1;60589:7;:11;:39;;;;;60615:13;;60604:7;:24;;60589:39;:50;;;;;60638:1;60632:3;:7;60589:50;:76;;;;;60650:15;;60643:3;:22;;60589:76;:126;;;;-1:-1:-1;60701:14:0;;;;:9;:14;;;;;;;;;60669:13;:18;;;;;;;:28;;60690:7;;60669:28;:::i;:::-;:46;;60589:126;60585:276;;;60547:592;;60585:276;-1:-1:-1;60840:5:0;60833:12;;60547:592;60916:1;60906:7;:11;:39;;;;;60932:13;;60921:7;:24;;60906:39;:50;;;;;60955:1;60949:3;:7;60906:50;:76;;;;;60967:15;;60960:3;:22;60902:226;;;-1:-1:-1;61158:4:0;60462:708;;;;:::o;70040:228::-;70109:4;70136:17;;70129:3;:24;;:40;;;;;70157:7;70168:1;70157:12;70129:40;70125:136;;;-1:-1:-1;70192:4:0;70185:11;;31705:1146;31932:7;:14;31918:3;:10;:28;31910:81;;;;-1:-1:-1;;;31910:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32010:16:0;;32002:66;;;;-1:-1:-1;;;32002:66:0;;;;;;;:::i;:::-;3362:10;32081:16;32198:421;32222:3;:10;32218:1;:14;32198:421;;;32254:10;32267:3;32271:1;32267:6;;;;;;;;:::i;:::-;;;;;;;32254:19;;32288:14;32305:7;32313:1;32305:10;;;;;;;;:::i;:::-;;;;;;;;;;;;32332:19;32354:13;;;;;;;;;;-1:-1:-1;;;;;32354:19:0;;;;;;;;;;;;32305:10;;-1:-1:-1;32396:21:0;;;;32388:76;;;;-1:-1:-1;;;32388:76:0;;;;;;;:::i;:::-;32508:9;:13;;;;;;;;;;;-1:-1:-1;;;;;32508:19:0;;;;;;;;;;32530:20;;;32508:42;;32580:17;;;;;;;:27;;32530:20;;32508:9;32580:27;;32530:20;;32580:27;:::i;:::-;;;;;;;;32239:380;;;32234:3;;;;:::i;:::-;;;32198:421;;;;32666:2;-1:-1:-1;;;;;32636:47:0;32660:4;-1:-1:-1;;;;;32636:47:0;32650:8;-1:-1:-1;;;;;32636:47:0;;32670:3;32675:7;32636:47;;;;;;;:::i;:::-;;;;;;;;32768:75;32804:8;32814:4;32820:2;32824:3;32829:7;32838:4;32768:35;:75::i;:::-;31899:952;31705:1146;;;;;:::o;4949:132::-;4857:6;;-1:-1:-1;;;;;4857:6:0;3362:10;5013:23;5005:68;;;;-1:-1:-1;;;5005:68:0;;25845:2:1;5005:68:0;;;25827:21:1;;;25864:18;;;25857:30;25923:34;25903:18;;;25896:62;25975:18;;5005:68:0;25643:356:1;35301:813:0;-1:-1:-1;;;;;35479:16:0;;35471:62;;;;-1:-1:-1;;;35471:62:0;;;;;;;:::i;:::-;35566:7;:14;35552:3;:10;:28;35544:81;;;;-1:-1:-1;;;35544:81:0;;;;;;;:::i;:::-;3362:10;35638:16;35761:103;35785:3;:10;35781:1;:14;35761:103;;;35842:7;35850:1;35842:10;;;;;;;;:::i;:::-;;;;;;;35817:9;:17;35827:3;35831:1;35827:6;;;;;;;;:::i;:::-;;;;;;;35817:17;;;;;;;;;;;:21;35835:2;-1:-1:-1;;;;;35817:21:0;-1:-1:-1;;;;;35817:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;35797:3:0;;-1:-1:-1;35797:3:0;;;:::i;:::-;;;;35761:103;;;;35917:2;-1:-1:-1;;;;;35881:53:0;35913:1;-1:-1:-1;;;;;35881:53:0;35895:8;-1:-1:-1;;;;;35881:53:0;;35921:3;35926:7;35881:53;;;;;;;:::i;:::-;;;;;;;;36025:81;36061:8;36079:1;36083:2;36087:3;36092:7;36101:4;36025:35;:81::i;6051:191::-;6144:6;;;-1:-1:-1;;;;;6161:17:0;;;-1:-1:-1;;;;;;6161:17:0;;;;;;;6194:40;;6144:6;;;6161:17;6144:6;;6194:40;;6125:16;;6194:40;6114:128;6051:191;:::o;37470:969::-;-1:-1:-1;;;;;37622:18:0;;37614:66;;;;-1:-1:-1;;;37614:66:0;;;;;;;:::i;:::-;37713:7;:14;37699:3;:10;:28;37691:81;;;;-1:-1:-1;;;37691:81:0;;;;;;;:::i;:::-;37829:66;;;;;;;;;37785:16;37829:66;;;;3362:10;;37908:373;37932:3;:10;37928:1;:14;37908:373;;;37964:10;37977:3;37981:1;37977:6;;;;;;;;:::i;:::-;;;;;;;37964:19;;37998:14;38015:7;38023:1;38015:10;;;;;;;;:::i;:::-;;;;;;;;;;;;38042:19;38064:13;;;;;;;;;;-1:-1:-1;;;;;38064:19:0;;;;;;;;;;;;38015:10;;-1:-1:-1;38106:21:0;;;;38098:70;;;;-1:-1:-1;;;38098:70:0;;;;;;;:::i;:::-;38212:9;:13;;;;;;;;;;;-1:-1:-1;;;;;38212:19:0;;;;;;;;;;38234:20;;38212:42;;37944:3;;;;:::i;:::-;;;;37908:373;;;;38336:1;-1:-1:-1;;;;;38298:55:0;38322:4;-1:-1:-1;;;;;38298:55:0;38312:8;-1:-1:-1;;;;;38298:55:0;;38340:3;38345:7;38298:55;;;;;;;:::i;:::-;;;;;;;;38366:65;;;;;;;;;38410:1;38366:65;;;31705:1146;38582:331;38737:8;-1:-1:-1;;;;;38728:17:0;:5;-1:-1:-1;;;;;38728:17:0;;;38720:71;;;;-1:-1:-1;;;38720:71:0;;27315:2:1;38720:71:0;;;27297:21:1;27354:2;27334:18;;;27327:30;27393:34;27373:18;;;27366:62;-1:-1:-1;;;27444:18:1;;;27437:39;27493:19;;38720:71:0;27113:405:1;38720:71:0;-1:-1:-1;;;;;38802:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;38802:46:0;;;;;;;;;;38864:41;;17291::1;;;38864::0;;17264:18:1;38864:41:0;;;;;;;38582:331;;;:::o;36412:808::-;-1:-1:-1;;;;;36539:18:0;;36531:66;;;;-1:-1:-1;;;36531:66:0;;;;;;;:::i;:::-;3362:10;36610:16;36675:21;36693:2;36675:17;:21::i;:::-;36652:44;;36707:24;36734:25;36752:6;36734:17;:25::i;:::-;36772:66;;;;;;;;;-1:-1:-1;36772:66:0;;;;36873:13;;;;;;;;;-1:-1:-1;;;;;36873:19:0;;;;;;;;36707:52;;-1:-1:-1;36911:21:0;;;;36903:70;;;;-1:-1:-1;;;36903:70:0;;;;;;;:::i;:::-;37009:9;:13;;;;;;;;;;;-1:-1:-1;;;;;37009:19:0;;;;;;;;;;;;37031:20;;;37009:42;;37080:54;;31032:25:1;;;31073:18;;;31066:34;;;37009:19:0;;37080:54;;;;;;31005:18:1;37080:54:0;;;;;;;37147:65;;;;;;;;;37191:1;37147:65;;;31705:1146;69652:380;69718:4;;69734:269;69758:4;:11;69754:1;:15;69734:269;;;69791:11;69805:4;69810:1;69805:7;;;;;;;;:::i;:::-;;;;;;;69791:21;;69838:17;;69831:3;:24;69827:165;;;;;-1:-1:-1;69971:5:0;;69652:380;-1:-1:-1;;;69652:380:0:o;69827:165::-;-1:-1:-1;69771:3:0;;;:::i;:::-;;;69734:269;;63594:946;63687:4;;63703:806;63727:4;:11;63723:1;:15;63703:806;;;63760:11;63774:4;63779:1;63774:7;;;;;;;;:::i;:::-;;;;;;;63760:21;;63796:15;63814:8;63823:1;63814:11;;;;;;;;:::i;:::-;;;;;;;;;;;;63844:17;;;;:12;:17;;;;;;;;63814:11;;-1:-1:-1;63844:17:0;;63840:658;;;63896:1;63886:7;:11;:39;;;;;63912:13;;63901:7;:24;;63886:39;:50;;;;;63935:1;63929:3;:7;63886:50;:76;;;;;63947:15;;63940:3;:22;;63886:76;:126;;;;-1:-1:-1;63998:14:0;;;;:9;:14;;;;;;;;;63966:13;:18;;;;;;;:28;;63987:7;;63966:28;:::i;:::-;:46;;63886:126;63882:299;;;63840:658;;63882:299;64156:5;64149:12;;;;;;;63840:658;64248:1;64238:7;:11;:39;;;;;64264:13;;64253:7;:24;;64238:39;:50;;;;;64287:1;64281:3;:7;64238:50;:76;;;;;64299:15;;64292:3;:22;64234:249;;;63745:764;;63740:3;;;;;:::i;:::-;;;;63703:806;;;-1:-1:-1;64528:4:0;;63594:946;-1:-1:-1;;;63594:946:0:o;30373:974::-;-1:-1:-1;;;;;30561:16:0;;30553:66;;;;-1:-1:-1;;;30553:66:0;;;;;;;:::i;:::-;3362:10;30632:16;30697:21;30715:2;30697:17;:21::i;:::-;30674:44;;30729:24;30756:25;30774:6;30756:17;:25::i;:::-;30729:52;;30867:19;30889:13;;;;;;;;;;;-1:-1:-1;;;;;30889:19:0;;;;;;;;;;30927:21;;;;30919:76;;;;-1:-1:-1;;;30919:76:0;;;;;;;:::i;:::-;31031:9;:13;;;;;;;;;;;-1:-1:-1;;;;;31031:19:0;;;;;;;;;;31053:20;;;31031:42;;31095:17;;;;;;;:27;;31053:20;;31031:9;31095:27;;31053:20;;31095:27;:::i;:::-;;;;-1:-1:-1;;31140:46:0;;;31032:25:1;;;31088:2;31073:18;;31066:34;;;-1:-1:-1;;;;;31140:46:0;;;;;;;;;;;;;;31005:18:1;31140:46:0;;;;;;;31271:68;31302:8;31312:4;31318:2;31322;31326:6;31334:4;31271:30;:68::i;:::-;30542:805;;;;30373:974;;;;;:::o;42848:198::-;42968:16;;;42982:1;42968:16;;;;;;;;;42914;;42943:22;;42968:16;;;;;;;;;;;;-1:-1:-1;42968:16:0;42943:41;;43006:7;42995:5;43001:1;42995:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;43033:5;42848:198;-1:-1:-1;;42848:198:0:o;41275:744::-;-1:-1:-1;;;;;41490:13:0;;7830:19;:23;41486:526;;41526:72;;-1:-1:-1;;;41526:72:0;;-1:-1:-1;;;;;41526:38:0;;;;;:72;;41565:8;;41575:4;;41581:2;;41585:6;;41593:4;;41526:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41526:72:0;;;;;;;;-1:-1:-1;;41526:72:0;;;;;;;;;;;;:::i;:::-;;;41522:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;41874:6;41867:14;;-1:-1:-1;;;41867:14:0;;;;;;;;:::i;41522:479::-;;;41923:62;;-1:-1:-1;;;41923:62:0;;29634:2:1;41923:62:0;;;29616:21:1;29673:2;29653:18;;;29646:30;29712:34;29692:18;;;29685:62;-1:-1:-1;;;29763:18:1;;;29756:50;29823:19;;41923:62:0;29432:416:1;41522:479:0;-1:-1:-1;;;;;;41648:55:0;;-1:-1:-1;;;41648:55:0;41644:154;;41728:50;;-1:-1:-1;;;41728:50:0;;;;;;;:::i;42027:813::-;-1:-1:-1;;;;;42267:13:0;;7830:19;:23;42263:570;;42303:79;;-1:-1:-1;;;42303:79:0;;-1:-1:-1;;;;;42303:43:0;;;;;:79;;42347:8;;42357:4;;42363:3;;42368:7;;42377:4;;42303:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42303:79:0;;;;;;;;-1:-1:-1;;42303:79:0;;;;;;;;;;;;:::i;:::-;;;42299:523;;;;:::i;:::-;-1:-1:-1;;;;;;42464:60:0;;-1:-1:-1;;;42464:60:0;42460:159;;42549:50;;-1:-1:-1;;;42549:50:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;192:735;246:5;299:3;292:4;284:6;280:17;276:27;266:55;;317:1;314;307:12;266:55;353:6;340:20;379:4;402:43;442:2;402:43;:::i;:::-;474:2;468:9;486:31;514:2;506:6;486:31;:::i;:::-;552:18;;;586:15;;;;-1:-1:-1;621:15:1;;;671:1;667:10;;;655:23;;651:32;;648:41;-1:-1:-1;645:61:1;;;702:1;699;692:12;645:61;724:1;734:163;748:2;745:1;742:9;734:163;;;805:17;;793:30;;843:12;;;;875;;;;766:1;759:9;734:163;;;-1:-1:-1;915:6:1;;192:735;-1:-1:-1;;;;;;;192:735:1:o;932:160::-;997:20;;1053:13;;1046:21;1036:32;;1026:60;;1082:1;1079;1072:12;1097:555;1139:5;1192:3;1185:4;1177:6;1173:17;1169:27;1159:55;;1210:1;1207;1200:12;1159:55;1246:6;1233:20;-1:-1:-1;;;;;1268:2:1;1265:26;1262:52;;;1294:18;;:::i;:::-;1343:2;1337:9;1355:67;1410:2;1391:13;;-1:-1:-1;;1387:27:1;1416:4;1383:38;1337:9;1355:67;:::i;:::-;1446:2;1438:6;1431:18;1492:3;1485:4;1480:2;1472:6;1468:15;1464:26;1461:35;1458:55;;;1509:1;1506;1499:12;1458:55;1573:2;1566:4;1558:6;1554:17;1547:4;1539:6;1535:17;1522:54;1620:1;1596:15;;;1613:4;1592:26;1585:37;;;;1600:6;1097:555;-1:-1:-1;;;1097:555:1:o;1657:186::-;1716:6;1769:2;1757:9;1748:7;1744:23;1740:32;1737:52;;;1785:1;1782;1775:12;1737:52;1808:29;1827:9;1808:29;:::i;:::-;1798:39;1657:186;-1:-1:-1;;;1657:186:1:o;1848:260::-;1916:6;1924;1977:2;1965:9;1956:7;1952:23;1948:32;1945:52;;;1993:1;1990;1983:12;1945:52;2016:29;2035:9;2016:29;:::i;:::-;2006:39;;2064:38;2098:2;2087:9;2083:18;2064:38;:::i;:::-;2054:48;;1848:260;;;;;:::o;2113:943::-;2267:6;2275;2283;2291;2299;2352:3;2340:9;2331:7;2327:23;2323:33;2320:53;;;2369:1;2366;2359:12;2320:53;2392:29;2411:9;2392:29;:::i;:::-;2382:39;;2440:38;2474:2;2463:9;2459:18;2440:38;:::i;:::-;2430:48;;2529:2;2518:9;2514:18;2501:32;-1:-1:-1;;;;;2593:2:1;2585:6;2582:14;2579:34;;;2609:1;2606;2599:12;2579:34;2632:61;2685:7;2676:6;2665:9;2661:22;2632:61;:::i;:::-;2622:71;;2746:2;2735:9;2731:18;2718:32;2702:48;;2775:2;2765:8;2762:16;2759:36;;;2791:1;2788;2781:12;2759:36;2814:63;2869:7;2858:8;2847:9;2843:24;2814:63;:::i;:::-;2804:73;;2930:3;2919:9;2915:19;2902:33;2886:49;;2960:2;2950:8;2947:16;2944:36;;;2976:1;2973;2966:12;2944:36;;2999:51;3042:7;3031:8;3020:9;3016:24;2999:51;:::i;:::-;2989:61;;;2113:943;;;;;;;;:::o;3061:606::-;3165:6;3173;3181;3189;3197;3250:3;3238:9;3229:7;3225:23;3221:33;3218:53;;;3267:1;3264;3257:12;3218:53;3290:29;3309:9;3290:29;:::i;:::-;3280:39;;3338:38;3372:2;3361:9;3357:18;3338:38;:::i;:::-;3328:48;;3423:2;3412:9;3408:18;3395:32;3385:42;;3474:2;3463:9;3459:18;3446:32;3436:42;;3529:3;3518:9;3514:19;3501:33;-1:-1:-1;;;;;3549:6:1;3546:30;3543:50;;;3589:1;3586;3579:12;3543:50;3612:49;3653:7;3644:6;3633:9;3629:22;3612:49;:::i;3672:669::-;3799:6;3807;3815;3868:2;3856:9;3847:7;3843:23;3839:32;3836:52;;;3884:1;3881;3874:12;3836:52;3907:29;3926:9;3907:29;:::i;:::-;3897:39;;3987:2;3976:9;3972:18;3959:32;-1:-1:-1;;;;;4051:2:1;4043:6;4040:14;4037:34;;;4067:1;4064;4057:12;4037:34;4090:61;4143:7;4134:6;4123:9;4119:22;4090:61;:::i;:::-;4080:71;;4204:2;4193:9;4189:18;4176:32;4160:48;;4233:2;4223:8;4220:16;4217:36;;;4249:1;4246;4239:12;4217:36;;4272:63;4327:7;4316:8;4305:9;4301:24;4272:63;:::i;:::-;4262:73;;;3672:669;;;;;:::o;4346:254::-;4411:6;4419;4472:2;4460:9;4451:7;4447:23;4443:32;4440:52;;;4488:1;4485;4478:12;4440:52;4511:29;4530:9;4511:29;:::i;:::-;4501:39;;4559:35;4590:2;4579:9;4575:18;4559:35;:::i;4605:254::-;4673:6;4681;4734:2;4722:9;4713:7;4709:23;4705:32;4702:52;;;4750:1;4747;4740:12;4702:52;4773:29;4792:9;4773:29;:::i;:::-;4763:39;4849:2;4834:18;;;;4821:32;;-1:-1:-1;;;4605:254:1:o;4864:322::-;4941:6;4949;4957;5010:2;4998:9;4989:7;4985:23;4981:32;4978:52;;;5026:1;5023;5016:12;4978:52;5049:29;5068:9;5049:29;:::i;:::-;5039:39;5125:2;5110:18;;5097:32;;-1:-1:-1;5176:2:1;5161:18;;;5148:32;;4864:322;-1:-1:-1;;;4864:322:1:o;5191:615::-;5277:6;5285;5338:2;5326:9;5317:7;5313:23;5309:32;5306:52;;;5354:1;5351;5344:12;5306:52;5394:9;5381:23;-1:-1:-1;;;;;5464:2:1;5456:6;5453:14;5450:34;;;5480:1;5477;5470:12;5450:34;5518:6;5507:9;5503:22;5493:32;;5563:7;5556:4;5552:2;5548:13;5544:27;5534:55;;5585:1;5582;5575:12;5534:55;5625:2;5612:16;5651:2;5643:6;5640:14;5637:34;;;5667:1;5664;5657:12;5637:34;5720:7;5715:2;5705:6;5702:1;5698:14;5694:2;5690:23;5686:32;5683:45;5680:65;;;5741:1;5738;5731:12;5680:65;5772:2;5764:11;;;;;5794:6;;-1:-1:-1;5191:615:1;;-1:-1:-1;;;;5191:615:1:o;5811:1219::-;5929:6;5937;5990:2;5978:9;5969:7;5965:23;5961:32;5958:52;;;6006:1;6003;5996:12;5958:52;6046:9;6033:23;-1:-1:-1;;;;;6116:2:1;6108:6;6105:14;6102:34;;;6132:1;6129;6122:12;6102:34;6170:6;6159:9;6155:22;6145:32;;6215:7;6208:4;6204:2;6200:13;6196:27;6186:55;;6237:1;6234;6227:12;6186:55;6273:2;6260:16;6295:4;6318:43;6358:2;6318:43;:::i;:::-;6390:2;6384:9;6402:31;6430:2;6422:6;6402:31;:::i;:::-;6468:18;;;6502:15;;;;-1:-1:-1;6537:11:1;;;6579:1;6575:10;;;6567:19;;6563:28;;6560:41;-1:-1:-1;6557:61:1;;;6614:1;6611;6604:12;6557:61;6636:1;6627:10;;6646:169;6660:2;6657:1;6654:9;6646:169;;;6717:23;6736:3;6717:23;:::i;:::-;6705:36;;6678:1;6671:9;;;;;6761:12;;;;6793;;6646:169;;;-1:-1:-1;6834:6:1;-1:-1:-1;;6878:18:1;;6865:32;;-1:-1:-1;;6909:16:1;;;6906:36;;;6938:1;6935;6928:12;6906:36;;6961:63;7016:7;7005:8;6994:9;6990:24;6961:63;:::i;:::-;6951:73;;;5811:1219;;;;;:::o;7035:595::-;7153:6;7161;7214:2;7202:9;7193:7;7189:23;7185:32;7182:52;;;7230:1;7227;7220:12;7182:52;7270:9;7257:23;-1:-1:-1;;;;;7340:2:1;7332:6;7329:14;7326:34;;;7356:1;7353;7346:12;7326:34;7379:61;7432:7;7423:6;7412:9;7408:22;7379:61;:::i;:::-;7369:71;;7493:2;7482:9;7478:18;7465:32;7449:48;;7522:2;7512:8;7509:16;7506:36;;;7538:1;7535;7528:12;7635:636;7744:6;7752;7760;7813:2;7801:9;7792:7;7788:23;7784:32;7781:52;;;7829:1;7826;7819:12;7781:52;7869:9;7856:23;-1:-1:-1;;;;;7939:2:1;7931:6;7928:14;7925:34;;;7955:1;7952;7945:12;7925:34;7978:61;8031:7;8022:6;8011:9;8007:22;7978:61;:::i;:::-;7968:71;;8092:2;8081:9;8077:18;8064:32;8048:48;;8121:2;8111:8;8108:16;8105:36;;;8137:1;8134;8127:12;8105:36;;8160:51;8203:7;8192:8;8181:9;8177:24;8160:51;:::i;:::-;8150:61;;;8230:35;8261:2;8250:9;8246:18;8230:35;:::i;:::-;8220:45;;7635:636;;;;;:::o;8276:180::-;8332:6;8385:2;8373:9;8364:7;8360:23;8356:32;8353:52;;;8401:1;8398;8391:12;8353:52;8424:26;8440:9;8424:26;:::i;8461:245::-;8519:6;8572:2;8560:9;8551:7;8547:23;8543:32;8540:52;;;8588:1;8585;8578:12;8540:52;8627:9;8614:23;8646:30;8670:5;8646:30;:::i;8711:249::-;8780:6;8833:2;8821:9;8812:7;8808:23;8804:32;8801:52;;;8849:1;8846;8839:12;8801:52;8881:9;8875:16;8900:30;8924:5;8900:30;:::i;8965:321::-;9034:6;9087:2;9075:9;9066:7;9062:23;9058:32;9055:52;;;9103:1;9100;9093:12;9055:52;9143:9;9130:23;-1:-1:-1;;;;;9168:6:1;9165:30;9162:50;;;9208:1;9205;9198:12;9162:50;9231:49;9272:7;9263:6;9252:9;9248:22;9231:49;:::i;9291:180::-;9350:6;9403:2;9391:9;9382:7;9378:23;9374:32;9371:52;;;9419:1;9416;9409:12;9371:52;-1:-1:-1;9442:23:1;;9291:180;-1:-1:-1;9291:180:1:o;9476:457::-;9560:6;9568;9576;9629:2;9617:9;9608:7;9604:23;9600:32;9597:52;;;9645:1;9642;9635:12;9597:52;9681:9;9668:23;9658:33;;9742:2;9731:9;9727:18;9714:32;-1:-1:-1;;;;;9761:6:1;9758:30;9755:50;;;9801:1;9798;9791:12;9755:50;9824:49;9865:7;9856:6;9845:9;9841:22;9824:49;:::i;9938:248::-;10006:6;10014;10067:2;10055:9;10046:7;10042:23;10038:32;10035:52;;;10083:1;10080;10073:12;10035:52;-1:-1:-1;;10106:23:1;;;10176:2;10161:18;;;10148:32;;-1:-1:-1;9938:248:1:o;10191:435::-;10244:3;10282:5;10276:12;10309:6;10304:3;10297:19;10335:4;10364:2;10359:3;10355:12;10348:19;;10401:2;10394:5;10390:14;10422:1;10432:169;10446:6;10443:1;10440:13;10432:169;;;10507:13;;10495:26;;10541:12;;;;10576:15;;;;10468:1;10461:9;10432:169;;;-1:-1:-1;10617:3:1;;10191:435;-1:-1:-1;;;;;10191:435:1:o;10631:257::-;10672:3;10710:5;10704:12;10737:6;10732:3;10725:19;10753:63;10809:6;10802:4;10797:3;10793:14;10786:4;10779:5;10775:16;10753:63;:::i;:::-;10870:2;10849:15;-1:-1:-1;;10845:29:1;10836:39;;;;10877:4;10832:50;;10631:257;-1:-1:-1;;10631:257:1:o;10893:973::-;10978:12;;10943:3;;11033:1;11053:18;;;;11106;;;;11133:61;;11187:4;11179:6;11175:17;11165:27;;11133:61;11213:2;11261;11253:6;11250:14;11230:18;11227:38;11224:161;;;11307:10;11302:3;11298:20;11295:1;11288:31;11342:4;11339:1;11332:15;11370:4;11367:1;11360:15;11224:161;11401:18;11428:104;;;;11546:1;11541:319;;;;11394:466;;11428:104;-1:-1:-1;;11461:24:1;;11449:37;;11506:16;;;;-1:-1:-1;11428:104:1;;11541:319;31372:1;31365:14;;;31409:4;31396:18;;11635:1;11649:165;11663:6;11660:1;11657:13;11649:165;;;11741:14;;11728:11;;;11721:35;11784:16;;;;11678:10;;11649:165;;;11653:3;;11843:6;11838:3;11834:16;11827:23;;11394:466;;;;;;;10893:973;;;;:::o;11871:909::-;-1:-1:-1;;;12378:3:1;12371:22;12353:3;12422:6;12416:13;12438:61;12492:6;12488:1;12483:3;12479:11;12472:4;12464:6;12460:17;12438:61;:::i;:::-;-1:-1:-1;;;12558:1:1;12518:16;;;12550:10;;;12543:23;12591:13;;12613:62;12591:13;12662:1;12654:10;;12647:4;12635:17;;12613:62;:::i;:::-;-1:-1:-1;;;12735:1:1;12694:17;;;;12727:10;;;12720:27;12771:2;12763:11;;11871:909;-1:-1:-1;;;;11871:909:1:o;12785:815::-;-1:-1:-1;;;13289:3:1;13282:22;13264:3;13323:46;13366:1;13361:3;13357:11;13349:6;13323:46;:::i;:::-;-1:-1:-1;;;13385:2:1;13378:15;13422:6;13416:13;13438:60;13491:6;13487:1;13483:2;13479:10;13472:4;13464:6;13460:17;13438:60;:::i;:::-;-1:-1:-1;;;13556:1:1;13517:15;;;;13548:10;;;13541:27;13592:1;13584:10;;12785:815;-1:-1:-1;;;;12785:815:1:o;13605:767::-;-1:-1:-1;;;14162:3:1;14155:22;14137:3;14196:46;14239:1;14234:3;14230:11;14222:6;14196:46;:::i;:::-;-1:-1:-1;;;14251:15:1;;-1:-1:-1;;;14290:1:1;14282:10;;14275:28;-1:-1:-1;;;14327:1:1;14319:10;;14312:27;14363:2;14355:11;;13605:767;-1:-1:-1;;;13605:767:1:o;15019:826::-;-1:-1:-1;;;;;15416:15:1;;;15398:34;;15468:15;;15463:2;15448:18;;15441:43;15378:3;15515:2;15500:18;;15493:31;;;15341:4;;15547:57;;15584:19;;15576:6;15547:57;:::i;:::-;15652:9;15644:6;15640:22;15635:2;15624:9;15620:18;15613:50;15686:44;15723:6;15715;15686:44;:::i;:::-;15672:58;;15779:9;15771:6;15767:22;15761:3;15750:9;15746:19;15739:51;15807:32;15832:6;15824;15807:32;:::i;:::-;15799:40;15019:826;-1:-1:-1;;;;;;;;15019:826:1:o;15850:560::-;-1:-1:-1;;;;;16147:15:1;;;16129:34;;16199:15;;16194:2;16179:18;;16172:43;16246:2;16231:18;;16224:34;;;16289:2;16274:18;;16267:34;;;16109:3;16332;16317:19;;16310:32;;;16072:4;;16359:45;;16384:19;;16376:6;16359:45;:::i;:::-;16351:53;15850:560;-1:-1:-1;;;;;;;15850:560:1:o;16415:261::-;16594:2;16583:9;16576:21;16557:4;16614:56;16666:2;16655:9;16651:18;16643:6;16614:56;:::i;16681:465::-;16938:2;16927:9;16920:21;16901:4;16964:56;17016:2;17005:9;17001:18;16993:6;16964:56;:::i;:::-;17068:9;17060:6;17056:22;17051:2;17040:9;17036:18;17029:50;17096:44;17133:6;17125;17096:44;:::i;:::-;17088:52;16681:465;-1:-1:-1;;;;;16681:465:1:o;17343:219::-;17492:2;17481:9;17474:21;17455:4;17512:44;17552:2;17541:9;17537:18;17529:6;17512:44;:::i;17925:411::-;18127:2;18109:21;;;18166:2;18146:18;;;18139:30;18205:34;18200:2;18185:18;;18178:62;-1:-1:-1;;;18271:2:1;18256:18;;18249:45;18326:3;18311:19;;17925:411::o;18341:404::-;18543:2;18525:21;;;18582:2;18562:18;;;18555:30;18621:34;18616:2;18601:18;;18594:62;-1:-1:-1;;;18687:2:1;18672:18;;18665:38;18735:3;18720:19;;18341:404::o;20203:400::-;20405:2;20387:21;;;20444:2;20424:18;;;20417:30;20483:34;20478:2;20463:18;;20456:62;-1:-1:-1;;;20549:2:1;20534:18;;20527:34;20593:3;20578:19;;20203:400::o;21425:342::-;21627:2;21609:21;;;21666:2;21646:18;;;21639:30;-1:-1:-1;;;21700:2:1;21685:18;;21678:48;21758:2;21743:18;;21425:342::o;22949:401::-;23151:2;23133:21;;;23190:2;23170:18;;;23163:30;23229:34;23224:2;23209:18;;23202:62;-1:-1:-1;;;23295:2:1;23280:18;;23273:35;23340:3;23325:19;;22949:401::o;24054:399::-;24256:2;24238:21;;;24295:2;24275:18;;;24268:30;24334:34;24329:2;24314:18;;24307:62;-1:-1:-1;;;24400:2:1;24385:18;;24378:33;24443:3;24428:19;;24054:399::o;24458:406::-;24660:2;24642:21;;;24699:2;24679:18;;;24672:30;24738:34;24733:2;24718:18;;24711:62;-1:-1:-1;;;24804:2:1;24789:18;;24782:40;24854:3;24839:19;;24458:406::o;26004:403::-;26206:2;26188:21;;;26245:2;26225:18;;;26218:30;26284:34;26279:2;26264:18;;26257:62;-1:-1:-1;;;26350:2:1;26335:18;;26328:37;26397:3;26382:19;;26004:403::o;27933:404::-;28135:2;28117:21;;;28174:2;28154:18;;;28147:30;28213:34;28208:2;28193:18;;28186:62;-1:-1:-1;;;28279:2:1;28264:18;;28257:38;28327:3;28312:19;;27933:404::o;28342:339::-;28544:2;28526:21;;;28583:2;28563:18;;;28556:30;-1:-1:-1;;;28617:2:1;28602:18;;28595:45;28672:2;28657:18;;28342:339::o;28686:397::-;28888:2;28870:21;;;28927:2;28907:18;;;28900:30;28966:34;28961:2;28946:18;;28939:62;-1:-1:-1;;;29032:2:1;29017:18;;29010:31;29073:3;29058:19;;28686:397::o;29088:339::-;29290:2;29272:21;;;29329:2;29309:18;;;29302:30;-1:-1:-1;;;29363:2:1;29348:18;;29341:45;29418:2;29403:18;;29088:339::o;29853:416::-;30055:2;30037:21;;;30094:2;30074:18;;;30067:30;30133:34;30128:2;30113:18;;30106:62;-1:-1:-1;;;30199:2:1;30184:18;;30177:50;30259:3;30244:19;;29853:416::o;30274:397::-;30476:2;30458:21;;;30515:2;30495:18;;;30488:30;30554:34;30549:2;30534:18;;30527:62;-1:-1:-1;;;30620:2:1;30605:18;;30598:31;30661:3;30646:19;;30274:397::o;31111:183::-;31171:4;-1:-1:-1;;;;;31196:6:1;31193:30;31190:56;;;31226:18;;:::i;:::-;-1:-1:-1;31271:1:1;31267:14;31283:4;31263:25;;31111:183::o;31425:128::-;31465:3;31496:1;31492:6;31489:1;31486:13;31483:39;;;31502:18;;:::i;:::-;-1:-1:-1;31538:9:1;;31425:128::o;31558:120::-;31598:1;31624;31614:35;;31629:18;;:::i;:::-;-1:-1:-1;31663:9:1;;31558:120::o;31683:168::-;31723:7;31789:1;31785;31781:6;31777:14;31774:1;31771:21;31766:1;31759:9;31752:17;31748:45;31745:71;;;31796:18;;:::i;:::-;-1:-1:-1;31836:9:1;;31683:168::o;31856:125::-;31896:4;31924:1;31921;31918:8;31915:34;;;31929:18;;:::i;:::-;-1:-1:-1;31966:9:1;;31856:125::o;31986:258::-;32058:1;32068:113;32082:6;32079:1;32076:13;32068:113;;;32158:11;;;32152:18;32139:11;;;32132:39;32104:2;32097:10;32068:113;;;32199:6;32196:1;32193:13;32190:48;;;-1:-1:-1;;32234:1:1;32216:16;;32209:27;31986:258::o;32249:380::-;32328:1;32324:12;;;;32371;;;32392:61;;32446:4;32438:6;32434:17;32424:27;;32392:61;32499:2;32491:6;32488:14;32468:18;32465:38;32462:161;;;32545:10;32540:3;32536:20;32533:1;32526:31;32580:4;32577:1;32570:15;32608:4;32605:1;32598:15;32462:161;;32249:380;;;:::o;32634:249::-;32744:2;32725:13;;-1:-1:-1;;32721:27:1;32709:40;;-1:-1:-1;;;;;32764:34:1;;32800:22;;;32761:62;32758:88;;;32826:18;;:::i;:::-;32862:2;32855:22;-1:-1:-1;;32634:249:1:o;32888:135::-;32927:3;-1:-1:-1;;32948:17:1;;32945:43;;;32968:18;;:::i;:::-;-1:-1:-1;33015:1:1;33004:13;;32888:135::o;33028:112::-;33060:1;33086;33076:35;;33091:18;;:::i;:::-;-1:-1:-1;33125:9:1;;33028:112::o;33145:127::-;33206:10;33201:3;33197:20;33194:1;33187:31;33237:4;33234:1;33227:15;33261:4;33258:1;33251:15;33277:127;33338:10;33333:3;33329:20;33326:1;33319:31;33369:4;33366:1;33359:15;33393:4;33390:1;33383:15;33409:127;33470:10;33465:3;33461:20;33458:1;33451:31;33501:4;33498:1;33491:15;33525:4;33522:1;33515:15;33541:127;33602:10;33597:3;33593:20;33590:1;33583:31;33633:4;33630:1;33623:15;33657:4;33654:1;33647:15;33673:179;33708:3;33750:1;33732:16;33729:23;33726:120;;;33796:1;33793;33790;33775:23;-1:-1:-1;33833:1:1;33827:8;33822:3;33818:18;33673:179;:::o;33857:671::-;33896:3;33938:4;33920:16;33917:26;33914:39;;;33857:671;:::o;33914:39::-;33980:2;33974:9;-1:-1:-1;;34045:16:1;34041:25;;34038:1;33974:9;34017:50;34096:4;34090:11;34120:16;-1:-1:-1;;;;;34226:2:1;34219:4;34211:6;34207:17;34204:25;34199:2;34191:6;34188:14;34185:45;34182:58;;;34233:5;;;;;33857:671;:::o;34182:58::-;34270:6;34264:4;34260:17;34249:28;;34306:3;34300:10;34333:2;34325:6;34322:14;34319:27;;;34339:5;;;;;;33857:671;:::o;34319:27::-;34423:2;34404:16;34398:4;34394:27;34390:36;34383:4;34374:6;34369:3;34365:16;34361:27;34358:69;34355:82;;;34430:5;;;;;;33857:671;:::o;34355:82::-;34446:57;34497:4;34488:6;34480;34476:19;34472:30;34466:4;34446:57;:::i;:::-;-1:-1:-1;34519:3:1;;33857:671;-1:-1:-1;;;;;33857:671:1:o;34533:131::-;-1:-1:-1;;;;;;34607:32:1;;34597:43;;34587:71;;34654:1;34651;34644:12
Swarm Source
ipfs://8d52f78b1d96e6308725cb3f1beff8e214a51b9fe9d048848e815a6eece2597b
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.01
Net Worth in ETH
0.000003
Token Allocations
POL
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| POL | 100.00% | $0.097634 | 0.06 | $0.005858 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.