More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 260 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Bought Tok... | 20158892 | 22 days ago | IN | 0 ETH | 0.00030304 | ||||
Claim Bought Tok... | 20051785 | 37 days ago | IN | 0 ETH | 0.00048741 | ||||
Claim Bought Tok... | 20005336 | 43 days ago | IN | 0 ETH | 0.00179376 | ||||
Claim Bought Tok... | 19996940 | 44 days ago | IN | 0 ETH | 0.00050444 | ||||
Claim Bought Tok... | 19828376 | 68 days ago | IN | 0 ETH | 0.0003956 | ||||
Claim Bought Tok... | 19818619 | 69 days ago | IN | 0 ETH | 0.00054008 | ||||
Claim Bought Tok... | 19813702 | 70 days ago | IN | 0 ETH | 0.00035629 | ||||
Claim Bought Tok... | 19812404 | 70 days ago | IN | 0 ETH | 0.00062966 | ||||
Claim Bought Tok... | 19811351 | 70 days ago | IN | 0 ETH | 0.0008286 | ||||
Claim Bought Tok... | 19809703 | 70 days ago | IN | 0 ETH | 0.00044487 | ||||
Claim Bought Tok... | 19809171 | 71 days ago | IN | 0 ETH | 0.00034179 | ||||
Claim Bought Tok... | 19807545 | 71 days ago | IN | 0 ETH | 0.0005171 | ||||
Claim Bought Tok... | 19806586 | 71 days ago | IN | 0 ETH | 0.00034813 | ||||
Claim Bought Tok... | 19753077 | 78 days ago | IN | 0 ETH | 0.00048279 | ||||
Claim Bought Tok... | 19715682 | 84 days ago | IN | 0 ETH | 0.00073841 | ||||
Claim Bought Tok... | 19695187 | 86 days ago | IN | 0 ETH | 0.00076329 | ||||
Claim Bought Tok... | 19693131 | 87 days ago | IN | 0 ETH | 0.00060798 | ||||
Claim Bought Tok... | 19681798 | 88 days ago | IN | 0 ETH | 0.00122972 | ||||
Claim Bought Tok... | 19654237 | 92 days ago | IN | 0 ETH | 0.00113608 | ||||
Claim Bought Tok... | 19637268 | 95 days ago | IN | 0 ETH | 0.00114282 | ||||
Claim Bought Tok... | 19636619 | 95 days ago | IN | 0 ETH | 0.00108373 | ||||
Claim Bought Tok... | 19588255 | 101 days ago | IN | 0 ETH | 0.00132311 | ||||
Claim Bought Tok... | 19565975 | 105 days ago | IN | 0 ETH | 0.00148737 | ||||
Claim Bought Tok... | 19504864 | 113 days ago | IN | 0 ETH | 0.00161506 | ||||
Claim Bought Tok... | 19504715 | 113 days ago | IN | 0 ETH | 0.00210841 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
18468873 | 258 days ago | 0.01 ETH | ||||
18459388 | 260 days ago | 0.00029694 ETH | ||||
18452715 | 261 days ago | 0.00490133 ETH | ||||
18451838 | 261 days ago | 0.00164063 ETH | ||||
18451838 | 261 days ago | 0.00656255 ETH | ||||
18451251 | 261 days ago | 0.001 ETH | ||||
18447253 | 261 days ago | 0.0002 ETH | ||||
18447253 | 261 days ago | 0.0008 ETH | ||||
18443973 | 262 days ago | 0.0002 ETH | ||||
18443973 | 262 days ago | 0.0008 ETH | ||||
18441071 | 262 days ago | 0.0005 ETH | ||||
18440746 | 262 days ago | 0.0002 ETH | ||||
18440746 | 262 days ago | 0.0008 ETH | ||||
18440546 | 262 days ago | 0.0283 ETH | ||||
18435786 | 263 days ago | 0.061 ETH | ||||
18409243 | 267 days ago | 0.02888156 ETH | ||||
18407537 | 267 days ago | 0.00415408 ETH | ||||
18404605 | 267 days ago | 0.0246 ETH | ||||
18401483 | 268 days ago | 0.00123832 ETH | ||||
18399499 | 268 days ago | 0.06 ETH | ||||
18399499 | 268 days ago | 0.24 ETH | ||||
18389858 | 269 days ago | 0.01 ETH | ||||
18388242 | 270 days ago | 0.002 ETH | ||||
18385343 | 270 days ago | 0.0002 ETH | ||||
18385343 | 270 days ago | 0.0008 ETH |
Loading...
Loading
Contract Name:
Presale
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-09-25 */ pragma solidity ^0.8.19; // // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) /** * @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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/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); } } } // // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol) /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } } // interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); function getRoundData(uint80 _roundId) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); } // // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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; } } // // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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); } } // uint256 constant REFERAL_COMMISSION_RATE = 10; // uint256 constant USDC_DECIMALS = 6; // contract Referrals is Ownable { uint256 public referralCommissionRate = REFERAL_COMMISSION_RATE; mapping(address => address) private referrers; function setReferralCommissionRate( uint256 _referralCommissionRate ) external onlyOwner { require(_referralCommissionRate <= 100, "ReferralManagement: > 100%"); referralCommissionRate = _referralCommissionRate; } function _setAndGetReferrerIfPossible( address _user, address _referrer ) internal returns (address) { _safelySetReferrer(_user, _referrer); return _getReferrer(_user); } function _getReferrer(address _user) internal view returns (address) { address referrer = referrers[_user]; return referrer; } function setReferrer(address _referrer) external { _setReffererFor(msg.sender, _referrer); } function _safelySetReferrer(address _user, address _referrer) internal { // does not revert if referrer is already set or if referrer is the user or if referrer is 0x0 if ( referrers[_user] == address(0) && _referrer != _user && _referrer != address(0) ) { _setReffererFor(_user, _referrer); } } function _setReffererFor(address _user, address _referrer) internal { require( _referrer != address(0), "ReferralManagement: invalid referrer address" ); require( _referrer != _user, "ReferralManagement: referrer cannot be the user" ); require( referrers[_user] == address(0), "ReferralManagement: referrer already set" ); referrers[_user] = _referrer; } function setReferrerFor( address _user, address _referrer ) external onlyOwner { _setReffererFor(_user, _referrer); } function referrerOf(address account) external view returns (address) { return referrers[account]; } } // // A presale stage is only active if the current active presale is sold out , or it is the active presale uint256 constant RATIODENOMINATOR = 1_000; struct PresaleStage { uint128 price; uint128 offeredAmount; uint128 soldAmount; uint64 duration; uint64 startedAt; uint64 firstUnlockRatio; uint64 unlockEvery; uint64 unlockEveryRatio; } struct PresaleStageArg { uint128 price; uint128 offeredAmount; uint64 duration; uint64 firstUnlockRatio; uint64 unlockEvery; uint64 unlockEveryRatio; } struct UserData { uint128 boughtAmount; } struct ReferalData { uint128 usdcRefReceived; uint128 usdtRefReceived; uint128 ethRefReceived; } interface IERC20Meta is IERC20 { function decimals() external view returns (uint8); } contract Presale is Ownable, Referrals { using SafeERC20 for IERC20Meta; AggregatorV3Interface internal immutable dataFeed; // ETH Price IERC20Meta public immutable saleToken; IERC20Meta public immutable usdcToken; IERC20Meta public immutable usdtToken; uint8 public immutable saleTokenDecimals; uint256 public immutable dataFeedDecimals; uint256 public immutable usdcDecimals; uint256 public immutable usdtDecimals; PresaleStage[] private _presaleStages; function getStage( uint256 _index ) external view returns (PresaleStage memory) { return _presaleStages[_index]; } function stagesCount() external view returns (uint256) { return _presaleStages.length; } // stage => user => data mapping(uint256 => mapping(address => UserData)) public userData; mapping(address => ReferalData) public referalData; mapping(address => uint256) public claimedAmount; uint256 public presaleStart; // uint256 public __activePresale; uint256 public claimEnabled; function enableClaim() external onlyOwner { claimEnabled = block.timestamp; } event Buy( address indexed user, uint256 indexed stage, address referrer, address token, uint256 totalAmount, uint256 refAmount, uint256 saldAmount ); constructor( AggregatorV3Interface _chainlinkEthFeed, IERC20Meta _saleToken, IERC20Meta _usdcToken, IERC20Meta _usdtToken ) { dataFeed = _chainlinkEthFeed; saleToken = _saleToken; usdcToken = _usdcToken; usdtToken = _usdtToken; saleTokenDecimals = _saleToken.decimals(); dataFeedDecimals = _chainlinkEthFeed.decimals(); usdcDecimals = _usdcToken.decimals(); usdtDecimals = _usdtToken.decimals(); } function _getPresaleStage( uint256 _index ) internal view returns (PresaleStage storage) { require( presaleStart != 0 && block.timestamp >= presaleStart, "Presale: not started yet" ); require(_index < _presaleStages.length, "Presale: sold out"); PresaleStage storage presale = _presaleStages[_index]; require( presale.startedAt + presale.duration >= block.timestamp, "Presale: Presale Stage Ended" ); return presale; } function _getRefAmount( address _user, address _ref, uint256 _amount ) internal returns (uint256 refAmount, address) { address ref = _setAndGetReferrerIfPossible(_user, _ref); refAmount = ref != address(0) ? uint128((_amount * referralCommissionRate) / 100) : 0; if (refAmount > 0) referalData[ref].usdcRefReceived += uint128(refAmount); return (refAmount, ref); } function _getRefAmountETH( address _user, address _ref, uint256 _amount ) internal returns (uint256 refAmount, address ref) { ref = _setAndGetReferrerIfPossible(_user, _ref); refAmount = ref != address(0) ? uint128((_amount * referralCommissionRate) / 100) : 0; if (refAmount > 0) referalData[ref].ethRefReceived += uint128(refAmount); } function buyWithUSD( uint128 _usdcAmount, address _referrer, bool _withUSDC ) external { uint256 _activePresale = _activeStage(); PresaleStage storage presale = _getPresaleStage(_activePresale); uint256 saleTokenAmount = (_usdcAmount * 10 ** saleTokenDecimals) / presale.price; uint256 refundAmount; // if presale left is less than the intended purchase amount only purchase what is left and return the rest if (presale.offeredAmount - presale.soldAmount < saleTokenAmount) { saleTokenAmount = presale.offeredAmount - presale.soldAmount; refundAmount = _usdcAmount - (saleTokenAmount * presale.price) / 10 ** saleTokenDecimals; } uint256 netAmount = _usdcAmount - refundAmount; (uint256 refAmount, address ref) = _getRefAmount( msg.sender, _referrer, netAmount ); presale.soldAmount += uint128(saleTokenAmount); // to do add ref to the user's object userData[_activePresale][msg.sender].boughtAmount += uint128( saleTokenAmount ); // transfer USDC to this contract address but only net amount if (_withUSDC) usdcToken.safeTransferFrom( msg.sender, owner(), netAmount - refAmount ); else usdtToken.safeTransferFrom( msg.sender, owner(), netAmount - refAmount ); // transfer ref amount to ref if (refAmount > 0) { if (_withUSDC) usdcToken.safeTransferFrom(msg.sender, ref, refAmount); else usdtToken.safeTransferFrom(msg.sender, ref, refAmount); } emit Buy( msg.sender, _activePresale, ref, address(_withUSDC ? usdcToken : usdtToken), netAmount, refAmount, saleTokenAmount ); } function buyWithEth(address _referrer) external payable { uint256 _ethAmount = msg.value; uint256 _activePresale = _activeStage(); PresaleStage storage presale = _getPresaleStage(_activePresale); uint256 ethPrice = (uint256(getLatestETHPrice()) * 10 ** (18)) / 10 ** dataFeedDecimals; uint256 _usdcAmount = (_ethAmount * ethPrice) / 10 ** (18); _usdcAmount = (_usdcAmount * 10 ** usdcDecimals) / 10 ** 18; uint256 saleTokenAmount = (_usdcAmount * 10 ** saleTokenDecimals) / presale.price; uint256 refundAmount; // in eth // if presale left is less than the intended purchase amount only purchase what is left and return the rest if (presale.offeredAmount - presale.soldAmount < saleTokenAmount) { uint256 saleTokenAmountNew = presale.offeredAmount - presale.soldAmount; refundAmount = (_ethAmount * (saleTokenAmount - saleTokenAmountNew)) / saleTokenAmount; saleTokenAmount = saleTokenAmountNew; } uint256 netAmount = _ethAmount - refundAmount; (uint256 refAmount, address ref) = _getRefAmountETH( msg.sender, _referrer, netAmount ); presale.soldAmount += uint128(saleTokenAmount); userData[_activePresale][msg.sender].boughtAmount += uint128( saleTokenAmount ); // transfer back the refund amount if (refundAmount > 0) { (bool success, ) = payable(msg.sender).call{value: refundAmount}( "" ); require(success, "Presale: unable to send ETH"); } // trasnfer eth to owner (bool success_owner, ) = payable(owner()).call{ value: netAmount - refAmount }(""); require(success_owner, "Presale: unable to send ETH"); // transfer ref amount to ref if (refAmount > 0) { (bool success, ) = payable(ref).call{value: refAmount}(""); require(success, "Presale: unable to send ETH"); } emit Buy( msg.sender, _activePresale, ref, address(0), netAmount, refAmount, saleTokenAmount ); } /** * @notice Initializes the presale * @param _presaleStart the timestamp when the presale starts * @param _presaleStagesArg the presale stages */ function initializePresale( uint256 _presaleStart, PresaleStageArg[] calldata _presaleStagesArg ) external onlyOwner { require(_presaleStages.length == 0, "Presale: already initialized"); presaleStart = _presaleStart; uint128 totalOfferedAmount; for (uint256 i = 0; i < _presaleStagesArg.length; i++) { require( _presaleStagesArg[i].firstUnlockRatio <= RATIODENOMINATOR, "Presale: invalid first unlock ratio" ); require( _presaleStagesArg[i].unlockEveryRatio <= RATIODENOMINATOR, "Presale: invalid unlock every ratio" ); _presaleStages.push( PresaleStage({ price: _presaleStagesArg[i].price, offeredAmount: _presaleStagesArg[i].offeredAmount, soldAmount: 0, duration: _presaleStagesArg[i].duration, startedAt: 0, firstUnlockRatio: _presaleStagesArg[i].firstUnlockRatio, unlockEvery: _presaleStagesArg[i].unlockEvery, unlockEveryRatio: _presaleStagesArg[i].unlockEveryRatio }) ); totalOfferedAmount += _presaleStagesArg[i].offeredAmount; } _presaleStages[0].startedAt = uint64(_presaleStart); saleToken.safeTransferFrom( msg.sender, address(this), totalOfferedAmount ); } /** * @notice Recovers unsold tokens from a presale stage * @param _presaleIndex the index of the presale stage */ function recoverUnsoldFromStage(uint256 _presaleIndex) external onlyOwner { PresaleStage storage presale = _presaleStages[_presaleIndex]; uint128 offeredAmount = presale.offeredAmount; uint128 soldAmount = presale.soldAmount; uint128 unsoldAmount = offeredAmount - soldAmount; presale.offeredAmount = soldAmount; saleToken.safeTransfer(msg.sender, unsoldAmount); } /** * @param _presaleStart the timestamp when the presale starts */ function setPresaleStart(uint256 _presaleStart) external onlyOwner { require( _presaleStart > block.timestamp, "Presale: presale start in the past" ); require( presaleStart == 0 || block.timestamp < presaleStart, "Presale: presale already started" ); presaleStart = _presaleStart; _presaleStages[0].startedAt = uint64(_presaleStart); } function setActivePresale(uint256 _activePresale) external onlyOwner { // can't go back to past presales require(_activePresale >= __activePresale, "Presale: invalid presale"); require( _activePresale < _presaleStages.length, "Presale: invalid presale" ); __activePresale = _activePresale; _presaleStages[__activePresale].startedAt = uint64(block.timestamp); } function _activeStage() internal returns (uint256) { require(__activePresale < _presaleStages.length, "Presale: sold out"); PresaleStage storage presale = _presaleStages[__activePresale]; if (presale.offeredAmount - presale.soldAmount == 0) { require( __activePresale + 1 < _presaleStages.length, "Presale: sold out" ); __activePresale = __activePresale + 1; _presaleStages[__activePresale].startedAt = uint64(block.timestamp); } return (__activePresale); } function addPresaleStage( uint128 _price, uint128 _offredAmount, uint64 _duration, uint64 _firstUnlockRatio, uint64 _unlockEvery, uint64 _unlockEveryRatio ) external onlyOwner { require( _firstUnlockRatio <= RATIODENOMINATOR, "Presale: invalid first unlock ratio" ); require( _unlockEveryRatio <= RATIODENOMINATOR && _unlockEveryRatio > 0, "Presale: invalid unlock every ratio" ); require(_unlockEvery > 0, "Presale: unlockEvery cannot be zero"); require(_duration > 0, "empty duration not supported"); require(claimEnabled == 0, "Presale: Presale Ended"); saleToken.safeTransferFrom(msg.sender, address(this), _offredAmount); _presaleStages.push( PresaleStage({ price: _price, offeredAmount: _offredAmount, soldAmount: 0, duration: _duration, startedAt: 0, firstUnlockRatio: _firstUnlockRatio, unlockEvery: _unlockEvery, unlockEveryRatio: _unlockEveryRatio }) ); } /** * @param _presaleIndex the index of the presale stage * @param _price the price of the token in USDC * @param _amount the amount of tokens offered * @param _duration the duration of the presale stage in seconds */ function updatePresaleStage( uint256 _presaleIndex, uint128 _price, uint128 _amount, uint64 _duration, uint64 _firstUnlockRatio, uint64 _unlockEvery, uint64 _unlockEveryRatio ) external onlyOwner { require( _presaleIndex >= _activeStage(), "Presale: can't update past presale" ); require( _firstUnlockRatio <= RATIODENOMINATOR, "Presale: invalid first unlock ratio" ); require( _unlockEveryRatio <= RATIODENOMINATOR && _unlockEveryRatio > 0, "Presale: invalid unlock every ratio" ); require(_unlockEvery > 0, "Presale: unlockEvery cannot be zero"); require(_duration > 0, "empty duration not supported"); PresaleStage storage presale = _presaleStages[_presaleIndex]; uint128 offeredAmount = presale.offeredAmount; presale.price = _price; presale.offeredAmount = _amount; presale.duration = _duration; presale.firstUnlockRatio = _firstUnlockRatio; presale.unlockEvery = _unlockEvery; presale.unlockEveryRatio = _unlockEveryRatio; if (offeredAmount > _amount) { require(_amount >= presale.soldAmount, "Presale: invalid amount"); saleToken.safeTransfer(msg.sender, offeredAmount - _amount); } else if (offeredAmount < _amount) { saleToken.safeTransferFrom( msg.sender, address(this), _amount - offeredAmount ); } } function activeStage() external view returns (uint256 stageIndex) { PresaleStage storage presale = _presaleStages[__activePresale]; stageIndex = __activePresale; if (presale.offeredAmount - presale.soldAmount == 0) { stageIndex = __activePresale + 1; } return (stageIndex); } /** * */ function getLatestETHPrice() public view returns (int256) { // prettier-ignore ( /* uint80 roundID */, int answer, /*uint startedAt*/, /*uint timeStamp*/, /*uint80 answeredInRound*/ ) = dataFeed.latestRoundData(); return answer; // 8 decimals } function getUserData( uint256 _stage, address _user ) external view returns (UserData memory) { return userData[_stage][_user]; } struct UserClaimData { uint256 total; uint256 unlocked; uint256 claimed; uint256 available; } function getUserClaimData( address user ) public view returns (UserClaimData memory) { UserClaimData memory data; for (uint256 i = 0; i < _presaleStages.length; i++) { PresaleStage storage presale = _presaleStages[i]; data.total += userData[i][user].boughtAmount; if (claimEnabled != 0) { data.unlocked += (userData[i][user].boughtAmount * presale.firstUnlockRatio) / RATIODENOMINATOR; uint256 numOfUnlocks = (block.timestamp - claimEnabled) / presale.unlockEvery; uint256 unlockedTotalRatio = (numOfUnlocks * presale.unlockEveryRatio); if ( unlockedTotalRatio + presale.firstUnlockRatio > RATIODENOMINATOR ) { unlockedTotalRatio = RATIODENOMINATOR - presale.firstUnlockRatio; // avoids precision loss data.unlocked += userData[i][user].boughtAmount - (userData[i][user].boughtAmount * presale.firstUnlockRatio) / RATIODENOMINATOR; } else { data.unlocked += (userData[i][user].boughtAmount * unlockedTotalRatio) / RATIODENOMINATOR; } } } data.claimed = claimedAmount[user]; data.available = data.unlocked - data.claimed; return data; } event Claim(address indexed user, uint256 amount); function claimBoughtTokens() external { UserClaimData memory data = getUserClaimData(msg.sender); require(data.available > 0, "Presale: nothing to claim"); claimedAmount[msg.sender] += data.available; saleToken.safeTransfer(msg.sender, data.available); emit Claim(msg.sender, data.available); } function recoverAsset( address _token, address _to, uint256 _amount ) external onlyOwner { if (_token == address(0)) { (bool success, ) = payable(_to).call{value: _amount}(""); require(success, "Presale: unable to send ETH"); } IERC20Meta(_token).safeTransfer(_to, _amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract AggregatorV3Interface","name":"_chainlinkEthFeed","type":"address"},{"internalType":"contract IERC20Meta","name":"_saleToken","type":"address"},{"internalType":"contract IERC20Meta","name":"_usdcToken","type":"address"},{"internalType":"contract IERC20Meta","name":"_usdtToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"stage","type":"uint256"},{"indexed":false,"internalType":"address","name":"referrer","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"refAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"saldAmount","type":"uint256"}],"name":"Buy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","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"},{"inputs":[],"name":"__activePresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activeStage","outputs":[{"internalType":"uint256","name":"stageIndex","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"_price","type":"uint128"},{"internalType":"uint128","name":"_offredAmount","type":"uint128"},{"internalType":"uint64","name":"_duration","type":"uint64"},{"internalType":"uint64","name":"_firstUnlockRatio","type":"uint64"},{"internalType":"uint64","name":"_unlockEvery","type":"uint64"},{"internalType":"uint64","name":"_unlockEveryRatio","type":"uint64"}],"name":"addPresaleStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_referrer","type":"address"}],"name":"buyWithEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_usdcAmount","type":"uint128"},{"internalType":"address","name":"_referrer","type":"address"},{"internalType":"bool","name":"_withUSDC","type":"bool"}],"name":"buyWithUSD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimBoughtTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEnabled","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dataFeedDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLatestETHPrice","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getStage","outputs":[{"components":[{"internalType":"uint128","name":"price","type":"uint128"},{"internalType":"uint128","name":"offeredAmount","type":"uint128"},{"internalType":"uint128","name":"soldAmount","type":"uint128"},{"internalType":"uint64","name":"duration","type":"uint64"},{"internalType":"uint64","name":"startedAt","type":"uint64"},{"internalType":"uint64","name":"firstUnlockRatio","type":"uint64"},{"internalType":"uint64","name":"unlockEvery","type":"uint64"},{"internalType":"uint64","name":"unlockEveryRatio","type":"uint64"}],"internalType":"struct PresaleStage","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserClaimData","outputs":[{"components":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"unlocked","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"}],"internalType":"struct Presale.UserClaimData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stage","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getUserData","outputs":[{"components":[{"internalType":"uint128","name":"boughtAmount","type":"uint128"}],"internalType":"struct UserData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleStart","type":"uint256"},{"components":[{"internalType":"uint128","name":"price","type":"uint128"},{"internalType":"uint128","name":"offeredAmount","type":"uint128"},{"internalType":"uint64","name":"duration","type":"uint64"},{"internalType":"uint64","name":"firstUnlockRatio","type":"uint64"},{"internalType":"uint64","name":"unlockEvery","type":"uint64"},{"internalType":"uint64","name":"unlockEveryRatio","type":"uint64"}],"internalType":"struct PresaleStageArg[]","name":"_presaleStagesArg","type":"tuple[]"}],"name":"initializePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleIndex","type":"uint256"}],"name":"recoverUnsoldFromStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referalData","outputs":[{"internalType":"uint128","name":"usdcRefReceived","type":"uint128"},{"internalType":"uint128","name":"usdtRefReceived","type":"uint128"},{"internalType":"uint128","name":"ethRefReceived","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralCommissionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"referrerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleToken","outputs":[{"internalType":"contract IERC20Meta","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleTokenDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_activePresale","type":"uint256"}],"name":"setActivePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleStart","type":"uint256"}],"name":"setPresaleStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_referralCommissionRate","type":"uint256"}],"name":"setReferralCommissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_referrer","type":"address"}],"name":"setReferrer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_referrer","type":"address"}],"name":"setReferrerFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stagesCount","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":"_presaleIndex","type":"uint256"},{"internalType":"uint128","name":"_price","type":"uint128"},{"internalType":"uint128","name":"_amount","type":"uint128"},{"internalType":"uint64","name":"_duration","type":"uint64"},{"internalType":"uint64","name":"_firstUnlockRatio","type":"uint64"},{"internalType":"uint64","name":"_unlockEvery","type":"uint64"},{"internalType":"uint64","name":"_unlockEveryRatio","type":"uint64"}],"name":"updatePresaleStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdcDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdcToken","outputs":[{"internalType":"contract IERC20Meta","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdtDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdtToken","outputs":[{"internalType":"contract IERC20Meta","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userData","outputs":[{"internalType":"uint128","name":"boughtAmount","type":"uint128"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
610180604052600a6001553480156200001757600080fd5b5060405162003aef38038062003aef8339810160408190526200003a9162000297565b62000045336200022e565b6001600160a01b0380851660805283811660a081905283821660c05290821660e0526040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa158015620000a3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000c99190620002ff565b60ff166101008160ff1681525050836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000116573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200013c9190620002ff565b60ff166101208181525050816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000186573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ac9190620002ff565b60ff166101408181525050806001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001f6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200021c9190620002ff565b60ff1661016052506200032b92505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200029457600080fd5b50565b60008060008060808587031215620002ae57600080fd5b8451620002bb816200027e565b6020860151909450620002ce816200027e565b6040860151909350620002e1816200027e565b6060860151909250620002f4816200027e565b939692955090935050565b6000602082840312156200031257600080fd5b815160ff811681146200032457600080fd5b9392505050565b60805160a05160c05160e051610100516101205161014051610160516136e76200040860003960006105de0152600081816105aa0152611b1e0152600081816106a40152611aa301526000818161023c01528181611501015281816115b40152611b6e01526000818161067001528181611750015281816117cb015261181e0152600081816102c2015281816116f90152818161179101526118440152600081816107e6015281816111cf015281816112b9015281816119eb015281816121370152818161219f01526123260152600061133701526136e76000f3fe6080604052600436106102255760003560e01c80637bf4216511610123578063cb397f63116100ab578063dbf7d5931161006f578063dbf7d5931461079e578063de8801e5146107be578063e985e367146107d4578063f183b4fa14610808578063f2fde38b1461082857600080fd5b8063cb397f6314610706578063d21cacdf1461071c578063d30ef61b14610755578063d74d3d781461076b578063d8eaa36d1461078b57600080fd5b8063a18a7bfc116100f2578063a18a7bfc1461063e578063a98ad46c1461065e578063ab48b88114610692578063bda6d5ce146106c6578063c5af5a15146106e657600080fd5b80637bf421651461059857806382543b32146105cc578063888b168d146106005780638da5cb5b1461062057600080fd5b80633806422a116101b1578063697af70a11610175578063697af70a146104e057806371037894146104f5578063715018a61461054e578063777e0d861461056357806378152bbe1461057857600080fd5b80633806422a146104015780634864d8d9146104165780634bd35b291461042b5780635af9e3bf1461044b5780635f5c09a91461046b57600080fd5b80632866ed21116101f85780632866ed211461034f57806328dae6e31461036557806329d3cb351461037c5780632e3250201461039c57806332734257146103c957600080fd5b806302a9e7141461022a57806304e869031461027557806311eac855146102b05780632637615b146102fc575b600080fd5b34801561023657600080fd5b5061025e7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020015b60405180910390f35b34801561028157600080fd5b506102a2610290366004612ec4565b60066020526000908152604090205481565b60405190815260200161026c565b3480156102bc57600080fd5b506102e47f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161026c565b34801561030857600080fd5b5061031c610317366004612ec4565b610848565b60405161026c91908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b34801561035b57600080fd5b506102a260095481565b34801561037157600080fd5b5061037a610b76565b005b34801561038857600080fd5b5061037a610397366004612edf565b610b84565b3480156103a857600080fd5b506103bc6103b7366004612f1b565b610c31565b60405161026c9190612f34565b3480156103d557600080fd5b506103e96103e4366004612fde565b610d1d565b60405190516001600160801b0316815260200161026c565b34801561040d57600080fd5b506003546102a2565b34801561042257600080fd5b506102a2610d66565b34801561043757600080fd5b5061037a61044636600461300a565b610de1565b34801561045757600080fd5b5061037a610466366004613088565b611206565b34801561047757600080fd5b506104b6610486366004612ec4565b600560205260009081526040902080546001909101546001600160801b0380831692600160801b90048116911683565b604080516001600160801b039485168152928416602084015292169181019190915260600161026c565b3480156104ec57600080fd5b5061037a61121c565b34801561050157600080fd5b50610536610510366004612fde565b60046020908152600092835260408084209091529082529020546001600160801b031681565b6040516001600160801b03909116815260200161026c565b34801561055a57600080fd5b5061037a61131e565b34801561056f57600080fd5b506102a2611332565b34801561058457600080fd5b5061037a610593366004612f1b565b6113c2565b3480156105a457600080fd5b506102a27f000000000000000000000000000000000000000000000000000000000000000081565b3480156105d857600080fd5b506102a27f000000000000000000000000000000000000000000000000000000000000000081565b34801561060c57600080fd5b5061037a61061b3660046130d7565b6114d4565b34801561062c57600080fd5b506000546001600160a01b03166102e4565b34801561064a57600080fd5b5061037a610659366004612ec4565b6118a8565b34801561066a57600080fd5b506102e47f000000000000000000000000000000000000000000000000000000000000000081565b34801561069e57600080fd5b506102a27f000000000000000000000000000000000000000000000000000000000000000081565b3480156106d257600080fd5b5061037a6106e1366004612f1b565b6118b5565b3480156106f257600080fd5b5061037a610701366004612f1b565b611973565b34801561071257600080fd5b506102a260085481565b34801561072857600080fd5b506102e4610737366004612ec4565b6001600160a01b039081166000908152600260205260409020541690565b34801561076157600080fd5b506102a260015481565b34801561077757600080fd5b5061037a610786366004612f1b565b611a24565b61037a610799366004612ec4565b611a82565b3480156107aa57600080fd5b5061037a6107b9366004613135565b611ebe565b3480156107ca57600080fd5b506102a260075481565b3480156107e057600080fd5b506102e47f000000000000000000000000000000000000000000000000000000000000000081565b34801561081457600080fd5b5061037a6108233660046131b4565b6121db565b34801561083457600080fd5b5061037a610843366004612ec4565b6124c9565b6108736040518060800160405280600081526020016000815260200160008152602001600081525090565b61089e6040518060800160405280600081526020016000815260200160008152602001600081525090565b60005b600354811015610b3a576000600382815481106108c0576108c0613228565b600091825260208083208584526004825260408085206001600160a01b038b1686529092529220548551600390920290920192506001600160801b0390911690849061090d908390613254565b90525060095415610b2757600281015460008381526004602090815260408083206001600160a01b038a1684529091529020546103e891610962916001600160401b03909116906001600160801b0316613267565b6001600160801b03166109759190613292565b836020018181516109869190613254565b9052506002810154600954600091600160401b90046001600160401b0316906109af90426132b4565b6109b99190613292565b60028301549091506000906109de90600160801b90046001600160401b0316836132c7565b60028401549091506103e8906109fd906001600160401b031683613254565b1115610aca576002830154610a1d906001600160401b03166103e86132b4565b600284015460008681526004602090815260408083206001600160a01b038d1684529091529020549192506103e891610a68916001600160401b0316906001600160801b0316613267565b6001600160801b0316610a7b9190613292565b60008581526004602090815260408083206001600160a01b038c168452909152902054610ab191906001600160801b03166132b4565b85602001818151610ac29190613254565b905250610b24565b60008481526004602090815260408083206001600160a01b038b1684529091529020546103e890610b059083906001600160801b03166132c7565b610b0f9190613292565b85602001818151610b209190613254565b9052505b50505b5080610b32816132de565b9150506108a1565b506001600160a01b03831660009081526006602090815260409182902054918301829052820151610b6b91906132b4565b606082015292915050565b610b7e61253f565b42600955565b610b8c61253f565b6001600160a01b038316610c18576000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610be7576040519150601f19603f3d011682016040523d82523d6000602084013e610bec565b606091505b5050905080610c165760405162461bcd60e51b8152600401610c0d906132f7565b60405180910390fd5b505b610c2c6001600160a01b0384168383612599565b505050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915260038281548110610c8557610c85613228565b60009182526020918290206040805161010081018252600390930290910180546001600160801b038082168552600160801b918290048116958501959095526001820154948516928401929092526001600160401b0382850481166060850152600160c01b909404841660808401526002015480841660a0840152600160401b8104841660c08401520490911660e082015292915050565b6040805160208082018352600091829052848252600481528282206001600160a01b0385168352815290829020825191820190925290546001600160801b031681525b92915050565b600080600360085481548110610d7e57610d7e613228565b6000918252602090912060085460039092020160018101548154929450909250610dbc916001600160801b0391821691600160801b9091041661332e565b6001600160801b0316600003610ddd57600854610dda906001613254565b91505b5090565b610de961253f565b60035415610e395760405162461bcd60e51b815260206004820152601c60248201527f50726573616c653a20616c726561647920696e697469616c697a6564000000006044820152606401610c0d565b60078390556000805b82811015611174576103e8848483818110610e5f57610e5f613228565b905060c002016060016020810190610e77919061334e565b6001600160401b03161115610e9e5760405162461bcd60e51b8152600401610c0d90613369565b6103e8848483818110610eb357610eb3613228565b905060c0020160a0016020810190610ecb919061334e565b6001600160401b03161115610ef25760405162461bcd60e51b8152600401610c0d906133ac565b6003604051806101000160405280868685818110610f1257610f12613228565b610f2892602060c09092020190810191506133ef565b6001600160801b03168152602001868685818110610f4857610f48613228565b905060c002016020016020810190610f6091906133ef565b6001600160801b0316815260006020820152604001868685818110610f8757610f87613228565b905060c002016040016020810190610f9f919061334e565b6001600160401b0316815260006020820152604001868685818110610fc657610fc6613228565b905060c002016060016020810190610fde919061334e565b6001600160401b03168152602001868685818110610ffe57610ffe613228565b905060c002016080016020810190611016919061334e565b6001600160401b0316815260200186868581811061103657611036613228565b905060c0020160a001602081019061104e919061334e565b6001600160401b0390811690915282546001818101855560009485526020948590208451958501516001600160801b03908116600160801b90810297821697909717600390940290910192835560408501519183018054606087015160808801518716600160c01b026001600160c01b039188168a026001600160c01b03199093169590941694909417179290921617905560a08301516002909101805460c085015160e0909501518416909502938316600160401b026001600160801b03199590951691909216179290921767ffffffffffffffff60801b191617905583838281811061113e5761113e613228565b905060c00201602001602081019061115691906133ef565b611160908361340a565b91508061116c816132de565b915050610e42565b5083600360008154811061118a5761118a613228565b6000918252602090912060016003909202010180546001600160401b0392909216600160c01b026001600160c01b039092169190911790556112006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633306001600160801b0385166125fc565b50505050565b61120e61253f565b6112188282612634565b5050565b600061122733610848565b9050600081606001511161127d5760405162461bcd60e51b815260206004820152601960248201527f50726573616c653a206e6f7468696e6720746f20636c61696d000000000000006044820152606401610c0d565b606081015133600090815260066020526040812080549091906112a1908490613254565b909155505060608101516112e1906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016903390612599565b606081015160405190815233907f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d49060200160405180910390a250565b61132661253f565b61133060006127bf565b565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b79190613444565b509195945050505050565b6113ca61253f565b4281116114245760405162461bcd60e51b815260206004820152602260248201527f50726573616c653a2070726573616c6520737461727420696e207468652070616044820152611cdd60f21b6064820152608401610c0d565b6007541580611434575060075442105b6114805760405162461bcd60e51b815260206004820181905260248201527f50726573616c653a2070726573616c6520616c726561647920737461727465646044820152606401610c0d565b8060078190555080600360008154811061149c5761149c613228565b906000526020600020906003020160010160186101000a8154816001600160401b0302191690836001600160401b0316021790555050565b60006114de61280f565b905060006114eb82612928565b80549091506000906001600160801b03166115277f0000000000000000000000000000000000000000000000000000000000000000600a613578565b61153a906001600160801b0389166132c7565b6115449190613292565b600183015483549192506000918391611571916001600160801b0391821691600160801b9091041661332e565b6001600160801b0316101561160f57600183015483546115a4916001600160801b0390811691600160801b90041661332e565b6001600160801b031691506115da7f0000000000000000000000000000000000000000000000000000000000000000600a613578565b83546115ef906001600160801b0316846132c7565b6115f99190613292565b61160c906001600160801b0389166132b4565b90505b6000611624826001600160801b038a166132b4565b9050600080611634338a85612a56565b60018801805492945090925086916000906116599084906001600160801b031661340a565b82546101009290920a6001600160801b0381810219909316918316021790915560008981526004602090815260408083203384529091528120805489945090926116a59185911661340a565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550871561172657611721336116e56000546001600160a01b031690565b6116ef85876132b4565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169291906125fc565b611778565b6117783361173c6000546001600160a01b031690565b61174685876132b4565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169291906125fc565b81156117f35787156117be576117b96001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383856125fc565b6117f3565b6117f36001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383856125fc565b86337fd7c1a911d825368778218c8e2781ac83b991f75c9b940a90f8ea7e59c94c5900838b611842577f0000000000000000000000000000000000000000000000000000000000000000611864565b7f00000000000000000000000000000000000000000000000000000000000000005b604080516001600160a01b0393841681529290911660208301528101879052606081018690526080810189905260a00160405180910390a350505050505050505050565b6118b23382612634565b50565b6118bd61253f565b60085481101561190a5760405162461bcd60e51b815260206004820152601860248201527750726573616c653a20696e76616c69642070726573616c6560401b6044820152606401610c0d565b60035481106119565760405162461bcd60e51b815260206004820152601860248201527750726573616c653a20696e76616c69642070726573616c6560401b6044820152606401610c0d565b806008819055504260036008548154811061149c5761149c613228565b61197b61253f565b60006003828154811061199057611990613228565b600091825260208220600390910201805460018201549193506001600160801b03600160801b9091048116929116906119c9828461332e565b84546001600160801b03908116600160801b85831602178655909150611a1d907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169033908416612599565b5050505050565b611a2c61253f565b6064811115611a7d5760405162461bcd60e51b815260206004820152601a60248201527f526566657272616c4d616e6167656d656e743a203e20313030250000000000006044820152606401610c0d565b600155565b346000611a8d61280f565b90506000611a9a82612928565b90506000611ac97f0000000000000000000000000000000000000000000000000000000000000000600a613587565b611ad1611332565b611ae390670de0b6b3a76400006132c7565b611aed9190613292565b90506000670de0b6b3a7640000611b0483876132c7565b611b0e9190613292565b9050670de0b6b3a7640000611b447f0000000000000000000000000000000000000000000000000000000000000000600a613587565b611b4e90836132c7565b611b589190613292565b83549091506000906001600160801b0316611b947f0000000000000000000000000000000000000000000000000000000000000000600a613578565b611b9e90846132c7565b611ba89190613292565b600185015485549192506000918391611bd5916001600160801b0391821691600160801b9091041661332e565b6001600160801b03161015611c3c5760018501548554600091611c0c916001600160801b0391821691600160801b9091041661332e565b6001600160801b0316905082611c2282826132b4565b611c2c908a6132c7565b611c369190613292565b90925090505b6000611c4882896132b4565b9050600080611c58338c85612b08565b60018a0180549294509092508691600090611c7d9084906001600160801b031661340a565b82546101009290920a6001600160801b0381810219909316918316021790915560008b8152600460209081526040808320338452909152812080548994509092611cc99185911661340a565b92506101000a8154816001600160801b0302191690836001600160801b031602179055506000841115611d6057604051600090339086908381818185875af1925050503d8060008114611d38576040519150601f19603f3d011682016040523d82523d6000602084013e611d3d565b606091505b5050905080611d5e5760405162461bcd60e51b8152600401610c0d906132f7565b505b600080546001600160a01b0316611d7784866132b4565b604051600081818185875af1925050503d8060008114611db3576040519150601f19603f3d011682016040523d82523d6000602084013e611db8565b606091505b5050905080611dd95760405162461bcd60e51b8152600401610c0d906132f7565b8215611e54576000826001600160a01b03168460405160006040518083038185875af1925050503d8060008114611e2c576040519150601f19603f3d011682016040523d82523d6000602084013e611e31565b606091505b5050905080611e525760405162461bcd60e51b8152600401610c0d906132f7565b505b604080516001600160a01b03841681526000602082015290810185905260608101849052608081018790528a9033907fd7c1a911d825368778218c8e2781ac83b991f75c9b940a90f8ea7e59c94c59009060a00160405180910390a3505050505050505050505050565b611ec661253f565b611ece61280f565b871015611f285760405162461bcd60e51b815260206004820152602260248201527f50726573616c653a2063616e27742075706461746520706173742070726573616044820152616c6560f01b6064820152608401610c0d565b6103e8836001600160401b03161115611f535760405162461bcd60e51b8152600401610c0d90613369565b6103e8816001600160401b031611158015611f7757506000816001600160401b0316115b611f935760405162461bcd60e51b8152600401610c0d906133ac565b6000826001600160401b031611611fbc5760405162461bcd60e51b8152600401610c0d90613593565b6000846001600160401b0316116120155760405162461bcd60e51b815260206004820152601c60248201527f656d707479206475726174696f6e206e6f7420737570706f72746564000000006044820152606401610c0d565b60006003888154811061202a5761202a613228565b6000918252602090912060039091020180546001600160801b03888116600160801b8181028c84161785556001850180546001600160401b03808d16840267ffffffffffffffff60801b19928316179092556002870180548a841685028c8516600160401b026001600160801b031992909216948e16949094171790911691909117905593945092909104169081111561216c5760018201546001600160801b03908116908816101561211f5760405162461bcd60e51b815260206004820152601760248201527f50726573616c653a20696e76616c696420616d6f756e740000000000000000006044820152606401610c0d565b6121673361212d898461332e565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906001600160801b0316612599565b6121d0565b866001600160801b0316816001600160801b031610156121d0576121d03330612195848b61332e565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169291906001600160801b03166125fc565b505050505050505050565b6121e361253f565b6103e8836001600160401b0316111561220e5760405162461bcd60e51b8152600401610c0d90613369565b6103e8816001600160401b03161115801561223257506000816001600160401b0316115b61224e5760405162461bcd60e51b8152600401610c0d906133ac565b6000826001600160401b0316116122775760405162461bcd60e51b8152600401610c0d90613593565b6000846001600160401b0316116122d05760405162461bcd60e51b815260206004820152601c60248201527f656d707479206475726174696f6e206e6f7420737570706f72746564000000006044820152606401610c0d565b600954156123195760405162461bcd60e51b8152602060048201526016602482015275141c995cd85b194e88141c995cd85b1948115b99195960521b6044820152606401610c0d565b6123576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633306001600160801b0389166125fc565b60408051610100810182526001600160801b0397881681529587166020870190815260009187018281526001600160401b03968716606089019081526080890184815296881660a08a0190815295881660c08a0190815294881660e08a019081526003805460018101825595819052995193518b16600160801b908102948c1694909417949099027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b81019490945590517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c84018054925197518916600160c01b026001600160c01b03988a1685026001600160c01b031990941692909b169190911791909117959095169790971790935590517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d9092018054915194518416909502938316600160401b026001600160801b03199190911691909216171767ffffffffffffffff60801b1916179055565b6124d161253f565b6001600160a01b0381166125365760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c0d565b6118b2816127bf565b6000546001600160a01b031633146113305760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c0d565b6040516001600160a01b038316602482015260448101829052610c2c90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612bb7565b6040516001600160a01b03808516602483015283166044820152606481018290526112009085906323b872dd60e01b906084016125c5565b6001600160a01b03811661269f5760405162461bcd60e51b815260206004820152602c60248201527f526566657272616c4d616e6167656d656e743a20696e76616c6964207265666560448201526b72726572206164647265737360a01b6064820152608401610c0d565b816001600160a01b0316816001600160a01b0316036127185760405162461bcd60e51b815260206004820152602f60248201527f526566657272616c4d616e6167656d656e743a2072656665727265722063616e60448201526e3737ba103132903a3432903ab9b2b960891b6064820152608401610c0d565b6001600160a01b0382811660009081526002602052604090205416156127915760405162461bcd60e51b815260206004820152602860248201527f526566657272616c4d616e6167656d656e743a20726566657272657220616c726044820152671958591e481cd95d60c21b6064820152608401610c0d565b6001600160a01b03918216600090815260026020526040902080546001600160a01b03191691909216179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600354600854600091116128355760405162461bcd60e51b8152600401610c0d906135d6565b600060036008548154811061284c5761284c613228565b6000918252602090912060039091020160018101548154919250612884916001600160801b0391821691600160801b9091041661332e565b6001600160801b0316600003612920576003546008546128a5906001613254565b106128c25760405162461bcd60e51b8152600401610c0d906135d6565b6008546128d0906001613254565b60088190556003805442929081106128ea576128ea613228565b906000526020600020906003020160010160186101000a8154816001600160401b0302191690836001600160401b031602179055505b505060085490565b600060075460001415801561293f57506007544210155b61298b5760405162461bcd60e51b815260206004820152601860248201527f50726573616c653a206e6f7420737461727465642079657400000000000000006044820152606401610c0d565b60035482106129ac5760405162461bcd60e51b8152600401610c0d906135d6565b6000600383815481106129c1576129c1613228565b6000918252602090912060016003909202019081015490915042906129ff906001600160401b03600160801b8204811691600160c01b900416613601565b6001600160401b03161015610d605760405162461bcd60e51b815260206004820152601c60248201527f50726573616c653a2050726573616c6520537461676520456e646564000000006044820152606401610c0d565b6000806000612a658686612c8c565b90506001600160a01b038116612a7c576000612a96565b606460015485612a8c91906132c7565b612a969190613292565b6001600160801b031692508215612afd576001600160a01b03811660009081526005602052604081208054859290612ad89084906001600160801b031661340a565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b90505b935093915050565b600080612b158585612c8c565b90506001600160a01b038116612b2c576000612b46565b606460015484612b3c91906132c7565b612b469190613292565b6001600160801b031691508115612b00576001600160a01b03811660009081526005602052604081206001018054849290612b8b9084906001600160801b031661340a565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550935093915050565b6000612c0c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612cbb9092919063ffffffff16565b9050805160001480612c2d575080806020019051810190612c2d9190613621565b610c2c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610c0d565b6000612c988383612cd2565b6001600160a01b03808416600090815260026020526040902054165b9392505050565b6060612cca8484600085612d2f565b949350505050565b6001600160a01b0382811660009081526002602052604090205416158015612d0c5750816001600160a01b0316816001600160a01b031614155b8015612d2057506001600160a01b03811615155b15611218576112188282612634565b606082471015612d905760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610c0d565b600080866001600160a01b03168587604051612dac9190613662565b60006040518083038185875af1925050503d8060008114612de9576040519150601f19603f3d011682016040523d82523d6000602084013e612dee565b606091505b5091509150612dff87838387612e0a565b979650505050505050565b60608315612e79578251600003612e72576001600160a01b0385163b612e725760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c0d565b5081612cca565b612cca8383815115612e8e5781518083602001fd5b8060405162461bcd60e51b8152600401610c0d919061367e565b80356001600160a01b0381168114612ebf57600080fd5b919050565b600060208284031215612ed657600080fd5b612cb482612ea8565b600080600060608486031215612ef457600080fd5b612efd84612ea8565b9250612f0b60208501612ea8565b9150604084013590509250925092565b600060208284031215612f2d57600080fd5b5035919050565b6000610100820190506001600160801b038084511683528060208501511660208401528060408501511660408401525060608301516001600160401b038082166060850152806080860151166080850152505060a0830151612fa160a08401826001600160401b03169052565b5060c0830151612fbc60c08401826001600160401b03169052565b5060e0830151612fd760e08401826001600160401b03169052565b5092915050565b60008060408385031215612ff157600080fd5b8235915061300160208401612ea8565b90509250929050565b60008060006040848603121561301f57600080fd5b8335925060208401356001600160401b038082111561303d57600080fd5b818601915086601f83011261305157600080fd5b81358181111561306057600080fd5b87602060c08302850101111561307557600080fd5b6020830194508093505050509250925092565b6000806040838503121561309b57600080fd5b6130a483612ea8565b915061300160208401612ea8565b80356001600160801b0381168114612ebf57600080fd5b80151581146118b257600080fd5b6000806000606084860312156130ec57600080fd5b6130f5846130b2565b925061310360208501612ea8565b91506040840135613113816130c9565b809150509250925092565b80356001600160401b0381168114612ebf57600080fd5b600080600080600080600060e0888a03121561315057600080fd5b87359650613160602089016130b2565b955061316e604089016130b2565b945061317c6060890161311e565b935061318a6080890161311e565b925061319860a0890161311e565b91506131a660c0890161311e565b905092959891949750929550565b60008060008060008060c087890312156131cd57600080fd5b6131d6876130b2565b95506131e4602088016130b2565b94506131f26040880161311e565b93506132006060880161311e565b925061320e6080880161311e565b915061321c60a0880161311e565b90509295509295509295565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820180821115610d6057610d6061323e565b6001600160801b0381811683821602808216919082811461328a5761328a61323e565b505092915050565b6000826132af57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610d6057610d6061323e565b8082028115828204841417610d6057610d6061323e565b6000600182016132f0576132f061323e565b5060010190565b6020808252601b908201527f50726573616c653a20756e61626c6520746f2073656e64204554480000000000604082015260600190565b6001600160801b03828116828216039080821115612fd757612fd761323e565b60006020828403121561336057600080fd5b612cb48261311e565b60208082526023908201527f50726573616c653a20696e76616c696420666972737420756e6c6f636b20726160408201526274696f60e81b606082015260800190565b60208082526023908201527f50726573616c653a20696e76616c696420756e6c6f636b20657665727920726160408201526274696f60e81b606082015260800190565b60006020828403121561340157600080fd5b612cb4826130b2565b6001600160801b03818116838216019080821115612fd757612fd761323e565b805169ffffffffffffffffffff81168114612ebf57600080fd5b600080600080600060a0868803121561345c57600080fd5b6134658661342a565b94506020860151935060408601519250606086015191506134886080870161342a565b90509295509295909350565b600181815b808511156134cf5781600019048211156134b5576134b561323e565b808516156134c257918102915b93841c9390800290613499565b509250929050565b6000826134e657506001610d60565b816134f357506000610d60565b816001811461350957600281146135135761352f565b6001915050610d60565b60ff8411156135245761352461323e565b50506001821b610d60565b5060208310610133831016604e8410600b8410161715613552575081810a610d60565b61355c8383613494565b80600019048211156135705761357061323e565b029392505050565b6000612cb460ff8416836134d7565b6000612cb483836134d7565b60208082526023908201527f50726573616c653a20756e6c6f636b45766572792063616e6e6f74206265207a60408201526265726f60e81b606082015260800190565b602080825260119082015270141c995cd85b194e881cdbdb19081bdd5d607a1b604082015260600190565b6001600160401b03818116838216019080821115612fd757612fd761323e565b60006020828403121561363357600080fd5b8151612cb4816130c9565b60005b83811015613659578181015183820152602001613641565b50506000910152565b6000825161367481846020870161363e565b9190910192915050565b602081526000825180602084015261369d81604085016020870161363e565b601f01601f1916919091016040019291505056fea2646970667358221220156871a418c7227d1e7148ff54566aa8eea6ae2abb36a0d2b0aa0e783fe4af3c64736f6c634300081300330000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84190000000000000000000000006923f9b683111dcc0e20124e9a031deeae5dad93000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Deployed Bytecode
0x6080604052600436106102255760003560e01c80637bf4216511610123578063cb397f63116100ab578063dbf7d5931161006f578063dbf7d5931461079e578063de8801e5146107be578063e985e367146107d4578063f183b4fa14610808578063f2fde38b1461082857600080fd5b8063cb397f6314610706578063d21cacdf1461071c578063d30ef61b14610755578063d74d3d781461076b578063d8eaa36d1461078b57600080fd5b8063a18a7bfc116100f2578063a18a7bfc1461063e578063a98ad46c1461065e578063ab48b88114610692578063bda6d5ce146106c6578063c5af5a15146106e657600080fd5b80637bf421651461059857806382543b32146105cc578063888b168d146106005780638da5cb5b1461062057600080fd5b80633806422a116101b1578063697af70a11610175578063697af70a146104e057806371037894146104f5578063715018a61461054e578063777e0d861461056357806378152bbe1461057857600080fd5b80633806422a146104015780634864d8d9146104165780634bd35b291461042b5780635af9e3bf1461044b5780635f5c09a91461046b57600080fd5b80632866ed21116101f85780632866ed211461034f57806328dae6e31461036557806329d3cb351461037c5780632e3250201461039c57806332734257146103c957600080fd5b806302a9e7141461022a57806304e869031461027557806311eac855146102b05780632637615b146102fc575b600080fd5b34801561023657600080fd5b5061025e7f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff90911681526020015b60405180910390f35b34801561028157600080fd5b506102a2610290366004612ec4565b60066020526000908152604090205481565b60405190815260200161026c565b3480156102bc57600080fd5b506102e47f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec781565b6040516001600160a01b03909116815260200161026c565b34801561030857600080fd5b5061031c610317366004612ec4565b610848565b60405161026c91908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b34801561035b57600080fd5b506102a260095481565b34801561037157600080fd5b5061037a610b76565b005b34801561038857600080fd5b5061037a610397366004612edf565b610b84565b3480156103a857600080fd5b506103bc6103b7366004612f1b565b610c31565b60405161026c9190612f34565b3480156103d557600080fd5b506103e96103e4366004612fde565b610d1d565b60405190516001600160801b0316815260200161026c565b34801561040d57600080fd5b506003546102a2565b34801561042257600080fd5b506102a2610d66565b34801561043757600080fd5b5061037a61044636600461300a565b610de1565b34801561045757600080fd5b5061037a610466366004613088565b611206565b34801561047757600080fd5b506104b6610486366004612ec4565b600560205260009081526040902080546001909101546001600160801b0380831692600160801b90048116911683565b604080516001600160801b039485168152928416602084015292169181019190915260600161026c565b3480156104ec57600080fd5b5061037a61121c565b34801561050157600080fd5b50610536610510366004612fde565b60046020908152600092835260408084209091529082529020546001600160801b031681565b6040516001600160801b03909116815260200161026c565b34801561055a57600080fd5b5061037a61131e565b34801561056f57600080fd5b506102a2611332565b34801561058457600080fd5b5061037a610593366004612f1b565b6113c2565b3480156105a457600080fd5b506102a27f000000000000000000000000000000000000000000000000000000000000000681565b3480156105d857600080fd5b506102a27f000000000000000000000000000000000000000000000000000000000000000681565b34801561060c57600080fd5b5061037a61061b3660046130d7565b6114d4565b34801561062c57600080fd5b506000546001600160a01b03166102e4565b34801561064a57600080fd5b5061037a610659366004612ec4565b6118a8565b34801561066a57600080fd5b506102e47f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b34801561069e57600080fd5b506102a27f000000000000000000000000000000000000000000000000000000000000000881565b3480156106d257600080fd5b5061037a6106e1366004612f1b565b6118b5565b3480156106f257600080fd5b5061037a610701366004612f1b565b611973565b34801561071257600080fd5b506102a260085481565b34801561072857600080fd5b506102e4610737366004612ec4565b6001600160a01b039081166000908152600260205260409020541690565b34801561076157600080fd5b506102a260015481565b34801561077757600080fd5b5061037a610786366004612f1b565b611a24565b61037a610799366004612ec4565b611a82565b3480156107aa57600080fd5b5061037a6107b9366004613135565b611ebe565b3480156107ca57600080fd5b506102a260075481565b3480156107e057600080fd5b506102e47f0000000000000000000000006923f9b683111dcc0e20124e9a031deeae5dad9381565b34801561081457600080fd5b5061037a6108233660046131b4565b6121db565b34801561083457600080fd5b5061037a610843366004612ec4565b6124c9565b6108736040518060800160405280600081526020016000815260200160008152602001600081525090565b61089e6040518060800160405280600081526020016000815260200160008152602001600081525090565b60005b600354811015610b3a576000600382815481106108c0576108c0613228565b600091825260208083208584526004825260408085206001600160a01b038b1686529092529220548551600390920290920192506001600160801b0390911690849061090d908390613254565b90525060095415610b2757600281015460008381526004602090815260408083206001600160a01b038a1684529091529020546103e891610962916001600160401b03909116906001600160801b0316613267565b6001600160801b03166109759190613292565b836020018181516109869190613254565b9052506002810154600954600091600160401b90046001600160401b0316906109af90426132b4565b6109b99190613292565b60028301549091506000906109de90600160801b90046001600160401b0316836132c7565b60028401549091506103e8906109fd906001600160401b031683613254565b1115610aca576002830154610a1d906001600160401b03166103e86132b4565b600284015460008681526004602090815260408083206001600160a01b038d1684529091529020549192506103e891610a68916001600160401b0316906001600160801b0316613267565b6001600160801b0316610a7b9190613292565b60008581526004602090815260408083206001600160a01b038c168452909152902054610ab191906001600160801b03166132b4565b85602001818151610ac29190613254565b905250610b24565b60008481526004602090815260408083206001600160a01b038b1684529091529020546103e890610b059083906001600160801b03166132c7565b610b0f9190613292565b85602001818151610b209190613254565b9052505b50505b5080610b32816132de565b9150506108a1565b506001600160a01b03831660009081526006602090815260409182902054918301829052820151610b6b91906132b4565b606082015292915050565b610b7e61253f565b42600955565b610b8c61253f565b6001600160a01b038316610c18576000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610be7576040519150601f19603f3d011682016040523d82523d6000602084013e610bec565b606091505b5050905080610c165760405162461bcd60e51b8152600401610c0d906132f7565b60405180910390fd5b505b610c2c6001600160a01b0384168383612599565b505050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915260038281548110610c8557610c85613228565b60009182526020918290206040805161010081018252600390930290910180546001600160801b038082168552600160801b918290048116958501959095526001820154948516928401929092526001600160401b0382850481166060850152600160c01b909404841660808401526002015480841660a0840152600160401b8104841660c08401520490911660e082015292915050565b6040805160208082018352600091829052848252600481528282206001600160a01b0385168352815290829020825191820190925290546001600160801b031681525b92915050565b600080600360085481548110610d7e57610d7e613228565b6000918252602090912060085460039092020160018101548154929450909250610dbc916001600160801b0391821691600160801b9091041661332e565b6001600160801b0316600003610ddd57600854610dda906001613254565b91505b5090565b610de961253f565b60035415610e395760405162461bcd60e51b815260206004820152601c60248201527f50726573616c653a20616c726561647920696e697469616c697a6564000000006044820152606401610c0d565b60078390556000805b82811015611174576103e8848483818110610e5f57610e5f613228565b905060c002016060016020810190610e77919061334e565b6001600160401b03161115610e9e5760405162461bcd60e51b8152600401610c0d90613369565b6103e8848483818110610eb357610eb3613228565b905060c0020160a0016020810190610ecb919061334e565b6001600160401b03161115610ef25760405162461bcd60e51b8152600401610c0d906133ac565b6003604051806101000160405280868685818110610f1257610f12613228565b610f2892602060c09092020190810191506133ef565b6001600160801b03168152602001868685818110610f4857610f48613228565b905060c002016020016020810190610f6091906133ef565b6001600160801b0316815260006020820152604001868685818110610f8757610f87613228565b905060c002016040016020810190610f9f919061334e565b6001600160401b0316815260006020820152604001868685818110610fc657610fc6613228565b905060c002016060016020810190610fde919061334e565b6001600160401b03168152602001868685818110610ffe57610ffe613228565b905060c002016080016020810190611016919061334e565b6001600160401b0316815260200186868581811061103657611036613228565b905060c0020160a001602081019061104e919061334e565b6001600160401b0390811690915282546001818101855560009485526020948590208451958501516001600160801b03908116600160801b90810297821697909717600390940290910192835560408501519183018054606087015160808801518716600160c01b026001600160c01b039188168a026001600160c01b03199093169590941694909417179290921617905560a08301516002909101805460c085015160e0909501518416909502938316600160401b026001600160801b03199590951691909216179290921767ffffffffffffffff60801b191617905583838281811061113e5761113e613228565b905060c00201602001602081019061115691906133ef565b611160908361340a565b91508061116c816132de565b915050610e42565b5083600360008154811061118a5761118a613228565b6000918252602090912060016003909202010180546001600160401b0392909216600160c01b026001600160c01b039092169190911790556112006001600160a01b037f0000000000000000000000006923f9b683111dcc0e20124e9a031deeae5dad931633306001600160801b0385166125fc565b50505050565b61120e61253f565b6112188282612634565b5050565b600061122733610848565b9050600081606001511161127d5760405162461bcd60e51b815260206004820152601960248201527f50726573616c653a206e6f7468696e6720746f20636c61696d000000000000006044820152606401610c0d565b606081015133600090815260066020526040812080549091906112a1908490613254565b909155505060608101516112e1906001600160a01b037f0000000000000000000000006923f9b683111dcc0e20124e9a031deeae5dad9316903390612599565b606081015160405190815233907f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d49060200160405180910390a250565b61132661253f565b61133060006127bf565b565b6000807f0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84196001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b79190613444565b509195945050505050565b6113ca61253f565b4281116114245760405162461bcd60e51b815260206004820152602260248201527f50726573616c653a2070726573616c6520737461727420696e207468652070616044820152611cdd60f21b6064820152608401610c0d565b6007541580611434575060075442105b6114805760405162461bcd60e51b815260206004820181905260248201527f50726573616c653a2070726573616c6520616c726561647920737461727465646044820152606401610c0d565b8060078190555080600360008154811061149c5761149c613228565b906000526020600020906003020160010160186101000a8154816001600160401b0302191690836001600160401b0316021790555050565b60006114de61280f565b905060006114eb82612928565b80549091506000906001600160801b03166115277f0000000000000000000000000000000000000000000000000000000000000012600a613578565b61153a906001600160801b0389166132c7565b6115449190613292565b600183015483549192506000918391611571916001600160801b0391821691600160801b9091041661332e565b6001600160801b0316101561160f57600183015483546115a4916001600160801b0390811691600160801b90041661332e565b6001600160801b031691506115da7f0000000000000000000000000000000000000000000000000000000000000012600a613578565b83546115ef906001600160801b0316846132c7565b6115f99190613292565b61160c906001600160801b0389166132b4565b90505b6000611624826001600160801b038a166132b4565b9050600080611634338a85612a56565b60018801805492945090925086916000906116599084906001600160801b031661340a565b82546101009290920a6001600160801b0381810219909316918316021790915560008981526004602090815260408083203384529091528120805489945090926116a59185911661340a565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550871561172657611721336116e56000546001600160a01b031690565b6116ef85876132b4565b6001600160a01b037f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7169291906125fc565b611778565b6117783361173c6000546001600160a01b031690565b61174685876132b4565b6001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48169291906125fc565b81156117f35787156117be576117b96001600160a01b037f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7163383856125fc565b6117f3565b6117f36001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48163383856125fc565b86337fd7c1a911d825368778218c8e2781ac83b991f75c9b940a90f8ea7e59c94c5900838b611842577f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48611864565b7f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec75b604080516001600160a01b0393841681529290911660208301528101879052606081018690526080810189905260a00160405180910390a350505050505050505050565b6118b23382612634565b50565b6118bd61253f565b60085481101561190a5760405162461bcd60e51b815260206004820152601860248201527750726573616c653a20696e76616c69642070726573616c6560401b6044820152606401610c0d565b60035481106119565760405162461bcd60e51b815260206004820152601860248201527750726573616c653a20696e76616c69642070726573616c6560401b6044820152606401610c0d565b806008819055504260036008548154811061149c5761149c613228565b61197b61253f565b60006003828154811061199057611990613228565b600091825260208220600390910201805460018201549193506001600160801b03600160801b9091048116929116906119c9828461332e565b84546001600160801b03908116600160801b85831602178655909150611a1d907f0000000000000000000000006923f9b683111dcc0e20124e9a031deeae5dad936001600160a01b03169033908416612599565b5050505050565b611a2c61253f565b6064811115611a7d5760405162461bcd60e51b815260206004820152601a60248201527f526566657272616c4d616e6167656d656e743a203e20313030250000000000006044820152606401610c0d565b600155565b346000611a8d61280f565b90506000611a9a82612928565b90506000611ac97f0000000000000000000000000000000000000000000000000000000000000008600a613587565b611ad1611332565b611ae390670de0b6b3a76400006132c7565b611aed9190613292565b90506000670de0b6b3a7640000611b0483876132c7565b611b0e9190613292565b9050670de0b6b3a7640000611b447f0000000000000000000000000000000000000000000000000000000000000006600a613587565b611b4e90836132c7565b611b589190613292565b83549091506000906001600160801b0316611b947f0000000000000000000000000000000000000000000000000000000000000012600a613578565b611b9e90846132c7565b611ba89190613292565b600185015485549192506000918391611bd5916001600160801b0391821691600160801b9091041661332e565b6001600160801b03161015611c3c5760018501548554600091611c0c916001600160801b0391821691600160801b9091041661332e565b6001600160801b0316905082611c2282826132b4565b611c2c908a6132c7565b611c369190613292565b90925090505b6000611c4882896132b4565b9050600080611c58338c85612b08565b60018a0180549294509092508691600090611c7d9084906001600160801b031661340a565b82546101009290920a6001600160801b0381810219909316918316021790915560008b8152600460209081526040808320338452909152812080548994509092611cc99185911661340a565b92506101000a8154816001600160801b0302191690836001600160801b031602179055506000841115611d6057604051600090339086908381818185875af1925050503d8060008114611d38576040519150601f19603f3d011682016040523d82523d6000602084013e611d3d565b606091505b5050905080611d5e5760405162461bcd60e51b8152600401610c0d906132f7565b505b600080546001600160a01b0316611d7784866132b4565b604051600081818185875af1925050503d8060008114611db3576040519150601f19603f3d011682016040523d82523d6000602084013e611db8565b606091505b5050905080611dd95760405162461bcd60e51b8152600401610c0d906132f7565b8215611e54576000826001600160a01b03168460405160006040518083038185875af1925050503d8060008114611e2c576040519150601f19603f3d011682016040523d82523d6000602084013e611e31565b606091505b5050905080611e525760405162461bcd60e51b8152600401610c0d906132f7565b505b604080516001600160a01b03841681526000602082015290810185905260608101849052608081018790528a9033907fd7c1a911d825368778218c8e2781ac83b991f75c9b940a90f8ea7e59c94c59009060a00160405180910390a3505050505050505050505050565b611ec661253f565b611ece61280f565b871015611f285760405162461bcd60e51b815260206004820152602260248201527f50726573616c653a2063616e27742075706461746520706173742070726573616044820152616c6560f01b6064820152608401610c0d565b6103e8836001600160401b03161115611f535760405162461bcd60e51b8152600401610c0d90613369565b6103e8816001600160401b031611158015611f7757506000816001600160401b0316115b611f935760405162461bcd60e51b8152600401610c0d906133ac565b6000826001600160401b031611611fbc5760405162461bcd60e51b8152600401610c0d90613593565b6000846001600160401b0316116120155760405162461bcd60e51b815260206004820152601c60248201527f656d707479206475726174696f6e206e6f7420737570706f72746564000000006044820152606401610c0d565b60006003888154811061202a5761202a613228565b6000918252602090912060039091020180546001600160801b03888116600160801b8181028c84161785556001850180546001600160401b03808d16840267ffffffffffffffff60801b19928316179092556002870180548a841685028c8516600160401b026001600160801b031992909216948e16949094171790911691909117905593945092909104169081111561216c5760018201546001600160801b03908116908816101561211f5760405162461bcd60e51b815260206004820152601760248201527f50726573616c653a20696e76616c696420616d6f756e740000000000000000006044820152606401610c0d565b6121673361212d898461332e565b6001600160a01b037f0000000000000000000000006923f9b683111dcc0e20124e9a031deeae5dad931691906001600160801b0316612599565b6121d0565b866001600160801b0316816001600160801b031610156121d0576121d03330612195848b61332e565b6001600160a01b037f0000000000000000000000006923f9b683111dcc0e20124e9a031deeae5dad93169291906001600160801b03166125fc565b505050505050505050565b6121e361253f565b6103e8836001600160401b0316111561220e5760405162461bcd60e51b8152600401610c0d90613369565b6103e8816001600160401b03161115801561223257506000816001600160401b0316115b61224e5760405162461bcd60e51b8152600401610c0d906133ac565b6000826001600160401b0316116122775760405162461bcd60e51b8152600401610c0d90613593565b6000846001600160401b0316116122d05760405162461bcd60e51b815260206004820152601c60248201527f656d707479206475726174696f6e206e6f7420737570706f72746564000000006044820152606401610c0d565b600954156123195760405162461bcd60e51b8152602060048201526016602482015275141c995cd85b194e88141c995cd85b1948115b99195960521b6044820152606401610c0d565b6123576001600160a01b037f0000000000000000000000006923f9b683111dcc0e20124e9a031deeae5dad931633306001600160801b0389166125fc565b60408051610100810182526001600160801b0397881681529587166020870190815260009187018281526001600160401b03968716606089019081526080890184815296881660a08a0190815295881660c08a0190815294881660e08a019081526003805460018101825595819052995193518b16600160801b908102948c1694909417949099027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b81019490945590517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c84018054925197518916600160c01b026001600160c01b03988a1685026001600160c01b031990941692909b169190911791909117959095169790971790935590517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d9092018054915194518416909502938316600160401b026001600160801b03199190911691909216171767ffffffffffffffff60801b1916179055565b6124d161253f565b6001600160a01b0381166125365760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c0d565b6118b2816127bf565b6000546001600160a01b031633146113305760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c0d565b6040516001600160a01b038316602482015260448101829052610c2c90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612bb7565b6040516001600160a01b03808516602483015283166044820152606481018290526112009085906323b872dd60e01b906084016125c5565b6001600160a01b03811661269f5760405162461bcd60e51b815260206004820152602c60248201527f526566657272616c4d616e6167656d656e743a20696e76616c6964207265666560448201526b72726572206164647265737360a01b6064820152608401610c0d565b816001600160a01b0316816001600160a01b0316036127185760405162461bcd60e51b815260206004820152602f60248201527f526566657272616c4d616e6167656d656e743a2072656665727265722063616e60448201526e3737ba103132903a3432903ab9b2b960891b6064820152608401610c0d565b6001600160a01b0382811660009081526002602052604090205416156127915760405162461bcd60e51b815260206004820152602860248201527f526566657272616c4d616e6167656d656e743a20726566657272657220616c726044820152671958591e481cd95d60c21b6064820152608401610c0d565b6001600160a01b03918216600090815260026020526040902080546001600160a01b03191691909216179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600354600854600091116128355760405162461bcd60e51b8152600401610c0d906135d6565b600060036008548154811061284c5761284c613228565b6000918252602090912060039091020160018101548154919250612884916001600160801b0391821691600160801b9091041661332e565b6001600160801b0316600003612920576003546008546128a5906001613254565b106128c25760405162461bcd60e51b8152600401610c0d906135d6565b6008546128d0906001613254565b60088190556003805442929081106128ea576128ea613228565b906000526020600020906003020160010160186101000a8154816001600160401b0302191690836001600160401b031602179055505b505060085490565b600060075460001415801561293f57506007544210155b61298b5760405162461bcd60e51b815260206004820152601860248201527f50726573616c653a206e6f7420737461727465642079657400000000000000006044820152606401610c0d565b60035482106129ac5760405162461bcd60e51b8152600401610c0d906135d6565b6000600383815481106129c1576129c1613228565b6000918252602090912060016003909202019081015490915042906129ff906001600160401b03600160801b8204811691600160c01b900416613601565b6001600160401b03161015610d605760405162461bcd60e51b815260206004820152601c60248201527f50726573616c653a2050726573616c6520537461676520456e646564000000006044820152606401610c0d565b6000806000612a658686612c8c565b90506001600160a01b038116612a7c576000612a96565b606460015485612a8c91906132c7565b612a969190613292565b6001600160801b031692508215612afd576001600160a01b03811660009081526005602052604081208054859290612ad89084906001600160801b031661340a565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b90505b935093915050565b600080612b158585612c8c565b90506001600160a01b038116612b2c576000612b46565b606460015484612b3c91906132c7565b612b469190613292565b6001600160801b031691508115612b00576001600160a01b03811660009081526005602052604081206001018054849290612b8b9084906001600160801b031661340a565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550935093915050565b6000612c0c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612cbb9092919063ffffffff16565b9050805160001480612c2d575080806020019051810190612c2d9190613621565b610c2c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610c0d565b6000612c988383612cd2565b6001600160a01b03808416600090815260026020526040902054165b9392505050565b6060612cca8484600085612d2f565b949350505050565b6001600160a01b0382811660009081526002602052604090205416158015612d0c5750816001600160a01b0316816001600160a01b031614155b8015612d2057506001600160a01b03811615155b15611218576112188282612634565b606082471015612d905760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610c0d565b600080866001600160a01b03168587604051612dac9190613662565b60006040518083038185875af1925050503d8060008114612de9576040519150601f19603f3d011682016040523d82523d6000602084013e612dee565b606091505b5091509150612dff87838387612e0a565b979650505050505050565b60608315612e79578251600003612e72576001600160a01b0385163b612e725760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c0d565b5081612cca565b612cca8383815115612e8e5781518083602001fd5b8060405162461bcd60e51b8152600401610c0d919061367e565b80356001600160a01b0381168114612ebf57600080fd5b919050565b600060208284031215612ed657600080fd5b612cb482612ea8565b600080600060608486031215612ef457600080fd5b612efd84612ea8565b9250612f0b60208501612ea8565b9150604084013590509250925092565b600060208284031215612f2d57600080fd5b5035919050565b6000610100820190506001600160801b038084511683528060208501511660208401528060408501511660408401525060608301516001600160401b038082166060850152806080860151166080850152505060a0830151612fa160a08401826001600160401b03169052565b5060c0830151612fbc60c08401826001600160401b03169052565b5060e0830151612fd760e08401826001600160401b03169052565b5092915050565b60008060408385031215612ff157600080fd5b8235915061300160208401612ea8565b90509250929050565b60008060006040848603121561301f57600080fd5b8335925060208401356001600160401b038082111561303d57600080fd5b818601915086601f83011261305157600080fd5b81358181111561306057600080fd5b87602060c08302850101111561307557600080fd5b6020830194508093505050509250925092565b6000806040838503121561309b57600080fd5b6130a483612ea8565b915061300160208401612ea8565b80356001600160801b0381168114612ebf57600080fd5b80151581146118b257600080fd5b6000806000606084860312156130ec57600080fd5b6130f5846130b2565b925061310360208501612ea8565b91506040840135613113816130c9565b809150509250925092565b80356001600160401b0381168114612ebf57600080fd5b600080600080600080600060e0888a03121561315057600080fd5b87359650613160602089016130b2565b955061316e604089016130b2565b945061317c6060890161311e565b935061318a6080890161311e565b925061319860a0890161311e565b91506131a660c0890161311e565b905092959891949750929550565b60008060008060008060c087890312156131cd57600080fd5b6131d6876130b2565b95506131e4602088016130b2565b94506131f26040880161311e565b93506132006060880161311e565b925061320e6080880161311e565b915061321c60a0880161311e565b90509295509295509295565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820180821115610d6057610d6061323e565b6001600160801b0381811683821602808216919082811461328a5761328a61323e565b505092915050565b6000826132af57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610d6057610d6061323e565b8082028115828204841417610d6057610d6061323e565b6000600182016132f0576132f061323e565b5060010190565b6020808252601b908201527f50726573616c653a20756e61626c6520746f2073656e64204554480000000000604082015260600190565b6001600160801b03828116828216039080821115612fd757612fd761323e565b60006020828403121561336057600080fd5b612cb48261311e565b60208082526023908201527f50726573616c653a20696e76616c696420666972737420756e6c6f636b20726160408201526274696f60e81b606082015260800190565b60208082526023908201527f50726573616c653a20696e76616c696420756e6c6f636b20657665727920726160408201526274696f60e81b606082015260800190565b60006020828403121561340157600080fd5b612cb4826130b2565b6001600160801b03818116838216019080821115612fd757612fd761323e565b805169ffffffffffffffffffff81168114612ebf57600080fd5b600080600080600060a0868803121561345c57600080fd5b6134658661342a565b94506020860151935060408601519250606086015191506134886080870161342a565b90509295509295909350565b600181815b808511156134cf5781600019048211156134b5576134b561323e565b808516156134c257918102915b93841c9390800290613499565b509250929050565b6000826134e657506001610d60565b816134f357506000610d60565b816001811461350957600281146135135761352f565b6001915050610d60565b60ff8411156135245761352461323e565b50506001821b610d60565b5060208310610133831016604e8410600b8410161715613552575081810a610d60565b61355c8383613494565b80600019048211156135705761357061323e565b029392505050565b6000612cb460ff8416836134d7565b6000612cb483836134d7565b60208082526023908201527f50726573616c653a20756e6c6f636b45766572792063616e6e6f74206265207a60408201526265726f60e81b606082015260800190565b602080825260119082015270141c995cd85b194e881cdbdb19081bdd5d607a1b604082015260600190565b6001600160401b03818116838216019080821115612fd757612fd761323e565b60006020828403121561363357600080fd5b8151612cb4816130c9565b60005b83811015613659578181015183820152602001613641565b50506000910152565b6000825161367481846020870161363e565b9190910192915050565b602081526000825180602084015261369d81604085016020870161363e565b601f01601f1916919091016040019291505056fea2646970667358221220156871a418c7227d1e7148ff54566aa8eea6ae2abb36a0d2b0aa0e783fe4af3c64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84190000000000000000000000006923f9b683111dcc0e20124e9a031deeae5dad93000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
-----Decoded View---------------
Arg [0] : _chainlinkEthFeed (address): 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
Arg [1] : _saleToken (address): 0x6923F9B683111DCc0e20124e9A031dEeAE5DaD93
Arg [2] : _usdcToken (address): 0xdAC17F958D2ee523a2206206994597C13D831ec7
Arg [3] : _usdtToken (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Arg [1] : 0000000000000000000000006923f9b683111dcc0e20124e9a031deeae5dad93
Arg [2] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [3] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Deployed Bytecode Sourcemap
28635:18698:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28923:40;;;;;;;;;;;;;;;;;;186:4:1;174:17;;;156:36;;144:2;129:18;28923:40:0;;;;;;;;29576:48;;;;;;;;;;-1:-1:-1;29576:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;718:25:1;;;706:2;691:18;29576:48:0;572:177:1;28833:37:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;937:32:1;;;919:51;;907:2;892:18;28833:37:0;754:222:1;44812:1726:0;;;;;;;;;;-1:-1:-1;44812:1726:0;;;;;:::i;:::-;;:::i;:::-;;;;;;1208:13:1;;1190:32;;1278:4;1266:17;;;1260:24;1238:20;;;1231:54;1341:4;1329:17;;;1323:24;1301:20;;;1294:54;1404:4;1392:17;;;1386:24;1364:20;;;1357:54;;;;1177:3;1162:19;;981:436;29711:27:0;;;;;;;;;;;;;;;;29747:91;;;;;;;;;;;;;:::i;:::-;;46964:366;;;;;;;;;;-1:-1:-1;46964:366:0;;;;;:::i;:::-;;:::i;29154:142::-;;;;;;;;;;-1:-1:-1;29154:142:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;44496:166::-;;;;;;;;;;-1:-1:-1;44496:166:0;;;;;:::i;:::-;;:::i;:::-;;;3561:13:1;;-1:-1:-1;;;;;3557:54:1;3539:73;;3527:2;3512:18;44496:166:0;3341:277:1;29304:102:0;;;;;;;;;;-1:-1:-1;29377:14:0;:21;29304:102;;43780:340;;;;;;;;;;;;;:::i;36866:1580::-;;;;;;;;;;-1:-1:-1;36866:1580:0;;;;;:::i;:::-;;:::i;27516:154::-;;;;;;;;;;-1:-1:-1;27516:154:0;;;;;:::i;:::-;;:::i;29517:50::-;;;;;;;;;;-1:-1:-1;29517:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29517:50:0;;;;-1:-1:-1;;;29517:50:0;;;;;;;;;;;;-1:-1:-1;;;;;4887:15:1;;;4869:34;;4939:15;;;4934:2;4919:18;;4912:43;4991:15;;4971:18;;;4964:43;;;;4804:2;4789:18;29517:50:0;4614:399:1;46604:352:0;;;;;;;;;;;;;:::i;29444:64::-;;;;;;;;;;-1:-1:-1;29444:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29444:64:0;;;;;;-1:-1:-1;;;;;5182:47:1;;;5164:66;;5152:2;5137:18;29444:64:0;5018:218:1;24779:103:0;;;;;;;;;;;;;:::i;44154:334::-;;;;;;;;;;;;;:::i;39108:448::-;;;;;;;;;;-1:-1:-1;39108:448:0;;;;;:::i;:::-;;:::i;29018:37::-;;;;;;;;;;;;;;;29062;;;;;;;;;;;;;;;32099:2160;;;;;;;;;;-1:-1:-1;32099:2160:0;;;;;:::i;:::-;;:::i;24138:87::-;;;;;;;;;;-1:-1:-1;24184:7:0;24211:6;-1:-1:-1;;;;;24211:6:0;24138:87;;26498:106;;;;;;;;;;-1:-1:-1;26498:106:0;;;;;:::i;:::-;;:::i;28877:37::-;;;;;;;;;;;;;;;28970:41;;;;;;;;;;;;;;;39564:445;;;;;;;;;;-1:-1:-1;39564:445:0;;;;;:::i;:::-;;:::i;38592:423::-;;;;;;;;;;-1:-1:-1;38592:423:0;;;;;:::i;:::-;;:::i;29672:30::-;;;;;;;;;;;;;;;;27678:113;;;;;;;;;;-1:-1:-1;27678:113:0;;;;;:::i;:::-;-1:-1:-1;;;;;27765:18:0;;;27738:7;27765:18;;;:9;:18;;;;;;;;27678:113;25733:63;;;;;;;;;;;;;;;;25859:250;;;;;;;;;;-1:-1:-1;25859:250:0;;;;;:::i;:::-;;:::i;34267:2414::-;;;;;;:::i;:::-;;:::i;42124:1648::-;;;;;;;;;;-1:-1:-1;42124:1648:0;;;;;:::i;:::-;;:::i;29633:27::-;;;;;;;;;;;;;;;;28789:37;;;;;;;;;;;;;;;40620:1241;;;;;;;;;;-1:-1:-1;40620:1241:0;;;;;:::i;:::-;;:::i;25037:201::-;;;;;;;;;;-1:-1:-1;25037:201:0;;;;;:::i;:::-;;:::i;44812:1726::-;44889:20;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44889:20:0;44922:25;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44922:25:0;44963:9;44958:1448;44982:14;:21;44978:25;;44958:1448;;;45025:28;45056:14;45071:1;45056:17;;;;;;;;:::i;:::-;;;;;;;;;45102:11;;;:8;:11;;;;;;-1:-1:-1;;;;;45102:17:0;;;;;;;;;:30;45088:44;;45056:17;;;;;;;;-1:-1:-1;;;;;;45102:30:0;;;;45088:4;;:44;;45102:30;;45088:44;:::i;:::-;;;-1:-1:-1;45151:12:0;;:17;45147:1248;;45286:24;;;;;45228:11;;;:8;:11;;;;;;;;-1:-1:-1;;;;;45228:17:0;;;;;;;;;:30;27946:5;;45228:82;;-1:-1:-1;;;;;45286:24:0;;;;-1:-1:-1;;;;;45228:30:0;:82;:::i;:::-;-1:-1:-1;;;;;45227:124:0;;;;;:::i;:::-;45189:4;:13;;:162;;;;;;;:::i;:::-;;;-1:-1:-1;45451:19:0;;;;45414:12;;45372:20;;-1:-1:-1;;;45451:19:0;;-1:-1:-1;;;;;45451:19:0;;45396:30;;:15;:30;:::i;:::-;45395:75;;;;:::i;:::-;45557:24;;;;45372:98;;-1:-1:-1;45491:26:0;;45521:60;;-1:-1:-1;;;45557:24:0;;-1:-1:-1;;;;;45557:24:0;45372:98;45521:60;:::i;:::-;45650:24;;;;45491:91;;-1:-1:-1;27946:5:0;;45629:45;;-1:-1:-1;;;;;45650:24:0;45491:91;45629:45;:::i;:::-;:85;45603:777;;;45847:24;;;;45803:68;;-1:-1:-1;;;;;45847:24:0;27946:5;45803:68;:::i;:::-;46103:24;;;;;46041:11;;;:8;:11;;;;;;;;-1:-1:-1;;;;;46041:17:0;;;;;;;;;:30;45757:114;;-1:-1:-1;27946:5:0;;46041:86;;-1:-1:-1;;;;;46103:24:0;;-1:-1:-1;;;;;46041:30:0;:86;:::i;:::-;-1:-1:-1;;;;;46040:132:0;;;;;:::i;:::-;45982:11;;;;:8;:11;;;;;;;;-1:-1:-1;;;;;45982:17:0;;;;;;;;;:30;:190;;;-1:-1:-1;;;;;45982:30:0;:190;:::i;:::-;45940:4;:13;;:232;;;;;;;:::i;:::-;;;-1:-1:-1;45603:777:0;;;46264:11;;;;:8;:11;;;;;;;;-1:-1:-1;;;;;46264:17:0;;;;;;;;;:30;27946:5;;46264:51;;46297:18;;-1:-1:-1;;;;;46264:30:0;:51;:::i;:::-;46263:97;;;;:::i;:::-;46221:4;:13;;:139;;;;;;;:::i;:::-;;;-1:-1:-1;45603:777:0;45170:1225;;45147:1248;-1:-1:-1;45005:3:0;;;;:::i;:::-;;;;44958:1448;;;-1:-1:-1;;;;;;46433:19:0;;;;;;:13;:19;;;;;;;;;;46418:12;;;:34;;;46480:13;;;:28;;46433:19;46480:28;:::i;:::-;46463:14;;;:45;:4;44812:1726;-1:-1:-1;;44812:1726:0:o;29747:91::-;24024:13;:11;:13::i;:::-;29815:15:::1;29800:12;:30:::0;29747:91::o;46964:366::-;24024:13;:11;:13::i;:::-;-1:-1:-1;;;;;47100:20:0;::::1;47096:171;;47138:12;47164:3;-1:-1:-1::0;;;;;47156:17:0::1;47181:7;47156:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47137:56;;;47216:7;47208:47;;;;-1:-1:-1::0;;;47208:47:0::1;;;;;;;:::i;:::-;;;;;;;;;47122:145;47096:171;47277:45;-1:-1:-1::0;;;;;47277:31:0;::::1;47309:3:::0;47314:7;47277:31:::1;:45::i;:::-;46964:366:::0;;;:::o;29154:142::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29266:14:0;29281:6;29266:22;;;;;;;;:::i;:::-;;;;;;;;;;29259:29;;;;;;;;29266:22;;;;;;;29259:29;;-1:-1:-1;;;;;29259:29:0;;;;;-1:-1:-1;;;29259:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29259:29:0;;;;;;;;;-1:-1:-1;;;29259:29:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29259:29:0;;;;;;;;;;;;;;;;;29154:142;-1:-1:-1;;29154:142:0:o;44496:166::-;-1:-1:-1;;;;;;;;;;;;;;44631:16:0;;;:8;:16;;;;;-1:-1:-1;;;;;44631:23:0;;;;;;;;;;44624:30;;;;;;;;;;-1:-1:-1;;;;;44624:30:0;;;44496:166;;;;;:::o;43780:340::-;43826:18;43857:28;43888:14;43903:15;;43888:31;;;;;;;;:::i;:::-;;;;;;;;;43943:15;;43888:31;;;;;43997:18;;;;43973:21;;43943:15;;-1:-1:-1;43888:31:0;;-1:-1:-1;43973:42:0;;-1:-1:-1;;;;;43997:18:0;;;;-1:-1:-1;;;43973:21:0;;;;:42;:::i;:::-;-1:-1:-1;;;;;43973:47:0;44019:1;43973:47;43969:112;;44050:15;;:19;;44068:1;44050:19;:::i;:::-;44037:32;;43969:112;44093:19;43780:340;:::o;36866:1580::-;24024:13;:11;:13::i;:::-;37025:14:::1;:21:::0;:26;37017:67:::1;;;::::0;-1:-1:-1;;;37017:67:0;;10010:2:1;37017:67:0::1;::::0;::::1;9992:21:1::0;10049:2;10029:18;;;10022:30;10088;10068:18;;;10061:58;10136:18;;37017:67:0::1;9808:352:1::0;37017:67:0::1;37097:12;:28:::0;;;37136:26:::1;::::0;37175:1064:::1;37195:28:::0;;::::1;37175:1064;;;27946:5;37271:17;;37289:1;37271:20;;;;;;;:::i;:::-;;;;;;:37;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37271:57:0::1;;;37245:154;;;;-1:-1:-1::0;;;37245:154:0::1;;;;;;;:::i;:::-;27946:5;37440:17;;37458:1;37440:20;;;;;;;:::i;:::-;;;;;;:37;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37440:57:0::1;;;37414:154;;;;-1:-1:-1::0;;;37414:154:0::1;;;;;;;:::i;:::-;37585:14;37623:518;;;;;;;;37666:17;;37684:1;37666:20;;;;;;;:::i;:::-;:26;::::0;::::1;:20;::::0;;::::1;;:26:::0;;::::1;::::0;-1:-1:-1;37666:26:0::1;:::i;:::-;-1:-1:-1::0;;;;;37623:518:0::1;;;;;37730:17;;37748:1;37730:20;;;;;;;:::i;:::-;;;;;;:34;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37623:518:0::1;::::0;;37799:1:::1;37623:518;::::0;::::1;::::0;;;37833:17;;37851:1;37833:20;;::::1;;;;;:::i;:::-;;;;;;:29;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37623:518:0::1;::::0;;37896:1:::1;37623:518;::::0;::::1;::::0;;;37938:17;;37956:1;37938:20;;::::1;;;;;:::i;:::-;;;;;;:37;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37623:518:0::1;;;;;38011:17;;38029:1;38011:20;;;;;;;:::i;:::-;;;;;;:32;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37623:518:0::1;;;;;38084:17;;38102:1;38084:20;;;;;;;:::i;:::-;;;;;;:37;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37623:518:0;;::::1;::::0;;;37585:571;;::::1;::::0;;::::1;::::0;;-1:-1:-1;37585:571:0;;;::::1;::::0;;;;;;;;::::1;::::0;-1:-1:-1;;;;;37585:571:0;;::::1;-1:-1:-1::0;;;37585:571:0;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;;37585:571:0::1;-1:-1:-1::0;;;;;37585:571:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;37585:571:0;;;;;;::::1;::::0;;;;::::1;::::0;;;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;37585:571:0::1;-1:-1:-1::0;;;;;;37585:571:0;;;;;;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;37585:571:0::1;;::::0;;38193:17;;38211:1;38193:20;;::::1;;;;;:::i;:::-;;;;;;:34;;;;;;;;;;:::i;:::-;38171:56;::::0;;::::1;:::i;:::-;::::0;-1:-1:-1;37225:3:0;::::1;::::0;::::1;:::i;:::-;;;;37175:1064;;;;38288:13;38251:14;38266:1;38251:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:27:::1;:17;::::0;;::::1;;:27;:51:::0;;-1:-1:-1;;;;;38251:51:0;;;::::1;-1:-1:-1::0;;;38251:51:0::1;-1:-1:-1::0;;;;;38251:51:0;;::::1;::::0;;;::::1;::::0;;38315:123:::1;-1:-1:-1::0;;;;;38315:9:0::1;:26;38356:10;38389:4;-1:-1:-1::0;;;;;38315:123:0;::::1;:26;:123::i;:::-;37006:1440;36866:1580:::0;;;:::o;27516:154::-;24024:13;:11;:13::i;:::-;27629:33:::1;27645:5;27652:9;27629:15;:33::i;:::-;27516:154:::0;;:::o;46604:352::-;46653:25;46681:28;46698:10;46681:16;:28::i;:::-;46653:56;;46747:1;46730:4;:14;;;:18;46722:56;;;;-1:-1:-1;;;46722:56:0;;11757:2:1;46722:56:0;;;11739:21:1;11796:2;11776:18;;;11769:30;11835:27;11815:18;;;11808:55;11880:18;;46722:56:0;11555:349:1;46722:56:0;46820:14;;;;46805:10;46791:25;;;;:13;:25;;;;;:43;;:25;;;:43;;46820:14;;46791:43;:::i;:::-;;;;-1:-1:-1;;46882:14:0;;;;46847:50;;-1:-1:-1;;;;;46847:9:0;:22;;46870:10;;46847:22;:50::i;:::-;46933:14;;;;46915:33;;718:25:1;;;46921:10:0;;46915:33;;706:2:1;691:18;46915:33:0;;;;;;;46642:314;46604:352::o;24779:103::-;24024:13;:11;:13::i;:::-;24844:30:::1;24871:1;24844:18;:30::i;:::-;24779:103::o:0;44154:334::-;44204:6;44297:10;44416:8;-1:-1:-1;;;;;44416:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;44251:191:0;;44154:334;-1:-1:-1;;;;;44154:334:0:o;39108:448::-;24024:13;:11;:13::i;:::-;39224:15:::1;39208:13;:31;39186:115;;;::::0;-1:-1:-1;;;39186:115:0;;12773:2:1;39186:115:0::1;::::0;::::1;12755:21:1::0;12812:2;12792:18;;;12785:30;12851:34;12831:18;;;12824:62;-1:-1:-1;;;12902:18:1;;;12895:32;12944:19;;39186:115:0::1;12571:398:1::0;39186:115:0::1;39334:12;::::0;:17;;:51:::1;;;39373:12;;39355:15;:30;39334:51;39312:133;;;::::0;-1:-1:-1;;;39312:133:0;;13176:2:1;39312:133:0::1;::::0;::::1;13158:21:1::0;;;13195:18;;;13188:30;13254:34;13234:18;;;13227:62;13306:18;;39312:133:0::1;12974:356:1::0;39312:133:0::1;39471:13;39456:12;:28;;;;39534:13;39497:14;39512:1;39497:17;;;;;;;;:::i;:::-;;;;;;;;;;;:27;;;:51;;;;;-1:-1:-1::0;;;;;39497:51:0::1;;;;;-1:-1:-1::0;;;;;39497:51:0::1;;;;;;39108:448:::0;:::o;32099:2160::-;32229:22;32254:14;:12;:14::i;:::-;32229:39;;32279:28;32310:32;32327:14;32310:16;:32::i;:::-;32436:13;;32279:63;;-1:-1:-1;32355:23:0;;-1:-1:-1;;;;;32436:13:0;32396:23;32402:17;32396:2;:23;:::i;:::-;32382:37;;-1:-1:-1;;;;;32382:37:0;;;:::i;:::-;32381:68;;;;:::i;:::-;32640:18;;;;32616:21;;32355:94;;-1:-1:-1;32462:20:0;;32355:94;;32616:42;;-1:-1:-1;;;;;32640:18:0;;;;-1:-1:-1;;;32616:21:0;;;;:42;:::i;:::-;-1:-1:-1;;;;;32616:60:0;;32612:307;;;32735:18;;;;32711:21;;:42;;-1:-1:-1;;;;;32735:18:0;;;;-1:-1:-1;;;32711:21:0;;;:42;:::i;:::-;-1:-1:-1;;;;;32693:60:0;;-1:-1:-1;32884:23:0;32890:17;32884:2;:23;:::i;:::-;32850:13;;32832:31;;-1:-1:-1;;;;;32850:13:0;32832:15;:31;:::i;:::-;32831:76;;;;:::i;:::-;32800:107;;-1:-1:-1;;;;;32800:107:0;;;:::i;:::-;32768:139;;32612:307;32931:17;32951:26;32965:12;-1:-1:-1;;;;;32951:26:0;;;:::i;:::-;32931:46;;32991:17;33010:11;33025:97;33053:10;33078:9;33102;33025:13;:97::i;:::-;33135:18;;;:46;;32990:132;;-1:-1:-1;32990:132:0;;-1:-1:-1;33165:15:0;;33135:18;;:46;;33165:15;;-1:-1:-1;;;;;33135:46:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;33135:46:0;;;;;;;;;;;;;;;-1:-1:-1;33241:24:0;;;:8;:24;;;;;;;;33266:10;33241:36;;;;;;;:101;;33316:15;;-1:-1:-1;33241:36:0;;:101;;33316:15;;33241:101;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;33241:101:0;;;;;-1:-1:-1;;;;;33241:101:0;;;;;;33430:9;33426:329;;;33454:136;33499:10;33528:7;24184;24211:6;-1:-1:-1;;;;;24211:6:0;;24138:87;33528:7;33554:21;33566:9;33554;:21;:::i;:::-;-1:-1:-1;;;;;33454:9:0;:26;;:136;;:26;:136::i;:::-;33426:329;;;33619:136;33664:10;33693:7;24184;24211:6;-1:-1:-1;;;;;24211:6:0;;24138:87;33693:7;33719:21;33731:9;33719;:21;:::i;:::-;-1:-1:-1;;;;;33619:9:0;:26;;:136;;:26;:136::i;:::-;33811:13;;33807:206;;33845:9;33841:160;;;33873:54;-1:-1:-1;;;;;33873:9:0;:26;33900:10;33912:3;33917:9;33873:26;:54::i;:::-;33841:160;;;33947:54;-1:-1:-1;;;;;33947:9:0;:26;33974:10;33986:3;33991:9;33947:26;:54::i;:::-;34073:14;34048:10;34030:221;34102:3;34128:9;:33;;34152:9;34128:33;;;34140:9;34128:33;34030:221;;;-1:-1:-1;;;;;15033:15:1;;;15015:34;;15085:15;;;;15080:2;15065:18;;15058:43;15117:18;;15110:34;;;15175:2;15160:18;;15153:34;;;15218:3;15203:19;;15196:35;;;14964:3;14949:19;34030:221:0;;;;;;;32218:2041;;;;;;;32099:2160;;;:::o;26498:106::-;26558:38;26574:10;26586:9;26558:15;:38::i;:::-;26498:106;:::o;39564:445::-;24024:13;:11;:13::i;:::-;39713:15:::1;;39695:14;:33;;39687:70;;;::::0;-1:-1:-1;;;39687:70:0;;15444:2:1;39687:70:0::1;::::0;::::1;15426:21:1::0;15483:2;15463:18;;;15456:30;-1:-1:-1;;;15502:18:1;;;15495:54;15566:18;;39687:70:0::1;15242:348:1::0;39687:70:0::1;39807:14;:21:::0;39790:38;::::1;39768:112;;;::::0;-1:-1:-1;;;39768:112:0;;15444:2:1;39768:112:0::1;::::0;::::1;15426:21:1::0;15483:2;15463:18;;;15456:30;-1:-1:-1;;;15502:18:1;;;15495:54;15566:18;;39768:112:0::1;15242:348:1::0;39768:112:0::1;39909:14;39891:15;:32;;;;39985:15;39934:14;39949:15;;39934:31;;;;;;;;:::i;38592:423::-:0;24024:13;:11;:13::i;:::-;38677:28:::1;38708:14;38723:13;38708:29;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;;::::1;;38772:21:::0;;38825:18:::1;::::0;::::1;::::0;38708:29;;-1:-1:-1;;;;;;;;;38772:21:0;;::::1;::::0;::::1;::::0;38825:18;::::1;::::0;38877:26:::1;38825:18:::0;38772:21;38877:26:::1;:::i;:::-;38914:34:::0;;-1:-1:-1;;;;;38914:34:0;;::::1;-1:-1:-1::0;;;38914:34:0;;::::1;;;::::0;;38854:49;;-1:-1:-1;38959:48:0::1;::::0;:9:::1;-1:-1:-1::0;;;;;38959:22:0::1;::::0;38982:10:::1;::::0;38959:48;::::1;:22;:48::i;:::-;38666:349;;;;38592:423:::0;:::o;25859:250::-;24024:13;:11;:13::i;:::-;26008:3:::1;25981:23;:30;;25973:69;;;::::0;-1:-1:-1;;;25973:69:0;;15797:2:1;25973:69:0::1;::::0;::::1;15779:21:1::0;15836:2;15816:18;;;15809:30;15875:28;15855:18;;;15848:56;15921:18;;25973:69:0::1;15595:350:1::0;25973:69:0::1;26053:22;:48:::0;25859:250::o;34267:2414::-;34355:9;34334:18;34400:14;:12;:14::i;:::-;34375:39;;34425:28;34456:32;34473:14;34456:16;:32::i;:::-;34425:63;-1:-1:-1;34501:16:0;34579:22;34585:16;34579:2;:22;:::i;:::-;34529:19;:17;:19::i;:::-;34521:41;;34552:10;34521:41;:::i;:::-;34520:81;;;;:::i;:::-;34501:100;-1:-1:-1;34614:19:0;34662:10;34637:21;34501:100;34637:10;:21;:::i;:::-;34636:36;;;;:::i;:::-;34614:58;-1:-1:-1;34736:8:0;34714:18;34720:12;34714:2;:18;:::i;:::-;34700:32;;:11;:32;:::i;:::-;34699:45;;;;:::i;:::-;34838:13;;34685:59;;-1:-1:-1;34757:23:0;;-1:-1:-1;;;;;34838:13:0;34798:23;34804:17;34798:2;:23;:::i;:::-;34784:37;;:11;:37;:::i;:::-;34783:68;;;;:::i;:::-;35052:18;;;;35028:21;;34757:94;;-1:-1:-1;34864:20:0;;34757:94;;35028:42;;-1:-1:-1;;;;;35052:18:0;;;;-1:-1:-1;;;35028:21:0;;;;:42;:::i;:::-;-1:-1:-1;;;;;35028:60:0;;35024:367;;;35175:18;;;;35134:21;;35105:26;;35134:59;;-1:-1:-1;;;;;35175:18:0;;;;-1:-1:-1;;;35134:21:0;;;;:59;:::i;:::-;-1:-1:-1;;;;;35105:88:0;;-1:-1:-1;35313:15:0;35255:36;35105:88;35313:15;35255:36;:::i;:::-;35241:51;;:10;:51;:::i;:::-;35240:88;;;;:::i;:::-;35361:18;;-1:-1:-1;35208:120:0;-1:-1:-1;35024:367:0;35403:17;35423:25;35436:12;35423:10;:25;:::i;:::-;35403:45;;35462:17;35481:11;35496:100;35527:10;35552:9;35576;35496:16;:100::i;:::-;35609:18;;;:46;;35461:135;;-1:-1:-1;35461:135:0;;-1:-1:-1;35639:15:0;;35609:18;;:46;;35639:15;;-1:-1:-1;;;;;35609:46:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;35609:46:0;;;;;;;;;;;;;;;-1:-1:-1;35668:24:0;;;:8;:24;;;;;;;;35693:10;35668:36;;;;;;;:101;;35743:15;;-1:-1:-1;35668:36:0;;:101;;35743:15;;35668:101;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;35668:101:0;;;;;-1:-1:-1;;;;;35668:101:0;;;;;;35845:1;35830:12;:16;35826:211;;;35882:81;;35864:12;;35890:10;;35914:12;;35864;35882:81;35864:12;35882:81;35914:12;35890:10;35882:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35863:100;;;35986:7;35978:47;;;;-1:-1:-1;;;35978:47:0;;;;;;;:::i;:::-;35848:189;35826:211;36084:18;24211:6;;-1:-1:-1;;;;;24211:6:0;36151:21;36163:9;36151;:21;:::i;:::-;36108:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36083:104;;;36206:13;36198:53;;;;-1:-1:-1;;;36198:53:0;;;;;;;:::i;:::-;36305:13;;36301:166;;36336:12;36362:3;-1:-1:-1;;;;;36354:17:0;36379:9;36354:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36335:58;;;36416:7;36408:47;;;;-1:-1:-1;;;36408:47:0;;;;;;;:::i;:::-;36320:147;36301:166;36484:189;;;-1:-1:-1;;;;;15033:15:1;;15015:34;;36582:1:0;15080:2:1;15065:18;;15058:43;15117:18;;;15110:34;;;15175:2;15160:18;;15153:34;;;15218:3;15203:19;;15196:35;;;36527:14:0;;36502:10;;36484:189;;14964:3:1;14949:19;36484:189:0;;;;;;;34323:2358;;;;;;;;;;;34267:2414;:::o;42124:1648::-;24024:13;:11;:13::i;:::-;42438:14:::1;:12;:14::i;:::-;42421:13;:31;;42399:115;;;::::0;-1:-1:-1;;;42399:115:0;;16288:2:1;42399:115:0::1;::::0;::::1;16270:21:1::0;16327:2;16307:18;;;16300:30;16366:34;16346:18;;;16339:62;-1:-1:-1;;;16417:18:1;;;16410:32;16459:19;;42399:115:0::1;16086:398:1::0;42399:115:0::1;27946:5;42549:17;-1:-1:-1::0;;;;;42549:37:0::1;;;42527:122;;;;-1:-1:-1::0;;;42527:122:0::1;;;;;;;:::i;:::-;27946:5;42684:17;-1:-1:-1::0;;;;;42684:37:0::1;;;:62;;;;;42745:1;42725:17;-1:-1:-1::0;;;;;42725:21:0::1;;42684:62;42662:147;;;;-1:-1:-1::0;;;42662:147:0::1;;;;;;;:::i;:::-;42845:1;42830:12;-1:-1:-1::0;;;;;42830:16:0::1;;42822:64;;;;-1:-1:-1::0;;;42822:64:0::1;;;;;;;:::i;:::-;42919:1;42907:9;-1:-1:-1::0;;;;;42907:13:0::1;;42899:54;;;::::0;-1:-1:-1;;;42899:54:0;;17095:2:1;42899:54:0::1;::::0;::::1;17077:21:1::0;17134:2;17114:18;;;17107:30;17173;17153:18;;;17146:58;17221:18;;42899:54:0::1;16893:352:1::0;42899:54:0::1;42966:28;42997:14;43012:13;42997:29;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;43061:21:::0;;-1:-1:-1;;;;;43126:31:0;;::::1;-1:-1:-1::0;;;43126:31:0;;::::1;43093:22:::0;;::::1;43126:31;::::0;;43093:22;43168:16;::::1;:28:::0;;-1:-1:-1;;;;;43168:28:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;43168:28:0;;::::1;;::::0;;;43207:24:::1;::::0;::::1;:44:::0;;43307;;::::1;::::0;::::1;43262:34:::0;;::::1;-1:-1:-1::0;;;43262:34:0::1;-1:-1:-1::0;;;;;;43262:34:0;;;;43207:44;;::::1;43262:34:::0;;;;::::1;43307:44:::0;;::::1;::::0;;;::::1;::::0;;42997:29;;-1:-1:-1;43061:21:0;;;::::1;;::::0;43368:23;::::1;43364:401;;;43427:18;::::0;::::1;::::0;-1:-1:-1;;;;;43427:18:0;;::::1;43416:29:::0;;::::1;;;43408:65;;;::::0;-1:-1:-1;;;43408:65:0;;17452:2:1;43408:65:0::1;::::0;::::1;17434:21:1::0;17491:2;17471:18;;;17464:30;17530:25;17510:18;;;17503:53;17573:18;;43408:65:0::1;17250:347:1::0;43408:65:0::1;43488:59;43511:10;43523:23;43539:7:::0;43523:13;:23:::1;:::i;:::-;-1:-1:-1::0;;;;;43488:9:0::1;:22;::::0;:59;-1:-1:-1;;;;;43488:59:0::1;:22;:59::i;:::-;43364:401;;;43585:7;-1:-1:-1::0;;;;;43569:23:0::1;:13;-1:-1:-1::0;;;;;43569:23:0::1;;43565:200;;;43609:144;43654:10;43691:4;43715:23;43725:13:::0;43715:7;:23:::1;:::i;:::-;-1:-1:-1::0;;;;;43609:9:0::1;:26;::::0;:144;;-1:-1:-1;;;;;43609:144:0::1;:26;:144::i;:::-;42388:1384;;42124:1648:::0;;;;;;;:::o;40620:1241::-;24024:13;:11;:13::i;:::-;27946:5:::1;40888:17;-1:-1:-1::0;;;;;40888:37:0::1;;;40866:122;;;;-1:-1:-1::0;;;40866:122:0::1;;;;;;;:::i;:::-;27946:5;41021:17;-1:-1:-1::0;;;;;41021:37:0::1;;;:62;;;;;41082:1;41062:17;-1:-1:-1::0;;;;;41062:21:0::1;;41021:62;40999:147;;;;-1:-1:-1::0;;;40999:147:0::1;;;;;;;:::i;:::-;41182:1;41167:12;-1:-1:-1::0;;;;;41167:16:0::1;;41159:64;;;;-1:-1:-1::0;;;41159:64:0::1;;;;;;;:::i;:::-;41256:1;41244:9;-1:-1:-1::0;;;;;41244:13:0::1;;41236:54;;;::::0;-1:-1:-1;;;41236:54:0;;17095:2:1;41236:54:0::1;::::0;::::1;17077:21:1::0;17134:2;17114:18;;;17107:30;17173;17153:18;;;17146:58;17221:18;;41236:54:0::1;16893:352:1::0;41236:54:0::1;41311:12;::::0;:17;41303:52:::1;;;::::0;-1:-1:-1;;;41303:52:0;;17804:2:1;41303:52:0::1;::::0;::::1;17786:21:1::0;17843:2;17823:18;;;17816:30;-1:-1:-1;;;17862:18:1;;;17855:52;17924:18;;41303:52:0::1;17602:346:1::0;41303:52:0::1;41368:68;-1:-1:-1::0;;;;;41368:9:0::1;:26;41395:10;41415:4;-1:-1:-1::0;;;;;41368:68:0;::::1;:26;:68::i;:::-;41481:361;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;41481:361:0;;::::1;::::0;;;;::::1;;::::0;::::1;::::0;;;-1:-1:-1;41481:361:0;;;;;;-1:-1:-1;;;;;41481:361:0;;::::1;::::0;;;;;;;;;;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;41447:14:::1;:406:::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;-1:-1:-1::0;;;41447:406:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;::::1;-1:-1:-1::0;;;41447:406:0::1;-1:-1:-1::0;;;;;41447:406:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;41447:406:0;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;;;;;;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;41447:406:0::1;-1:-1:-1::0;;;;;;41447:406:0;;;;;;;::::1;::::0;::::1;-1:-1:-1::0;;;;41447:406:0::1;;::::0;;40620:1241::o;25037:201::-;24024:13;:11;:13::i;:::-;-1:-1:-1;;;;;25126:22:0;::::1;25118:73;;;::::0;-1:-1:-1;;;25118:73:0;;18155:2:1;25118:73:0::1;::::0;::::1;18137:21:1::0;18194:2;18174:18;;;18167:30;18233:34;18213:18;;;18206:62;-1:-1:-1;;;18284:18:1;;;18277:36;18330:19;;25118:73:0::1;17953:402:1::0;25118:73:0::1;25202:28;25221:8;25202:18;:28::i;24303:132::-:0;24184:7;24211:6;-1:-1:-1;;;;;24211:6:0;22852:10;24367:23;24359:68;;;;-1:-1:-1;;;24359:68:0;;18562:2:1;24359:68:0;;;18544:21:1;;;18581:18;;;18574:30;18640:34;18620:18;;;18613:62;18692:18;;24359:68:0;18360:356:1;15411:177:0;15521:58;;-1:-1:-1;;;;;18913:32:1;;15521:58:0;;;18895:51:1;18962:18;;;18955:34;;;15494:86:0;;15514:5;;-1:-1:-1;;;15544:23:0;18868:18:1;;15521:58:0;;;;-1:-1:-1;;15521:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;15521:58:0;-1:-1:-1;;;;;;15521:58:0;;;;;;;;;;15494:19;:86::i;15833:205::-;15961:68;;-1:-1:-1;;;;;19258:15:1;;;15961:68:0;;;19240:34:1;19310:15;;19290:18;;;19283:43;19342:18;;;19335:34;;;15934:96:0;;15954:5;;-1:-1:-1;;;15984:27:0;19175:18:1;;15961:68:0;19000:375:1;27008:500:0;-1:-1:-1;;;;;27109:23:0;;27087:117;;;;-1:-1:-1;;;27087:117:0;;19582:2:1;27087:117:0;;;19564:21:1;19621:2;19601:18;;;19594:30;19660:34;19640:18;;;19633:62;-1:-1:-1;;;19711:18:1;;;19704:42;19763:19;;27087:117:0;19380:408:1;27087:117:0;27250:5;-1:-1:-1;;;;;27237:18:0;:9;-1:-1:-1;;;;;27237:18:0;;27215:115;;;;-1:-1:-1;;;27215:115:0;;19995:2:1;27215:115:0;;;19977:21:1;20034:2;20014:18;;;20007:30;20073:34;20053:18;;;20046:62;-1:-1:-1;;;20124:18:1;;;20117:45;20179:19;;27215:115:0;19793:411:1;27215:115:0;-1:-1:-1;;;;;27363:16:0;;;27391:1;27363:16;;;:9;:16;;;;;;;:30;27341:120;;;;-1:-1:-1;;;27341:120:0;;20411:2:1;27341:120:0;;;20393:21:1;20450:2;20430:18;;;20423:30;20489:34;20469:18;;;20462:62;-1:-1:-1;;;20540:18:1;;;20533:38;20588:19;;27341:120:0;20209:404:1;27341:120:0;-1:-1:-1;;;;;27472:16:0;;;;;;;:9;:16;;;;;:28;;-1:-1:-1;;;;;;27472:28:0;;;;;;;;27008:500::o;25398:191::-;25472:16;25491:6;;-1:-1:-1;;;;;25508:17:0;;;-1:-1:-1;;;;;;25508:17:0;;;;;;25541:40;;25491:6;;;;;;;25541:40;;25472:16;25541:40;25461:128;25398:191;:::o;40017:595::-;40105:14;:21;40087:15;;40059:7;;-1:-1:-1;40079:69:0;;;;-1:-1:-1;;;40079:69:0;;;;;;;:::i;:::-;40159:28;40190:14;40205:15;;40190:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;40262:18;;;;40238:21;;40190:31;;-1:-1:-1;40238:42:0;;-1:-1:-1;;;;;40262:18:0;;;;-1:-1:-1;;;40238:21:0;;;;:42;:::i;:::-;-1:-1:-1;;;;;40238:47:0;40284:1;40238:47;40234:336;;40350:14;:21;40328:15;;:19;;40346:1;40328:19;:::i;:::-;:43;40302:122;;;;-1:-1:-1;;;40302:122:0;;;;;;;:::i;:::-;40457:15;;:19;;40475:1;40457:19;:::i;:::-;40439:15;:37;;;40491:14;:31;;40542:15;;40439:37;40491:31;;;;;;:::i;:::-;;;;;;;;;;;:41;;;:67;;;;;-1:-1:-1;;;;;40491:67:0;;;;;-1:-1:-1;;;;;40491:67:0;;;;;;40234:336;-1:-1:-1;;40588:15:0;;;40017:595::o;30597:556::-;30678:20;30733:12;;30749:1;30733:17;;:52;;;;;30773:12;;30754:15;:31;;30733:52;30711:126;;;;-1:-1:-1;;;30711:126:0;;21166:2:1;30711:126:0;;;21148:21:1;21205:2;21185:18;;;21178:30;21244:26;21224:18;;;21217:54;21288:18;;30711:126:0;20964:348:1;30711:126:0;30867:14;:21;30858:30;;30850:60;;;;-1:-1:-1;;;30850:60:0;;;;;;;:::i;:::-;30921:28;30952:14;30967:6;30952:22;;;;;;;;:::i;:::-;;;;;;;;;31029:16;30952:22;;;;;31029:16;;;;30952:22;;-1:-1:-1;31049:15:0;;31009:36;;-1:-1:-1;;;;;;;;31029:16:0;;;;;-1:-1:-1;;;31009:17:0;;;:36;:::i;:::-;-1:-1:-1;;;;;31009:55:0;;;30987:133;;;;-1:-1:-1;;;30987:133:0;;21704:2:1;30987:133:0;;;21686:21:1;21743:2;21723:18;;;21716:30;21782;21762:18;;;21755:58;21830:18;;30987:133:0;21502:352:1;31161:480:0;31282:17;31301:7;31321:11;31335:41;31364:5;31371:4;31335:28;:41::i;:::-;31321:55;-1:-1:-1;;;;;;31399:17:0;;:99;;31497:1;31399:99;;;31477:3;31451:22;;31441:7;:32;;;;:::i;:::-;31440:40;;;;:::i;:::-;-1:-1:-1;;;;;31387:111:0;;-1:-1:-1;31515:13:0;;31511:86;;-1:-1:-1;;;;;31543:16:0;;;;;;:11;:16;;;;;:54;;31587:9;;31543:16;:54;;31587:9;;-1:-1:-1;;;;;31543:54:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;31543:54:0;;;;;-1:-1:-1;;;;;31543:54:0;;;;;;31511:86;31629:3;-1:-1:-1;31161:480:0;;;;;;;:::o;31649:442::-;31773:17;31792:11;31822:41;31851:5;31858:4;31822:28;:41::i;:::-;31816:47;-1:-1:-1;;;;;;31886:17:0;;:99;;31984:1;31886:99;;;31964:3;31938:22;;31928:7;:32;;;;:::i;:::-;31927:40;;;;:::i;:::-;-1:-1:-1;;;;;31874:111:0;;-1:-1:-1;32002:13:0;;31998:85;;-1:-1:-1;;;;;32030:16:0;;;;;;:11;:16;;;;;:31;;:53;;32073:9;;32030:16;:53;;32073:9;;-1:-1:-1;;;;;32030:53:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;32030:53:0;;;;;-1:-1:-1;;;;;32030:53:0;;;;;;31649:442;;;;;;:::o;19757:649::-;20181:23;20207:69;20235:4;20207:69;;;;;;;;;;;;;;;;;20215:5;-1:-1:-1;;;;;20207:27:0;;;:69;;;;;:::i;:::-;20181:95;;20295:10;:17;20316:1;20295:22;:56;;;;20332:10;20321:30;;;;;;;;;;;;:::i;:::-;20287:111;;;;-1:-1:-1;;;20287:111:0;;22311:2:1;20287:111:0;;;22293:21:1;22350:2;22330:18;;;22323:30;22389:34;22369:18;;;22362:62;-1:-1:-1;;;22440:18:1;;;22433:40;22490:19;;20287:111:0;22109:406:1;26117:216:0;26232:7;26252:36;26271:5;26278:9;26252:18;:36::i;:::-;-1:-1:-1;;;;;26440:16:0;;;26401:7;26440:16;;;:9;:16;;;;;;;26306:19;26299:26;26117:216;-1:-1:-1;;;26117:216:0:o;9205:229::-;9342:12;9374:52;9396:6;9404:4;9410:1;9413:12;9374:21;:52::i;:::-;9367:59;9205:229;-1:-1:-1;;;;9205:229:0:o;26612:388::-;-1:-1:-1;;;;;26816:16:0;;;26844:1;26816:16;;;:9;:16;;;;;;;:30;:65;;;;;26876:5;-1:-1:-1;;;;;26863:18:0;:9;-1:-1:-1;;;;;26863:18:0;;;26816:65;:105;;;;-1:-1:-1;;;;;;26898:23:0;;;;26816:105;26798:195;;;26948:33;26964:5;26971:9;26948:15;:33::i;10291:455::-;10461:12;10519:5;10494:21;:30;;10486:81;;;;-1:-1:-1;;;10486:81:0;;22722:2:1;10486:81:0;;;22704:21:1;22761:2;22741:18;;;22734:30;22800:34;22780:18;;;22773:62;-1:-1:-1;;;22851:18:1;;;22844:36;22897:19;;10486:81:0;22520:402:1;10486:81:0;10579:12;10593:23;10620:6;-1:-1:-1;;;;;10620:11:0;10639:5;10646:4;10620:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10578:73;;;;10669:69;10696:6;10704:7;10713:10;10725:12;10669:26;:69::i;:::-;10662:76;10291:455;-1:-1:-1;;;;;;;10291:455:0:o;12864:644::-;13049:12;13078:7;13074:427;;;13106:10;:17;13127:1;13106:22;13102:290;;-1:-1:-1;;;;;6745:19:0;;;13316:60;;;;-1:-1:-1;;;13316:60:0;;23676:2:1;13316:60:0;;;23658:21:1;23715:2;23695:18;;;23688:30;23754:31;23734:18;;;23727:59;23803:18;;13316:60:0;23474:353:1;13316:60:0;-1:-1:-1;13413:10:0;13406:17;;13074:427;13456:33;13464:10;13476:12;14211:17;;:21;14207:388;;14443:10;14437:17;14500:15;14487:10;14483:2;14479:19;14472:44;14207:388;14570:12;14563:20;;-1:-1:-1;;;14563:20:0;;;;;;;;:::i;203:173:1:-;271:20;;-1:-1:-1;;;;;320:31:1;;310:42;;300:70;;366:1;363;356:12;300:70;203:173;;;:::o;381:186::-;440:6;493:2;481:9;472:7;468:23;464:32;461:52;;;509:1;506;499:12;461:52;532:29;551:9;532:29;:::i;1422:328::-;1499:6;1507;1515;1568:2;1556:9;1547:7;1543:23;1539:32;1536:52;;;1584:1;1581;1574:12;1536:52;1607:29;1626:9;1607:29;:::i;:::-;1597:39;;1655:38;1689:2;1678:9;1674:18;1655:38;:::i;:::-;1645:48;;1740:2;1729:9;1725:18;1712:32;1702:42;;1422:328;;;;;:::o;1755:180::-;1814:6;1867:2;1855:9;1846:7;1842:23;1838:32;1835:52;;;1883:1;1880;1873:12;1835:52;-1:-1:-1;1906:23:1;;1755:180;-1:-1:-1;1755:180:1:o;2047:1030::-;2199:4;2241:3;2230:9;2226:19;2218:27;;-1:-1:-1;;;;;2344:2:1;2335:6;2329:13;2325:22;2314:9;2307:41;2416:2;2408:4;2400:6;2396:17;2390:24;2386:33;2379:4;2368:9;2364:20;2357:63;2488:2;2480:4;2472:6;2468:17;2462:24;2458:33;2451:4;2440:9;2436:20;2429:63;;2539:4;2531:6;2527:17;2521:24;-1:-1:-1;;;;;2638:2:1;2624:12;2620:21;2613:4;2602:9;2598:20;2591:51;2710:2;2702:4;2694:6;2690:17;2684:24;2680:33;2673:4;2662:9;2658:20;2651:63;;;2763:4;2755:6;2751:17;2745:24;2778:55;2827:4;2816:9;2812:20;2796:14;-1:-1:-1;;;;;2005:30:1;1993:43;;1940:102;2778:55;;2882:4;2874:6;2870:17;2864:24;2897:55;2946:4;2935:9;2931:20;2915:14;-1:-1:-1;;;;;2005:30:1;1993:43;;1940:102;2897:55;;3001:4;2993:6;2989:17;2983:24;3016:55;3065:4;3054:9;3050:20;3034:14;-1:-1:-1;;;;;2005:30:1;1993:43;;1940:102;3016:55;;2047:1030;;;;:::o;3082:254::-;3150:6;3158;3211:2;3199:9;3190:7;3186:23;3182:32;3179:52;;;3227:1;3224;3217:12;3179:52;3263:9;3250:23;3240:33;;3292:38;3326:2;3315:9;3311:18;3292:38;:::i;:::-;3282:48;;3082:254;;;;;:::o;3623:721::-;3753:6;3761;3769;3822:2;3810:9;3801:7;3797:23;3793:32;3790:52;;;3838:1;3835;3828:12;3790:52;3874:9;3861:23;3851:33;;3935:2;3924:9;3920:18;3907:32;-1:-1:-1;;;;;3999:2:1;3991:6;3988:14;3985:34;;;4015:1;4012;4005:12;3985:34;4053:6;4042:9;4038:22;4028:32;;4098:7;4091:4;4087:2;4083:13;4079:27;4069:55;;4120:1;4117;4110:12;4069:55;4160:2;4147:16;4186:2;4178:6;4175:14;4172:34;;;4202:1;4199;4192:12;4172:34;4258:7;4253:2;4245:4;4237:6;4233:17;4229:2;4225:26;4221:35;4218:48;4215:68;;;4279:1;4276;4269:12;4215:68;4310:2;4306;4302:11;4292:21;;4332:6;4322:16;;;;;3623:721;;;;;:::o;4349:260::-;4417:6;4425;4478:2;4466:9;4457:7;4453:23;4449:32;4446:52;;;4494:1;4491;4484:12;4446:52;4517:29;4536:9;4517:29;:::i;:::-;4507:39;;4565:38;4599:2;4588:9;4584:18;4565:38;:::i;5421:188::-;5489:20;;-1:-1:-1;;;;;5538:46:1;;5528:57;;5518:85;;5599:1;5596;5589:12;5614:118;5700:5;5693:13;5686:21;5679:5;5676:32;5666:60;;5722:1;5719;5712:12;5737:389;5811:6;5819;5827;5880:2;5868:9;5859:7;5855:23;5851:32;5848:52;;;5896:1;5893;5886:12;5848:52;5919:29;5938:9;5919:29;:::i;:::-;5909:39;;5967:38;6001:2;5990:9;5986:18;5967:38;:::i;:::-;5957:48;;6055:2;6044:9;6040:18;6027:32;6068:28;6090:5;6068:28;:::i;:::-;6115:5;6105:15;;;5737:389;;;;;:::o;6339:171::-;6406:20;;-1:-1:-1;;;;;6455:30:1;;6445:41;;6435:69;;6500:1;6497;6490:12;6515:620;6624:6;6632;6640;6648;6656;6664;6672;6725:3;6713:9;6704:7;6700:23;6696:33;6693:53;;;6742:1;6739;6732:12;6693:53;6778:9;6765:23;6755:33;;6807:38;6841:2;6830:9;6826:18;6807:38;:::i;:::-;6797:48;;6864:38;6898:2;6887:9;6883:18;6864:38;:::i;:::-;6854:48;;6921:37;6954:2;6943:9;6939:18;6921:37;:::i;:::-;6911:47;;6977:38;7010:3;6999:9;6995:19;6977:38;:::i;:::-;6967:48;;7034:38;7067:3;7056:9;7052:19;7034:38;:::i;:::-;7024:48;;7091:38;7124:3;7113:9;7109:19;7091:38;:::i;:::-;7081:48;;6515:620;;;;;;;;;;:::o;7140:551::-;7240:6;7248;7256;7264;7272;7280;7333:3;7321:9;7312:7;7308:23;7304:33;7301:53;;;7350:1;7347;7340:12;7301:53;7373:29;7392:9;7373:29;:::i;:::-;7363:39;;7421:38;7455:2;7444:9;7440:18;7421:38;:::i;:::-;7411:48;;7478:37;7511:2;7500:9;7496:18;7478:37;:::i;:::-;7468:47;;7534:37;7567:2;7556:9;7552:18;7534:37;:::i;:::-;7524:47;;7590:38;7623:3;7612:9;7608:19;7590:38;:::i;:::-;7580:48;;7647:38;7680:3;7669:9;7665:19;7647:38;:::i;:::-;7637:48;;7140:551;;;;;;;;:::o;7696:127::-;7757:10;7752:3;7748:20;7745:1;7738:31;7788:4;7785:1;7778:15;7812:4;7809:1;7802:15;7828:127;7889:10;7884:3;7880:20;7877:1;7870:31;7920:4;7917:1;7910:15;7944:4;7941:1;7934:15;7960:125;8025:9;;;8046:10;;;8043:36;;;8059:18;;:::i;8090:274::-;-1:-1:-1;;;;;8228:10:1;;;8240;;;8224:27;8271:20;;;;8162:34;8310:24;;;8300:58;;8338:18;;:::i;:::-;8300:58;;8090:274;;;;:::o;8369:217::-;8409:1;8435;8425:132;;8479:10;8474:3;8470:20;8467:1;8460:31;8514:4;8511:1;8504:15;8542:4;8539:1;8532:15;8425:132;-1:-1:-1;8571:9:1;;8369:217::o;8591:128::-;8658:9;;;8679:11;;;8676:37;;;8693:18;;:::i;8724:168::-;8797:9;;;8828;;8845:15;;;8839:22;;8825:37;8815:71;;8866:18;;:::i;8897:135::-;8936:3;8957:17;;;8954:43;;8977:18;;:::i;:::-;-1:-1:-1;9024:1:1;9013:13;;8897:135::o;9247:351::-;9449:2;9431:21;;;9488:2;9468:18;;;9461:30;9527:29;9522:2;9507:18;;9500:57;9589:2;9574:18;;9247:351::o;9603:200::-;-1:-1:-1;;;;;9739:10:1;;;9727;;;9723:27;;9762:12;;;9759:38;;;9777:18;;:::i;10165:184::-;10223:6;10276:2;10264:9;10255:7;10251:23;10247:32;10244:52;;;10292:1;10289;10282:12;10244:52;10315:28;10333:9;10315:28;:::i;10354:399::-;10556:2;10538:21;;;10595:2;10575:18;;;10568:30;10634:34;10629:2;10614:18;;10607:62;-1:-1:-1;;;10700:2:1;10685:18;;10678:33;10743:3;10728:19;;10354:399::o;10758:::-;10960:2;10942:21;;;10999:2;10979:18;;;10972:30;11038:34;11033:2;11018:18;;11011:62;-1:-1:-1;;;11104:2:1;11089:18;;11082:33;11147:3;11132:19;;10758:399::o;11162:186::-;11221:6;11274:2;11262:9;11253:7;11249:23;11245:32;11242:52;;;11290:1;11287;11280:12;11242:52;11313:29;11332:9;11313:29;:::i;11353:197::-;-1:-1:-1;;;;;11475:10:1;;;11487;;;11471:27;;11510:11;;;11507:37;;;11524:18;;:::i;11909:179::-;11987:13;;12040:22;12029:34;;12019:45;;12009:73;;12078:1;12075;12068:12;12093:473;12196:6;12204;12212;12220;12228;12281:3;12269:9;12260:7;12256:23;12252:33;12249:53;;;12298:1;12295;12288:12;12249:53;12321:39;12350:9;12321:39;:::i;:::-;12311:49;;12400:2;12389:9;12385:18;12379:25;12369:35;;12444:2;12433:9;12429:18;12423:25;12413:35;;12488:2;12477:9;12473:18;12467:25;12457:35;;12511:49;12555:3;12544:9;12540:19;12511:49;:::i;:::-;12501:59;;12093:473;;;;;;;;:::o;13335:422::-;13424:1;13467:5;13424:1;13481:270;13502:7;13492:8;13489:21;13481:270;;;13561:4;13557:1;13553:6;13549:17;13543:4;13540:27;13537:53;;;13570:18;;:::i;:::-;13620:7;13610:8;13606:22;13603:55;;;13640:16;;;;13603:55;13719:22;;;;13679:15;;;;13481:270;;;13485:3;13335:422;;;;;:::o;13762:806::-;13811:5;13841:8;13831:80;;-1:-1:-1;13882:1:1;13896:5;;13831:80;13930:4;13920:76;;-1:-1:-1;13967:1:1;13981:5;;13920:76;14012:4;14030:1;14025:59;;;;14098:1;14093:130;;;;14005:218;;14025:59;14055:1;14046:10;;14069:5;;;14093:130;14130:3;14120:8;14117:17;14114:43;;;14137:18;;:::i;:::-;-1:-1:-1;;14193:1:1;14179:16;;14208:5;;14005:218;;14307:2;14297:8;14294:16;14288:3;14282:4;14279:13;14275:36;14269:2;14259:8;14256:16;14251:2;14245:4;14242:12;14238:35;14235:77;14232:159;;;-1:-1:-1;14344:19:1;;;14376:5;;14232:159;14423:34;14448:8;14442:4;14423:34;:::i;:::-;14493:6;14489:1;14485:6;14481:19;14472:7;14469:32;14466:58;;;14504:18;;:::i;:::-;14542:20;;13762:806;-1:-1:-1;;;13762:806:1:o;14573:140::-;14631:5;14660:47;14701:4;14691:8;14687:19;14681:4;14660:47;:::i;15950:131::-;16010:5;16039:36;16066:8;16060:4;16039:36;:::i;16489:399::-;16691:2;16673:21;;;16730:2;16710:18;;;16703:30;16769:34;16764:2;16749:18;;16742:62;-1:-1:-1;;;16835:2:1;16820:18;;16813:33;16878:3;16863:19;;16489:399::o;20618:341::-;20820:2;20802:21;;;20859:2;20839:18;;;20832:30;-1:-1:-1;;;20893:2:1;20878:18;;20871:47;20950:2;20935:18;;20618:341::o;21317:180::-;-1:-1:-1;;;;;21422:10:1;;;21434;;;21418:27;;21457:11;;;21454:37;;;21471:18;;:::i;21859:245::-;21926:6;21979:2;21967:9;21958:7;21954:23;21950:32;21947:52;;;21995:1;21992;21985:12;21947:52;22027:9;22021:16;22046:28;22068:5;22046:28;:::i;22927:250::-;23012:1;23022:113;23036:6;23033:1;23030:13;23022:113;;;23112:11;;;23106:18;23093:11;;;23086:39;23058:2;23051:10;23022:113;;;-1:-1:-1;;23169:1:1;23151:16;;23144:27;22927:250::o;23182:287::-;23311:3;23349:6;23343:13;23365:66;23424:6;23419:3;23412:4;23404:6;23400:17;23365:66;:::i;:::-;23447:16;;;;;23182:287;-1:-1:-1;;23182:287:1:o;23832:396::-;23981:2;23970:9;23963:21;23944:4;24013:6;24007:13;24056:6;24051:2;24040:9;24036:18;24029:34;24072:79;24144:6;24139:2;24128:9;24124:18;24119:2;24111:6;24107:15;24072:79;:::i;:::-;24212:2;24191:15;-1:-1:-1;;24187:29:1;24172:45;;;;24219:2;24168:54;;23832:396;-1:-1:-1;;23832:396:1:o
Swarm Source
ipfs://156871a418c7227d1e7148ff54566aa8eea6ae2abb36a0d2b0aa0e783fe4af3c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.0019 | 1,499,828.4364 | $2,850.36 |
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.