Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Dailies
Compiler Version
v0.8.21+commit.d9974bed
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-09-12 */ // File: libs/SafeTransferLib.sol pragma solidity >=0.8.4; /// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SafeTransferLib.sol) /// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol) /// /// @dev Note: /// - For ETH transfers, please use `forceSafeTransferETH` for gas griefing protection. /// - For ERC20s, this implementation won't check that a token has code, /// responsibility is delegated to the caller. library SafeTransferLib { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The ETH transfer has failed. error ETHTransferFailed(); /// @dev The ERC20 `transferFrom` has failed. error TransferFromFailed(); /// @dev The ERC20 `transfer` has failed. error TransferFailed(); /// @dev The ERC20 `approve` has failed. error ApproveFailed(); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CONSTANTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Suggested gas stipend for contract receiving ETH /// that disallows any storage writes. uint256 internal constant _GAS_STIPEND_NO_STORAGE_WRITES = 2300; /// @dev Suggested gas stipend for contract receiving ETH to perform a few /// storage reads and writes, but low enough to prevent griefing. /// Multiply by a small constant (e.g. 2), if needed. uint256 internal constant _GAS_STIPEND_NO_GRIEF = 100000; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* ETH OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Sends `amount` (in wei) ETH to `to`. /// Reverts upon failure. /// /// Note: This implementation does NOT protect against gas griefing. /// Please use `forceSafeTransferETH` for gas griefing protection. function safeTransferETH(address to, uint256 amount) internal { /// @solidity memory-safe-assembly assembly { // Transfer the ETH and check if it succeeded or not. if iszero(call(gas(), to, amount, 0, 0, 0, 0)) { // Store the function selector of `ETHTransferFailed()`. mstore(0x00, 0xb12d13eb) // Revert with (offset, size). revert(0x1c, 0x04) } } } /// @dev Force sends `amount` (in wei) ETH to `to`, with a `gasStipend`. /// The `gasStipend` can be set to a low enough value to prevent /// storage writes or gas griefing. /// /// If sending via the normal procedure fails, force sends the ETH by /// creating a temporary contract which uses `SELFDESTRUCT` to force send the ETH. /// /// Reverts if the current contract has insufficient balance. function forceSafeTransferETH(address to, uint256 amount, uint256 gasStipend) internal { /// @solidity memory-safe-assembly assembly { // If insufficient balance, revert. if lt(selfbalance(), amount) { // Store the function selector of `ETHTransferFailed()`. mstore(0x00, 0xb12d13eb) // Revert with (offset, size). revert(0x1c, 0x04) } // Transfer the ETH and check if it succeeded or not. if iszero(call(gasStipend, to, amount, 0, 0, 0, 0)) { mstore(0x00, to) // Store the address in scratch space. mstore8(0x0b, 0x73) // Opcode `PUSH20`. mstore8(0x20, 0xff) // Opcode `SELFDESTRUCT`. // We can directly use `SELFDESTRUCT` in the contract creation. // Compatible with `SENDALL`: https://eips.ethereum.org/EIPS/eip-4758 if iszero(create(amount, 0x0b, 0x16)) { // To coerce gas estimation to provide enough gas for the `create` above. if iszero(gt(gas(), 1000000)) { revert(0, 0) } } } } } /// @dev Force sends `amount` (in wei) ETH to `to`, with a gas stipend /// equal to `_GAS_STIPEND_NO_GRIEF`. This gas stipend is a reasonable default /// for 99% of cases and can be overridden with the three-argument version of this /// function if necessary. /// /// If sending via the normal procedure fails, force sends the ETH by /// creating a temporary contract which uses `SELFDESTRUCT` to force send the ETH. /// /// Reverts if the current contract has insufficient balance. function forceSafeTransferETH(address to, uint256 amount) internal { // Manually inlined because the compiler doesn't inline functions with branches. /// @solidity memory-safe-assembly assembly { // If insufficient balance, revert. if lt(selfbalance(), amount) { // Store the function selector of `ETHTransferFailed()`. mstore(0x00, 0xb12d13eb) // Revert with (offset, size). revert(0x1c, 0x04) } // Transfer the ETH and check if it succeeded or not. if iszero(call(_GAS_STIPEND_NO_GRIEF, to, amount, 0, 0, 0, 0)) { mstore(0x00, to) // Store the address in scratch space. mstore8(0x0b, 0x73) // Opcode `PUSH20`. mstore8(0x20, 0xff) // Opcode `SELFDESTRUCT`. // We can directly use `SELFDESTRUCT` in the contract creation. // Compatible with `SENDALL`: https://eips.ethereum.org/EIPS/eip-4758 if iszero(create(amount, 0x0b, 0x16)) { // To coerce gas estimation to provide enough gas for the `create` above. if iszero(gt(gas(), 1000000)) { revert(0, 0) } } } } } /// @dev Sends `amount` (in wei) ETH to `to`, with a `gasStipend`. /// The `gasStipend` can be set to a low enough value to prevent /// storage writes or gas griefing. /// /// Simply use `gasleft()` for `gasStipend` if you don't need a gas stipend. /// /// Note: Does NOT revert upon failure. /// Returns whether the transfer of ETH is successful instead. function trySafeTransferETH(address to, uint256 amount, uint256 gasStipend) internal returns (bool success) { /// @solidity memory-safe-assembly assembly { // Transfer the ETH and check if it succeeded or not. success := call(gasStipend, to, amount, 0, 0, 0, 0) } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* ERC20 OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Sends `amount` of ERC20 `token` from `from` to `to`. /// Reverts upon failure. /// /// The `from` account must have at least `amount` approved for /// the current contract to manage. function safeTransferFrom(address token, address from, address to, uint256 amount) internal { /// @solidity memory-safe-assembly assembly { let m := mload(0x40) // Cache the free memory pointer. mstore(0x60, amount) // Store the `amount` argument. mstore(0x40, to) // Store the `to` argument. mstore(0x2c, shl(96, from)) // Store the `from` argument. // Store the function selector of `transferFrom(address,address,uint256)`. mstore(0x0c, 0x23b872dd000000000000000000000000) if iszero( and( // The arguments of `and` are evaluated from right to left. // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20) ) ) { // Store the function selector of `TransferFromFailed()`. mstore(0x00, 0x7939f424) // Revert with (offset, size). revert(0x1c, 0x04) } mstore(0x60, 0) // Restore the zero slot to zero. mstore(0x40, m) // Restore the free memory pointer. } } /// @dev Sends all of ERC20 `token` from `from` to `to`. /// Reverts upon failure. /// /// The `from` account must have their entire balance approved for /// the current contract to manage. function safeTransferAllFrom(address token, address from, address to) internal returns (uint256 amount) { /// @solidity memory-safe-assembly assembly { let m := mload(0x40) // Cache the free memory pointer. mstore(0x40, to) // Store the `to` argument. mstore(0x2c, shl(96, from)) // Store the `from` argument. // Store the function selector of `balanceOf(address)`. mstore(0x0c, 0x70a08231000000000000000000000000) if iszero( and( // The arguments of `and` are evaluated from right to left. gt(returndatasize(), 0x1f), // At least 32 bytes returned. staticcall(gas(), token, 0x1c, 0x24, 0x60, 0x20) ) ) { // Store the function selector of `TransferFromFailed()`. mstore(0x00, 0x7939f424) // Revert with (offset, size). revert(0x1c, 0x04) } // Store the function selector of `transferFrom(address,address,uint256)`. mstore(0x00, 0x23b872dd) // The `amount` argument is already written to the memory word at 0x60. amount := mload(0x60) if iszero( and( // The arguments of `and` are evaluated from right to left. // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20) ) ) { // Store the function selector of `TransferFromFailed()`. mstore(0x00, 0x7939f424) // Revert with (offset, size). revert(0x1c, 0x04) } mstore(0x60, 0) // Restore the zero slot to zero. mstore(0x40, m) // Restore the free memory pointer. } } /// @dev Sends `amount` of ERC20 `token` from the current contract to `to`. /// Reverts upon failure. function safeTransfer(address token, address to, uint256 amount) internal { /// @solidity memory-safe-assembly assembly { mstore(0x14, to) // Store the `to` argument. mstore(0x34, amount) // Store the `amount` argument. // Store the function selector of `transfer(address,uint256)`. mstore(0x00, 0xa9059cbb000000000000000000000000) if iszero( and( // The arguments of `and` are evaluated from right to left. // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20) ) ) { // Store the function selector of `TransferFailed()`. mstore(0x00, 0x90b8ec18) // Revert with (offset, size). revert(0x1c, 0x04) } // Restore the part of the free memory pointer that was overwritten. mstore(0x34, 0) } } /// @dev Sends all of ERC20 `token` from the current contract to `to`. /// Reverts upon failure. function safeTransferAll(address token, address to) internal returns (uint256 amount) { /// @solidity memory-safe-assembly assembly { mstore(0x00, 0x70a08231) // Store the function selector of `balanceOf(address)`. mstore(0x20, address()) // Store the address of the current contract. if iszero( and( // The arguments of `and` are evaluated from right to left. gt(returndatasize(), 0x1f), // At least 32 bytes returned. staticcall(gas(), token, 0x1c, 0x24, 0x34, 0x20) ) ) { // Store the function selector of `TransferFailed()`. mstore(0x00, 0x90b8ec18) // Revert with (offset, size). revert(0x1c, 0x04) } mstore(0x14, to) // Store the `to` argument. // The `amount` argument is already written to the memory word at 0x34. amount := mload(0x34) // Store the function selector of `transfer(address,uint256)`. mstore(0x00, 0xa9059cbb000000000000000000000000) if iszero( and( // The arguments of `and` are evaluated from right to left. // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20) ) ) { // Store the function selector of `TransferFailed()`. mstore(0x00, 0x90b8ec18) // Revert with (offset, size). revert(0x1c, 0x04) } // Restore the part of the free memory pointer that was overwritten. mstore(0x34, 0) } } /// @dev Sets `amount` of ERC20 `token` for `to` to manage on behalf of the current contract. /// Reverts upon failure. function safeApprove(address token, address to, uint256 amount) internal { /// @solidity memory-safe-assembly assembly { mstore(0x14, to) // Store the `to` argument. mstore(0x34, amount) // Store the `amount` argument. // Store the function selector of `approve(address,uint256)`. mstore(0x00, 0x095ea7b3000000000000000000000000) if iszero( and( // The arguments of `and` are evaluated from right to left. // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20) ) ) { // Store the function selector of `ApproveFailed()`. mstore(0x00, 0x3e3f8f73) // Revert with (offset, size). revert(0x1c, 0x04) } // Restore the part of the free memory pointer that was overwritten. mstore(0x34, 0) } } /// @dev Returns the amount of ERC20 `token` owned by `account`. /// Returns zero if the `token` does not exist. function balanceOf(address token, address account) internal view returns (uint256 amount) { /// @solidity memory-safe-assembly assembly { mstore(0x14, account) // Store the `account` argument. // Store the function selector of `balanceOf(address)`. mstore(0x00, 0x70a08231000000000000000000000000) amount := mul( mload(0x20), and( // The arguments of `and` are evaluated from right to left. gt(returndatasize(), 0x1f), // At least 32 bytes returned. staticcall(gas(), token, 0x10, 0x24, 0x20, 0x20) ) ) } } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * 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); } } } // File: @openzeppelin/contracts/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized != type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. 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); } } // File: Dailies.sol pragma solidity ^0.8.21; contract Dailies is Ownable, Initializable { uint256 private constant BPS = 10_000; uint256 private constant BID_INCREASE_THRESHOLD = 0.2 ether; uint256 private constant DEFAULT_SPLIT = 7_000; uint256 private constant EXTENSION_TIME = 10 minutes; uint256 private constant INIT_AUCTION_DURATION = 24 hours; uint256 private constant MIN_BID = 0.01 ether; uint256 private constant MIN_BID_INCREASE_PRE = 2_000; uint256 private constant MIN_BID_INCREASE_POST = 1_000; uint256 private constant MINT_PASS_REBATE = 1_500; uint256 private constant SAFE_GAS_LIMIT = 30_000; address public beneficiary; bool public paused; struct Auction { uint24 offsetFromEnd; uint72 amount; address bidder; } struct AuctionConfig { address artist; uint16 split; uint80 startTime; } mapping(uint256 => AuctionConfig) public auctionConfig; mapping(uint256 => Auction) public auctionIdToAuction; event BidMade( uint256 indexed auctionId, address indexed collectionAddress, uint256 indexed tokenId, address bidder, uint256 amount, uint256 timestamp ); event Settled( uint256 indexed auctionId, address indexed collectionAddress, uint256 indexed tokenId, uint256 timestamp ); function init(address fellowship) external initializer { _transferOwnership(fellowship); beneficiary = fellowship; } function bid( uint256 auctionId ) external payable { require(!paused, 'Bidding is paused'); require(isAuctionActive(auctionId), 'Auction Inactive'); Auction memory highestBid = auctionIdToAuction[auctionId]; uint256 bidIncrease = highestBid.amount >= BID_INCREASE_THRESHOLD ? MIN_BID_INCREASE_POST : MIN_BID_INCREASE_PRE; require( msg.value >= (highestBid.amount * (BPS + bidIncrease) / BPS) && msg.value >= MIN_BID, 'Bid not high enough' ); uint256 refundAmount; address refundBidder; uint256 offset = highestBid.offsetFromEnd; uint256 endTime = auctionEndTime(auctionId); if (highestBid.amount > 0) { refundAmount = highestBid.amount; refundBidder = highestBid.bidder; } if (endTime - block.timestamp < EXTENSION_TIME) { offset += block.timestamp + EXTENSION_TIME - endTime; } auctionIdToAuction[auctionId] = Auction(uint24(offset), uint72(msg.value), msg.sender); emit BidMade( auctionId, getCollectionFromId(auctionId), getArtTokenIdFromId(auctionId), msg.sender, msg.value, block.timestamp ); if (refundAmount > 0) { SafeTransferLib.forceSafeTransferETH(refundBidder, refundAmount, SAFE_GAS_LIMIT); } } function bidOnFavs( uint256[] calldata favorites, uint256[] calldata expectedPrices ) external payable { require(!paused, 'Bidding is paused'); require(favorites.length == expectedPrices.length); uint256 totalFailed; uint256 expectedTotal; for(uint256 i; i < favorites.length; ++i) { uint256 auctionId = favorites[i]; uint256 expectedPrice = expectedPrices[i]; expectedTotal += expectedPrice; if(!isAuctionActive(auctionId)) { totalFailed += expectedPrice; continue; } Auction memory highestBid = auctionIdToAuction[auctionId]; uint256 bidIncrease = highestBid.amount >= BID_INCREASE_THRESHOLD ? MIN_BID_INCREASE_POST : MIN_BID_INCREASE_PRE; if ( expectedPrice >= (highestBid.amount * (BPS + bidIncrease) / BPS) && expectedPrice >= MIN_BID ) { uint256 refundAmount; address refundBidder; uint256 offset = highestBid.offsetFromEnd; uint256 endTime = auctionEndTime(auctionId); if (highestBid.amount > 0) { refundAmount = highestBid.amount; refundBidder = highestBid.bidder; } if (endTime - block.timestamp < EXTENSION_TIME) { offset += block.timestamp + EXTENSION_TIME - endTime; } auctionIdToAuction[auctionId] = Auction(uint24(offset), uint72(expectedPrice), msg.sender); emit BidMade( auctionId, getCollectionFromId(auctionId), getArtTokenIdFromId(auctionId), msg.sender, expectedPrice, block.timestamp ); if (refundAmount > 0) { SafeTransferLib.forceSafeTransferETH(refundBidder, refundAmount, SAFE_GAS_LIMIT); } } else{ totalFailed += expectedPrice; } } require(msg.value == expectedTotal, 'Incorrect amount of ETH sent'); if (totalFailed > 0) { SafeTransferLib.forceSafeTransferETH(msg.sender, totalFailed, SAFE_GAS_LIMIT); } } function settleAuction( uint256 auctionId ) external payable { Auction memory highestBid = auctionIdToAuction[auctionId]; require(isAuctionOver(auctionId), 'Auction is still active'); uint256 amountToPay = highestBid.amount; if (amountToPay > 0) { _mint(highestBid.bidder, auctionId); } else { require(msg.value == MIN_BID, 'Incorrect funds sent for unclaimed'); amountToPay = msg.value; _mint(owner(), auctionId); } emit Settled( auctionId, getCollectionFromId(auctionId), getArtTokenIdFromId(auctionId), block.timestamp ); AuctionConfig memory config = auctionConfig[auctionId]; uint256 split = config.split; if (split == 0) { split = DEFAULT_SPLIT; } uint256 amountForArtist = amountToPay * split / 10_000; SafeTransferLib.forceSafeTransferETH(config.artist, amountForArtist, SAFE_GAS_LIMIT); SafeTransferLib.forceSafeTransferETH(beneficiary, amountToPay - amountForArtist, SAFE_GAS_LIMIT); } function settleMultipleAuctions( uint256[] calldata auctionIds ) external payable { uint256 unclaimedCost; uint256 amountForBene; for (uint256 i; i < auctionIds.length; ++i) { uint256 auctionId = auctionIds[i]; Auction memory highestBid = auctionIdToAuction[auctionId]; require(isAuctionOver(auctionId), 'Auction is still active'); uint256 amountToPay = highestBid.amount; if (amountToPay > 0) { _mint(highestBid.bidder, auctionId); } else { amountToPay = MIN_BID; unclaimedCost += MIN_BID; _mint(owner(), auctionId); } emit Settled( auctionId, getCollectionFromId(auctionId), getArtTokenIdFromId(auctionId), block.timestamp ); AuctionConfig memory config = auctionConfig[auctionId]; uint256 split = config.split; if (split == 0) { split = DEFAULT_SPLIT; } uint256 amountForArtist = amountToPay * split / 10_000; SafeTransferLib.forceSafeTransferETH(config.artist, amountForArtist, SAFE_GAS_LIMIT); amountForBene += amountToPay - amountForArtist; } require(msg.value == unclaimedCost, 'Incorrect funds sent for unclaimed'); SafeTransferLib.forceSafeTransferETH(beneficiary, amountForBene, SAFE_GAS_LIMIT); } function _mint( address to, uint256 auctionId ) internal { address collection = getCollectionFromId(auctionId); uint256 tokenId = getArtTokenIdFromId(auctionId); try INFT(collection).ownerOf(tokenId) returns (address _owner) { if (_owner == address(0)) { INFT(collection).mint(to, tokenId); } else { INFT(collection).transferFrom(_owner, to, tokenId); } } catch { INFT(collection).mint(to, tokenId); } } function _changeSplit( address collectionAddress, uint256 tokenId, address artist, uint256 newSplit ) internal { uint256 auctionId = artTokentoAuctionId(collectionAddress, tokenId); if (artist != address(0)) { auctionConfig[auctionId].artist = artist; } auctionConfig[auctionId].split = uint16(newSplit); } function _rescheduele( address collectionAddress, uint256 tokenId, uint256 newStartTime ) internal { uint256 auctionId = artTokentoAuctionId(collectionAddress, tokenId); require(auctionConfig[auctionId].startTime > block.timestamp); auctionConfig[auctionId].startTime = uint80(newStartTime); } function _scheduele( address collectionAddress, uint256 tokenId, uint256 startTime, address artist, uint256 split ) internal { uint256 auctionId = artTokentoAuctionId(collectionAddress, tokenId); require(auctionConfig[auctionId].startTime == 0); auctionConfig[auctionId] = AuctionConfig(artist, uint16(split), uint80(startTime)); } function changeSplit( address collectionAddress, uint256 tokenId, address artist, uint256 split ) external onlyOwner { _changeSplit(collectionAddress, tokenId, artist, split); } function changeSplitMultiple( address[] calldata collections, uint256[] calldata tokenIds, address[] calldata artists, uint256[] calldata splits ) external onlyOwner { require( collections.length == tokenIds.length && tokenIds.length == artists.length && artists.length == splits.length, 'Array length mismatch' ); for(uint256 i; i < collections.length; ++i) { _changeSplit(collections[i], tokenIds[i], artists[i], splits[i]); } } function rescheduele( address collectionAddress, uint256 tokenId, uint256 newStartTime ) external onlyOwner { _rescheduele(collectionAddress, tokenId, newStartTime); } function reschedueleMultiple( address[] calldata collections, uint256[] calldata tokenIds, uint256[] calldata newStartTimes ) external onlyOwner { require( collections.length == tokenIds.length && tokenIds.length == newStartTimes.length, 'Array length mismatch' ); for(uint256 i; i < collections.length; ++i) { _rescheduele(collections[i], tokenIds[i], newStartTimes[i]); } } function scheduele( address collectionAddress, uint256 tokenId, uint256 startTime, address artist, uint256 split ) external onlyOwner { _scheduele(collectionAddress, tokenId, startTime, artist, split); } function schedueleMultiple( address[] calldata collections, uint256[] calldata tokenIds, uint256[] calldata startTimes, address[] calldata artists, uint256[] calldata splits ) external onlyOwner { require( collections.length == tokenIds.length && tokenIds.length == startTimes.length, 'Array length mismatch' ); for(uint256 i; i < collections.length; ++i) { _scheduele(collections[i], tokenIds[i], startTimes[i], artists[i], splits[i]); } } function setBeneficiary( address _beneficiary ) external onlyOwner { beneficiary = _beneficiary; } function setPaused( bool _paused ) external onlyOwner { paused = _paused; } function artTokentoAuctionId( address collection, uint256 tokenId ) public pure returns (uint256) { return (uint256(uint160(collection)) << 96) | uint96(tokenId); } function auctionEndTime( uint256 auctionId ) public view returns (uint256) { return auctionConfig[auctionId].startTime + INIT_AUCTION_DURATION + auctionIdToAuction[auctionId].offsetFromEnd; } function auctionStartTime( uint256 auctionId ) external view returns (uint256) { return auctionConfig[auctionId].startTime; } function isAuctionActive( uint256 auctionId ) public view returns (bool) { uint256 startTime = auctionConfig[auctionId].startTime; uint256 endTime = auctionEndTime(auctionId); return (startTime > 0 && block.timestamp >= startTime && block.timestamp < endTime); } function isAuctionOver( uint256 auctionId ) public view returns (bool) { uint256 startTime = auctionConfig[auctionId].startTime; uint256 endTime = auctionEndTime(auctionId); return (startTime > 0 && block.timestamp >= endTime); } function getCollectionFromId( uint256 id ) public pure returns (address) { return address(uint160(id >> 96)); } function getArtTokenIdFromId( uint256 id ) public pure returns (uint256) { return uint256(uint96(id)); } } interface INFT { function mint(address to, uint256 tokenId) external; function ownerOf(uint256 tokenId) external view returns (address); function transferFrom(address from, address to, uint256 tokenId) external; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"collectionAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"bidder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"BidMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"collectionAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Settled","type":"event"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"artTokentoAuctionId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"auctionConfig","outputs":[{"internalType":"address","name":"artist","type":"address"},{"internalType":"uint16","name":"split","type":"uint16"},{"internalType":"uint80","name":"startTime","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"auctionEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"auctionIdToAuction","outputs":[{"internalType":"uint24","name":"offsetFromEnd","type":"uint24"},{"internalType":"uint72","name":"amount","type":"uint72"},{"internalType":"address","name":"bidder","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"auctionStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"bid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"favorites","type":"uint256[]"},{"internalType":"uint256[]","name":"expectedPrices","type":"uint256[]"}],"name":"bidOnFavs","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"artist","type":"address"},{"internalType":"uint256","name":"split","type":"uint256"}],"name":"changeSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"address[]","name":"artists","type":"address[]"},{"internalType":"uint256[]","name":"splits","type":"uint256[]"}],"name":"changeSplitMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getArtTokenIdFromId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getCollectionFromId","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"fellowship","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"isAuctionActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"isAuctionOver","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"newStartTime","type":"uint256"}],"name":"rescheduele","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"newStartTimes","type":"uint256[]"}],"name":"reschedueleMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"address","name":"artist","type":"address"},{"internalType":"uint256","name":"split","type":"uint256"}],"name":"scheduele","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"startTimes","type":"uint256[]"},{"internalType":"address[]","name":"artists","type":"address[]"},{"internalType":"uint256[]","name":"splits","type":"uint256[]"}],"name":"schedueleMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"settleAuction","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"auctionIds","type":"uint256[]"}],"name":"settleMultipleAuctions","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561000f575f80fd5b506100193361001e565b61006d565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6120da8061007a5f395ff3fe608060405260043610610195575f3560e01c8063454a2ab3116100e75780638da5cb5b11610087578063a08546c611610062578063a08546c614610550578063a9c0deaf1461056f578063e71f7b151461058e578063f2fde38b146105ad575f80fd5b80638da5cb5b146104f55780638fd3c3671461051157806395657db014610530575f80fd5b8063715018a6116100c2578063715018a61461047d578063777de704146104915780638624e7df146104b05780638c77cc09146104cf575f80fd5b8063454a2ab31461042b5780635c975abb1461043e5780637100dd871461045e575f80fd5b80631ae03271116101525780632e9936111161012d5780632e9936111461037957806333465c5f1461038c578063339a2e90146103d557806338af3eed146103f4575f80fd5b80631ae032711461030c5780631c31f7101461032b5780632c104a921461034a575f80fd5b8063025483761461019957806302ffbaba146102235780631033a663146102385780631107a8fc1461024b57806316c38b3c146102ce57806319ab453c146102ed575b5f80fd5b3480156101a4575f80fd5b506101ec6101b3366004611aff565b60036020525f908152604090205462ffffff811690630100000081046001600160481b031690600160601b90046001600160a01b031683565b6040805162ffffff90941684526001600160481b0390921660208401526001600160a01b0316908201526060015b60405180910390f35b610236610231366004611b5e565b6105cc565b005b610236610246366004611b9d565b610837565b348015610256575f80fd5b5061029d610265366004611aff565b60026020525f90815260409020546001600160a01b03811690600160a01b810461ffff1690600160b01b90046001600160501b031683565b604080516001600160a01b03909416845261ffff90921660208401526001600160501b03169082015260600161021a565b3480156102d9575f80fd5b506102366102e8366004611c04565b610bc8565b3480156102f8575f80fd5b50610236610307366004611c3e565b610bee565b348015610317575f80fd5b50610236610326366004611c59565b610d31565b348015610336575f80fd5b50610236610345366004611c3e565b610e1b565b348015610355575f80fd5b50610369610364366004611aff565b610e45565b604051901515815260200161021a565b610236610387366004611aff565b610e86565b348015610397575f80fd5b506103c76103a6366004611aff565b5f90815260026020526040902054600160b01b90046001600160501b031690565b60405190815260200161021a565b3480156103e0575f80fd5b506102366103ef366004611d14565b611088565b3480156103ff575f80fd5b50600154610413906001600160a01b031681565b6040516001600160a01b03909116815260200161021a565b610236610439366004611aff565b6110a4565b348015610449575f80fd5b5060015461036990600160a01b900460ff1681565b348015610469575f80fd5b506103c7610478366004611d62565b6113af565b348015610488575f80fd5b506102366113d0565b34801561049c575f80fd5b506103c76104ab366004611aff565b6113e3565b3480156104bb575f80fd5b506102366104ca366004611d8c565b61142c565b3480156104da575f80fd5b506103c76104e9366004611aff565b6001600160601b031690565b348015610500575f80fd5b505f546001600160a01b0316610413565b34801561051c575f80fd5b5061023661052b366004611dd1565b611440565b34801561053b575f80fd5b5061041361054a366004611aff565b60601c90565b34801561055b575f80fd5b5061023661056a366004611e64565b6114ed565b34801561057a575f80fd5b50610236610589366004611f4a565b6115e7565b348015610599575f80fd5b506103696105a8366004611aff565b6115ff565b3480156105b8575f80fd5b506102366105c7366004611c3e565b611648565b5f805f5b838110156107f8575f8585838181106105eb576105eb611f7c565b602090810292909201355f818152600384526040908190208151606081018352905462ffffff81168252630100000081046001600160481b031695820195909552600160601b9094046001600160a01b031690840152925061064e905082610e45565b6106995760405162461bcd60e51b815260206004820152601760248201527641756374696f6e206973207374696c6c2061637469766560481b60448201526064015b60405180910390fd5b60208101516001600160481b031680156106c0576106bb8260400151846116c1565b6106ef565b50662386f26fc100006106d38187611fa4565b95506106ef6106e95f546001600160a01b031690565b846116c1565b6001600160601b0383166107038460601c90565b6001600160a01b0316847f7f5920f48fa11434ef5ffb7b29c2915859ad72e6f9987cfafb6e204e22ca3a414260405161073e91815260200190565b60405180910390a45f838152600260209081526040808320815160608101835290546001600160a01b0381168252600160a01b810461ffff16938201849052600160b01b90046001600160501b031691810191909152918190036107a15750611b585b5f6127106107af8386611fb7565b6107b99190611fce565b90506107cb835f015182617530611874565b6107d58185611fed565b6107df9089611fa4565b9750505050505050806107f190612000565b90506105d0565b508134146108185760405162461bcd60e51b815260040161069090612018565b600154610831906001600160a01b031682617530611874565b50505050565b600154600160a01b900460ff16156108855760405162461bcd60e51b8152602060048201526011602482015270109a59191a5b99c81a5cc81c185d5cd959607a1b6044820152606401610690565b828114610890575f80fd5b5f805f5b85811015610b5d575f8787838181106108af576108af611f7c565b9050602002013590505f8686848181106108cb576108cb611f7c565b90506020020135905080846108e09190611fa4565b93506108eb826115ff565b610902576108f98186611fa4565b94505050610b4d565b5f8281526003602090815260408083208151606081018352905462ffffff81168252630100000081046001600160481b0316938201849052600160601b90046001600160a01b03169181019190915291906702c68af0bb140000111561096a576107d061096e565b6103e85b905061271061097d8282611fa4565b83602001516001600160481b03166109959190611fb7565b61099f9190611fce565b83101580156109b55750662386f26fc100008310155b15610b3b5781515f90819062ffffff16816109cf886113e3565b60208701519091506001600160481b0316156109fd5785602001516001600160481b03169350856040015192505b610258610a0a4283611fed565b1015610a345780610a1d61025842611fa4565b610a279190611fed565b610a319083611fa4565b91505b6040805160608101825262ffffff80851682526001600160481b03808b166020808501918252338587019081525f8f8152600390925295902093518454915195516001600160a01b0316600160601b026001600160601b03969093166301000000026001600160601b03199092169316929092179190911792909216919091179055610ac6886001600160601b031690565b610ad08960601c90565b60408051338152602081018b9052428183015290516001600160a01b0392909216918b917fe55fea5e734015d5114a28644bd784f4484c9d4fa2d29dee5aff56034294e21b919081900360600190a48315610b3257610b328385617530611874565b50505050610b48565b610b458388611fa4565b96505b505050505b610b5681612000565b9050610894565b50803414610bad5760405162461bcd60e51b815260206004820152601c60248201527f496e636f727265637420616d6f756e74206f66204554482073656e74000000006044820152606401610690565b8115610bc057610bc03383617530611874565b505050505050565b610bd06118ba565b60018054911515600160a01b0260ff60a01b19909216919091179055565b5f54600160a81b900460ff1615808015610c1457505f546001600160a01b90910460ff16105b80610c345750303b158015610c3457505f54600160a01b900460ff166001145b610c975760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610690565b5f805460ff60a01b1916600160a01b1790558015610cc2575f805460ff60a81b1916600160a81b1790555b610ccb82611913565b600180546001600160a01b0319166001600160a01b0384161790558015610d2d575f805460ff60a81b19169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b610d396118ba565b8685148015610d4757508483145b8015610d5257508281145b610d6e5760405162461bcd60e51b81526004016106909061205a565b5f5b87811015610e1057610e00898983818110610d8d57610d8d611f7c565b9050602002016020810190610da29190611c3e565b888884818110610db457610db4611f7c565b90506020020135878785818110610dcd57610dcd611f7c565b9050602002016020810190610de29190611c3e565b868686818110610df457610df4611f7c565b90506020020135611962565b610e0981612000565b9050610d70565b505050505050505050565b610e236118ba565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b5f81815260026020526040812054600160b01b90046001600160501b031681610e6d846113e3565b90505f82118015610e7e5750804210155b949350505050565b5f818152600360209081526040918290208251606081018452905462ffffff81168252630100000081046001600160481b031692820192909252600160601b9091046001600160a01b031691810191909152610ee182610e45565b610f275760405162461bcd60e51b815260206004820152601760248201527641756374696f6e206973207374696c6c2061637469766560481b6044820152606401610690565b60208101516001600160481b03168015610f4e57610f498260400151846116c1565b610f8a565b662386f26fc100003414610f745760405162461bcd60e51b815260040161069090612018565b5034610f8a6106e95f546001600160a01b031690565b6001600160601b038316610f9e8460601c90565b6001600160a01b0316847f7f5920f48fa11434ef5ffb7b29c2915859ad72e6f9987cfafb6e204e22ca3a4142604051610fd991815260200190565b60405180910390a45f838152600260209081526040808320815160608101835290546001600160a01b0381168252600160a01b810461ffff16938201849052600160b01b90046001600160501b0316918101919091529181900361103c5750611b585b5f61271061104a8386611fb7565b6110549190611fce565b9050611066835f015182617530611874565b600154610bc0906001600160a01b03166110808387611fed565b617530611874565b6110906118ba565b61109d85858585856119d5565b5050505050565b600154600160a01b900460ff16156110f25760405162461bcd60e51b8152602060048201526011602482015270109a59191a5b99c81a5cc81c185d5cd959607a1b6044820152606401610690565b6110fb816115ff565b61113a5760405162461bcd60e51b815260206004820152601060248201526f41756374696f6e20496e61637469766560801b6044820152606401610690565b5f8181526003602090815260408083208151606081018352905462ffffff81168252630100000081046001600160481b0316938201849052600160601b90046001600160a01b03169181019190915291906702c68af0bb14000011156111a2576107d06111a6565b6103e85b90506127106111b58282611fa4565b83602001516001600160481b03166111cd9190611fb7565b6111d79190611fce565b34101580156111ed5750662386f26fc100003410155b61122f5760405162461bcd60e51b8152602060048201526013602482015272084d2c840dcdee840d0d2ced040cadcdeeaced606b1b6044820152606401610690565b81515f90819062ffffff1681611244876113e3565b60208701519091506001600160481b0316156112725785602001516001600160481b03169350856040015192505b61025861127f4283611fed565b10156112a9578061129261025842611fa4565b61129c9190611fed565b6112a69083611fa4565b91505b6040805160608101825262ffffff80851682526001600160481b033481166020808501918252338587019081525f8e8152600390925295902093518454915195516001600160a01b0316600160601b026001600160601b03969093166301000000026001600160601b0319909216931692909217919091179290921691909117905561133b876001600160601b031690565b6113458860601c90565b60408051338152346020820152428183015290516001600160a01b0392909216918a917fe55fea5e734015d5114a28644bd784f4484c9d4fa2d29dee5aff56034294e21b919081900360600190a483156113a6576113a68385617530611874565b50505050505050565b6001600160601b0319606083901b166001600160601b038216175b92915050565b6113d86118ba565b6113e15f611913565b565b5f81815260036020908152604080832054600290925282205462ffffff90911690611422906201518090600160b01b90046001600160501b0316611fa4565b6113ca9190611fa4565b6114346118ba565b61083184848484611962565b6114486118ba565b848314801561145657508281145b6114725760405162461bcd60e51b81526004016106909061205a565b5f5b858110156113a6576114dd87878381811061149157611491611f7c565b90506020020160208101906114a69190611c3e565b8686848181106114b8576114b8611f7c565b905060200201358585858181106114d1576114d1611f7c565b90506020020135611a93565b6114e681612000565b9050611474565b6114f56118ba565b888714801561150357508685145b61151f5760405162461bcd60e51b81526004016106909061205a565b5f5b898110156115da576115ca8b8b8381811061153e5761153e611f7c565b90506020020160208101906115539190611c3e565b8a8a8481811061156557611565611f7c565b9050602002013589898581811061157e5761157e611f7c565b9050602002013588888681811061159757611597611f7c565b90506020020160208101906115ac9190611c3e565b8787878181106115be576115be611f7c565b905060200201356119d5565b6115d381612000565b9050611521565b5050505050505050505050565b6115ef6118ba565b6115fa838383611a93565b505050565b5f81815260026020526040812054600160b01b90046001600160501b031681611627846113e3565b90505f821180156116385750814210155b8015610e7e575042109392505050565b6116506118ba565b6001600160a01b0381166116b55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610690565b6116be81611913565b50565b5f6116cc8260601c90565b90505f6001600160601b0383166040516331a9108f60e11b8152600481018290529091506001600160a01b03831690636352211e90602401602060405180830381865afa92505050801561173d575060408051601f3d908101601f1916820190925261173a91810190612089565b60015b6117a3576040516340c10f1960e01b81526001600160a01b038581166004830152602482018390528316906340c10f19906044015f604051808303815f87803b158015611788575f80fd5b505af115801561179a573d5f803e3d5ffd5b50505050610831565b6001600160a01b038116611813576040516340c10f1960e01b81526001600160a01b038681166004830152602482018490528416906340c10f19906044015f604051808303815f87803b1580156117f8575f80fd5b505af115801561180a573d5f803e3d5ffd5b5050505061109d565b6040516323b872dd60e01b81526001600160a01b0382811660048301528681166024830152604482018490528416906323b872dd906064015f604051808303815f87803b158015611862575f80fd5b505af1158015610e10573d5f803e3d5ffd5b814710156118895763b12d13eb5f526004601cfd5b5f805f80858786f16115fa57825f526073600b5360ff6020536016600b83f06115fa57620f42405a116115fa575f80fd5b5f546001600160a01b031633146113e15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610690565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f61196d85856113af565b90506001600160a01b038316156119a5575f81815260026020526040902080546001600160a01b0319166001600160a01b0385161790555b5f908152600260205260409020805461ffff909216600160a01b0261ffff60a01b19909216919091179055505050565b5f6119e086866113af565b5f81815260026020526040902054909150600160b01b90046001600160501b031615611a0a575f80fd5b604080516060810182526001600160a01b03948516815261ffff93841660208083019182526001600160501b039788168385019081525f9586526002909152929093209051815493519251909616600160b01b026001600160b01b0392909416600160a01b026001600160b01b0319909316959094169490941717929092169190911790555050565b5f611a9e84846113af565b5f8181526002602052604090205490915042600160b01b9091046001600160501b031611611aca575f80fd5b5f90815260026020526040902080546001600160501b03909216600160b01b026001600160b01b039092169190911790555050565b5f60208284031215611b0f575f80fd5b5035919050565b5f8083601f840112611b26575f80fd5b50813567ffffffffffffffff811115611b3d575f80fd5b6020830191508360208260051b8501011115611b57575f80fd5b9250929050565b5f8060208385031215611b6f575f80fd5b823567ffffffffffffffff811115611b85575f80fd5b611b9185828601611b16565b90969095509350505050565b5f805f8060408587031215611bb0575f80fd5b843567ffffffffffffffff80821115611bc7575f80fd5b611bd388838901611b16565b90965094506020870135915080821115611beb575f80fd5b50611bf887828801611b16565b95989497509550505050565b5f60208284031215611c14575f80fd5b81358015158114611c23575f80fd5b9392505050565b6001600160a01b03811681146116be575f80fd5b5f60208284031215611c4e575f80fd5b8135611c2381611c2a565b5f805f805f805f806080898b031215611c70575f80fd5b883567ffffffffffffffff80821115611c87575f80fd5b611c938c838d01611b16565b909a50985060208b0135915080821115611cab575f80fd5b611cb78c838d01611b16565b909850965060408b0135915080821115611ccf575f80fd5b611cdb8c838d01611b16565b909650945060608b0135915080821115611cf3575f80fd5b50611d008b828c01611b16565b999c989b5096995094979396929594505050565b5f805f805f60a08688031215611d28575f80fd5b8535611d3381611c2a565b945060208601359350604086013592506060860135611d5181611c2a565b949793965091946080013592915050565b5f8060408385031215611d73575f80fd5b8235611d7e81611c2a565b946020939093013593505050565b5f805f8060808587031215611d9f575f80fd5b8435611daa81611c2a565b9350602085013592506040850135611dc181611c2a565b9396929550929360600135925050565b5f805f805f8060608789031215611de6575f80fd5b863567ffffffffffffffff80821115611dfd575f80fd5b611e098a838b01611b16565b90985096506020890135915080821115611e21575f80fd5b611e2d8a838b01611b16565b90965094506040890135915080821115611e45575f80fd5b50611e5289828a01611b16565b979a9699509497509295939492505050565b5f805f805f805f805f8060a08b8d031215611e7d575f80fd5b8a3567ffffffffffffffff80821115611e94575f80fd5b611ea08e838f01611b16565b909c509a5060208d0135915080821115611eb8575f80fd5b611ec48e838f01611b16565b909a50985060408d0135915080821115611edc575f80fd5b611ee88e838f01611b16565b909850965060608d0135915080821115611f00575f80fd5b611f0c8e838f01611b16565b909650945060808d0135915080821115611f24575f80fd5b50611f318d828e01611b16565b915080935050809150509295989b9194979a5092959850565b5f805f60608486031215611f5c575f80fd5b8335611f6781611c2a565b95602085013595506040909401359392505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156113ca576113ca611f90565b80820281158282048414176113ca576113ca611f90565b5f82611fe857634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156113ca576113ca611f90565b5f6001820161201157612011611f90565b5060010190565b60208082526022908201527f496e636f72726563742066756e64732073656e7420666f7220756e636c61696d604082015261195960f21b606082015260800190565b602080825260159082015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b604082015260600190565b5f60208284031215612099575f80fd5b8151611c2381611c2a56fea2646970667358221220e3ca7495f560eeed38feba96595eecb72f0b1699d1d2d706e9da83af0a31820b64736f6c63430008150033
Deployed Bytecode
0x608060405260043610610195575f3560e01c8063454a2ab3116100e75780638da5cb5b11610087578063a08546c611610062578063a08546c614610550578063a9c0deaf1461056f578063e71f7b151461058e578063f2fde38b146105ad575f80fd5b80638da5cb5b146104f55780638fd3c3671461051157806395657db014610530575f80fd5b8063715018a6116100c2578063715018a61461047d578063777de704146104915780638624e7df146104b05780638c77cc09146104cf575f80fd5b8063454a2ab31461042b5780635c975abb1461043e5780637100dd871461045e575f80fd5b80631ae03271116101525780632e9936111161012d5780632e9936111461037957806333465c5f1461038c578063339a2e90146103d557806338af3eed146103f4575f80fd5b80631ae032711461030c5780631c31f7101461032b5780632c104a921461034a575f80fd5b8063025483761461019957806302ffbaba146102235780631033a663146102385780631107a8fc1461024b57806316c38b3c146102ce57806319ab453c146102ed575b5f80fd5b3480156101a4575f80fd5b506101ec6101b3366004611aff565b60036020525f908152604090205462ffffff811690630100000081046001600160481b031690600160601b90046001600160a01b031683565b6040805162ffffff90941684526001600160481b0390921660208401526001600160a01b0316908201526060015b60405180910390f35b610236610231366004611b5e565b6105cc565b005b610236610246366004611b9d565b610837565b348015610256575f80fd5b5061029d610265366004611aff565b60026020525f90815260409020546001600160a01b03811690600160a01b810461ffff1690600160b01b90046001600160501b031683565b604080516001600160a01b03909416845261ffff90921660208401526001600160501b03169082015260600161021a565b3480156102d9575f80fd5b506102366102e8366004611c04565b610bc8565b3480156102f8575f80fd5b50610236610307366004611c3e565b610bee565b348015610317575f80fd5b50610236610326366004611c59565b610d31565b348015610336575f80fd5b50610236610345366004611c3e565b610e1b565b348015610355575f80fd5b50610369610364366004611aff565b610e45565b604051901515815260200161021a565b610236610387366004611aff565b610e86565b348015610397575f80fd5b506103c76103a6366004611aff565b5f90815260026020526040902054600160b01b90046001600160501b031690565b60405190815260200161021a565b3480156103e0575f80fd5b506102366103ef366004611d14565b611088565b3480156103ff575f80fd5b50600154610413906001600160a01b031681565b6040516001600160a01b03909116815260200161021a565b610236610439366004611aff565b6110a4565b348015610449575f80fd5b5060015461036990600160a01b900460ff1681565b348015610469575f80fd5b506103c7610478366004611d62565b6113af565b348015610488575f80fd5b506102366113d0565b34801561049c575f80fd5b506103c76104ab366004611aff565b6113e3565b3480156104bb575f80fd5b506102366104ca366004611d8c565b61142c565b3480156104da575f80fd5b506103c76104e9366004611aff565b6001600160601b031690565b348015610500575f80fd5b505f546001600160a01b0316610413565b34801561051c575f80fd5b5061023661052b366004611dd1565b611440565b34801561053b575f80fd5b5061041361054a366004611aff565b60601c90565b34801561055b575f80fd5b5061023661056a366004611e64565b6114ed565b34801561057a575f80fd5b50610236610589366004611f4a565b6115e7565b348015610599575f80fd5b506103696105a8366004611aff565b6115ff565b3480156105b8575f80fd5b506102366105c7366004611c3e565b611648565b5f805f5b838110156107f8575f8585838181106105eb576105eb611f7c565b602090810292909201355f818152600384526040908190208151606081018352905462ffffff81168252630100000081046001600160481b031695820195909552600160601b9094046001600160a01b031690840152925061064e905082610e45565b6106995760405162461bcd60e51b815260206004820152601760248201527641756374696f6e206973207374696c6c2061637469766560481b60448201526064015b60405180910390fd5b60208101516001600160481b031680156106c0576106bb8260400151846116c1565b6106ef565b50662386f26fc100006106d38187611fa4565b95506106ef6106e95f546001600160a01b031690565b846116c1565b6001600160601b0383166107038460601c90565b6001600160a01b0316847f7f5920f48fa11434ef5ffb7b29c2915859ad72e6f9987cfafb6e204e22ca3a414260405161073e91815260200190565b60405180910390a45f838152600260209081526040808320815160608101835290546001600160a01b0381168252600160a01b810461ffff16938201849052600160b01b90046001600160501b031691810191909152918190036107a15750611b585b5f6127106107af8386611fb7565b6107b99190611fce565b90506107cb835f015182617530611874565b6107d58185611fed565b6107df9089611fa4565b9750505050505050806107f190612000565b90506105d0565b508134146108185760405162461bcd60e51b815260040161069090612018565b600154610831906001600160a01b031682617530611874565b50505050565b600154600160a01b900460ff16156108855760405162461bcd60e51b8152602060048201526011602482015270109a59191a5b99c81a5cc81c185d5cd959607a1b6044820152606401610690565b828114610890575f80fd5b5f805f5b85811015610b5d575f8787838181106108af576108af611f7c565b9050602002013590505f8686848181106108cb576108cb611f7c565b90506020020135905080846108e09190611fa4565b93506108eb826115ff565b610902576108f98186611fa4565b94505050610b4d565b5f8281526003602090815260408083208151606081018352905462ffffff81168252630100000081046001600160481b0316938201849052600160601b90046001600160a01b03169181019190915291906702c68af0bb140000111561096a576107d061096e565b6103e85b905061271061097d8282611fa4565b83602001516001600160481b03166109959190611fb7565b61099f9190611fce565b83101580156109b55750662386f26fc100008310155b15610b3b5781515f90819062ffffff16816109cf886113e3565b60208701519091506001600160481b0316156109fd5785602001516001600160481b03169350856040015192505b610258610a0a4283611fed565b1015610a345780610a1d61025842611fa4565b610a279190611fed565b610a319083611fa4565b91505b6040805160608101825262ffffff80851682526001600160481b03808b166020808501918252338587019081525f8f8152600390925295902093518454915195516001600160a01b0316600160601b026001600160601b03969093166301000000026001600160601b03199092169316929092179190911792909216919091179055610ac6886001600160601b031690565b610ad08960601c90565b60408051338152602081018b9052428183015290516001600160a01b0392909216918b917fe55fea5e734015d5114a28644bd784f4484c9d4fa2d29dee5aff56034294e21b919081900360600190a48315610b3257610b328385617530611874565b50505050610b48565b610b458388611fa4565b96505b505050505b610b5681612000565b9050610894565b50803414610bad5760405162461bcd60e51b815260206004820152601c60248201527f496e636f727265637420616d6f756e74206f66204554482073656e74000000006044820152606401610690565b8115610bc057610bc03383617530611874565b505050505050565b610bd06118ba565b60018054911515600160a01b0260ff60a01b19909216919091179055565b5f54600160a81b900460ff1615808015610c1457505f546001600160a01b90910460ff16105b80610c345750303b158015610c3457505f54600160a01b900460ff166001145b610c975760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610690565b5f805460ff60a01b1916600160a01b1790558015610cc2575f805460ff60a81b1916600160a81b1790555b610ccb82611913565b600180546001600160a01b0319166001600160a01b0384161790558015610d2d575f805460ff60a81b19169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b610d396118ba565b8685148015610d4757508483145b8015610d5257508281145b610d6e5760405162461bcd60e51b81526004016106909061205a565b5f5b87811015610e1057610e00898983818110610d8d57610d8d611f7c565b9050602002016020810190610da29190611c3e565b888884818110610db457610db4611f7c565b90506020020135878785818110610dcd57610dcd611f7c565b9050602002016020810190610de29190611c3e565b868686818110610df457610df4611f7c565b90506020020135611962565b610e0981612000565b9050610d70565b505050505050505050565b610e236118ba565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b5f81815260026020526040812054600160b01b90046001600160501b031681610e6d846113e3565b90505f82118015610e7e5750804210155b949350505050565b5f818152600360209081526040918290208251606081018452905462ffffff81168252630100000081046001600160481b031692820192909252600160601b9091046001600160a01b031691810191909152610ee182610e45565b610f275760405162461bcd60e51b815260206004820152601760248201527641756374696f6e206973207374696c6c2061637469766560481b6044820152606401610690565b60208101516001600160481b03168015610f4e57610f498260400151846116c1565b610f8a565b662386f26fc100003414610f745760405162461bcd60e51b815260040161069090612018565b5034610f8a6106e95f546001600160a01b031690565b6001600160601b038316610f9e8460601c90565b6001600160a01b0316847f7f5920f48fa11434ef5ffb7b29c2915859ad72e6f9987cfafb6e204e22ca3a4142604051610fd991815260200190565b60405180910390a45f838152600260209081526040808320815160608101835290546001600160a01b0381168252600160a01b810461ffff16938201849052600160b01b90046001600160501b0316918101919091529181900361103c5750611b585b5f61271061104a8386611fb7565b6110549190611fce565b9050611066835f015182617530611874565b600154610bc0906001600160a01b03166110808387611fed565b617530611874565b6110906118ba565b61109d85858585856119d5565b5050505050565b600154600160a01b900460ff16156110f25760405162461bcd60e51b8152602060048201526011602482015270109a59191a5b99c81a5cc81c185d5cd959607a1b6044820152606401610690565b6110fb816115ff565b61113a5760405162461bcd60e51b815260206004820152601060248201526f41756374696f6e20496e61637469766560801b6044820152606401610690565b5f8181526003602090815260408083208151606081018352905462ffffff81168252630100000081046001600160481b0316938201849052600160601b90046001600160a01b03169181019190915291906702c68af0bb14000011156111a2576107d06111a6565b6103e85b90506127106111b58282611fa4565b83602001516001600160481b03166111cd9190611fb7565b6111d79190611fce565b34101580156111ed5750662386f26fc100003410155b61122f5760405162461bcd60e51b8152602060048201526013602482015272084d2c840dcdee840d0d2ced040cadcdeeaced606b1b6044820152606401610690565b81515f90819062ffffff1681611244876113e3565b60208701519091506001600160481b0316156112725785602001516001600160481b03169350856040015192505b61025861127f4283611fed565b10156112a9578061129261025842611fa4565b61129c9190611fed565b6112a69083611fa4565b91505b6040805160608101825262ffffff80851682526001600160481b033481166020808501918252338587019081525f8e8152600390925295902093518454915195516001600160a01b0316600160601b026001600160601b03969093166301000000026001600160601b0319909216931692909217919091179290921691909117905561133b876001600160601b031690565b6113458860601c90565b60408051338152346020820152428183015290516001600160a01b0392909216918a917fe55fea5e734015d5114a28644bd784f4484c9d4fa2d29dee5aff56034294e21b919081900360600190a483156113a6576113a68385617530611874565b50505050505050565b6001600160601b0319606083901b166001600160601b038216175b92915050565b6113d86118ba565b6113e15f611913565b565b5f81815260036020908152604080832054600290925282205462ffffff90911690611422906201518090600160b01b90046001600160501b0316611fa4565b6113ca9190611fa4565b6114346118ba565b61083184848484611962565b6114486118ba565b848314801561145657508281145b6114725760405162461bcd60e51b81526004016106909061205a565b5f5b858110156113a6576114dd87878381811061149157611491611f7c565b90506020020160208101906114a69190611c3e565b8686848181106114b8576114b8611f7c565b905060200201358585858181106114d1576114d1611f7c565b90506020020135611a93565b6114e681612000565b9050611474565b6114f56118ba565b888714801561150357508685145b61151f5760405162461bcd60e51b81526004016106909061205a565b5f5b898110156115da576115ca8b8b8381811061153e5761153e611f7c565b90506020020160208101906115539190611c3e565b8a8a8481811061156557611565611f7c565b9050602002013589898581811061157e5761157e611f7c565b9050602002013588888681811061159757611597611f7c565b90506020020160208101906115ac9190611c3e565b8787878181106115be576115be611f7c565b905060200201356119d5565b6115d381612000565b9050611521565b5050505050505050505050565b6115ef6118ba565b6115fa838383611a93565b505050565b5f81815260026020526040812054600160b01b90046001600160501b031681611627846113e3565b90505f821180156116385750814210155b8015610e7e575042109392505050565b6116506118ba565b6001600160a01b0381166116b55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610690565b6116be81611913565b50565b5f6116cc8260601c90565b90505f6001600160601b0383166040516331a9108f60e11b8152600481018290529091506001600160a01b03831690636352211e90602401602060405180830381865afa92505050801561173d575060408051601f3d908101601f1916820190925261173a91810190612089565b60015b6117a3576040516340c10f1960e01b81526001600160a01b038581166004830152602482018390528316906340c10f19906044015f604051808303815f87803b158015611788575f80fd5b505af115801561179a573d5f803e3d5ffd5b50505050610831565b6001600160a01b038116611813576040516340c10f1960e01b81526001600160a01b038681166004830152602482018490528416906340c10f19906044015f604051808303815f87803b1580156117f8575f80fd5b505af115801561180a573d5f803e3d5ffd5b5050505061109d565b6040516323b872dd60e01b81526001600160a01b0382811660048301528681166024830152604482018490528416906323b872dd906064015f604051808303815f87803b158015611862575f80fd5b505af1158015610e10573d5f803e3d5ffd5b814710156118895763b12d13eb5f526004601cfd5b5f805f80858786f16115fa57825f526073600b5360ff6020536016600b83f06115fa57620f42405a116115fa575f80fd5b5f546001600160a01b031633146113e15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610690565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f61196d85856113af565b90506001600160a01b038316156119a5575f81815260026020526040902080546001600160a01b0319166001600160a01b0385161790555b5f908152600260205260409020805461ffff909216600160a01b0261ffff60a01b19909216919091179055505050565b5f6119e086866113af565b5f81815260026020526040902054909150600160b01b90046001600160501b031615611a0a575f80fd5b604080516060810182526001600160a01b03948516815261ffff93841660208083019182526001600160501b039788168385019081525f9586526002909152929093209051815493519251909616600160b01b026001600160b01b0392909416600160a01b026001600160b01b0319909316959094169490941717929092169190911790555050565b5f611a9e84846113af565b5f8181526002602052604090205490915042600160b01b9091046001600160501b031611611aca575f80fd5b5f90815260026020526040902080546001600160501b03909216600160b01b026001600160b01b039092169190911790555050565b5f60208284031215611b0f575f80fd5b5035919050565b5f8083601f840112611b26575f80fd5b50813567ffffffffffffffff811115611b3d575f80fd5b6020830191508360208260051b8501011115611b57575f80fd5b9250929050565b5f8060208385031215611b6f575f80fd5b823567ffffffffffffffff811115611b85575f80fd5b611b9185828601611b16565b90969095509350505050565b5f805f8060408587031215611bb0575f80fd5b843567ffffffffffffffff80821115611bc7575f80fd5b611bd388838901611b16565b90965094506020870135915080821115611beb575f80fd5b50611bf887828801611b16565b95989497509550505050565b5f60208284031215611c14575f80fd5b81358015158114611c23575f80fd5b9392505050565b6001600160a01b03811681146116be575f80fd5b5f60208284031215611c4e575f80fd5b8135611c2381611c2a565b5f805f805f805f806080898b031215611c70575f80fd5b883567ffffffffffffffff80821115611c87575f80fd5b611c938c838d01611b16565b909a50985060208b0135915080821115611cab575f80fd5b611cb78c838d01611b16565b909850965060408b0135915080821115611ccf575f80fd5b611cdb8c838d01611b16565b909650945060608b0135915080821115611cf3575f80fd5b50611d008b828c01611b16565b999c989b5096995094979396929594505050565b5f805f805f60a08688031215611d28575f80fd5b8535611d3381611c2a565b945060208601359350604086013592506060860135611d5181611c2a565b949793965091946080013592915050565b5f8060408385031215611d73575f80fd5b8235611d7e81611c2a565b946020939093013593505050565b5f805f8060808587031215611d9f575f80fd5b8435611daa81611c2a565b9350602085013592506040850135611dc181611c2a565b9396929550929360600135925050565b5f805f805f8060608789031215611de6575f80fd5b863567ffffffffffffffff80821115611dfd575f80fd5b611e098a838b01611b16565b90985096506020890135915080821115611e21575f80fd5b611e2d8a838b01611b16565b90965094506040890135915080821115611e45575f80fd5b50611e5289828a01611b16565b979a9699509497509295939492505050565b5f805f805f805f805f8060a08b8d031215611e7d575f80fd5b8a3567ffffffffffffffff80821115611e94575f80fd5b611ea08e838f01611b16565b909c509a5060208d0135915080821115611eb8575f80fd5b611ec48e838f01611b16565b909a50985060408d0135915080821115611edc575f80fd5b611ee88e838f01611b16565b909850965060608d0135915080821115611f00575f80fd5b611f0c8e838f01611b16565b909650945060808d0135915080821115611f24575f80fd5b50611f318d828e01611b16565b915080935050809150509295989b9194979a5092959850565b5f805f60608486031215611f5c575f80fd5b8335611f6781611c2a565b95602085013595506040909401359392505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156113ca576113ca611f90565b80820281158282048414176113ca576113ca611f90565b5f82611fe857634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156113ca576113ca611f90565b5f6001820161201157612011611f90565b5060010190565b60208082526022908201527f496e636f72726563742066756e64732073656e7420666f7220756e636c61696d604082015261195960f21b606082015260800190565b602080825260159082015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b604082015260600190565b5f60208284031215612099575f80fd5b8151611c2381611c2a56fea2646970667358221220e3ca7495f560eeed38feba96595eecb72f0b1699d1d2d706e9da83af0a31820b64736f6c63430008150033
Deployed Bytecode Sourcemap
37221:12554:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38127:53;;;;;;;;;;-1:-1:-1;38127:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38127:53:0;;-1:-1:-1;;;38127:53:0;;-1:-1:-1;;;;;38127:53:0;;;;;;;427:8:1;415:21;;;397:40;;-1:-1:-1;;;;;473:33:1;;;468:2;453:18;;446:61;-1:-1:-1;;;;;543:32:1;523:18;;;516:60;385:2;370:18;38127:53:0;;;;;;;;43136:1346;;;;;;:::i;:::-;;:::i;:::-;;40001:2071;;;;;;:::i;:::-;;:::i;38068:54::-;;;;;;;;;;-1:-1:-1;38068:54:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;38068:54:0;;;-1:-1:-1;;;38068:54:0;;;;;-1:-1:-1;;;38068:54:0;;-1:-1:-1;;;;;38068:54:0;;;;;;;-1:-1:-1;;;;;2395:32:1;;;2377:51;;2476:6;2464:19;;;2459:2;2444:18;;2437:47;-1:-1:-1;;;;;2520:35:1;2500:18;;;2493:63;2365:2;2350:18;38068:54:0;2179:383:1;48316:91:0;;;;;;;;;;-1:-1:-1;48316:91:0;;;;;:::i;:::-;;:::i;38533:129::-;;;;;;;;;;-1:-1:-1;38533:129:0;;;;;:::i;:::-;;:::i;46281:504::-;;;;;;;;;;-1:-1:-1;46281:504:0;;;;;:::i;:::-;;:::i;48196:114::-;;;;;;;;;;-1:-1:-1;48196:114:0;;;;;:::i;:::-;;:::i;49258:255::-;;;;;;;;;;-1:-1:-1;49258:255:0;;;;;:::i;:::-;;:::i;:::-;;;4807:14:1;;4800:22;4782:41;;4770:2;4755:18;49258:255:0;4642:187:1;42078:1052:0;;;;;;:::i;:::-;;:::i;48817:141::-;;;;;;;;;;-1:-1:-1;48817:141:0;;;;;:::i;:::-;48895:7;48918:24;;;:13;:24;;;;;:34;-1:-1:-1;;;48918:34:0;;-1:-1:-1;;;;;48918:34:0;;48817:141;;;;4980:25:1;;;4968:2;4953:18;48817:141:0;4834:177:1;47433:239:0;;;;;;;;;;-1:-1:-1;47433:239:0;;;;;:::i;:::-;;:::i;37821:26::-;;;;;;;;;;-1:-1:-1;37821:26:0;;;;-1:-1:-1;;;;;37821:26:0;;;;;;-1:-1:-1;;;;;5779:32:1;;;5761:51;;5749:2;5734:18;37821:26:0;5615:203:1;38668:1327:0;;;;;;:::i;:::-;;:::i;37852:18::-;;;;;;;;;;-1:-1:-1;37852:18:0;;;;-1:-1:-1;;;37852:18:0;;;;;;48413:185;;;;;;;;;;-1:-1:-1;48413:185:0;;;;;:::i;:::-;;:::i;36344:103::-;;;;;;;;;;;;;:::i;48604:207::-;;;;;;;;;;-1:-1:-1;48604:207:0;;;;;:::i;:::-;;:::i;46067:208::-;;;;;;;;;;-1:-1:-1;46067:208:0;;;;;:::i;:::-;;:::i;49652:120::-;;;;;;;;;;-1:-1:-1;49652:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;49747:19:0;;49652:120;35703:87;;;;;;;;;;-1:-1:-1;35749:7:0;35776:6;-1:-1:-1;;;;;35776:6:0;35703:87;;46990:437;;;;;;;;;;-1:-1:-1;46990:437:0;;;;;:::i;:::-;;:::i;49519:127::-;;;;;;;;;;-1:-1:-1;49519:127:0;;;;;:::i;:::-;49636:2;49630:8;;49519:127;47678:512;;;;;;;;;;-1:-1:-1;47678:512:0;;;;;:::i;:::-;;:::i;46791:193::-;;;;;;;;;;-1:-1:-1;46791:193:0;;;;;:::i;:::-;;:::i;48964:288::-;;;;;;;;;;-1:-1:-1;48964:288:0;;;;;:::i;:::-;;:::i;36602:201::-;;;;;;;;;;-1:-1:-1;36602:201:0;;;;;:::i;:::-;;:::i;43136:1346::-;43233:21;43256;43289:9;43284:1024;43300:21;;;43284:1024;;;43337:17;43357:10;;43368:1;43357:13;;;;;;;:::i;:::-;;;;;;;;;;43379:25;43407:29;;;:18;:29;;;;;;;43379:57;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43379:57:0;;;;;;;;-1:-1:-1;;;43379:57:0;;;-1:-1:-1;;;;;43379:57:0;;;;;43357:13;-1:-1:-1;43453:24:0;;-1:-1:-1;43357:13:0;43453;:24::i;:::-;43445:60;;;;-1:-1:-1;;;43445:60:0;;10213:2:1;43445:60:0;;;10195:21:1;10252:2;10232:18;;;10225:30;-1:-1:-1;;;10271:18:1;;;10264:53;10334:18;;43445:60:0;;;;;;;;;43538:17;;;;-1:-1:-1;;;;;43516:39:0;43568:15;;43564:196;;43596:35;43602:10;:17;;;43621:9;43596:5;:35::i;:::-;43564:196;;;-1:-1:-1;37580:10:0;43690:24;37580:10;43690:24;;:::i;:::-;;;43725:25;43731:7;35749;35776:6;-1:-1:-1;;;;;35776:6:0;;35703:87;43731:7;43740:9;43725:5;:25::i;:::-;-1:-1:-1;;;;;49747:19:0;;43813:30;43833:9;49636:2;49630:8;;49519:127;43813:30;-1:-1:-1;;;;;43775:144:0;43793:9;43775:144;43895:15;43775:144;;;;4980:25:1;;4968:2;4953:18;;4834:177;43775:144:0;;;;;;;;43930:27;43960:24;;;:13;:24;;;;;;;;43930:54;;;;;;;;;-1:-1:-1;;;;;43930:54:0;;;;-1:-1:-1;;;43930:54:0;;;;;;;;;;-1:-1:-1;;;43930:54:0;;-1:-1:-1;;;;;43930:54:0;;;;;;;;;44034:10;;;44030:58;;-1:-1:-1;37416:5:0;44030:58;44096:23;44144:6;44122:19;44136:5;44122:11;:19;:::i;:::-;:28;;;;:::i;:::-;44096:54;;44159:84;44196:6;:13;;;44211:15;37808:6;44159:36;:84::i;:::-;44271:29;44285:15;44271:11;:29;:::i;:::-;44254:46;;;;:::i;:::-;;;43328:980;;;;;;43323:3;;;;:::i;:::-;;;43284:1024;;;;44337:13;44324:9;:26;44316:73;;;;-1:-1:-1;;;44316:73:0;;;;;;;:::i;:::-;44433:11;;44396:80;;-1:-1:-1;;;;;44433:11:0;44446:13;37808:6;44396:36;:80::i;:::-;43226:1256;;43136:1346;;:::o;40001:2071::-;40133:6;;-1:-1:-1;;;40133:6:0;;;;40132:7;40124:37;;;;-1:-1:-1;;;40124:37:0;;11898:2:1;40124:37:0;;;11880:21:1;11937:2;11917:18;;;11910:30;-1:-1:-1;;;11956:18:1;;;11949:47;12013:18;;40124:37:0;11696:341:1;40124:37:0;40176:41;;;40168:50;;;;;;40227:19;40248:21;40280:9;40276:1594;40291:20;;;40276:1594;;;40327:17;40347:9;;40357:1;40347:12;;;;;;;:::i;:::-;;;;;;;40327:32;;40368:21;40392:14;;40407:1;40392:17;;;;;;;:::i;:::-;;;;;;;40368:41;;40435:13;40418:30;;;;;:::i;:::-;;;40461:26;40477:9;40461:15;:26::i;:::-;40457:100;;40500:28;40515:13;40500:28;;:::i;:::-;;;40539:8;;;;40457:100;40567:25;40595:29;;;:18;:29;;;;;;;;40567:57;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40567:57:0;;;;;;;-1:-1:-1;;;40567:57:0;;-1:-1:-1;;;;;40567:57:0;;;;;;;;;:25;37361:9;-1:-1:-1;40655:43:0;:99;;37643:5;40655:99;;;37702:5;40655:99;40633:121;-1:-1:-1;37300:6:0;40816:17;40633:121;37300:6;40816:17;:::i;:::-;40795:10;:17;;;-1:-1:-1;;;;;40795:39:0;;;;;:::i;:::-;:45;;;;:::i;:::-;40777:13;:64;;:101;;;;;37580:10;40854:13;:24;;40777:101;40763:1100;;;40978:24;;40899:20;;;;40961:41;;40899:20;41031:25;41046:9;41031:14;:25::i;:::-;41073:17;;;;41013:43;;-1:-1:-1;;;;;;41073:21:0;;41069:129;;41124:10;:17;;;-1:-1:-1;;;;;41109:32:0;;;41169:10;:17;;;41154:32;;41069:129;37468:10;41214:25;41224:15;41214:7;:25;:::i;:::-;:42;41210:125;;;41316:7;41281:32;37468:10;41281:15;:32;:::i;:::-;:42;;;;:::i;:::-;41271:52;;;;:::i;:::-;;;41210:125;41379:58;;;;;;;;;;;;;;-1:-1:-1;;;;;41379:58:0;;;;;;;;;;41426:10;41379:58;;;;;;-1:-1:-1;41347:29:0;;;:18;:29;;;;;;:90;;;;;;;;-1:-1:-1;;;;;41347:90:0;-1:-1:-1;;;41347:90:0;-1:-1:-1;;;;;41347:90:0;;;;;;-1:-1:-1;;;;;;41347:90:0;;;;;;;;;;;;;;;;;;;;;;;41540:30;41366:9;-1:-1:-1;;;;;49747:19:0;;49652:120;41540:30;41497;41517:9;49636:2;49630:8;;49519:127;41497:30;41455:203;;;41583:10;12244:51:1;;12326:2;12311:18;;12304:34;;;41632:15:0;12354:18:1;;;12347:34;41455:203:0;;-1:-1:-1;;;;;41455:203:0;;;;;41475:9;;41455:203;;;;;;12232:2:1;41455:203:0;;;41677:16;;41673:127;;41708:80;41745:12;41759;37808:6;41708:36;:80::i;:::-;40888:921;;;;40763:1100;;;41825:28;41840:13;41825:28;;:::i;:::-;;;40763:1100;40318:1552;;;;40276:1594;40313:3;;;:::i;:::-;;;40276:1594;;;;41899:13;41886:9;:26;41878:67;;;;-1:-1:-1;;;41878:67:0;;12594:2:1;41878:67:0;;;12576:21:1;12633:2;12613:18;;;12606:30;12672;12652:18;;;12645:58;12720:18;;41878:67:0;12392:352:1;41878:67:0;41956:15;;41952:115;;41982:77;42019:10;42031:11;37808:6;41982:36;:77::i;:::-;40117:1955;;40001:2071;;;;:::o;48316:91::-;35589:13;:11;:13::i;:::-;48385:6:::1;:16:::0;;;::::1;;-1:-1:-1::0;;;48385:16:0::1;-1:-1:-1::0;;;;48385:16:0;;::::1;::::0;;;::::1;::::0;;48316:91::o;38533:129::-;30140:19;30163:13;-1:-1:-1;;;30163:13:0;;;;30162:14;;30210:34;;;;-1:-1:-1;30228:12:0;;30243:1;-1:-1:-1;;;30228:12:0;;;;;:16;30210:34;30209:97;;;-1:-1:-1;30278:4:0;18924:19;:23;;;30250:55;;-1:-1:-1;30288:12:0;;-1:-1:-1;;;30288:12:0;;;;30304:1;30288:17;30250:55;30187:193;;;;-1:-1:-1;;;30187:193:0;;12951:2:1;30187:193:0;;;12933:21:1;12990:2;12970:18;;;12963:30;13029:34;13009:18;;;13002:62;-1:-1:-1;;;13080:18:1;;;13073:44;13134:19;;30187:193:0;12749:410:1;30187:193:0;30391:12;:16;;-1:-1:-1;;;;30391:16:0;-1:-1:-1;;;30391:16:0;;;30418:67;;;;30453:13;:20;;-1:-1:-1;;;;30453:20:0;-1:-1:-1;;;30453:20:0;;;30418:67;38595:30:::1;38614:10;38595:18;:30::i;:::-;38632:11;:24:::0;;-1:-1:-1;;;;;;38632:24:0::1;-1:-1:-1::0;;;;;38632:24:0;::::1;;::::0;;30507:102;;;;30558:5;30542:21;;-1:-1:-1;;;;30542:21:0;;;30583:14;;-1:-1:-1;13316:36:1;;30583:14:0;;13304:2:1;13289:18;30583:14:0;;;;;;;30507:102;30129:487;38533:129;:::o;46281:504::-;35589:13;:11;:13::i;:::-;46493:37;;::::1;:74:::0;::::1;;;-1:-1:-1::0;46534:33:0;;::::1;46493:74;:116;;;;-1:-1:-1::0;46578:31:0;;::::1;46493:116;46477:171;;;;-1:-1:-1::0;;;46477:171:0::1;;;;;;;:::i;:::-;46659:9;46655:125;46670:22:::0;;::::1;46655:125;;;46708:64;46721:11;;46733:1;46721:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;46737:8;;46746:1;46737:11;;;;;;;:::i;:::-;;;;;;;46750:7;;46758:1;46750:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;46762:6;;46769:1;46762:9;;;;;;;:::i;:::-;;;;;;;46708:12;:64::i;:::-;46694:3;::::0;::::1;:::i;:::-;;;46655:125;;;;46281:504:::0;;;;;;;;:::o;48196:114::-;35589:13;:11;:13::i;:::-;48278:11:::1;:26:::0;;-1:-1:-1;;;;;;48278:26:0::1;-1:-1:-1::0;;;;;48278:26:0;;;::::1;::::0;;;::::1;::::0;;48196:114::o;49258:255::-;49331:4;49364:24;;;:13;:24;;;;;:34;-1:-1:-1;;;49364:34:0;;-1:-1:-1;;;;;49364:34:0;49331:4;49423:25;49364:24;49423:14;:25::i;:::-;49405:43;;49475:1;49463:9;:13;:43;;;;;49499:7;49480:15;:26;;49463:43;49455:52;49258:255;-1:-1:-1;;;;49258:255:0:o;42078:1052::-;42154:25;42182:29;;;:18;:29;;;;;;;;;42154:57;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42154:57:0;;;;;;;;-1:-1:-1;;;42154:57:0;;;-1:-1:-1;;;;;42154:57:0;;;;;;;;42226:24;42182:29;42226:13;:24::i;:::-;42218:60;;;;-1:-1:-1;;;42218:60:0;;10213:2:1;42218:60:0;;;10195:21:1;10252:2;10232:18;;;10225:30;-1:-1:-1;;;10271:18:1;;;10264:53;10334:18;;42218:60:0;10011:347:1;42218:60:0;42309:17;;;;-1:-1:-1;;;;;42287:39:0;42337:15;;42333:231;;42363:35;42369:10;:17;;;42388:9;42363:5;:35::i;:::-;42333:231;;;37580:10;42429:9;:20;42421:67;;;;-1:-1:-1;;;42421:67:0;;;;;;;:::i;:::-;-1:-1:-1;42511:9:0;42531:25;42537:7;35749;35776:6;-1:-1:-1;;;;;35776:6:0;;35703:87;42531:25;-1:-1:-1;;;;;49747:19:0;;42611:30;42631:9;49636:2;49630:8;;49519:127;42611:30;-1:-1:-1;;;;;42577:134:0;42593:9;42577:134;42689:15;42577:134;;;;4980:25:1;;4968:2;4953:18;;4834:177;42577:134:0;;;;;;;;42720:27;42750:24;;;:13;:24;;;;;;;;42720:54;;;;;;;;;-1:-1:-1;;;;;42720:54:0;;;;-1:-1:-1;;;42720:54:0;;;;;;;;;;-1:-1:-1;;;42720:54:0;;-1:-1:-1;;;;;42720:54:0;;;;;;;;;42820:10;;;42816:54;;-1:-1:-1;37416:5:0;42816:54;42876:23;42924:6;42902:19;42916:5;42902:11;:19;:::i;:::-;:28;;;;:::i;:::-;42876:54;;42937:84;42974:6;:13;;;42989:15;37808:6;42937:36;:84::i;:::-;43065:11;;43028:96;;-1:-1:-1;;;;;43065:11:0;43078:29;43092:15;43078:11;:29;:::i;:::-;37808:6;43028:36;:96::i;47433:239::-;35589:13;:11;:13::i;:::-;47602:64:::1;47613:17;47632:7;47641:9;47652:6;47660:5;47602:10;:64::i;:::-;47433:239:::0;;;;;:::o;38668:1327::-;38743:6;;-1:-1:-1;;;38743:6:0;;;;38742:7;38734:37;;;;-1:-1:-1;;;38734:37:0;;11898:2:1;38734:37:0;;;11880:21:1;11937:2;11917:18;;;11910:30;-1:-1:-1;;;11956:18:1;;;11949:47;12013:18;;38734:37:0;11696:341:1;38734:37:0;38786:26;38802:9;38786:15;:26::i;:::-;38778:55;;;;-1:-1:-1;;;38778:55:0;;13915:2:1;38778:55:0;;;13897:21:1;13954:2;13934:18;;;13927:30;-1:-1:-1;;;13973:18:1;;;13966:46;14029:18;;38778:55:0;13713:340:1;38778:55:0;38842:25;38870:29;;;:18;:29;;;;;;;;38842:57;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38842:57:0;;;;;;;-1:-1:-1;;;38842:57:0;;-1:-1:-1;;;;;38842:57:0;;;;;;;;;:25;37361:9;-1:-1:-1;38928:43:0;:97;;37643:5;38928:97;;;37702:5;38928:97;38906:119;-1:-1:-1;37300:6:0;39085:17;38906:119;37300:6;39085:17;:::i;:::-;39064:10;:17;;;-1:-1:-1;;;;;39064:39:0;;;;;:::i;:::-;:45;;;;:::i;:::-;39050:9;:60;;:91;;;;;37580:10;39121:9;:20;;39050:91;39034:144;;;;-1:-1:-1;;;39034:144:0;;14260:2:1;39034:144:0;;;14242:21:1;14299:2;14279:18;;;14272:30;-1:-1:-1;;;14318:18:1;;;14311:49;14377:18;;39034:144:0;14058:343:1;39034:144:0;39258:24;;39187:20;;;;39241:41;;39187:20;39307:25;39322:9;39307:14;:25::i;:::-;39345:17;;;;39289:43;;-1:-1:-1;;;;;;39345:21:0;;39341:117;;39392:10;:17;;;-1:-1:-1;;;;;39377:32:0;;;39433:10;:17;;;39418:32;;39341:117;37468:10;39470:25;39480:15;39470:7;:25;:::i;:::-;:42;39466:117;;;39568:7;39533:32;37468:10;39533:15;:32;:::i;:::-;:42;;;;:::i;:::-;39523:52;;;;:::i;:::-;;;39466:117;39623:54;;;;;;;;;;;;;;-1:-1:-1;;;;;39654:9:0;39623:54;;;;;;;;;39666:10;39623:54;;;;;;-1:-1:-1;39591:29:0;;;:18;:29;;;;;;:86;;;;;;;;-1:-1:-1;;;;;39591:86:0;-1:-1:-1;;;39591:86:0;-1:-1:-1;;;;;39591:86:0;;;;;;-1:-1:-1;;;;;;39591:86:0;;;;;;;;;;;;;;;;;;;;;;;39764:30;39610:9;-1:-1:-1;;;;;49747:19:0;;49652:120;39764:30;39725;39745:9;49636:2;49630:8;;49519:127;39725:30;39691:171;;;39803:10;12244:51:1;;39822:9:0;12326:2:1;12311:18;;12304:34;39840:15:0;12354:18:1;;;12347:34;39691:171:0;;-1:-1:-1;;;;;39691:171:0;;;;;39707:9;;39691:171;;;;;;12232:2:1;39691:171:0;;;39875:16;;39871:119;;39902:80;39939:12;39953;37808:6;39902:36;:80::i;:::-;38727:1268;;;;;;38668:1327;:::o;48413:185::-;-1:-1:-1;;;;;;48571:2:0;48539:34;;;;-1:-1:-1;;;;;48538:54:0;;;48413:185;;;;;:::o;36344:103::-;35589:13;:11;:13::i;:::-;36409:30:::1;36436:1;36409:18;:30::i;:::-;36344:103::o:0;48604:207::-;48678:7;48762:29;;;:18;:29;;;;;;;;:43;48701:13;:24;;;;;:34;48762:43;;;;;48701:58;;37532:8;;-1:-1:-1;;;48701:34:0;;-1:-1:-1;;;;;48701:34:0;:58;:::i;:::-;:104;;;;:::i;46067:208::-;35589:13;:11;:13::i;:::-;46214:55:::1;46227:17;46246:7;46255:6;46263:5;46214:12;:55::i;46990:437::-:0;35589:13;:11;:13::i;:::-;47176:37;;::::1;:80:::0;::::1;;;-1:-1:-1::0;47217:39:0;;::::1;47176:80;47160:135;;;;-1:-1:-1::0;;;47160:135:0::1;;;;;;;:::i;:::-;47306:9;47302:120;47317:22:::0;;::::1;47302:120;;;47355:59;47368:11;;47380:1;47368:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;47384:8;;47393:1;47384:11;;;;;;;:::i;:::-;;;;;;;47397:13;;47411:1;47397:16;;;;;;;:::i;:::-;;;;;;;47355:12;:59::i;:::-;47341:3;::::0;::::1;:::i;:::-;;;47302:120;;47678:512:::0;35589:13;:11;:13::i;:::-;47924:37;;::::1;:77:::0;::::1;;;-1:-1:-1::0;47965:36:0;;::::1;47924:77;47908:132;;;;-1:-1:-1::0;;;47908:132:0::1;;;;;;;:::i;:::-;48051:9;48047:138;48062:22:::0;;::::1;48047:138;;;48100:77;48111:11;;48123:1;48111:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;48127:8;;48136:1;48127:11;;;;;;;:::i;:::-;;;;;;;48140:10;;48151:1;48140:13;;;;;;;:::i;:::-;;;;;;;48155:7;;48163:1;48155:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;48167:6;;48174:1;48167:9;;;;;;;:::i;:::-;;;;;;;48100:10;:77::i;:::-;48086:3;::::0;::::1;:::i;:::-;;;48047:138;;;;47678:512:::0;;;;;;;;;;:::o;46791:193::-;35589:13;:11;:13::i;:::-;46924:54:::1;46937:17;46956:7;46965:12;46924;:54::i;:::-;46791:193:::0;;;:::o;48964:288::-;49039:4;49072:24;;;:13;:24;;;;;:34;-1:-1:-1;;;49072:34:0;;-1:-1:-1;;;;;49072:34:0;49039:4;49131:25;49072:24;49131:14;:25::i;:::-;49113:43;;49183:1;49171:9;:13;:45;;;;;49207:9;49188:15;:28;;49171:45;:74;;;;-1:-1:-1;49220:15:0;:25;;49163:83;-1:-1:-1;;;48964:288:0:o;36602:201::-;35589:13;:11;:13::i;:::-;-1:-1:-1;;;;;36691:22:0;::::1;36683:73;;;::::0;-1:-1:-1;;;36683:73:0;;14608:2:1;36683:73:0::1;::::0;::::1;14590:21:1::0;14647:2;14627:18;;;14620:30;14686:34;14666:18;;;14659:62;-1:-1:-1;;;14737:18:1;;;14730:36;14783:19;;36683:73:0::1;14406:402:1::0;36683:73:0::1;36767:28;36786:8;36767:18;:28::i;:::-;36602:201:::0;:::o;44488:490::-;44565:18;44586:30;44606:9;49636:2;49630:8;;49519:127;44586:30;44565:51;-1:-1:-1;44623:15:0;-1:-1:-1;;;;;49747:19:0;;44682:33;;-1:-1:-1;;;44682:33:0;;;;;4980:25:1;;;44623:48:0;;-1:-1:-1;;;;;;44682:24:0;;;;;4953:18:1;;44682:33:0;;;;;;;;;;;;;;;;;;-1:-1:-1;44682:33:0;;;;;;;;-1:-1:-1;;44682:33:0;;;;;;;;;;;;:::i;:::-;;;44678:295;;44931:34;;-1:-1:-1;;;44931:34:0;;-1:-1:-1;;;;;15261:32:1;;;44931:34:0;;;15243:51:1;15310:18;;;15303:34;;;44931:21:0;;;;;15216:18:1;;44931:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44678:295;;;-1:-1:-1;;;;;44754:20:0;;44750:158;;44787:34;;-1:-1:-1;;;44787:34:0;;-1:-1:-1;;;;;15261:32:1;;;44787:34:0;;;15243:51:1;15310:18;;;15303:34;;;44787:21:0;;;;;15216:18:1;;44787:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44750:158;;;44848:50;;-1:-1:-1;;;44848:50:0;;-1:-1:-1;;;;;15606:15:1;;;44848:50:0;;;15588:34:1;15658:15;;;15638:18;;;15631:43;15690:18;;;15683:34;;;44848:29:0;;;;;15523:18:1;;44848:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3448:1227;3684:6;3669:13;3666:25;3663:245;;;3798:10;3792:4;3785:24;3888:4;3882;3875:18;3663:245;4037:1;4034;4031;4028;4020:6;4016:2;4004:10;3999:40;3989:668;;4073:2;4067:4;4060:16;4147:4;4141;4133:19;4204:4;4198;4190:19;4452:4;4446;4438:6;4431:26;4421:221;;4597:7;4590:5;4587:18;4577:46;;4619:1;4616;4609:12;35868:132;35749:7;35776:6;-1:-1:-1;;;;;35776:6:0;34334:10;35932:23;35924:68;;;;-1:-1:-1;;;35924:68:0;;15930:2:1;35924:68:0;;;15912:21:1;;;15949:18;;;15942:30;16008:34;15988:18;;;15981:62;16060:18;;35924:68:0;15728:356:1;36963:191:0;37037:16;37056:6;;-1:-1:-1;;;;;37073:17:0;;;-1:-1:-1;;;;;;37073:17:0;;;;;;37106:40;;37056:6;;;;;;;37106:40;;37037:16;37106:40;37026:128;36963:191;:::o;44984:359::-;45125:17;45145:47;45165:17;45184:7;45145:19;:47::i;:::-;45125:67;-1:-1:-1;;;;;;45203:20:0;;;45199:83;;45234:24;;;;:13;:24;;;;;:40;;-1:-1:-1;;;;;;45234:40:0;-1:-1:-1;;;;;45234:40:0;;;;;45199:83;45288:24;;;;:13;:24;;;;;:49;;;;;;-1:-1:-1;;;45288:49:0;-1:-1:-1;;;;45288:49:0;;;;;;;;;-1:-1:-1;;;44984:359:0:o;45684:377::-;45844:17;45864:47;45884:17;45903:7;45864:19;:47::i;:::-;45926:24;;;;:13;:24;;;;;:34;:24;;-1:-1:-1;;;;45926:34:0;;-1:-1:-1;;;;;45926:34:0;:39;45918:48;;;;;;46000:55;;;;;;;;-1:-1:-1;;;;;46000:55:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46000:55:0;;;;;;;;;-1:-1:-1;45973:24:0;;;:13;:24;;;;;;;:82;;;;;;;;;;;-1:-1:-1;;;45973:82:0;-1:-1:-1;;;;;45973:82:0;;;;-1:-1:-1;;;45973:82:0;-1:-1:-1;;;;;;45973:82:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45684:377:0:o;45349:329::-;45473:17;45493:47;45513:17;45532:7;45493:19;:47::i;:::-;45555:24;;;;:13;:24;;;;;:34;:24;;-1:-1:-1;45592:15:0;-1:-1:-1;;;45555:34:0;;;-1:-1:-1;;;;;45555:34:0;:52;45547:61;;;;;;45615:24;;;;:13;:24;;;;;:57;;-1:-1:-1;;;;;45615:57:0;;;-1:-1:-1;;;45615:57:0;-1:-1:-1;;;;;45615:57:0;;;;;;;;;-1:-1:-1;;45349:329:0:o;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;587:367::-;650:8;660:6;714:3;707:4;699:6;695:17;691:27;681:55;;732:1;729;722:12;681:55;-1:-1:-1;755:20:1;;798:18;787:30;;784:50;;;830:1;827;820:12;784:50;867:4;859:6;855:17;843:29;;927:3;920:4;910:6;907:1;903:14;895:6;891:27;887:38;884:47;881:67;;;944:1;941;934:12;881:67;587:367;;;;;:::o;959:437::-;1045:6;1053;1106:2;1094:9;1085:7;1081:23;1077:32;1074:52;;;1122:1;1119;1112:12;1074:52;1162:9;1149:23;1195:18;1187:6;1184:30;1181:50;;;1227:1;1224;1217:12;1181:50;1266:70;1328:7;1319:6;1308:9;1304:22;1266:70;:::i;:::-;1355:8;;1240:96;;-1:-1:-1;959:437:1;-1:-1:-1;;;;959:437:1:o;1401:773::-;1523:6;1531;1539;1547;1600:2;1588:9;1579:7;1575:23;1571:32;1568:52;;;1616:1;1613;1606:12;1568:52;1656:9;1643:23;1685:18;1726:2;1718:6;1715:14;1712:34;;;1742:1;1739;1732:12;1712:34;1781:70;1843:7;1834:6;1823:9;1819:22;1781:70;:::i;:::-;1870:8;;-1:-1:-1;1755:96:1;-1:-1:-1;1958:2:1;1943:18;;1930:32;;-1:-1:-1;1974:16:1;;;1971:36;;;2003:1;2000;1993:12;1971:36;;2042:72;2106:7;2095:8;2084:9;2080:24;2042:72;:::i;:::-;1401:773;;;;-1:-1:-1;2133:8:1;-1:-1:-1;;;;1401:773:1:o;2567:273::-;2623:6;2676:2;2664:9;2655:7;2651:23;2647:32;2644:52;;;2692:1;2689;2682:12;2644:52;2731:9;2718:23;2784:5;2777:13;2770:21;2763:5;2760:32;2750:60;;2806:1;2803;2796:12;2750:60;2829:5;2567:273;-1:-1:-1;;;2567:273:1:o;2845:131::-;-1:-1:-1;;;;;2920:31:1;;2910:42;;2900:70;;2966:1;2963;2956:12;2981:247;3040:6;3093:2;3081:9;3072:7;3068:23;3064:32;3061:52;;;3109:1;3106;3099:12;3061:52;3148:9;3135:23;3167:31;3192:5;3167:31;:::i;3233:1404::-;3427:6;3435;3443;3451;3459;3467;3475;3483;3536:3;3524:9;3515:7;3511:23;3507:33;3504:53;;;3553:1;3550;3543:12;3504:53;3593:9;3580:23;3622:18;3663:2;3655:6;3652:14;3649:34;;;3679:1;3676;3669:12;3649:34;3718:70;3780:7;3771:6;3760:9;3756:22;3718:70;:::i;:::-;3807:8;;-1:-1:-1;3692:96:1;-1:-1:-1;3895:2:1;3880:18;;3867:32;;-1:-1:-1;3911:16:1;;;3908:36;;;3940:1;3937;3930:12;3908:36;3979:72;4043:7;4032:8;4021:9;4017:24;3979:72;:::i;:::-;4070:8;;-1:-1:-1;3953:98:1;-1:-1:-1;4158:2:1;4143:18;;4130:32;;-1:-1:-1;4174:16:1;;;4171:36;;;4203:1;4200;4193:12;4171:36;4242:72;4306:7;4295:8;4284:9;4280:24;4242:72;:::i;:::-;4333:8;;-1:-1:-1;4216:98:1;-1:-1:-1;4421:2:1;4406:18;;4393:32;;-1:-1:-1;4437:16:1;;;4434:36;;;4466:1;4463;4456:12;4434:36;;4505:72;4569:7;4558:8;4547:9;4543:24;4505:72;:::i;:::-;3233:1404;;;;-1:-1:-1;3233:1404:1;;-1:-1:-1;3233:1404:1;;;;;;4596:8;-1:-1:-1;;;3233:1404:1:o;5016:594::-;5111:6;5119;5127;5135;5143;5196:3;5184:9;5175:7;5171:23;5167:33;5164:53;;;5213:1;5210;5203:12;5164:53;5252:9;5239:23;5271:31;5296:5;5271:31;:::i;:::-;5321:5;-1:-1:-1;5373:2:1;5358:18;;5345:32;;-1:-1:-1;5424:2:1;5409:18;;5396:32;;-1:-1:-1;5480:2:1;5465:18;;5452:32;5493:33;5452:32;5493:33;:::i;:::-;5016:594;;;;-1:-1:-1;5016:594:1;;5599:3;5584:19;5571:33;;5016:594;-1:-1:-1;;5016:594:1:o;5823:315::-;5891:6;5899;5952:2;5940:9;5931:7;5927:23;5923:32;5920:52;;;5968:1;5965;5958:12;5920:52;6007:9;5994:23;6026:31;6051:5;6026:31;:::i;:::-;6076:5;6128:2;6113:18;;;;6100:32;;-1:-1:-1;;;5823:315:1:o;6143:525::-;6229:6;6237;6245;6253;6306:3;6294:9;6285:7;6281:23;6277:33;6274:53;;;6323:1;6320;6313:12;6274:53;6362:9;6349:23;6381:31;6406:5;6381:31;:::i;:::-;6431:5;-1:-1:-1;6483:2:1;6468:18;;6455:32;;-1:-1:-1;6539:2:1;6524:18;;6511:32;6552:33;6511:32;6552:33;:::i;:::-;6143:525;;;;-1:-1:-1;6604:7:1;;6658:2;6643:18;6630:32;;-1:-1:-1;;6143:525:1:o;6673:1088::-;6831:6;6839;6847;6855;6863;6871;6924:2;6912:9;6903:7;6899:23;6895:32;6892:52;;;6940:1;6937;6930:12;6892:52;6980:9;6967:23;7009:18;7050:2;7042:6;7039:14;7036:34;;;7066:1;7063;7056:12;7036:34;7105:70;7167:7;7158:6;7147:9;7143:22;7105:70;:::i;:::-;7194:8;;-1:-1:-1;7079:96:1;-1:-1:-1;7282:2:1;7267:18;;7254:32;;-1:-1:-1;7298:16:1;;;7295:36;;;7327:1;7324;7317:12;7295:36;7366:72;7430:7;7419:8;7408:9;7404:24;7366:72;:::i;:::-;7457:8;;-1:-1:-1;7340:98:1;-1:-1:-1;7545:2:1;7530:18;;7517:32;;-1:-1:-1;7561:16:1;;;7558:36;;;7590:1;7587;7580:12;7558:36;;7629:72;7693:7;7682:8;7671:9;7667:24;7629:72;:::i;:::-;6673:1088;;;;-1:-1:-1;6673:1088:1;;-1:-1:-1;6673:1088:1;;7720:8;;6673:1088;-1:-1:-1;;;6673:1088:1:o;7766:1720::-;7996:6;8004;8012;8020;8028;8036;8044;8052;8060;8068;8121:3;8109:9;8100:7;8096:23;8092:33;8089:53;;;8138:1;8135;8128:12;8089:53;8178:9;8165:23;8207:18;8248:2;8240:6;8237:14;8234:34;;;8264:1;8261;8254:12;8234:34;8303:70;8365:7;8356:6;8345:9;8341:22;8303:70;:::i;:::-;8392:8;;-1:-1:-1;8277:96:1;-1:-1:-1;8480:2:1;8465:18;;8452:32;;-1:-1:-1;8496:16:1;;;8493:36;;;8525:1;8522;8515:12;8493:36;8564:72;8628:7;8617:8;8606:9;8602:24;8564:72;:::i;:::-;8655:8;;-1:-1:-1;8538:98:1;-1:-1:-1;8743:2:1;8728:18;;8715:32;;-1:-1:-1;8759:16:1;;;8756:36;;;8788:1;8785;8778:12;8756:36;8827:72;8891:7;8880:8;8869:9;8865:24;8827:72;:::i;:::-;8918:8;;-1:-1:-1;8801:98:1;-1:-1:-1;9006:2:1;8991:18;;8978:32;;-1:-1:-1;9022:16:1;;;9019:36;;;9051:1;9048;9041:12;9019:36;9090:72;9154:7;9143:8;9132:9;9128:24;9090:72;:::i;:::-;9181:8;;-1:-1:-1;9064:98:1;-1:-1:-1;9269:3:1;9254:19;;9241:33;;-1:-1:-1;9286:16:1;;;9283:36;;;9315:1;9312;9305:12;9283:36;;9354:72;9418:7;9407:8;9396:9;9392:24;9354:72;:::i;:::-;9328:98;;9445:8;9435:18;;;9472:8;9462:18;;;7766:1720;;;;;;;;;;;;;:::o;9491:383::-;9568:6;9576;9584;9637:2;9625:9;9616:7;9612:23;9608:32;9605:52;;;9653:1;9650;9643:12;9605:52;9692:9;9679:23;9711:31;9736:5;9711:31;:::i;:::-;9761:5;9813:2;9798:18;;9785:32;;-1:-1:-1;9864:2:1;9849:18;;;9836:32;;9491:383;-1:-1:-1;;;9491:383:1:o;9879:127::-;9940:10;9935:3;9931:20;9928:1;9921:31;9971:4;9968:1;9961:15;9995:4;9992:1;9985:15;10363:127;10424:10;10419:3;10415:20;10412:1;10405:31;10455:4;10452:1;10445:15;10479:4;10476:1;10469:15;10495:125;10560:9;;;10581:10;;;10578:36;;;10594:18;;:::i;10625:168::-;10698:9;;;10729;;10746:15;;;10740:22;;10726:37;10716:71;;10767:18;;:::i;10798:217::-;10838:1;10864;10854:132;;10908:10;10903:3;10899:20;10896:1;10889:31;10943:4;10940:1;10933:15;10971:4;10968:1;10961:15;10854:132;-1:-1:-1;11000:9:1;;10798:217::o;11020:128::-;11087:9;;;11108:11;;;11105:37;;;11122:18;;:::i;11153:135::-;11192:3;11213:17;;;11210:43;;11233:18;;:::i;:::-;-1:-1:-1;11280:1:1;11269:13;;11153:135::o;11293:398::-;11495:2;11477:21;;;11534:2;11514:18;;;11507:30;11573:34;11568:2;11553:18;;11546:62;-1:-1:-1;;;11639:2:1;11624:18;;11617:32;11681:3;11666:19;;11293:398::o;13363:345::-;13565:2;13547:21;;;13604:2;13584:18;;;13577:30;-1:-1:-1;;;13638:2:1;13623:18;;13616:51;13699:2;13684:18;;13363:345::o;14813:251::-;14883:6;14936:2;14924:9;14915:7;14911:23;14907:32;14904:52;;;14952:1;14949;14942:12;14904:52;14984:9;14978:16;15003:31;15028:5;15003:31;:::i
Swarm Source
ipfs://e3ca7495f560eeed38feba96595eecb72f0b1699d1d2d706e9da83af0a31820b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.