Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 13287754 | 1155 days ago | IN | 0 ETH | 0.28478258 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Coinvise
Compiler Version
v0.7.4+commit.3f05b770
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-24 */ // Sources flattened with hardhat v2.1.1 https://hardhat.org // File @openzeppelin/contracts-upgradeable/utils/[email protected] // SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: value}( data ); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts-upgradeable/proxy/[email protected] // License: MIT // solhint-disable-next-line compiler-version pragma solidity >=0.4.24 <0.8.0; /** * @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 a proxied contract can't have 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. * * 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 {UpgradeableProxy-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. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require( _initializing || _isConstructor() || !_initialized, "Initializable: contract is already initialized" ); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // License: MIT pragma solidity >=0.6.0 <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 GSN 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 ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer {} function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] // License: MIT pragma solidity >=0.6.0 <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 OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } // File @openzeppelin/contracts/token/ERC20/[email protected] // License: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); } // File @openzeppelin/contracts/math/[email protected] // License: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File @openzeppelin/contracts/utils/[email protected] // License: MIT pragma solidity >=0.6.2 <0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: value}( data ); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/[email protected] // License: MIT pragma solidity >=0.6.0 <0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value) ); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value) ); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, value) ); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add( value ); _callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub( value, "SafeERC20: decreased allowance below zero" ); _callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall( data, "SafeERC20: low-level call failed" ); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require( abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed" ); } } } // File contracts/lib/EIP712MetaTransactionUpgradeable/EIP712BaseUpgradeable.sol //License: MIT pragma solidity ^0.7.4; contract EIP712BaseUpgradeable is Initializable { struct EIP712Domain { string name; string version; uint256 salt; address verifyingContract; } bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256( bytes( "EIP712Domain(string name,string version,uint256 salt,address verifyingContract)" ) ); bytes32 internal domainSeperator; function _initialize(string memory name, string memory version) public virtual initializer { domainSeperator = keccak256( abi.encode( EIP712_DOMAIN_TYPEHASH, keccak256(bytes(name)), keccak256(bytes(version)), getChainID(), address(this) ) ); } function getChainID() internal pure returns (uint256 id) { assembly { id := chainid() } } function getDomainSeperator() private view returns (bytes32) { return domainSeperator; } /** * Accept message hash and returns hash message in EIP712 compatible form * So that it can be used to recover signer from signature signed using EIP712 formatted data * https://eips.ethereum.org/EIPS/eip-712 * "\\x19" makes the encoding deterministic * "\\x01" is the version byte to make it compatible to EIP-191 */ function toTypedMessageHash(bytes32 messageHash) internal view returns (bytes32) { return keccak256( abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash) ); } } // File contracts/lib/EIP712MetaTransactionUpgradeable/EIP712MetaTransactionUpgradeable.sol //License: MIT pragma solidity ^0.7.4; contract EIP712MetaTransactionUpgradeable is Initializable, EIP712BaseUpgradeable { using SafeMath for uint256; bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256( bytes( "MetaTransaction(uint256 nonce,address from,bytes functionSignature)" ) ); event MetaTransactionExecuted( address userAddress, address payable relayerAddress, bytes functionSignature ); mapping(address => uint256) private nonces; /* * Meta transaction structure. * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas * He should call the desired function directly in that case. */ struct MetaTransaction { uint256 nonce; address from; bytes functionSignature; } function _initialize(string memory _name, string memory _version) public override initializer { EIP712BaseUpgradeable._initialize(_name, _version); } function convertBytesToBytes4(bytes memory inBytes) internal pure returns (bytes4 outBytes4) { if (inBytes.length == 0) { return 0x0; } assembly { outBytes4 := mload(add(inBytes, 32)) } } function executeMetaTransaction( address userAddress, bytes memory functionSignature, bytes32 sigR, bytes32 sigS, uint8 sigV ) public payable virtual returns (bytes memory) { bytes4 destinationFunctionSig = convertBytesToBytes4(functionSignature); require( destinationFunctionSig != msg.sig, "functionSignature can not be of executeMetaTransaction method" ); MetaTransaction memory metaTx = MetaTransaction({ nonce: nonces[userAddress], from: userAddress, functionSignature: functionSignature }); require( verify(userAddress, metaTx, sigR, sigS, sigV), "Signer and signature do not match" ); nonces[userAddress] = nonces[userAddress].add(1); // Append userAddress at the end to extract it from calling context (bool success, bytes memory returnData) = address(this).call( abi.encodePacked(functionSignature, userAddress) ); require(success, "Function call not successful"); emit MetaTransactionExecuted( userAddress, msg.sender, functionSignature ); return returnData; } function hashMetaTransaction(MetaTransaction memory metaTx) internal pure returns (bytes32) { return keccak256( abi.encode( META_TRANSACTION_TYPEHASH, metaTx.nonce, metaTx.from, keccak256(metaTx.functionSignature) ) ); } function getNonce(address user) external view returns (uint256 nonce) { nonce = nonces[user]; } function verify( address user, MetaTransaction memory metaTx, bytes32 sigR, bytes32 sigS, uint8 sigV ) internal view returns (bool) { address signer = ecrecover( toTypedMessageHash(hashMetaTransaction(metaTx)), sigV, sigR, sigS ); require(signer != address(0), "Invalid signature"); return signer == user; } function msgSender() internal view returns (address sender) { if (msg.sender == address(this)) { bytes memory array = msg.data; uint256 index = msg.data.length; assembly { // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those. sender := and( mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff ) } } else { sender = msg.sender; } return sender; } } // File contracts/Coinvise.sol //License: Unlicensed pragma solidity 0.7.4; pragma experimental ABIEncoderV2; // import "hardhat/console.sol"; interface IERC20Extended is IERC20 { function decimals() external view returns (uint8); } contract Coinvise is Initializable, OwnableUpgradeable, EIP712MetaTransactionUpgradeable { using SafeMath for uint256; using SafeERC20 for IERC20Extended; using SafeERC20 for IERC20; event CampaignCreated(uint256 indexed campaignId); event UserRewarded( address indexed managerAddress, uint256 indexed campaignId, address indexed userAddress, address tokenAddress, uint256 amount ); event Multisent( address indexed tokenAddress, uint256 recipientsAmount, uint256 amount ); event Withdrawn(address indexed recipient, uint256 amount); event Deposited( uint256 depositId, address indexed depositor, address token, uint256 amount, uint256 price ); event Bought( address user, uint256 depositId, address owner, address token, uint256 amount, uint256 price ); event WithdrawnDepositOwnerBalance(address user, uint256 amount); struct Campaign { uint256 campaignId; address manager; address tokenAddress; uint256 initialBalance; uint256 remainingBalance; uint256 linksAmount; uint256 amountPerLink; uint256 linksRewardedCount; } struct Deposit { uint256 depositId; address owner; address token; uint256 initialBalance; uint256 remainingBalance; uint256 price; } /** * @dev Following are the state variables for this contract * Due to resrictions of the proxy pattern, do not change the type or order * of the state variables. * https://docs.openzeppelin.com/upgrades-plugins/1.x/writing-upgradeable */ uint256 totalDepositOwnersBalanceInWei; // Next campaign ID by manager mapping(address => uint256) internal nextCampaignId; // All campaigns (userAddress => campaignId => Campaign) mapping(address => mapping(uint256 => Campaign)) internal campaigns; // All campaign IDs of a user (userAddress => campaignIds[]) mapping(address => uint256[]) internal campaignIds; // Rewarded addresses by a campaign (campaignId => userAddress[]) mapping(address => mapping(uint256 => mapping(address => bool))) internal addressRewarded; // Rewarded links by a campaign (campaignId => slug[]) mapping(uint256 => mapping(string => bool)) internal linksRewarded; // Next deposit ID by owner mapping(address => uint256) internal nextDepositId; // Deposits by user (userAddress => (depositId => deposit) mapping(address => mapping(uint256 => Deposit)) internal deposits; // All deposits IDs of a user (userAddress => depositIds[]) mapping(address => uint256[]) internal depositIds; // Balances by owner mapping(address => uint256) internal depositOwnersBalancesInWei; // This is an address whose private key lives in the coinvise backend // Used for signature verification address private trustedAddress; // Premiums Charged on Various Services uint256 public airdropPerLinkWeiCharged; uint256 public multisendPerLinkWeiCharged; uint256 public depositPercentageCharged; uint256 public depositPercentageChargedDecimals; // Add any new state variables here // ETH pseudo-address address private constant ETHAddress = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; // End of state variables /** * @dev We cannot have constructors in upgradeable contracts, * therefore we define an initialize function which we call * manually once the contract is deployed. * the initializer modififer ensures that this can only be called once. * in practice, the openzeppelin library automatically calls the intitazie * function once deployed. */ function initialize( address _trustedAddress, uint256 _airdropPerLinkWeiCharged, uint256 _multisendPerLinkWeiCharged, uint256 _depositPercentageCharged, uint256 _depositPercentageChargedDecimals ) public initializer { require( _trustedAddress != address(0), "ERR__INVALID_TRUSTEDADDRESS_0x0" ); // Call intialize of Base Contracts require(_trustedAddress != address(0), "ERR__0x0_TRUSTEDADDRESS"); OwnableUpgradeable.__Ownable_init(); EIP712MetaTransactionUpgradeable._initialize("Coinvise", "1"); trustedAddress = _trustedAddress; // Set premiums require(_depositPercentageCharged < 30, "ERR_DEPOSIT_FEE_TOO_HIGH"); airdropPerLinkWeiCharged = _airdropPerLinkWeiCharged; multisendPerLinkWeiCharged = _multisendPerLinkWeiCharged; depositPercentageCharged = _depositPercentageCharged; depositPercentageChargedDecimals = _depositPercentageChargedDecimals; } function setAirdropPremiums(uint256 _airdropPerLinkWeiCharged) external onlyOwner { airdropPerLinkWeiCharged = _airdropPerLinkWeiCharged; } function setMultisendPremiums(uint256 _mulisendPerLinkWeiCharged) external onlyOwner { multisendPerLinkWeiCharged = _mulisendPerLinkWeiCharged; } function setDepositPremiums( uint256 _depositPercentageCharged, uint256 _depositPercentageChargedDecimals ) external onlyOwner { require(_depositPercentageCharged < 30, "ERR_DEPOSIT_FEE_TOO_HIGH"); depositPercentageCharged = _depositPercentageCharged; depositPercentageChargedDecimals = _depositPercentageChargedDecimals; } function setTrustedAddress(address _trustedAddress) external onlyOwner { require(_trustedAddress != address(0), "ERR__0x0_TRUSTEDADDRESS"); trustedAddress = _trustedAddress; } function withdraw() external onlyOwner { uint256 totalBalance = address(this).balance; uint256 balance = totalBalance.sub(totalDepositOwnersBalanceInWei); msg.sender.transfer(balance); emit Withdrawn(msg.sender, balance); } // Generate Links function _createCampaign( address _tokenAddress, uint256 _linksAmount, uint256 _amountPerLink ) internal returns (uint256 _campaignId) { require( _linksAmount > 0, "ERR__LINKS_AMOUNT_MUST_BE_GREATHER_THAN_ZERO" ); require( _amountPerLink > 0, "ERR__AMOUNT_PER_LINK_MUST_BE_GREATHER_THAN_ZERO" ); uint256 _initialBalance = _linksAmount.mul(_amountPerLink); address _sender = msgSender(); if (_tokenAddress != ETHAddress) IERC20(_tokenAddress).safeTransferFrom( _sender, address(this), _initialBalance ); _campaignId = getCampaignId(); Campaign memory _campaign = Campaign({ campaignId: _campaignId, manager: _sender, tokenAddress: _tokenAddress, initialBalance: _initialBalance, remainingBalance: _initialBalance, linksAmount: _linksAmount, amountPerLink: _amountPerLink, linksRewardedCount: 0 }); campaigns[_sender][_campaignId] = _campaign; campaignIds[_sender].push(_campaignId); emit CampaignCreated(_campaignId); return _campaignId; } function createCampaign( address _tokenAddress, uint256 _linksAmount, uint256 _amountPerLink ) external payable returns (uint256 _campaignId) { uint256 priceInWei = airdropPerLinkWeiCharged * _linksAmount; _tokenAddress == ETHAddress ? require( msg.value == _linksAmount.mul(_amountPerLink).add(priceInWei), "ERR__TOTAL_ETH_AMOUNT_PER_LINK_MUST_BE_PAID" ) : require( msg.value == priceInWei, "ERR__CAMPAIGN_PRICE_MUST_BE_PAID" ); return _createCampaign(_tokenAddress, _linksAmount, _amountPerLink); } function getCampaign(address _campaignManager, uint256 _campaignId) external view returns ( uint256, address, address, uint256, uint256, uint256, uint256, uint256 ) { require( campaigns[_campaignManager][_campaignId].campaignId == _campaignId, "ERR__CAMPAIGN_DOES_NOT_EXIST" ); Campaign memory _campaign = campaigns[_campaignManager][_campaignId]; return ( _campaign.campaignId, _campaign.manager, _campaign.tokenAddress, _campaign.initialBalance, _campaign.remainingBalance, _campaign.linksAmount, _campaign.amountPerLink, _campaign.linksRewardedCount ); } function getCampaignIdsFromManager(address _campaignManager) external view returns (uint256[] memory) { return campaignIds[_campaignManager]; } function claim( address _campaignManager, uint256 _campaignId, bytes32 r, bytes32 s, uint8 v ) external { require( campaigns[_campaignManager][_campaignId].campaignId == _campaignId, "ERR__CAMPAIGN_DOES_NOT_EXIST" ); address _claimer = msgSender(); Campaign memory _campaign = campaigns[_campaignManager][_campaignId]; require( addressRewarded[_campaignManager][_campaignId][_claimer] != true, "ERR__ADDRESS_ALREADY_REWARDED" ); // require(linksRewarded[_campaignId][_slug] != true, "ERR__LINK_ALREADY_REWARDED"); // Check if signature is correct bytes32 messageHash = keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n32", keccak256(abi.encode(_campaignManager, _campaignId, _claimer)) ) ); address signer = ecrecover(messageHash, v, r, s); require(signer != address(0), "ERR__0x0_SIGNER"); require(signer == trustedAddress, "ERR__INVALID_SIGNER"); require( _campaign.linksRewardedCount < _campaign.linksAmount, "ERR__ALL_LINKS_USED" ); require( _campaign.remainingBalance >= _campaign.amountPerLink, "ERR_NOT_ENOUGH_BALANCE_FOR_REWARDING" ); address _token = _campaign.tokenAddress; _token == ETHAddress ? payable(_claimer).transfer(_campaign.amountPerLink) : IERC20(_token).safeTransfer(_claimer, _campaign.amountPerLink); // Mark as rewarded addressRewarded[_campaignManager][_campaignId][_claimer] = true; campaigns[_campaignManager][_campaignId].linksRewardedCount = _campaign .linksRewardedCount .add(1); campaigns[_campaignManager][_campaignId].remainingBalance = _campaign .remainingBalance .sub(_campaign.amountPerLink); // Emit event emit UserRewarded( _campaignManager, _campaignId, _claimer, _token, _campaign.amountPerLink ); } function withdrawRemainingBalanceFromCampaign(uint256 _campaignId) external { require( campaigns[msg.sender][_campaignId].campaignId == _campaignId, "ERR__CAMPAIGN_BY_SENDER_DOES_NOT_EXIST" ); Campaign memory _campaign = campaigns[msg.sender][_campaignId]; require( _campaign.remainingBalance > 0, "ERR__ZERO_REMAINING_BALANCE_FOR_WITHDRAWAL" ); address _token = _campaign.tokenAddress; campaigns[_campaign.manager][_campaignId].remainingBalance = 0; _token == ETHAddress ? payable(_campaign.manager).transfer(_campaign.remainingBalance) : IERC20(_token).safeTransfer( _campaign.manager, _campaign.remainingBalance ); } function _multisend( address _token, address[] memory _recipients, uint256[] memory _amounts, uint256 _totalAmount ) internal { uint256 recipientsLength = _recipients.length; uint256 amountsLength = _amounts.length; require(amountsLength == recipientsLength, "ERR__INVALID_ARGS"); address _user = msgSender(); if (_token == ETHAddress) for (uint8 i = 0; i < recipientsLength; i++) payable(_recipients[i]).transfer(_amounts[i]); else for (uint8 i = 0; i < recipientsLength; i++) IERC20(_token).safeTransferFrom( _user, _recipients[i], _amounts[i] ); // Emit event emit Multisent(_token, recipientsLength, _totalAmount); } function multisend( address _token, address[] memory _recipients, uint256[] memory _amounts ) external payable { uint256 recipientsLength = _recipients.length; uint256 _totalAmount = 0; for (uint8 i = 0; i < recipientsLength; i++) _totalAmount = _totalAmount.add(_amounts[i]); _token == ETHAddress ? require( msg.value == _totalAmount.add( multisendPerLinkWeiCharged.mul(recipientsLength) ), "ERR__MULTISEND_TOTAL_ETH_AMOUNT_MUST_BE_PAID" ) : require( msg.value == multisendPerLinkWeiCharged * recipientsLength, "ERR__MULTISEND_PRICE_MUST_BE_PAID" ); _multisend(_token, _recipients, _amounts, _totalAmount); } // function multisendMeta( // address _token, // address[] memory _recipients, // uint256[] memory _amounts // ) external { // _multisend(_token, _recipients, _amounts); // } function getCampaignId() internal returns (uint256 _campaignId) { address _campaignManager = msg.sender; _campaignId = nextCampaignId[_campaignManager]; if (_campaignId <= 0) { _campaignId = 1; } nextCampaignId[_campaignManager] = _campaignId.add(1); return _campaignId; } function getCampaignRewardedCount(address _manager, uint256 _campaignId) external view returns (uint256) { return campaigns[_manager][_campaignId].linksRewardedCount; } function _depositToken( address _token, uint256 _amount, uint256 _price ) internal returns (uint256 _depositId) { require(_amount > 0, "ERR__AMOUNT_MUST_BE_GREATHER_THAN_ZERO"); require(_price > 0, "ERR__PRICE_MUST_BE_GREATHER_THAN_ZERO"); IERC20Extended tokenContract = IERC20Extended(_token); address _owner = msg.sender; tokenContract.safeTransferFrom(_owner, address(this), _amount); _depositId = getDepositId(); Deposit memory _deposit = Deposit({ depositId: _depositId, owner: _owner, token: _token, initialBalance: _amount, remainingBalance: _amount, price: _price }); deposits[_owner][_depositId] = _deposit; depositIds[_owner].push(_depositId); emit Deposited(_depositId, _owner, _token, _amount, _price); } function depositToken( address _token, uint256 _amount, uint256 _price ) external payable returns (uint256 _depositId) { IERC20Extended tokenContract = IERC20Extended(_token); uint256 decimalsZeros = 10**tokenContract.decimals(); // Fee = 2% of the total. (tokenAmount * values.tokenPrice * 0.02) / depositPercentageChargedDecimals // (depositPercentageChargedDecimals is used for when depositPercentageCharged < 0.01) // OLD // uint256 priceInWei = _price // .mul(_amount) // .div(decimalsZeros) // .mul(depositPercentageCharged) // .div(100) // .div(10**depositPercentageChargedDecimals); // Same formula but only dividing once, avoiding truncation as much as possible uint256 bigTotal = _price.mul(_amount).mul(depositPercentageCharged); uint256 zeroes = decimalsZeros.mul(100).mul( 10**depositPercentageChargedDecimals ); uint256 priceInWei = bigTotal.div(zeroes); require(priceInWei > 0, "ERR__A_PRICE_MUST_BE_PAID"); require(msg.value == priceInWei, "ERR__PRICE_MUST_BE_PAID"); return _depositToken(_token, _amount, _price); } function getDepositIdsFromOwner(address _owner) external view returns (uint256[] memory) { return depositIds[_owner]; } function getDeposit(address _owner, uint256 _depositId) external view returns ( uint256, address, address, uint256, uint256, uint256 ) { require( deposits[_owner][_depositId].depositId == _depositId, "ERR__DEPOSIT_DOES_NOT_EXIST" ); Deposit memory _deposit = deposits[_owner][_depositId]; return ( _deposit.depositId, _deposit.owner, _deposit.token, _deposit.initialBalance, _deposit.remainingBalance, _deposit.price ); } function buyToken( uint256 _depositId, address payable _owner, uint256 _amount ) external payable { require( deposits[_owner][_depositId].depositId == _depositId, "ERR__DEPOSIT_DOES_NOT_EXIST" ); Deposit memory _deposit = deposits[_owner][_depositId]; require(_amount > 0, "ERR__AMOUNT_MUST_BE_GREATHER_THAN_ZERO"); require( _deposit.remainingBalance >= _amount, "ERR_NOT_ENOUGH_BALANCE_TO_BUY" ); IERC20Extended tokenContract = IERC20Extended(_deposit.token); uint256 decimalsZeros = 10**tokenContract.decimals(); uint256 totalPrice = _deposit.price.mul(_amount).div(decimalsZeros); require(totalPrice > 0, "ERR__A_PRICE_MUST_BE_PAID"); require(msg.value == totalPrice, "ERR__TOTAL_PRICE_MUST_BE_PAID"); deposits[_owner][_depositId].remainingBalance = _deposit .remainingBalance .sub(_amount); IERC20(_deposit.token).safeTransfer(msg.sender, _amount); depositOwnersBalancesInWei[_owner] = depositOwnersBalancesInWei[_owner] .add(msg.value); totalDepositOwnersBalanceInWei = totalDepositOwnersBalanceInWei.add( msg.value ); emit Bought( msg.sender, _depositId, _owner, _deposit.token, _amount, _deposit.price ); } function withdrawDeposit(uint256 _depositId) external { address _owner = msg.sender; require( deposits[_owner][_depositId].depositId == _depositId, "ERR__DEPOSIT_DOES_NOT_EXIST" ); Deposit memory _deposit = deposits[_owner][_depositId]; require(_deposit.remainingBalance > 0, "ERR_NO_BALANCE_TO_WITHDRAW"); deposits[_owner][_depositId].remainingBalance = 0; delete deposits[_owner][_depositId]; IERC20(_deposit.token).safeTransfer(_owner, _deposit.remainingBalance); } function withdrawDepositOwnerBalance() external { address payable owner = msg.sender; require( depositOwnersBalancesInWei[owner] > 0, "ERR_NO_BALANCE_TO_WITHDRAW" ); uint256 toWithdraw = depositOwnersBalancesInWei[owner]; depositOwnersBalancesInWei[owner] = 0; totalDepositOwnersBalanceInWei = totalDepositOwnersBalanceInWei.sub( toWithdraw ); require( totalDepositOwnersBalanceInWei >= 0, "ERR_NO_GENERAL_BALANCE_TO_WITHDRAW" ); owner.transfer(toWithdraw); emit WithdrawnDepositOwnerBalance(owner, toWithdraw); } function getDepositOwnerBalance() external view returns (uint256) { return depositOwnersBalancesInWei[msg.sender]; } function getCoinviseBalance() external view returns (uint256) { uint256 totalBalance = address(this).balance; return totalBalance.sub(totalDepositOwnersBalanceInWei); } function getDepositId() internal returns (uint256 _depositId) { _depositId = nextDepositId[msg.sender]; if (_depositId <= 0) { _depositId = 1; } nextDepositId[msg.sender] = _depositId.add(1); return _depositId; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"Bought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"campaignId","type":"uint256"}],"name":"CampaignCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"recipientsAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Multisent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"managerAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"campaignId","type":"uint256"},{"indexed":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UserRewarded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawnDepositOwnerBalance","type":"event"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_version","type":"string"}],"name":"_initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"airdropPerLinkWeiCharged","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositId","type":"uint256"},{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"buyToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_campaignManager","type":"address"},{"internalType":"uint256","name":"_campaignId","type":"uint256"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_linksAmount","type":"uint256"},{"internalType":"uint256","name":"_amountPerLink","type":"uint256"}],"name":"createCampaign","outputs":[{"internalType":"uint256","name":"_campaignId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"depositPercentageCharged","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositPercentageChargedDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"depositToken","outputs":[{"internalType":"uint256","name":"_depositId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_campaignManager","type":"address"},{"internalType":"uint256","name":"_campaignId","type":"uint256"}],"name":"getCampaign","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_campaignManager","type":"address"}],"name":"getCampaignIdsFromManager","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"},{"internalType":"uint256","name":"_campaignId","type":"uint256"}],"name":"getCampaignRewardedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCoinviseBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_depositId","type":"uint256"}],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getDepositIdsFromOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDepositOwnerBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_trustedAddress","type":"address"},{"internalType":"uint256","name":"_airdropPerLinkWeiCharged","type":"uint256"},{"internalType":"uint256","name":"_multisendPerLinkWeiCharged","type":"uint256"},{"internalType":"uint256","name":"_depositPercentageCharged","type":"uint256"},{"internalType":"uint256","name":"_depositPercentageChargedDecimals","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"multisend","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"multisendPerLinkWeiCharged","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_airdropPerLinkWeiCharged","type":"uint256"}],"name":"setAirdropPremiums","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositPercentageCharged","type":"uint256"},{"internalType":"uint256","name":"_depositPercentageChargedDecimals","type":"uint256"}],"name":"setDepositPremiums","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mulisendPerLinkWeiCharged","type":"uint256"}],"name":"setMultisendPremiums","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_trustedAddress","type":"address"}],"name":"setTrustedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositId","type":"uint256"}],"name":"withdrawDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawDepositOwnerBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_campaignId","type":"uint256"}],"name":"withdrawRemainingBalanceFromCampaign","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50613d21806100206000396000f3fe6080604052600436106101d85760003560e01c8063887470d711610102578063b08328b411610095578063ec744d3811610064578063ec744d381461050b578063f2fde38b14610520578063f3e6264014610540578063f92ad21914610553576101d8565b8063b08328b41461048d578063b8de81bd146104c1578063cbc9fe00146104e1578063da6c1dd3146104f6576101d8565b8063963084a0116100d1578063963084a01461043257806399c6d2de14610452578063a8776b4e14610465578063ad8733ca1461047a576101d8565b8063887470d7146103b05780638cbfc305146103d05780638da5cb5b146103f057806396057cbd14610412576101d8565b80633ccfd60b1161017a5780635b6d6b57116101495780635b6d6b57146103395780636a8df47a1461034e5780636dfea7c41461036e578063715018a61461039b576101d8565b80633ccfd60b146102dc57806343d648e0146102f1578063461b6004146103065780634845876414610319576101d8565b80632726b506116101b65780632726b506146102485780632d0335ab1461027a57806333289a46146102a7578063337caa80146102c7576101d8565b8063098dce13146101dd5780630c53c51c146101ff5780631cb2acba14610228575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004612e2e565b610573565b005b61021261020d366004612caf565b61060b565b60405161021f919061317b565b60405180910390f35b34801561023457600080fd5b506101fd610243366004612e8f565b6107cc565b34801561025457600080fd5b50610268610263366004612d25565b610810565b60405161021f96959493929190613b1f565b34801561028657600080fd5b5061029a610295366004612bbf565b6108e9565b60405161021f9190613b16565b3480156102b357600080fd5b506101fd6102c2366004612e8f565b610904565b3480156102d357600080fd5b5061029a610a45565b3480156102e857600080fd5b506101fd610a59565b3480156102fd57600080fd5b5061029a610b21565b61029a610314366004612d97565b610b27565b34801561032557600080fd5b506101fd610334366004612e8f565b610bbf565b34801561034557600080fd5b5061029a610c03565b34801561035a57600080fd5b506101fd610369366004612ede565b610c09565b34801561037a57600080fd5b5061038e610389366004612bbf565b610c73565b60405161021f91906130c9565b3480156103a757600080fd5b506101fd610ce0565b3480156103bc57600080fd5b506101fd6103cb366004612e8f565b610d69565b3480156103dc57600080fd5b506101fd6103eb366004612bbf565b610f02565b3480156103fc57600080fd5b50610405610f89565b60405161021f9190612fe6565b34801561041e57600080fd5b5061038e61042d366004612bbf565b610f98565b34801561043e57600080fd5b506101fd61044d366004612d50565b611002565b61029a610460366004612d97565b6113e7565b34801561047157600080fd5b506101fd611511565b6101fd610488366004612bdb565b6115de565b34801561049957600080fd5b506104ad6104a8366004612d25565b6116b8565b60405161021f989796959493929190613b53565b3480156104cd57600080fd5b5061029a6104dc366004612d25565b6117b3565b3480156104ed57600080fd5b5061029a6117e1565b34801561050257600080fd5b5061029a6117e7565b34801561051757600080fd5b5061029a6117ed565b34801561052c57600080fd5b506101fd61053b366004612bbf565b611806565b6101fd61054e366004612ea7565b6118c7565b34801561055f57600080fd5b506101fd61056e366004612dcb565b611b93565b600054610100900460ff168061058c575061058c611d01565b8061059a575060005460ff16155b6105bf5760405162461bcd60e51b81526004016105b69061378a565b60405180910390fd5b600054610100900460ff161580156105ea576000805460ff1961ff0019909116610100171660011790555b6105f48383611d12565b8015610606576000805461ff00191690555b505050565b6060600061061886611dfe565b90506000356001600160e01b0319908116908216141561064a5760405162461bcd60e51b81526004016105b69061328e565b610652612a21565b50604080516060810182526001600160a01b038916600081815260666020908152908490205483528201529081018790526106908882888888611e1a565b6106ac5760405162461bcd60e51b81526004016105b690613901565b6001600160a01b0388166000908152606660205260409020546106d0906001611ec6565b6001600160a01b038916600090815260666020908152604080832093909355915190916060913091610706918c918e9101612f63565b60408051601f198184030181529082905261072091612f47565b6000604051808303816000865af19150503d806000811461075d576040519150601f19603f3d011682016040523d82523d6000602084013e610762565b606091505b5091509150816107845760405162461bcd60e51b81526004016105b690613257565b7f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b8a338b6040516107b79392919061304d565b60405180910390a19998505050505050505050565b6107d4611eeb565b6001600160a01b03166107e5610f89565b6001600160a01b03161461080b5760405162461bcd60e51b81526004016105b690613895565b607355565b6001600160a01b0382166000908152606e6020908152604080832084845290915281205481908190819081908190871461085c5760405162461bcd60e51b81526004016105b6906131da565b610864612a4b565b505050506001600160a01b039485166000908152606e6020908152604080832096835295815290859020855160c081018752815480825260018301548916938201849052600283015490981696810187905260038201546060820181905260048301546080830181905260059093015460a09092018290529798929795509093509150565b6001600160a01b031660009081526066602052604090205490565b336000818152606e60209081526040808320858452909152902054821461093d5760405162461bcd60e51b81526004016105b6906131da565b610945612a4b565b506001600160a01b038082166000908152606e60209081526040808320868452825291829020825160c0810184528154815260018201548516928101929092526002810154909316918101919091526003820154606082015260048201546080820181905260059092015460a0820152906109d25760405162461bcd60e51b81526004016105b6906133bd565b6001600160a01b038281166000908152606e60209081526040808320878452909152808220600481018390558281556001810180546001600160a01b0319908116909155600282018054909116905560038101839055600501919091556080830151908301516106069216908490611eef565b336000908152607060205260409020545b90565b610a61611eeb565b6001600160a01b0316610a72610f89565b6001600160a01b031614610a985760405162461bcd60e51b81526004016105b690613895565b6067544790600090610aab908390611f45565b604051909150339082156108fc029083906000818181858888f19350505050158015610adb573d6000803e3d6000fd5b50336001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d582604051610b159190613b16565b60405180910390a25050565b60745481565b60725460009083026001600160a01b03851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610b7757803414610b725760405162461bcd60e51b81526004016105b690613ae1565b610ba9565b610b8b81610b858686611f6d565b90611ec6565b3414610ba95760405162461bcd60e51b81526004016105b69061364d565b610bb4858585611fa7565b9150505b9392505050565b610bc7611eeb565b6001600160a01b0316610bd8610f89565b6001600160a01b031614610bfe5760405162461bcd60e51b81526004016105b690613895565b607255565b60725481565b610c11611eeb565b6001600160a01b0316610c22610f89565b6001600160a01b031614610c485760405162461bcd60e51b81526004016105b690613895565b601e8210610c685760405162461bcd60e51b81526004016105b6906138ca565b607491909155607555565b6001600160a01b0381166000908152606a6020908152604091829020805483518184028101840190945280845260609392830182828015610cd357602002820191906000526020600020905b815481526020019060010190808311610cbf575b505050505090505b919050565b610ce8611eeb565b6001600160a01b0316610cf9610f89565b6001600160a01b031614610d1f5760405162461bcd60e51b81526004016105b690613895565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b3360009081526069602090815260408083208484529091529020548114610da25760405162461bcd60e51b81526004016105b6906139f1565b610daa612a93565b503360009081526069602090815260408083208484528252918290208251610100810184528154815260018201546001600160a01b039081169382019390935260028201549092169282019290925260038201546060820152600482015460808201819052600583015460a0830152600683015460c083015260079092015460e082015290610e4b5760405162461bcd60e51b81526004016105b6906133f4565b6040808201516020808401516001600160a01b039081166000908152606983528481208782529092529281206004015590811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610ebb5760208201516080830151610eb6916001600160a01b03841691611eef565b610606565b81602001516001600160a01b03166108fc83608001519081150290604051600060405180830381858888f19350505050158015610efc573d6000803e3d6000fd5b50505050565b610f0a611eeb565b6001600160a01b0316610f1b610f89565b6001600160a01b031614610f415760405162461bcd60e51b81526004016105b690613895565b6001600160a01b038116610f675760405162461bcd60e51b81526004016105b6906132eb565b607180546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031690565b6001600160a01b0381166000908152606f6020908152604091829020805483518184028101840190945280845260609392830182828015610cd35760200282019190600052602060002090815481526020019060010190808311610cbf5750505050509050919050565b6001600160a01b038516600090815260696020908152604080832087845290915290205484146110445760405162461bcd60e51b81526004016105b6906135df565b600061104e6121ef565b9050611058612a93565b506001600160a01b0380871660008181526069602090815260408083208a845282528083208151610100810183528154815260018083015488168286015260028301548816828501526003830154606083015260048301546080830152600583015460a0830152600683015460c083015260079092015460e0820152948452606b83528184208b85528352818420958716845294909152902054909160ff909116151514156111195760405162461bcd60e51b81526004016105b69061381d565b6000878784604051602001611130939291906130a6565b604051602081830303815290604052805190602001206040516020016111569190612f9a565b604051602081830303815290604052805190602001209050600060018286898960405160008152602001604052604051611193949392919061315d565b6020604051602081039080840390855afa1580156111b5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166111e85760405162461bcd60e51b81526004016105b690613a81565b6071546001600160a01b038281169116146112155760405162461bcd60e51b81526004016105b69061343e565b8260a001518360e001511061123c5760405162461bcd60e51b81526004016105b690613390565b8260c00151836080015110156112645760405162461bcd60e51b81526004016105b69061370f565b60408301516001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146112ad5760c08401516112a8906001600160a01b038316908790611eef565b6112e8565b60c08401516040516001600160a01b0387169180156108fc02916000818181858888f193505050501580156112e6573d6000803e3d6000fd5b505b6001600160a01b03808b166000908152606b602090815260408083208d84528252808320938916835292905220805460ff1916600190811790915560e085015161133191611ec6565b6001600160a01b038b1660009081526069602090815260408083208d845290915290206007015560c0840151608085015161136b91611f45565b6001600160a01b03808c1660008181526069602090815260408083208f8452909152908190206004019390935560c08701519251918816928c927f06393144cb37277ba0e7aec9e82a50974ff3eb81b523dce68b403e11ec4ef419916113d391879190612ffa565b60405180910390a450505050505050505050565b6000808490506000816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561142857600080fd5b505afa15801561143c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114609190612eff565b60ff16600a0a905060006114896074546114838888611f6d90919063ffffffff16565b90611f6d565b905060006114aa607554600a0a611483606486611f6d90919063ffffffff16565b905060006114b8838361224c565b9050600081116114da5760405162461bcd60e51b81526004016105b690613616565b8034146114f95760405162461bcd60e51b81526004016105b690613359565b61150489898961227e565b9998505050505050505050565b3360008181526070602052604090205461153d5760405162461bcd60e51b81526004016105b6906133bd565b6001600160a01b038116600090815260706020526040812080549190556067546115679082611f45565b6067556040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156115a0573d6000803e3d6000fd5b507fd0c16bf212a1f1186e895b15e5240571ee9cc35f77e950dfd34b8393f712da6b82826040516115d2929190612ffa565b60405180910390a15050565b81516000805b828160ff16101561162257611618848260ff168151811061160157fe5b602002602001015183611ec690919063ffffffff16565b91506001016115e4565b506001600160a01b03851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461166f578160735402341461166a5760405162461bcd60e51b81526004016105b690613979565b6116a5565b607354611687906116809084611f6d565b8290611ec6565b34146116a55760405162461bcd60e51b81526004016105b69061318e565b6116b1858585846123e8565b5050505050565b6001600160a01b0382166000908152606960209081526040808320848452909152812054819081908190819081908190819089146117085760405162461bcd60e51b81526004016105b6906135df565b611710612a93565b505050506001600160a01b03968716600090815260696020908152604080832098835297815290879020875161010081018952815480825260018301548b169382018490526002830154909a16988101899052600382015460608201819052600483015460808301819052600584015460a08401819052600685015460c0850181905260079095015460e09094018490529b9c949b919950975095509093509150565b6001600160a01b03821660009081526069602090815260408083208484529091529020600701545b92915050565b60735481565b60755481565b6067546000904790611800908290611f45565b91505090565b61180e611eeb565b6001600160a01b031661181f610f89565b6001600160a01b0316146118455760405162461bcd60e51b81526004016105b690613895565b6001600160a01b03811661186b5760405162461bcd60e51b81526004016105b690613211565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382166000908152606e6020908152604080832086845290915290205483146119095760405162461bcd60e51b81526004016105b6906131da565b611911612a4b565b506001600160a01b038083166000908152606e60209081526040808320878452825291829020825160c081018452815481526001820154851692810192909252600281015490931691810191909152600382015460608201526004820154608082015260059091015460a08201528161199c5760405162461bcd60e51b81526004016105b6906134ba565b81816080015110156119c05760405162461bcd60e51b81526004016105b690613753565b6000816040015190506000816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611a0457600080fd5b505afa158015611a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3c9190612eff565b60ff16600a0a90506000611a6782611a61878760a00151611f6d90919063ffffffff16565b9061224c565b905060008111611a895760405162461bcd60e51b81526004016105b690613616565b803414611aa85760405162461bcd60e51b81526004016105b690613aaa565b6080840151611ab79086611f45565b6001600160a01b038088166000908152606e602090815260408083208c8452909152908190206004019290925590850151611af491163387611eef565b6001600160a01b038616600090815260706020526040902054611b179034611ec6565b6001600160a01b038716600090815260706020526040902055606754611b3d9034611ec6565b60675560408085015160a086015191517f842e66351f2f91f26dfe775da328f23de5cae382c37d0988d103d579704b55f392611b829233928c928c92918c9190613013565b60405180910390a150505050505050565b600054610100900460ff1680611bac5750611bac611d01565b80611bba575060005460ff16155b611bd65760405162461bcd60e51b81526004016105b69061378a565b600054610100900460ff16158015611c01576000805460ff1961ff0019909116610100171660011790555b6001600160a01b038616611c275760405162461bcd60e51b81526004016105b690613942565b6001600160a01b038616611c4d5760405162461bcd60e51b81526004016105b6906132eb565b611c5561256e565b611c9860405180604001604052806008815260200167436f696e7669736560c01b815250604051806040016040528060018152602001603160f81b815250610573565b607180546001600160a01b0319166001600160a01b038816179055601e8310611cd35760405162461bcd60e51b81526004016105b6906138ca565b60728590556073849055607483905560758290558015611cf9576000805461ff00191690555b505050505050565b6000611d0c30612601565b15905090565b600054610100900460ff1680611d2b5750611d2b611d01565b80611d39575060005460ff16155b611d555760405162461bcd60e51b81526004016105b69061378a565b600054610100900460ff16158015611d80576000805460ff1961ff0019909116610100171660011790555b6040518060800160405280604f8152602001613c9d604f91398051906020012083805190602001208380519060200120611db8612607565b30604051602001611dcd95949392919061310d565b60408051601f1981840301815291905280516020909101206065558015610606576000805461ff0019169055505050565b6000815160001415611e1257506000610cdb565b506020015190565b6000806001611e30611e2b8861260b565b612669565b84878760405160008152602001604052604051611e50949392919061315d565b6020604051602081039080840390855afa158015611e72573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611ea55760405162461bcd60e51b81526004016105b690613500565b866001600160a01b0316816001600160a01b03161491505095945050505050565b600082820183811015610bb85760405162461bcd60e51b81526004016105b690613322565b3390565b6106068363a9059cbb60e01b8484604051602401611f0e929190612ffa565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612685565b600082821115611f675760405162461bcd60e51b81526004016105b69061352b565b50900390565b600082611f7c575060006117db565b82820282848281611f8957fe5b0414610bb85760405162461bcd60e51b81526004016105b690613854565b6000808311611fc85760405162461bcd60e51b81526004016105b6906136c3565b60008211611fe85760405162461bcd60e51b81526004016105b69061346b565b6000611ff48484611f6d565b905060006120006121ef565b90506001600160a01b03861673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461203b5761203b6001600160a01b038716823085612714565b612043612735565b925061204d612a93565b604051806101000160405280858152602001836001600160a01b03168152602001886001600160a01b03168152602001848152602001848152602001878152602001868152602001600081525090508060696000846001600160a01b03166001600160a01b0316815260200190815260200160002060008681526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155905050606a6000836001600160a01b03166001600160a01b03168152602001908152602001600020849080600181540180825580915050600190039060005260206000200160009091909190915055837fbc0a5edd152fa5b886dcae82c5c109d113708653b4b9c0224549ccdf715af94e60405160405180910390a25050509392505050565b6000333014156122475760606000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150610a569050565b503390565b600080821161226d5760405162461bcd60e51b81526004016105b6906135a8565b81838161227657fe5b049392505050565b600080831161229f5760405162461bcd60e51b81526004016105b6906134ba565b600082116122bf5760405162461bcd60e51b81526004016105b6906137d8565b83336122d66001600160a01b038316823088612714565b6122de612778565b92506122e8612a4b565b506040805160c0810182528481526001600160a01b0380841660208084018281528b8416858701908152606086018c8152608087018d815260a088018d81526000878152606e87528a81208e825287528a81208a518155955160018088018054928c166001600160a01b0319938416179055955160028801805491909b169116179098559151600385015551600484015551600590920191909155828452606f8252858420805491820181558452922090910186905591519091907fefd7bb4f992963087670aa168590baee24d227ff5c18ae3790ef7ec22bde6274906123d69087908b908b908b90613b95565b60405180910390a25050509392505050565b8251825180821461240b5760405162461bcd60e51b81526004016105b690613698565b60006124156121ef565b90506001600160a01b03871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156124be5760005b838160ff1610156124b857868160ff168151811061245957fe5b60200260200101516001600160a01b03166108fc878360ff168151811061247c57fe5b60200260200101519081150290604051600060405180830381858888f193505050501580156124af573d6000803e3d6000fd5b5060010161243f565b50612522565b60005b838160ff1610156125205761251882888360ff16815181106124df57fe5b6020026020010151888460ff16815181106124f657fe5b60200260200101518b6001600160a01b0316612714909392919063ffffffff16565b6001016124c1565b505b866001600160a01b03167fd8b3799b7666e647874cb27516af73275795e9a144e00bf12d21a20dcc853ca7848660405161255d929190613bb9565b60405180910390a250505050505050565b600054610100900460ff16806125875750612587611d01565b80612595575060005460ff16155b6125b15760405162461bcd60e51b81526004016105b69061378a565b600054610100900460ff161580156125dc576000805460ff1961ff0019909116610100171660011790555b6125e46127af565b6125ec612830565b80156125fe576000805461ff00191690555b50565b3b151590565b4690565b6000604051806080016040528060438152602001613c5a604391398051602091820120835184830151604080870151805190860120905161264c9501613139565b604051602081830303815290604052805190602001209050919050565b600061267361290a565b8260405160200161264c929190612fcb565b60606126da826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166129109092919063ffffffff16565b80519091501561060657808060200190518101906126f89190612e0e565b6106065760405162461bcd60e51b81526004016105b690613a37565b610efc846323b872dd60e01b858585604051602401611f0e93929190613082565b33600081815260686020526040902054908161275057600191505b61275b826001611ec6565b6001600160a01b0390911660009081526068602052604090205590565b336000908152606d602052604090205480612791575060015b61279c816001611ec6565b336000908152606d602052604090205590565b600054610100900460ff16806127c857506127c8611d01565b806127d6575060005460ff16155b6127f25760405162461bcd60e51b81526004016105b69061378a565b600054610100900460ff161580156125ec576000805460ff1961ff00199091166101001716600117905580156125fe576000805461ff001916905550565b600054610100900460ff16806128495750612849611d01565b80612857575060005460ff16155b6128735760405162461bcd60e51b81526004016105b69061378a565b600054610100900460ff1615801561289e576000805460ff1961ff0019909116610100171660011790555b60006128a8611eeb565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156125fe576000805461ff001916905550565b60655490565b606061291f8484600085612927565b949350505050565b6060824710156129495760405162461bcd60e51b81526004016105b690613562565b61295285612601565b61296e5760405162461bcd60e51b81526004016105b6906139ba565b60006060866001600160a01b0316858760405161298b9190612f47565b60006040518083038185875af1925050503d80600081146129c8576040519150601f19603f3d011682016040523d82523d6000602084013e6129cd565b606091505b50915091506129dd8282866129e8565b979650505050505050565b606083156129f7575081610bb8565b825115612a075782518084602001fd5b8160405162461bcd60e51b81526004016105b6919061317b565b60405180606001604052806000815260200160006001600160a01b03168152602001606081525090565b6040518060c001604052806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b6040518061010001604052806000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081525090565b600082601f830112612afa578081fd5b8135612b0d612b0882613beb565b613bc7565b818152915060208083019084810181840286018201871015612b2e57600080fd5b60005b84811015612b4d57813584529282019290820190600101612b31565b505050505092915050565b600082601f830112612b68578081fd5b813567ffffffffffffffff811115612b7c57fe5b612b8f601f8201601f1916602001613bc7565b9150808252836020828501011115612ba657600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215612bd0578081fd5b8135610bb881613c35565b600080600060608486031215612bef578182fd5b8335612bfa81613c35565b925060208481013567ffffffffffffffff80821115612c17578485fd5b818701915087601f830112612c2a578485fd5b8135612c38612b0882613beb565b81815284810190848601868402860187018c1015612c54578889fd5b8895505b83861015612c7f578035612c6b81613c35565b835260019590950194918601918601612c58565b50965050506040870135925080831115612c97578384fd5b5050612ca586828701612aea565b9150509250925092565b600080600080600060a08688031215612cc6578081fd5b8535612cd181613c35565b9450602086013567ffffffffffffffff811115612cec578182fd5b612cf888828901612b58565b94505060408601359250606086013591506080860135612d1781613c4a565b809150509295509295909350565b60008060408385031215612d37578182fd5b8235612d4281613c35565b946020939093013593505050565b600080600080600060a08688031215612d67578081fd5b8535612d7281613c35565b94506020860135935060408601359250606086013591506080860135612d1781613c4a565b600080600060608486031215612dab578283fd5b8335612db681613c35565b95602085013595506040909401359392505050565b600080600080600060a08688031215612de2578081fd5b8535612ded81613c35565b97602087013597506040870135966060810135965060800135945092505050565b600060208284031215612e1f578081fd5b81518015158114610bb8578182fd5b60008060408385031215612e40578182fd5b823567ffffffffffffffff80821115612e57578384fd5b612e6386838701612b58565b93506020850135915080821115612e78578283fd5b50612e8585828601612b58565b9150509250929050565b600060208284031215612ea0578081fd5b5035919050565b600080600060608486031215612ebb578081fd5b833592506020840135612ecd81613c35565b929592945050506040919091013590565b60008060408385031215612ef0578182fd5b50508035926020909101359150565b600060208284031215612f10578081fd5b8151610bb881613c4a565b60008151808452612f33816020860160208601613c09565b601f01601f19169290920160200192915050565b60008251612f59818460208701613c09565b9190910192915050565b60008351612f75818460208801613c09565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0396871681526020810195909552928516604085015293166060830152608082019290925260a081019190915260c00190565b6001600160a01b0384811682528316602082015260606040820181905260009061307990830184612f1b565b95945050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6020808252825182820181905260009190848201906040850190845b81811015613101578351835292840192918401916001016130e5565b50909695505050505050565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b93845260208401929092526001600160a01b03166040830152606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610bb86020830184612f1b565b6020808252602c908201527f4552525f5f4d554c544953454e445f544f54414c5f4554485f414d4f554e545f60408201526b135554d517d09157d410525160a21b606082015260800190565b6020808252601b908201527f4552525f5f4445504f5349545f444f45535f4e4f545f45584953540000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000604082015260600190565b6020808252603d908201527f66756e6374696f6e5369676e61747572652063616e206e6f74206265206f662060408201527f657865637574654d6574615472616e73616374696f6e206d6574686f64000000606082015260800190565b60208082526017908201527f4552525f5f3078305f5452555354454441444452455353000000000000000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526017908201527f4552525f5f50524943455f4d5553545f42455f50414944000000000000000000604082015260600190565b60208082526013908201527211549497d7d0531317d3125392d4d7d554d151606a1b604082015260600190565b6020808252601a908201527f4552525f4e4f5f42414c414e43455f544f5f5749544844524157000000000000604082015260600190565b6020808252602a908201527f4552525f5f5a45524f5f52454d41494e494e475f42414c414e43455f464f525f60408201526915d2551211149055d05360b21b606082015260800190565b60208082526013908201527222a9292fafa4a72b20a624a22fa9a4a3a722a960691b604082015260600190565b6020808252602f908201527f4552525f5f414d4f554e545f5045525f4c494e4b5f4d5553545f42455f47524560408201526e41544845525f5448414e5f5a45524f60881b606082015260800190565b60208082526026908201527f4552525f5f414d4f554e545f4d5553545f42455f47524541544845525f5448416040820152654e5f5a45524f60d01b606082015260800190565b602080825260119082015270496e76616c6964207369676e617475726560781b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601c908201527f4552525f5f43414d504149474e5f444f45535f4e4f545f455849535400000000604082015260600190565b60208082526019908201527f4552525f5f415f50524943455f4d5553545f42455f5041494400000000000000604082015260600190565b6020808252602b908201527f4552525f5f544f54414c5f4554485f414d4f554e545f5045525f4c494e4b5f4d60408201526a1554d517d09157d410525160aa1b606082015260800190565b6020808252601190820152704552525f5f494e56414c49445f4152475360781b604082015260600190565b6020808252602c908201527f4552525f5f4c494e4b535f414d4f554e545f4d5553545f42455f47524541544860408201526b45525f5448414e5f5a45524f60a01b606082015260800190565b60208082526024908201527f4552525f4e4f545f454e4f5547485f42414c414e43455f464f525f524557415260408201526344494e4760e01b606082015260800190565b6020808252601d908201527f4552525f4e4f545f454e4f5547485f42414c414e43455f544f5f425559000000604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526025908201527f4552525f5f50524943455f4d5553545f42455f47524541544845525f5448414e6040820152645f5a45524f60d81b606082015260800190565b6020808252601d908201527f4552525f5f414444524553535f414c52454144595f5245574152444544000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526018908201527f4552525f4445504f5349545f4645455f544f4f5f484947480000000000000000604082015260600190565b60208082526021908201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636040820152600d60fb1b606082015260800190565b6020808252601f908201527f4552525f5f494e56414c49445f54525553544544414444524553535f30783000604082015260600190565b60208082526021908201527f4552525f5f4d554c544953454e445f50524943455f4d5553545f42455f5041496040820152601160fa1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526026908201527f4552525f5f43414d504149474e5f42595f53454e4445525f444f45535f4e4f5460408201526517d1561254d560d21b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600f908201526e22a9292faf983c182fa9a4a3a722a960891b604082015260600190565b6020808252601d908201527f4552525f5f544f54414c5f50524943455f4d5553545f42455f50414944000000604082015260600190565b6020808252818101527f4552525f5f43414d504149474e5f50524943455f4d5553545f42455f50414944604082015260600190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9788526001600160a01b0396871660208901529490951660408701526060860192909252608085015260a084015260c083019190915260e08201526101000190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715613be357fe5b604052919050565b600067ffffffffffffffff821115613bff57fe5b5060209081020190565b60005b83811015613c24578181015183820152602001613c0c565b83811115610efc5750506000910152565b6001600160a01b03811681146125fe57600080fd5b60ff811681146125fe57600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e743235362073616c742c6164647265737320766572696679696e67436f6e747261637429a2646970667358221220081551c64fc3f0e4587888105794dc843bd4418707c0e021ae5c34d11ca6fe5364736f6c63430007040033
Deployed Bytecode
0x6080604052600436106101d85760003560e01c8063887470d711610102578063b08328b411610095578063ec744d3811610064578063ec744d381461050b578063f2fde38b14610520578063f3e6264014610540578063f92ad21914610553576101d8565b8063b08328b41461048d578063b8de81bd146104c1578063cbc9fe00146104e1578063da6c1dd3146104f6576101d8565b8063963084a0116100d1578063963084a01461043257806399c6d2de14610452578063a8776b4e14610465578063ad8733ca1461047a576101d8565b8063887470d7146103b05780638cbfc305146103d05780638da5cb5b146103f057806396057cbd14610412576101d8565b80633ccfd60b1161017a5780635b6d6b57116101495780635b6d6b57146103395780636a8df47a1461034e5780636dfea7c41461036e578063715018a61461039b576101d8565b80633ccfd60b146102dc57806343d648e0146102f1578063461b6004146103065780634845876414610319576101d8565b80632726b506116101b65780632726b506146102485780632d0335ab1461027a57806333289a46146102a7578063337caa80146102c7576101d8565b8063098dce13146101dd5780630c53c51c146101ff5780631cb2acba14610228575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004612e2e565b610573565b005b61021261020d366004612caf565b61060b565b60405161021f919061317b565b60405180910390f35b34801561023457600080fd5b506101fd610243366004612e8f565b6107cc565b34801561025457600080fd5b50610268610263366004612d25565b610810565b60405161021f96959493929190613b1f565b34801561028657600080fd5b5061029a610295366004612bbf565b6108e9565b60405161021f9190613b16565b3480156102b357600080fd5b506101fd6102c2366004612e8f565b610904565b3480156102d357600080fd5b5061029a610a45565b3480156102e857600080fd5b506101fd610a59565b3480156102fd57600080fd5b5061029a610b21565b61029a610314366004612d97565b610b27565b34801561032557600080fd5b506101fd610334366004612e8f565b610bbf565b34801561034557600080fd5b5061029a610c03565b34801561035a57600080fd5b506101fd610369366004612ede565b610c09565b34801561037a57600080fd5b5061038e610389366004612bbf565b610c73565b60405161021f91906130c9565b3480156103a757600080fd5b506101fd610ce0565b3480156103bc57600080fd5b506101fd6103cb366004612e8f565b610d69565b3480156103dc57600080fd5b506101fd6103eb366004612bbf565b610f02565b3480156103fc57600080fd5b50610405610f89565b60405161021f9190612fe6565b34801561041e57600080fd5b5061038e61042d366004612bbf565b610f98565b34801561043e57600080fd5b506101fd61044d366004612d50565b611002565b61029a610460366004612d97565b6113e7565b34801561047157600080fd5b506101fd611511565b6101fd610488366004612bdb565b6115de565b34801561049957600080fd5b506104ad6104a8366004612d25565b6116b8565b60405161021f989796959493929190613b53565b3480156104cd57600080fd5b5061029a6104dc366004612d25565b6117b3565b3480156104ed57600080fd5b5061029a6117e1565b34801561050257600080fd5b5061029a6117e7565b34801561051757600080fd5b5061029a6117ed565b34801561052c57600080fd5b506101fd61053b366004612bbf565b611806565b6101fd61054e366004612ea7565b6118c7565b34801561055f57600080fd5b506101fd61056e366004612dcb565b611b93565b600054610100900460ff168061058c575061058c611d01565b8061059a575060005460ff16155b6105bf5760405162461bcd60e51b81526004016105b69061378a565b60405180910390fd5b600054610100900460ff161580156105ea576000805460ff1961ff0019909116610100171660011790555b6105f48383611d12565b8015610606576000805461ff00191690555b505050565b6060600061061886611dfe565b90506000356001600160e01b0319908116908216141561064a5760405162461bcd60e51b81526004016105b69061328e565b610652612a21565b50604080516060810182526001600160a01b038916600081815260666020908152908490205483528201529081018790526106908882888888611e1a565b6106ac5760405162461bcd60e51b81526004016105b690613901565b6001600160a01b0388166000908152606660205260409020546106d0906001611ec6565b6001600160a01b038916600090815260666020908152604080832093909355915190916060913091610706918c918e9101612f63565b60408051601f198184030181529082905261072091612f47565b6000604051808303816000865af19150503d806000811461075d576040519150601f19603f3d011682016040523d82523d6000602084013e610762565b606091505b5091509150816107845760405162461bcd60e51b81526004016105b690613257565b7f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b8a338b6040516107b79392919061304d565b60405180910390a19998505050505050505050565b6107d4611eeb565b6001600160a01b03166107e5610f89565b6001600160a01b03161461080b5760405162461bcd60e51b81526004016105b690613895565b607355565b6001600160a01b0382166000908152606e6020908152604080832084845290915281205481908190819081908190871461085c5760405162461bcd60e51b81526004016105b6906131da565b610864612a4b565b505050506001600160a01b039485166000908152606e6020908152604080832096835295815290859020855160c081018752815480825260018301548916938201849052600283015490981696810187905260038201546060820181905260048301546080830181905260059093015460a09092018290529798929795509093509150565b6001600160a01b031660009081526066602052604090205490565b336000818152606e60209081526040808320858452909152902054821461093d5760405162461bcd60e51b81526004016105b6906131da565b610945612a4b565b506001600160a01b038082166000908152606e60209081526040808320868452825291829020825160c0810184528154815260018201548516928101929092526002810154909316918101919091526003820154606082015260048201546080820181905260059092015460a0820152906109d25760405162461bcd60e51b81526004016105b6906133bd565b6001600160a01b038281166000908152606e60209081526040808320878452909152808220600481018390558281556001810180546001600160a01b0319908116909155600282018054909116905560038101839055600501919091556080830151908301516106069216908490611eef565b336000908152607060205260409020545b90565b610a61611eeb565b6001600160a01b0316610a72610f89565b6001600160a01b031614610a985760405162461bcd60e51b81526004016105b690613895565b6067544790600090610aab908390611f45565b604051909150339082156108fc029083906000818181858888f19350505050158015610adb573d6000803e3d6000fd5b50336001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d582604051610b159190613b16565b60405180910390a25050565b60745481565b60725460009083026001600160a01b03851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610b7757803414610b725760405162461bcd60e51b81526004016105b690613ae1565b610ba9565b610b8b81610b858686611f6d565b90611ec6565b3414610ba95760405162461bcd60e51b81526004016105b69061364d565b610bb4858585611fa7565b9150505b9392505050565b610bc7611eeb565b6001600160a01b0316610bd8610f89565b6001600160a01b031614610bfe5760405162461bcd60e51b81526004016105b690613895565b607255565b60725481565b610c11611eeb565b6001600160a01b0316610c22610f89565b6001600160a01b031614610c485760405162461bcd60e51b81526004016105b690613895565b601e8210610c685760405162461bcd60e51b81526004016105b6906138ca565b607491909155607555565b6001600160a01b0381166000908152606a6020908152604091829020805483518184028101840190945280845260609392830182828015610cd357602002820191906000526020600020905b815481526020019060010190808311610cbf575b505050505090505b919050565b610ce8611eeb565b6001600160a01b0316610cf9610f89565b6001600160a01b031614610d1f5760405162461bcd60e51b81526004016105b690613895565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b3360009081526069602090815260408083208484529091529020548114610da25760405162461bcd60e51b81526004016105b6906139f1565b610daa612a93565b503360009081526069602090815260408083208484528252918290208251610100810184528154815260018201546001600160a01b039081169382019390935260028201549092169282019290925260038201546060820152600482015460808201819052600583015460a0830152600683015460c083015260079092015460e082015290610e4b5760405162461bcd60e51b81526004016105b6906133f4565b6040808201516020808401516001600160a01b039081166000908152606983528481208782529092529281206004015590811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610ebb5760208201516080830151610eb6916001600160a01b03841691611eef565b610606565b81602001516001600160a01b03166108fc83608001519081150290604051600060405180830381858888f19350505050158015610efc573d6000803e3d6000fd5b50505050565b610f0a611eeb565b6001600160a01b0316610f1b610f89565b6001600160a01b031614610f415760405162461bcd60e51b81526004016105b690613895565b6001600160a01b038116610f675760405162461bcd60e51b81526004016105b6906132eb565b607180546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031690565b6001600160a01b0381166000908152606f6020908152604091829020805483518184028101840190945280845260609392830182828015610cd35760200282019190600052602060002090815481526020019060010190808311610cbf5750505050509050919050565b6001600160a01b038516600090815260696020908152604080832087845290915290205484146110445760405162461bcd60e51b81526004016105b6906135df565b600061104e6121ef565b9050611058612a93565b506001600160a01b0380871660008181526069602090815260408083208a845282528083208151610100810183528154815260018083015488168286015260028301548816828501526003830154606083015260048301546080830152600583015460a0830152600683015460c083015260079092015460e0820152948452606b83528184208b85528352818420958716845294909152902054909160ff909116151514156111195760405162461bcd60e51b81526004016105b69061381d565b6000878784604051602001611130939291906130a6565b604051602081830303815290604052805190602001206040516020016111569190612f9a565b604051602081830303815290604052805190602001209050600060018286898960405160008152602001604052604051611193949392919061315d565b6020604051602081039080840390855afa1580156111b5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166111e85760405162461bcd60e51b81526004016105b690613a81565b6071546001600160a01b038281169116146112155760405162461bcd60e51b81526004016105b69061343e565b8260a001518360e001511061123c5760405162461bcd60e51b81526004016105b690613390565b8260c00151836080015110156112645760405162461bcd60e51b81526004016105b69061370f565b60408301516001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146112ad5760c08401516112a8906001600160a01b038316908790611eef565b6112e8565b60c08401516040516001600160a01b0387169180156108fc02916000818181858888f193505050501580156112e6573d6000803e3d6000fd5b505b6001600160a01b03808b166000908152606b602090815260408083208d84528252808320938916835292905220805460ff1916600190811790915560e085015161133191611ec6565b6001600160a01b038b1660009081526069602090815260408083208d845290915290206007015560c0840151608085015161136b91611f45565b6001600160a01b03808c1660008181526069602090815260408083208f8452909152908190206004019390935560c08701519251918816928c927f06393144cb37277ba0e7aec9e82a50974ff3eb81b523dce68b403e11ec4ef419916113d391879190612ffa565b60405180910390a450505050505050505050565b6000808490506000816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561142857600080fd5b505afa15801561143c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114609190612eff565b60ff16600a0a905060006114896074546114838888611f6d90919063ffffffff16565b90611f6d565b905060006114aa607554600a0a611483606486611f6d90919063ffffffff16565b905060006114b8838361224c565b9050600081116114da5760405162461bcd60e51b81526004016105b690613616565b8034146114f95760405162461bcd60e51b81526004016105b690613359565b61150489898961227e565b9998505050505050505050565b3360008181526070602052604090205461153d5760405162461bcd60e51b81526004016105b6906133bd565b6001600160a01b038116600090815260706020526040812080549190556067546115679082611f45565b6067556040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156115a0573d6000803e3d6000fd5b507fd0c16bf212a1f1186e895b15e5240571ee9cc35f77e950dfd34b8393f712da6b82826040516115d2929190612ffa565b60405180910390a15050565b81516000805b828160ff16101561162257611618848260ff168151811061160157fe5b602002602001015183611ec690919063ffffffff16565b91506001016115e4565b506001600160a01b03851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461166f578160735402341461166a5760405162461bcd60e51b81526004016105b690613979565b6116a5565b607354611687906116809084611f6d565b8290611ec6565b34146116a55760405162461bcd60e51b81526004016105b69061318e565b6116b1858585846123e8565b5050505050565b6001600160a01b0382166000908152606960209081526040808320848452909152812054819081908190819081908190819089146117085760405162461bcd60e51b81526004016105b6906135df565b611710612a93565b505050506001600160a01b03968716600090815260696020908152604080832098835297815290879020875161010081018952815480825260018301548b169382018490526002830154909a16988101899052600382015460608201819052600483015460808301819052600584015460a08401819052600685015460c0850181905260079095015460e09094018490529b9c949b919950975095509093509150565b6001600160a01b03821660009081526069602090815260408083208484529091529020600701545b92915050565b60735481565b60755481565b6067546000904790611800908290611f45565b91505090565b61180e611eeb565b6001600160a01b031661181f610f89565b6001600160a01b0316146118455760405162461bcd60e51b81526004016105b690613895565b6001600160a01b03811661186b5760405162461bcd60e51b81526004016105b690613211565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382166000908152606e6020908152604080832086845290915290205483146119095760405162461bcd60e51b81526004016105b6906131da565b611911612a4b565b506001600160a01b038083166000908152606e60209081526040808320878452825291829020825160c081018452815481526001820154851692810192909252600281015490931691810191909152600382015460608201526004820154608082015260059091015460a08201528161199c5760405162461bcd60e51b81526004016105b6906134ba565b81816080015110156119c05760405162461bcd60e51b81526004016105b690613753565b6000816040015190506000816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611a0457600080fd5b505afa158015611a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3c9190612eff565b60ff16600a0a90506000611a6782611a61878760a00151611f6d90919063ffffffff16565b9061224c565b905060008111611a895760405162461bcd60e51b81526004016105b690613616565b803414611aa85760405162461bcd60e51b81526004016105b690613aaa565b6080840151611ab79086611f45565b6001600160a01b038088166000908152606e602090815260408083208c8452909152908190206004019290925590850151611af491163387611eef565b6001600160a01b038616600090815260706020526040902054611b179034611ec6565b6001600160a01b038716600090815260706020526040902055606754611b3d9034611ec6565b60675560408085015160a086015191517f842e66351f2f91f26dfe775da328f23de5cae382c37d0988d103d579704b55f392611b829233928c928c92918c9190613013565b60405180910390a150505050505050565b600054610100900460ff1680611bac5750611bac611d01565b80611bba575060005460ff16155b611bd65760405162461bcd60e51b81526004016105b69061378a565b600054610100900460ff16158015611c01576000805460ff1961ff0019909116610100171660011790555b6001600160a01b038616611c275760405162461bcd60e51b81526004016105b690613942565b6001600160a01b038616611c4d5760405162461bcd60e51b81526004016105b6906132eb565b611c5561256e565b611c9860405180604001604052806008815260200167436f696e7669736560c01b815250604051806040016040528060018152602001603160f81b815250610573565b607180546001600160a01b0319166001600160a01b038816179055601e8310611cd35760405162461bcd60e51b81526004016105b6906138ca565b60728590556073849055607483905560758290558015611cf9576000805461ff00191690555b505050505050565b6000611d0c30612601565b15905090565b600054610100900460ff1680611d2b5750611d2b611d01565b80611d39575060005460ff16155b611d555760405162461bcd60e51b81526004016105b69061378a565b600054610100900460ff16158015611d80576000805460ff1961ff0019909116610100171660011790555b6040518060800160405280604f8152602001613c9d604f91398051906020012083805190602001208380519060200120611db8612607565b30604051602001611dcd95949392919061310d565b60408051601f1981840301815291905280516020909101206065558015610606576000805461ff0019169055505050565b6000815160001415611e1257506000610cdb565b506020015190565b6000806001611e30611e2b8861260b565b612669565b84878760405160008152602001604052604051611e50949392919061315d565b6020604051602081039080840390855afa158015611e72573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611ea55760405162461bcd60e51b81526004016105b690613500565b866001600160a01b0316816001600160a01b03161491505095945050505050565b600082820183811015610bb85760405162461bcd60e51b81526004016105b690613322565b3390565b6106068363a9059cbb60e01b8484604051602401611f0e929190612ffa565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612685565b600082821115611f675760405162461bcd60e51b81526004016105b69061352b565b50900390565b600082611f7c575060006117db565b82820282848281611f8957fe5b0414610bb85760405162461bcd60e51b81526004016105b690613854565b6000808311611fc85760405162461bcd60e51b81526004016105b6906136c3565b60008211611fe85760405162461bcd60e51b81526004016105b69061346b565b6000611ff48484611f6d565b905060006120006121ef565b90506001600160a01b03861673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461203b5761203b6001600160a01b038716823085612714565b612043612735565b925061204d612a93565b604051806101000160405280858152602001836001600160a01b03168152602001886001600160a01b03168152602001848152602001848152602001878152602001868152602001600081525090508060696000846001600160a01b03166001600160a01b0316815260200190815260200160002060008681526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155905050606a6000836001600160a01b03166001600160a01b03168152602001908152602001600020849080600181540180825580915050600190039060005260206000200160009091909190915055837fbc0a5edd152fa5b886dcae82c5c109d113708653b4b9c0224549ccdf715af94e60405160405180910390a25050509392505050565b6000333014156122475760606000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150610a569050565b503390565b600080821161226d5760405162461bcd60e51b81526004016105b6906135a8565b81838161227657fe5b049392505050565b600080831161229f5760405162461bcd60e51b81526004016105b6906134ba565b600082116122bf5760405162461bcd60e51b81526004016105b6906137d8565b83336122d66001600160a01b038316823088612714565b6122de612778565b92506122e8612a4b565b506040805160c0810182528481526001600160a01b0380841660208084018281528b8416858701908152606086018c8152608087018d815260a088018d81526000878152606e87528a81208e825287528a81208a518155955160018088018054928c166001600160a01b0319938416179055955160028801805491909b169116179098559151600385015551600484015551600590920191909155828452606f8252858420805491820181558452922090910186905591519091907fefd7bb4f992963087670aa168590baee24d227ff5c18ae3790ef7ec22bde6274906123d69087908b908b908b90613b95565b60405180910390a25050509392505050565b8251825180821461240b5760405162461bcd60e51b81526004016105b690613698565b60006124156121ef565b90506001600160a01b03871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156124be5760005b838160ff1610156124b857868160ff168151811061245957fe5b60200260200101516001600160a01b03166108fc878360ff168151811061247c57fe5b60200260200101519081150290604051600060405180830381858888f193505050501580156124af573d6000803e3d6000fd5b5060010161243f565b50612522565b60005b838160ff1610156125205761251882888360ff16815181106124df57fe5b6020026020010151888460ff16815181106124f657fe5b60200260200101518b6001600160a01b0316612714909392919063ffffffff16565b6001016124c1565b505b866001600160a01b03167fd8b3799b7666e647874cb27516af73275795e9a144e00bf12d21a20dcc853ca7848660405161255d929190613bb9565b60405180910390a250505050505050565b600054610100900460ff16806125875750612587611d01565b80612595575060005460ff16155b6125b15760405162461bcd60e51b81526004016105b69061378a565b600054610100900460ff161580156125dc576000805460ff1961ff0019909116610100171660011790555b6125e46127af565b6125ec612830565b80156125fe576000805461ff00191690555b50565b3b151590565b4690565b6000604051806080016040528060438152602001613c5a604391398051602091820120835184830151604080870151805190860120905161264c9501613139565b604051602081830303815290604052805190602001209050919050565b600061267361290a565b8260405160200161264c929190612fcb565b60606126da826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166129109092919063ffffffff16565b80519091501561060657808060200190518101906126f89190612e0e565b6106065760405162461bcd60e51b81526004016105b690613a37565b610efc846323b872dd60e01b858585604051602401611f0e93929190613082565b33600081815260686020526040902054908161275057600191505b61275b826001611ec6565b6001600160a01b0390911660009081526068602052604090205590565b336000908152606d602052604090205480612791575060015b61279c816001611ec6565b336000908152606d602052604090205590565b600054610100900460ff16806127c857506127c8611d01565b806127d6575060005460ff16155b6127f25760405162461bcd60e51b81526004016105b69061378a565b600054610100900460ff161580156125ec576000805460ff1961ff00199091166101001716600117905580156125fe576000805461ff001916905550565b600054610100900460ff16806128495750612849611d01565b80612857575060005460ff16155b6128735760405162461bcd60e51b81526004016105b69061378a565b600054610100900460ff1615801561289e576000805460ff1961ff0019909116610100171660011790555b60006128a8611eeb565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156125fe576000805461ff001916905550565b60655490565b606061291f8484600085612927565b949350505050565b6060824710156129495760405162461bcd60e51b81526004016105b690613562565b61295285612601565b61296e5760405162461bcd60e51b81526004016105b6906139ba565b60006060866001600160a01b0316858760405161298b9190612f47565b60006040518083038185875af1925050503d80600081146129c8576040519150601f19603f3d011682016040523d82523d6000602084013e6129cd565b606091505b50915091506129dd8282866129e8565b979650505050505050565b606083156129f7575081610bb8565b825115612a075782518084602001fd5b8160405162461bcd60e51b81526004016105b6919061317b565b60405180606001604052806000815260200160006001600160a01b03168152602001606081525090565b6040518060c001604052806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b6040518061010001604052806000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081525090565b600082601f830112612afa578081fd5b8135612b0d612b0882613beb565b613bc7565b818152915060208083019084810181840286018201871015612b2e57600080fd5b60005b84811015612b4d57813584529282019290820190600101612b31565b505050505092915050565b600082601f830112612b68578081fd5b813567ffffffffffffffff811115612b7c57fe5b612b8f601f8201601f1916602001613bc7565b9150808252836020828501011115612ba657600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215612bd0578081fd5b8135610bb881613c35565b600080600060608486031215612bef578182fd5b8335612bfa81613c35565b925060208481013567ffffffffffffffff80821115612c17578485fd5b818701915087601f830112612c2a578485fd5b8135612c38612b0882613beb565b81815284810190848601868402860187018c1015612c54578889fd5b8895505b83861015612c7f578035612c6b81613c35565b835260019590950194918601918601612c58565b50965050506040870135925080831115612c97578384fd5b5050612ca586828701612aea565b9150509250925092565b600080600080600060a08688031215612cc6578081fd5b8535612cd181613c35565b9450602086013567ffffffffffffffff811115612cec578182fd5b612cf888828901612b58565b94505060408601359250606086013591506080860135612d1781613c4a565b809150509295509295909350565b60008060408385031215612d37578182fd5b8235612d4281613c35565b946020939093013593505050565b600080600080600060a08688031215612d67578081fd5b8535612d7281613c35565b94506020860135935060408601359250606086013591506080860135612d1781613c4a565b600080600060608486031215612dab578283fd5b8335612db681613c35565b95602085013595506040909401359392505050565b600080600080600060a08688031215612de2578081fd5b8535612ded81613c35565b97602087013597506040870135966060810135965060800135945092505050565b600060208284031215612e1f578081fd5b81518015158114610bb8578182fd5b60008060408385031215612e40578182fd5b823567ffffffffffffffff80821115612e57578384fd5b612e6386838701612b58565b93506020850135915080821115612e78578283fd5b50612e8585828601612b58565b9150509250929050565b600060208284031215612ea0578081fd5b5035919050565b600080600060608486031215612ebb578081fd5b833592506020840135612ecd81613c35565b929592945050506040919091013590565b60008060408385031215612ef0578182fd5b50508035926020909101359150565b600060208284031215612f10578081fd5b8151610bb881613c4a565b60008151808452612f33816020860160208601613c09565b601f01601f19169290920160200192915050565b60008251612f59818460208701613c09565b9190910192915050565b60008351612f75818460208801613c09565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0396871681526020810195909552928516604085015293166060830152608082019290925260a081019190915260c00190565b6001600160a01b0384811682528316602082015260606040820181905260009061307990830184612f1b565b95945050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6020808252825182820181905260009190848201906040850190845b81811015613101578351835292840192918401916001016130e5565b50909695505050505050565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b93845260208401929092526001600160a01b03166040830152606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610bb86020830184612f1b565b6020808252602c908201527f4552525f5f4d554c544953454e445f544f54414c5f4554485f414d4f554e545f60408201526b135554d517d09157d410525160a21b606082015260800190565b6020808252601b908201527f4552525f5f4445504f5349545f444f45535f4e4f545f45584953540000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000604082015260600190565b6020808252603d908201527f66756e6374696f6e5369676e61747572652063616e206e6f74206265206f662060408201527f657865637574654d6574615472616e73616374696f6e206d6574686f64000000606082015260800190565b60208082526017908201527f4552525f5f3078305f5452555354454441444452455353000000000000000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526017908201527f4552525f5f50524943455f4d5553545f42455f50414944000000000000000000604082015260600190565b60208082526013908201527211549497d7d0531317d3125392d4d7d554d151606a1b604082015260600190565b6020808252601a908201527f4552525f4e4f5f42414c414e43455f544f5f5749544844524157000000000000604082015260600190565b6020808252602a908201527f4552525f5f5a45524f5f52454d41494e494e475f42414c414e43455f464f525f60408201526915d2551211149055d05360b21b606082015260800190565b60208082526013908201527222a9292fafa4a72b20a624a22fa9a4a3a722a960691b604082015260600190565b6020808252602f908201527f4552525f5f414d4f554e545f5045525f4c494e4b5f4d5553545f42455f47524560408201526e41544845525f5448414e5f5a45524f60881b606082015260800190565b60208082526026908201527f4552525f5f414d4f554e545f4d5553545f42455f47524541544845525f5448416040820152654e5f5a45524f60d01b606082015260800190565b602080825260119082015270496e76616c6964207369676e617475726560781b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601c908201527f4552525f5f43414d504149474e5f444f45535f4e4f545f455849535400000000604082015260600190565b60208082526019908201527f4552525f5f415f50524943455f4d5553545f42455f5041494400000000000000604082015260600190565b6020808252602b908201527f4552525f5f544f54414c5f4554485f414d4f554e545f5045525f4c494e4b5f4d60408201526a1554d517d09157d410525160aa1b606082015260800190565b6020808252601190820152704552525f5f494e56414c49445f4152475360781b604082015260600190565b6020808252602c908201527f4552525f5f4c494e4b535f414d4f554e545f4d5553545f42455f47524541544860408201526b45525f5448414e5f5a45524f60a01b606082015260800190565b60208082526024908201527f4552525f4e4f545f454e4f5547485f42414c414e43455f464f525f524557415260408201526344494e4760e01b606082015260800190565b6020808252601d908201527f4552525f4e4f545f454e4f5547485f42414c414e43455f544f5f425559000000604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526025908201527f4552525f5f50524943455f4d5553545f42455f47524541544845525f5448414e6040820152645f5a45524f60d81b606082015260800190565b6020808252601d908201527f4552525f5f414444524553535f414c52454144595f5245574152444544000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526018908201527f4552525f4445504f5349545f4645455f544f4f5f484947480000000000000000604082015260600190565b60208082526021908201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636040820152600d60fb1b606082015260800190565b6020808252601f908201527f4552525f5f494e56414c49445f54525553544544414444524553535f30783000604082015260600190565b60208082526021908201527f4552525f5f4d554c544953454e445f50524943455f4d5553545f42455f5041496040820152601160fa1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526026908201527f4552525f5f43414d504149474e5f42595f53454e4445525f444f45535f4e4f5460408201526517d1561254d560d21b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600f908201526e22a9292faf983c182fa9a4a3a722a960891b604082015260600190565b6020808252601d908201527f4552525f5f544f54414c5f50524943455f4d5553545f42455f50414944000000604082015260600190565b6020808252818101527f4552525f5f43414d504149474e5f50524943455f4d5553545f42455f50414944604082015260600190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9788526001600160a01b0396871660208901529490951660408701526060860192909252608085015260a084015260c083019190915260e08201526101000190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715613be357fe5b604052919050565b600067ffffffffffffffff821115613bff57fe5b5060209081020190565b60005b83811015613c24578181015183820152602001613c0c565b83811115610efc5750506000910152565b6001600160a01b03811681146125fe57600080fd5b60ff811681146125fe57600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e743235362073616c742c6164647265737320766572696679696e67436f6e747261637429a2646970667358221220081551c64fc3f0e4587888105794dc843bd4418707c0e021ae5c34d11ca6fe5364736f6c63430007040033
Deployed Bytecode Sourcemap
44297:21746:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40631:195;;;;;;;;;;-1:-1:-1;40631:195:0;;;;;:::i;:::-;;:::i;:::-;;41130:1305;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49590:182;;;;;;;;;;-1:-1:-1;49590:182:0;;;;;:::i;:::-;;:::i;61931:698::-;;;;;;;;;;-1:-1:-1;61931:698:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;42861:109::-;;;;;;;;;;-1:-1:-1;42861:109:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;64147:573::-;;;;;;;;;;-1:-1:-1;64147:573:0;;;;;:::i;:::-;;:::i;65422:130::-;;;;;;;;;;;;;:::i;50372:264::-;;;;;;;;;;;;;:::i;47625:39::-;;;;;;;;;;;;;:::i;52023:686::-;;;;;;:::i;:::-;;:::i;49406:176::-;;;;;;;;;;-1:-1:-1;49406:176:0;;;;;:::i;:::-;;:::i;47531:39::-;;;;;;;;;;;;;:::i;49780:378::-;;;;;;;;;;-1:-1:-1;49780:378:0;;;;;:::i;:::-;;:::i;53611:189::-;;;;;;;;;;-1:-1:-1;53611:189:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;13217:148::-;;;;;;;;;;;;;:::i;56079:845::-;;;;;;;;;;-1:-1:-1;56079:845:0;;;;;:::i;:::-;;:::i;50166:198::-;;;;;;;;;;-1:-1:-1;50166:198:0;;;;;:::i;:::-;;:::i;12566:87::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;61758:165::-;;;;;;;;;;-1:-1:-1;61758:165:0;;;;;:::i;:::-;;:::i;53808:2263::-;;;;;;;;;;-1:-1:-1;53808:2263:0;;;;;:::i;:::-;;:::i;60479:1271::-;;;;;;:::i;:::-;;:::i;64728:686::-;;;;;;;;;;;;;:::i;57826:897::-;;;;;;:::i;:::-;;:::i;52717:886::-;;;;;;;;;;-1:-1:-1;52717:886:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;59309:214::-;;;;;;;;;;-1:-1:-1;59309:214:0;;;;;:::i;:::-;;:::i;47577:41::-;;;;;;;;;;;;;:::i;47671:47::-;;;;;;;;;;;;;:::i;65560:191::-;;;;;;;;;;;;;:::i;13520:281::-;;;;;;;;;;-1:-1:-1;13520:281:0;;;;;:::i;:::-;;:::i;62637:1502::-;;;;;;:::i;:::-;;:::i;48340:1058::-;;;;;;;;;;-1:-1:-1;48340:1058:0;;;;;:::i;:::-;;:::i;40631:195::-;9305:13;;;;;;;;:33;;;9322:16;:14;:16::i;:::-;9305:50;;;-1:-1:-1;9343:12:0;;;;9342:13;9305:50;9283:146;;;;-1:-1:-1;;;9283:146:0;;;;;;;:::i;:::-;;;;;;;;;9442:19;9465:13;;;;;;9464:14;9489:101;;;;9524:13;:20;;-1:-1:-1;;;;9524:20:0;;;;;9559:19;9540:4;9559:19;;;9489:101;40768:50:::1;40802:5;40809:8;40768:33;:50::i;:::-;9620:14:::0;9616:68;;;9667:5;9651:21;;-1:-1:-1;;9651:21:0;;;9616:68;40631:195;;;:::o;41130:1305::-;41339:12;41364:29;41396:39;41417:17;41396:20;:39::i;:::-;41364:71;-1:-1:-1;41494:7:0;;-1:-1:-1;;;;;;41494:7:0;;;41468:33;;;;;41446:144;;;;-1:-1:-1;;;41446:144:0;;;;;;;:::i;:::-;41601:29;;:::i;:::-;-1:-1:-1;41633:152:0;;;;;;;;-1:-1:-1;;;;;41671:19:0;;-1:-1:-1;41671:19:0;;;:6;:19;;;;;;;;;41633:152;;;;;;;;;;;41818:45;41678:11;41633:152;41846:4;41852;41858;41818:6;:45::i;:::-;41796:128;;;;-1:-1:-1;;;41796:128:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41957:19:0;;;;;;:6;:19;;;;;;:26;;41981:1;41957:23;:26::i;:::-;-1:-1:-1;;;;;41935:19:0;;;;;;:6;:19;;;;;;;;:48;;;;42146;;41935:19;;42086:23;;42121:4;;42146:48;;42163:17;;41942:11;;42146:48;;:::i;:::-;;;;-1:-1:-1;;42146:48:0;;;;;;;;;;42113:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42071:134;;;;42226:7;42218:48;;;;-1:-1:-1;;;42218:48:0;;;;;;;:::i;:::-;42282:117;42320:11;42346:10;42371:17;42282:117;;;;;;;;:::i;:::-;;;;;;;;42417:10;41130:1305;-1:-1:-1;;;;;;;;;41130:1305:0:o;49590:182::-;12797:12;:10;:12::i;:::-;-1:-1:-1;;;;;12786:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;12786:23:0;;12778:68;;;;-1:-1:-1;;;12778:68:0;;;;;;;:::i;:::-;49709:26:::1;:55:::0;49590:182::o;61931:698::-;-1:-1:-1;;;;;62218:16:0;;62051:7;62218:16;;;:8;:16;;;;;;;;:28;;;;;;;;:38;62051:7;;;;;;;;;;62218:52;;62196:129;;;;-1:-1:-1;;;62196:129:0;;;;;;;:::i;:::-;62338:23;;:::i;:::-;-1:-1:-1;;;;;;;;;62364:16:0;;;;;;;:8;:16;;;;;;;;:28;;;;;;;;;;62338:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62338:54:0;;-1:-1:-1;62338:54:0;-1:-1:-1;61931:698:0:o;42861:109::-;-1:-1:-1;;;;;42950:12:0;42916:13;42950:12;;;:6;:12;;;;;;;42861:109::o;64147:573::-;64229:10;64212:14;64272:16;;;:8;:16;;;;;;;;:28;;;;;;;;:38;:52;;64250:129;;;;-1:-1:-1;;;64250:129:0;;;;;;;:::i;:::-;64390:23;;:::i;:::-;-1:-1:-1;;;;;;64416:16:0;;;;;;;:8;:16;;;;;;;;:28;;;;;;;;;64390:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64455:68;;;;-1:-1:-1;;;64455:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;64536:16:0;;;64584:1;64536:16;;;:8;:16;;;;;;;;:28;;;;;;;;;:45;;;:49;;;64596:35;;;;;;;;-1:-1:-1;;;;;;64596:35:0;;;;;;;;;;;;;;;;-1:-1:-1;64596:35:0;;;;;;;;;;;64686:25;;;;64649:14;;;;64642:70;;:35;;64536:16;;64642:35;:70::i;65422:130::-;65533:10;65479:7;65506:38;;;:26;:38;;;;;;65422:130;;:::o;50372:264::-;12797:12;:10;:12::i;:::-;-1:-1:-1;;;;;12786:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;12786:23:0;;12778:68;;;;-1:-1:-1;;;12778:68:0;;;;;;;:::i;:::-;50512:30:::1;::::0;50445:21:::1;::::0;50422:20:::1;::::0;50495:48:::1;::::0;50445:21;;50495:16:::1;:48::i;:::-;50554:28;::::0;50477:66;;-1:-1:-1;50554:10:0::1;::::0;:28;::::1;;;::::0;50477:66;;50554:28:::1;::::0;;;50477:66;50554:10;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;50608:10;-1:-1:-1::0;;;;;50598:30:0::1;;50620:7;50598:30;;;;;;:::i;:::-;;;;;;;;12857:1;;50372:264::o:0;47625:39::-;;;;:::o;52023:686::-;52229:24;;52176:19;;52229:39;;-1:-1:-1;;;;;52279:27:0;;47844:42;52279:27;:342;;52543:10;52530:9;:23;52504:117;;;;-1:-1:-1;;;52504:117:0;;;;;;;:::i;:::-;52279:342;;;52361:48;52398:10;52361:32;:12;52378:14;52361:16;:32::i;:::-;:36;;:48::i;:::-;52348:9;:61;52322:166;;;;-1:-1:-1;;;52322:166:0;;;;;;;:::i;:::-;52641:60;52657:13;52672:12;52686:14;52641:15;:60::i;:::-;52634:67;;;52023:686;;;;;;:::o;49406:176::-;12797:12;:10;:12::i;:::-;-1:-1:-1;;;;;12786:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;12786:23:0;;12778:68;;;;-1:-1:-1;;;12778:68:0;;;;;;;:::i;:::-;49522:24:::1;:52:::0;49406:176::o;47531:39::-;;;;:::o;49780:378::-;12797:12;:10;:12::i;:::-;-1:-1:-1;;;;;12786:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;12786:23:0;;12778:68;;;;-1:-1:-1;;;12778:68:0;;;;;;;:::i;:::-;49977:2:::1;49949:25;:30;49941:67;;;;-1:-1:-1::0;;;49941:67:0::1;;;;;;;:::i;:::-;50019:24;:52:::0;;;;50082:32:::1;:68:::0;49780:378::o;53611:189::-;-1:-1:-1;;;;;53763:29:0;;;;;;:11;:29;;;;;;;;;53756:36;;;;;;;;;;;;;;;;;53722:16;;53756:36;;;53763:29;53756:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53611:189;;;;:::o;13217:148::-;12797:12;:10;:12::i;:::-;-1:-1:-1;;;;;12786:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;12786:23:0;;12778:68;;;;-1:-1:-1;;;12778:68:0;;;;;;;:::i;:::-;13308:6:::1;::::0;13287:40:::1;::::0;13324:1:::1;::::0;-1:-1:-1;;;;;13308:6:0::1;::::0;13287:40:::1;::::0;13324:1;;13287:40:::1;13338:6;:19:::0;;-1:-1:-1;;;;;;13338:19:0::1;::::0;;13217:148::o;56079:845::-;56212:10;56202:21;;;;:9;:21;;;;;;;;:34;;;;;;;;:45;:60;;56180:148;;;;-1:-1:-1;;;56180:148:0;;;;;;;:::i;:::-;56341:25;;:::i;:::-;-1:-1:-1;56379:10:0;56369:21;;;;:9;:21;;;;;;;;:34;;;;;;;;;56341:62;;;;;;;;;;;;;;;-1:-1:-1;;;;;56341:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56416:122;;;;-1:-1:-1;;;56416:122:0;;;;;;;:::i;:::-;56568:22;;;;;56613:17;;;;;-1:-1:-1;;;;;56603:28:0;;;56551:14;56603:28;;;:9;:28;;;;;:41;;;;;;;;;:58;;:62;56568:22;56678:20;;47844:42;56678:20;:238;;56839:17;;;;56875:26;;;;56793:123;;-1:-1:-1;;;;;56793:27:0;;;;:123::i;:::-;56678:238;;;56722:9;:17;;;-1:-1:-1;;;;;56714:35:0;:63;56750:9;:26;;;56714:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56079:845;;;:::o;50166:198::-;12797:12;:10;:12::i;:::-;-1:-1:-1;;;;;12786:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;12786:23:0;;12778:68;;;;-1:-1:-1;;;12778:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50256:29:0;::::1;50248:65;;;;-1:-1:-1::0;;;50248:65:0::1;;;;;;;:::i;:::-;50324:14;:32:::0;;-1:-1:-1;;;;;;50324:32:0::1;-1:-1:-1::0;;;;;50324:32:0;;;::::1;::::0;;;::::1;::::0;;50166:198::o;12566:87::-;12639:6;;-1:-1:-1;;;;;12639:6:0;12566:87;:::o;61758:165::-;-1:-1:-1;;;;;61897:18:0;;;;;;:10;:18;;;;;;;;;61890:25;;;;;;;;;;;;;;;;;61856:16;;61890:25;;;61897:18;61890:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61758:165;;;:::o;53808:2263::-;-1:-1:-1;;;;;53995:27:0;;;;;;:9;:27;;;;;;;;:40;;;;;;;;:51;:66;;53973:144;;;;-1:-1:-1;;;53973:144:0;;;;;;;:::i;:::-;54130:16;54149:11;:9;:11::i;:::-;54130:30;;54171:25;;:::i;:::-;-1:-1:-1;;;;;;54199:27:0;;;;;;;:9;:27;;;;;;;;:40;;;;;;;;54171:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54274:33;;;:15;:33;;;;;:46;;;;;;;;:56;;;;;;;;;;;;54171:68;;54274:56;;;;:64;;;;54252:143;;;;-1:-1:-1;;;54252:143:0;;;;;;;:::i;:::-;54544:19;54699:16;54717:11;54730:8;54688:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54678:62;;;;;;54590:165;;;;;;;;:::i;:::-;;;;;;;;;;;;;54566:200;;;;;;54544:222;;54777:14;54794:31;54804:11;54817:1;54820;54823;54794:31;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54794:31:0;;-1:-1:-1;;54794:31:0;;;-1:-1:-1;;;;;;;54844:20:0;;54836:48;;;;-1:-1:-1;;;54836:48:0;;;;;;;:::i;:::-;54913:14;;-1:-1:-1;;;;;54903:24:0;;;54913:14;;54903:24;54895:56;;;;-1:-1:-1;;;54895:56:0;;;;;;;:::i;:::-;55017:9;:21;;;54986:9;:28;;;:52;54964:121;;;;-1:-1:-1;;;54964:121:0;;;;;;;:::i;:::-;55148:9;:23;;;55118:9;:26;;;:53;;55096:139;;;;-1:-1:-1;;;55096:139:0;;;;;;;:::i;:::-;55265:22;;;;-1:-1:-1;;;;;55300:20:0;;47844:42;55300:20;:165;;55441:23;;;;55403:62;;-1:-1:-1;;;;;55403:27:0;;;55431:8;;55403:27;:62::i;:::-;55300:165;;;55363:23;;;;55336:51;;-1:-1:-1;;;;;55336:26:0;;;:51;;;;;;;;;55363:23;55336:26;:51;;;;;;;;;;;;;;;;;;;;;55300:165;-1:-1:-1;;;;;55507:33:0;;;;;;;:15;:33;;;;;;;;:46;;;;;;;;:56;;;;;;;;;:63;;-1:-1:-1;;55507:63:0;55566:4;55507:63;;;;;;55643:42;;;;:63;;:60;:63::i;:::-;-1:-1:-1;;;;;55581:27:0;;;;;;:9;:27;;;;;;;;:40;;;;;;;;:59;;:125;55836:23;;;;55777:40;;;;:83;;:58;:83::i;:::-;-1:-1:-1;;;;;55717:27:0;;;;;;;:9;:27;;;;;;;;:40;;;;;;;;;;:57;;:143;;;;56029:23;;;;55901:162;;;;;;55745:11;;55901:162;;;;56008:6;;56029:23;55901:162;:::i;:::-;;;;;;;;53808:2263;;;;;;;;;;:::o;60479:1271::-;60610:18;60641:28;60687:6;60641:53;;60705:21;60733:13;-1:-1:-1;;;;;60733:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60729:28;;:2;:28;60705:52;;61315:16;61334:49;61358:24;;61334:19;61345:7;61334:6;:10;;:19;;;;:::i;:::-;:23;;:49::i;:::-;61315:68;;61394:14;61411:88;61456:32;;61452:2;:36;61411:22;61429:3;61411:13;:17;;:22;;;;:::i;:88::-;61394:105;-1:-1:-1;61510:18:0;61531:20;:8;61394:105;61531:12;:20::i;:::-;61510:41;;61583:1;61570:10;:14;61562:52;;;;-1:-1:-1;;;61562:52:0;;;;;;;:::i;:::-;61646:10;61633:9;:23;61625:59;;;;-1:-1:-1;;;61625:59:0;;;;;;;:::i;:::-;61704:38;61718:6;61726:7;61735:6;61704:13;:38::i;:::-;61697:45;60479:1271;-1:-1:-1;;;;;;;;;60479:1271:0:o;64728:686::-;64811:10;64787:21;64854:33;;;:26;:33;;;;;;64832:113;;;;-1:-1:-1;;;64832:113:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;64977:33:0;;64956:18;64977:33;;;:26;:33;;;;;;;65021:37;;;65102:30;;:70;;64977:33;65102:34;:70::i;:::-;65069:30;:103;65315:26;;-1:-1:-1;;;;;65315:14:0;;;:26;;;;;65330:10;;65315:26;;;;65330:10;65315:14;:26;;;;;;;;;;;;;;;;;;;;;65359:47;65388:5;65395:10;65359:47;;;;;;;:::i;:::-;;;;;;;;64728:686;;:::o;57826:897::-;58007:18;;57980:24;;58073:102;58095:16;58091:1;:20;;;58073:102;;;58146:29;58163:8;58172:1;58163:11;;;;;;;;;;;;;;;;58146:12;:16;;:29;;;;:::i;:::-;58131:44;-1:-1:-1;58113:3:0;;58073:102;;;-1:-1:-1;;;;;;58188:20:0;;47844:42;58188:20;:459;;58562:16;58533:26;;:45;58520:9;:58;58494:153;;;;-1:-1:-1;;;58494:153:0;;;;;;;:::i;:::-;58188:459;;;58327:26;;58284:114;;58327:48;;58358:16;58327:30;:48::i;:::-;58284:12;;:16;:114::i;:::-;58250:9;:148;58224:254;;;;-1:-1:-1;;;58224:254:0;;;;;;;:::i;:::-;58660:55;58671:6;58679:11;58692:8;58702:12;58660:10;:55::i;:::-;57826:897;;;;;:::o;52717:886::-;-1:-1:-1;;;;;53060:27:0;;52849:7;53060:27;;;:9;:27;;;;;;;;:40;;;;;;;;:51;52849:7;;;;;;;;;;;;;;53060:66;;53038:144;;;;-1:-1:-1;;;53038:144:0;;;;;;;:::i;:::-;53195:25;;:::i;:::-;-1:-1:-1;;;;;;;;;53223:27:0;;;;;;;:9;:27;;;;;;;;:40;;;;;;;;;;53195:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53195:68:0;-1:-1:-1;53195:68:0;-1:-1:-1;53195:68:0;;-1:-1:-1;53195:68:0;-1:-1:-1;52717:886:0:o;59309:214::-;-1:-1:-1;;;;;59464:19:0;;59432:7;59464:19;;;:9;:19;;;;;;;;:32;;;;;;;;:51;;;59309:214;;;;;:::o;47577:41::-;;;;:::o;47671:47::-;;;;:::o;65560:191::-;65712:30;;65613:7;;65656:21;;65695:48;;65656:21;;65695:16;:48::i;:::-;65688:55;;;65560:191;:::o;13520:281::-;12797:12;:10;:12::i;:::-;-1:-1:-1;;;;;12786:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;12786:23:0;;12778:68;;;;-1:-1:-1;;;12778:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13623:22:0;::::1;13601:110;;;;-1:-1:-1::0;;;13601:110:0::1;;;;;;;:::i;:::-;13748:6;::::0;13727:38:::1;::::0;-1:-1:-1;;;;;13727:38:0;;::::1;::::0;13748:6:::1;::::0;13727:38:::1;::::0;13748:6:::1;::::0;13727:38:::1;13776:6;:17:::0;;-1:-1:-1;;;;;;13776:17:0::1;-1:-1:-1::0;;;;;13776:17:0;;;::::1;::::0;;;::::1;::::0;;13520:281::o;62637:1502::-;-1:-1:-1;;;;;62800:16:0;;;;;;:8;:16;;;;;;;;:28;;;;;;;;:38;:52;;62778:129;;;;-1:-1:-1;;;62778:129:0;;;;;;;:::i;:::-;62918:23;;:::i;:::-;-1:-1:-1;;;;;;62944:16:0;;;;;;;:8;:16;;;;;;;;:28;;;;;;;;;62918:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62991:11;62983:62;;;;-1:-1:-1;;;62983:62:0;;;;;;;:::i;:::-;63107:7;63078:8;:25;;;:36;;63056:115;;;;-1:-1:-1;;;63056:115:0;;;;;;;:::i;:::-;63184:28;63230:8;:14;;;63184:61;;63256:21;63284:13;-1:-1:-1;;;;;63284:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63280:28;;:2;:28;63256:52;;63319:18;63340:46;63372:13;63340:27;63359:7;63340:8;:14;;;:18;;:27;;;;:::i;:::-;:31;;:46::i;:::-;63319:67;;63418:1;63405:10;:14;63397:52;;;;-1:-1:-1;;;63397:52:0;;;;;;;:::i;:::-;63481:10;63468:9;:23;63460:65;;;;-1:-1:-1;;;63460:65:0;;;;;;;:::i;:::-;63586:39;;;;:66;;63644:7;63586:57;:66::i;:::-;-1:-1:-1;;;;;63538:16:0;;;;;;;:8;:16;;;;;;;;:28;;;;;;;;;;:45;;:114;;;;63670:14;;;;63663:56;;:35;63699:10;63711:7;63663:35;:56::i;:::-;-1:-1:-1;;;;;63769:34:0;;;;;;:26;:34;;;;;;:63;;63822:9;63769:52;:63::i;:::-;-1:-1:-1;;;;;63732:34:0;;;;;;:26;:34;;;;;:100;63876:30;;:69;;63925:9;63876:34;:69::i;:::-;63843:30;:102;64055:14;;;;;64106;;;;63963:168;;;;;;63984:10;;64009;;64034:6;;64055:14;64084:7;;64106:14;63963:168;:::i;:::-;;;;;;;;62637:1502;;;;;;;:::o;48340:1058::-;9305:13;;;;;;;;:33;;;9322:16;:14;:16::i;:::-;9305:50;;;-1:-1:-1;9343:12:0;;;;9342:13;9305:50;9283:146;;;;-1:-1:-1;;;9283:146:0;;;;;;;:::i;:::-;9442:19;9465:13;;;;;;9464:14;9489:101;;;;9524:13;:20;;-1:-1:-1;;;;9524:20:0;;;;;9559:19;9540:4;9559:19;;;9489:101;-1:-1:-1;;;;;48639:29:0;::::1;48617:110;;;;-1:-1:-1::0;;;48617:110:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;48793:29:0;::::1;48785:65;;;;-1:-1:-1::0;;;48785:65:0::1;;;;;;;:::i;:::-;48863:35;:33;:35::i;:::-;48909:61;;;;;;;;;;;;;;-1:-1:-1::0;;;48909:61:0::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;48909:61:0::1;;::::0;:44:::1;:61::i;:::-;48981:14;:32:::0;;-1:-1:-1;;;;;;48981:32:0::1;-1:-1:-1::0;;;;;48981:32:0;::::1;;::::0;;49087:2:::1;49059:30:::0;::::1;49051:67;;;;-1:-1:-1::0;;;49051:67:0::1;;;;;;;:::i;:::-;49129:24;:52:::0;;;49192:26:::1;:56:::0;;;49259:24:::1;:52:::0;;;49322:32:::1;:68:::0;;;9616;;;;9667:5;9651:21;;-1:-1:-1;;9651:21:0;;;9616:68;48340:1058;;;;;;:::o;9784:125::-;9832:4;9857:44;9895:4;9857:29;:44::i;:::-;9856:45;9849:52;;9784:125;:::o;38302:409::-;9305:13;;;;;;;;:33;;;9322:16;:14;:16::i;:::-;9305:50;;;-1:-1:-1;9343:12:0;;;;9342:13;9305:50;9283:146;;;;-1:-1:-1;;;9283:146:0;;;;;;;:::i;:::-;9442:19;9465:13;;;;;;9464:14;9489:101;;;;9524:13;:20;;-1:-1:-1;;;;9524:20:0;;;;;9559:19;9540:4;9559:19;;;9489:101;38121:120:::1;;;;;;;;;;;;;;;;;38097:155;;;;;;38564:4;38548:22;;;;;;38605:7;38589:25;;;;;;38633:12;:10;:12::i;:::-;38672:4;38478:214;;;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;38478:214:0;;::::1;::::0;;;;;;38454:249;;38478:214:::1;38454:249:::0;;::::1;::::0;38436:15:::1;:267:::0;9616:68;;;;9667:5;9651:21;;-1:-1:-1;;9651:21:0;;;38302:409;;;:::o;40834:288::-;40936:16;40974:7;:14;40992:1;40974:19;40970:62;;;-1:-1:-1;41017:3:0;41010:10;;40970:62;-1:-1:-1;41100:2:0;41087:16;41081:23;;41053:62::o;42978:450::-;43154:4;43171:14;43188:139;43212:47;43231:27;43251:6;43231:19;:27::i;:::-;43212:18;:47::i;:::-;43274:4;43293;43312;43188:139;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43188:139:0;;-1:-1:-1;;43188:139:0;;;-1:-1:-1;;;;;;;43346:20:0;;43338:50;;;;-1:-1:-1;;;43338:50:0;;;;;;;:::i;:::-;43416:4;-1:-1:-1;;;;;43406:14:0;:6;-1:-1:-1;;;;;43406:14:0;;43399:21;;;42978:450;;;;;;;:::o;19765:179::-;19823:7;19855:5;;;19879:6;;;;19871:46;;;;-1:-1:-1;;;19871:46:0;;;;;;;:::i;10791:106::-;10879:10;10791:106;:::o;33970:248::-;34087:123;34121:5;34164:23;;;34189:2;34193:5;34141:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;34141:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;34141:58:0;-1:-1:-1;;;;;;34141:58:0;;;;;;;;;;34087:19;:123::i;20227:158::-;20285:7;20318:1;20313;:6;;20305:49;;;;-1:-1:-1;;;20305:49:0;;;;;;;:::i;:::-;-1:-1:-1;20372:5:0;;;20227:158::o;20644:220::-;20702:7;20726:6;20722:20;;-1:-1:-1;20741:1:0;20734:8;;20722:20;20765:5;;;20769:1;20765;:5;:1;20789:5;;;;;:10;20781:56;;;;-1:-1:-1;;;20781:56:0;;;;;;;:::i;50667:1348::-;50813:19;50882:1;50867:12;:16;50845:110;;;;-1:-1:-1;;;50845:110:0;;;;;;;:::i;:::-;51005:1;50988:14;:18;50966:115;;;;-1:-1:-1;;;50966:115:0;;;;;;;:::i;:::-;51094:23;51120:32;:12;51137:14;51120:16;:32::i;:::-;51094:58;;51163:15;51181:11;:9;:11::i;:::-;51163:29;-1:-1:-1;;;;;;51209:27:0;;47844:42;51209:27;51205:191;;51251:145;-1:-1:-1;;;;;51251:38:0;;51308:7;51342:4;51366:15;51251:38;:145::i;:::-;51423:15;:13;:15::i;:::-;51409:29;;51451:25;;:::i;:::-;51479:346;;;;;;;;51515:11;51479:346;;;;51550:7;-1:-1:-1;;;;;51479:346:0;;;;;51586:13;-1:-1:-1;;;;;51479:346:0;;;;;51630:15;51479:346;;;;51678:15;51479:346;;;;51721:12;51479:346;;;;51763:14;51479:346;;;;51812:1;51479:346;;;51451:374;;51872:9;51838;:18;51848:7;-1:-1:-1;;;;;51838:18:0;-1:-1:-1;;;;;51838:18:0;;;;;;;;;;;;:31;51857:11;51838:31;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51838:43:0;;;;;-1:-1:-1;;;;;51838:43:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51838:43:0;;;;;-1:-1:-1;;;;;51838:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51892:11;:20;51904:7;-1:-1:-1;;;;;51892:20:0;-1:-1:-1;;;;;51892:20:0;;;;;;;;;;;;51918:11;51892:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51964:11;51948:28;;;;;;;;;;51989:18;;;50667:1348;;;;;:::o;43436:601::-;43480:14;43511:10;43533:4;43511:27;43507:499;;;43555:18;43576:8;;43555:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;43615:8:0;43826:17;43820:24;-1:-1:-1;;;;;43794:134:0;;-1:-1:-1;43654:289:0;;-1:-1:-1;43654:289:0;;-1:-1:-1;43984:10:0;43436:601;:::o;21342:153::-;21400:7;21432:1;21428;:5;21420:44;;;;-1:-1:-1;;;21420:44:0;;;;;;;:::i;:::-;21486:1;21482;:5;;;;;;;21342:153;-1:-1:-1;;;21342:153:0:o;59531:940::-;59655:18;59704:1;59694:7;:11;59686:62;;;;-1:-1:-1;;;59686:62:0;;;;;;;:::i;:::-;59776:1;59767:6;:10;59759:60;;;;-1:-1:-1;;;59759:60:0;;;;;;;:::i;:::-;59878:6;59915:10;59936:62;-1:-1:-1;;;;;59936:30:0;;59915:10;59983:4;59990:7;59936:30;:62::i;:::-;60024:14;:12;:14::i;:::-;60011:27;;60049:23;;:::i;:::-;-1:-1:-1;60075:218:0;;;;;;;;;;;-1:-1:-1;;;;;60075:218:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60306:16:0;;;:8;:16;;;;;:28;;;;;;;;:39;;;;;;;;;;;;;;;-1:-1:-1;;;;;;60306:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60356:18;;;:10;:18;;;;;:35;;;;;;;;;;;;;;;;;60409:54;;60075:218;;;60409:54;;;;60109:10;;60169:6;;60206:7;;60275:6;;60409:54;:::i;:::-;;;;;;;;59531:940;;;;;;;;:::o;56932:886::-;57137:18;;57190:15;;57226:33;;;57218:63;;;;-1:-1:-1;;;57218:63:0;;;;;;;:::i;:::-;57294:13;57310:11;:9;:11::i;:::-;57294:27;-1:-1:-1;;;;;;57338:20:0;;47844:42;57338:20;57334:386;;;57378:7;57373:107;57395:16;57391:1;:20;;;57373:107;;;57443:11;57455:1;57443:14;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57435:32:0;:45;57468:8;57477:1;57468:11;;;;;;;;;;;;;;;;57435:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57413:3:0;;57373:107;;;;57334:386;;;57514:7;57509:211;57531:16;57527:1;:20;;;57509:211;;;57571:149;57625:5;57653:11;57665:1;57653:14;;;;;;;;;;;;;;;;57690:8;57699:1;57690:11;;;;;;;;;;;;;;;;57578:6;-1:-1:-1;;;;;57571:31:0;;;:149;;;;;;:::i;:::-;57549:3;;57509:211;;;;57334:386;57771:6;-1:-1:-1;;;;;57761:49:0;;57779:16;57797:12;57761:49;;;;;;;:::i;:::-;;;;;;;;56932:886;;;;;;;:::o;12152:129::-;9305:13;;;;;;;;:33;;;9322:16;:14;:16::i;:::-;9305:50;;;-1:-1:-1;9343:12:0;;;;9342:13;9305:50;9283:146;;;;-1:-1:-1;;;9283:146:0;;;;;;;:::i;:::-;9442:19;9465:13;;;;;;9464:14;9489:101;;;;9524:13;:20;;-1:-1:-1;;;;9524:20:0;;;;;9559:19;9540:4;9559:19;;;9489:101;12210:26:::1;:24;:26::i;:::-;12247;:24;:26::i;:::-;9620:14:::0;9616:68;;;9667:5;9651:21;;-1:-1:-1;;9651:21:0;;;9616:68;12152:129;:::o;909:444::-;1289:20;1337:8;;;909:444::o;38719:125::-;38817:9;;38796:41::o;42443:410::-;42553:7;39945:108;;;;;;;;;;;;;;;;;39921:143;;;;;;;42707:12;;42742:11;;;;42786:24;;;;;42776:35;;;;;;42626:204;;;;;;:::i;:::-;;;;;;;;;;;;;42598:247;;;;;;42578:267;;42443:410;;;:::o;39323:258::-;39422:7;39524:20;:18;:20::i;:::-;39546:11;39495:63;;;;;;;;;:::i;36846:860::-;37270:23;37296:106;37338:4;37296:106;;;;;;;;;;;;;;;;;37304:5;-1:-1:-1;;;;;37296:27:0;;;:106;;;;;:::i;:::-;37417:17;;37270:132;;-1:-1:-1;37417:21:0;37413:286;;37590:10;37579:30;;;;;;;;;;;;:::i;:::-;37553:134;;;;-1:-1:-1;;;37553:134:0;;;;;;;:::i;34226:285::-;34370:133;34404:5;34447:27;;;34476:4;34482:2;34486:5;34424:68;;;;;;;;;;:::i;58951:350::-;59053:10;58994:19;59088:32;;;:14;:32;;;;;;;59137:16;59133:64;;59184:1;59170:15;;59133:64;59244:18;:11;59260:1;59244:15;:18::i;:::-;-1:-1:-1;;;;;59209:32:0;;;;;;;:14;:32;;;;;:53;58951:350;:::o;65759:281::-;65859:10;65801:18;65845:25;;;:13;:25;;;;;;65887:15;65883:62;;-1:-1:-1;65932:1:0;65883:62;65985:17;:10;66000:1;65985:14;:17::i;:::-;65971:10;65957:25;;;;:13;:25;;;;;:45;65759:281;:::o;10724:59::-;9305:13;;;;;;;;:33;;;9322:16;:14;:16::i;:::-;9305:50;;;-1:-1:-1;9343:12:0;;;;9342:13;9305:50;9283:146;;;;-1:-1:-1;;;9283:146:0;;;;;;;:::i;:::-;9442:19;9465:13;;;;;;9464:14;9489:101;;;;9524:13;:20;;-1:-1:-1;;;;9524:20:0;;;;;9559:19;9540:4;9559:19;;;9620:14;9616:68;;;9667:5;9651:21;;-1:-1:-1;;9651:21:0;;;10724:59;:::o;12289:196::-;9305:13;;;;;;;;:33;;;9322:16;:14;:16::i;:::-;9305:50;;;-1:-1:-1;9343:12:0;;;;9342:13;9305:50;9283:146;;;;-1:-1:-1;;;9283:146:0;;;;;;;:::i;:::-;9442:19;9465:13;;;;;;9464:14;9489:101;;;;9524:13;:20;;-1:-1:-1;;;;9524:20:0;;;;;9559:19;9540:4;9559:19;;;9489:101;12357:17:::1;12377:12;:10;:12::i;:::-;12400:6;:18:::0;;-1:-1:-1;;;;;;12400:18:0::1;-1:-1:-1::0;;;;;12400:18:0;::::1;::::0;;::::1;::::0;;;12434:43:::1;::::0;12400:18;;-1:-1:-1;12400:18:0;-1:-1:-1;;12434:43:0::1;::::0;-1:-1:-1;;12434:43:0::1;9602:1;9620:14:::0;9616:68;;;9667:5;9651:21;;-1:-1:-1;;9651:21:0;;;12289:196;:::o;38852:102::-;38931:15;;38852:102;:::o;28366:229::-;28503:12;28535:52;28557:6;28565:4;28571:1;28574:12;28535:21;:52::i;:::-;28528:59;28366:229;-1:-1:-1;;;;28366:229:0:o;29582:632::-;29752:12;29824:5;29799:21;:30;;29777:118;;;;-1:-1:-1;;;29777:118:0;;;;;;;:::i;:::-;29914:18;29925:6;29914:10;:18::i;:::-;29906:60;;;;-1:-1:-1;;;29906:60:0;;;;;;;:::i;:::-;30040:12;30054:23;30081:6;-1:-1:-1;;;;;30081:11:0;30100:5;30121:4;30081:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30039:97;;;;30154:52;30172:7;30181:10;30193:12;30154:17;:52::i;:::-;30147:59;29582:632;-1:-1:-1;;;;;;;29582:632:0:o;32505:777::-;32655:12;32684:7;32680:595;;;-1:-1:-1;32715:10:0;32708:17;;32680:595;32829:17;;:21;32825:439;;33092:10;33086:17;33153:15;33140:10;33136:2;33132:19;33125:44;33040:148;33235:12;33228:20;;-1:-1:-1;;;33228:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:692:1:-;;127:3;120:4;112:6;108:17;104:27;94:2;;149:5;142;135:20;94:2;193:6;180:20;218:69;233:53;279:6;233:53;:::i;:::-;218:69;:::i;:::-;321:21;;;209:78;-1:-1:-1;361:4:1;381:14;;;;415:15;;;461;;;449:28;;445:37;;442:46;-1:-1:-1;439:2:1;;;501:1;498;491:12;439:2;523:1;533:167;547:6;544:1;541:13;533:167;;;608:17;;596:30;;646:12;;;;678;;;;569:1;562:9;533:167;;;537:3;;;;;84:622;;;;:::o;711:521::-;;808:3;801:4;793:6;789:17;785:27;775:2;;830:5;823;816:20;775:2;874:6;861:20;904:18;896:6;893:30;890:2;;;926:9;890:2;955:58;1001:2;978:17;;-1:-1:-1;;974:31:1;1007:4;970:42;955:58;:::i;:::-;946:67;;1036:6;1029:5;1022:21;1090:3;1083:4;1074:6;1066;1062:19;1058:30;1055:39;1052:2;;;1107:1;1104;1097:12;1052:2;1170:6;1163:4;1155:6;1151:17;1144:4;1137:5;1133:16;1120:57;1224:1;1197:18;;;1217:4;1193:29;1186:40;1201:5;765:467;-1:-1:-1;;765:467:1:o;1237:259::-;;1349:2;1337:9;1328:7;1324:23;1320:32;1317:2;;;1370:6;1362;1355:22;1317:2;1414:9;1401:23;1433:33;1460:5;1433:33;:::i;1501:1456::-;;;;1697:2;1685:9;1676:7;1672:23;1668:32;1665:2;;;1718:6;1710;1703:22;1665:2;1762:9;1749:23;1781:33;1808:5;1781:33;:::i;:::-;1833:5;-1:-1:-1;1857:2:1;1895:18;;;1882:32;1933:18;1963:14;;;1960:2;;;1995:6;1987;1980:22;1960:2;2038:6;2027:9;2023:22;2013:32;;2083:7;2076:4;2072:2;2068:13;2064:27;2054:2;;2110:6;2102;2095:22;2054:2;2155;2142:16;2178:69;2193:53;2239:6;2193:53;:::i;2178:69::-;2281:19;;;2316:12;;;;2348:11;;;2386:15;;;2378:24;;2374:33;;2371:46;-1:-1:-1;2368:2:1;;;2435:6;2427;2420:22;2368:2;2462:6;2453:15;;2477:250;2491:6;2488:1;2485:13;2477:250;;;2568:3;2555:17;2585:35;2612:7;2585:35;:::i;:::-;2633:20;;2513:1;2506:9;;;;;2673:12;;;;2705;;2477:250;;;-1:-1:-1;2746:5:1;-1:-1:-1;;;2804:2:1;2789:18;;2776:32;;-1:-1:-1;2820:16:1;;;2817:2;;;2854:6;2846;2839:22;2817:2;;;2882:69;2943:7;2932:8;2921:9;2917:24;2882:69;:::i;:::-;2872:79;;;1655:1302;;;;;:::o;2962:756::-;;;;;;3149:3;3137:9;3128:7;3124:23;3120:33;3117:2;;;3171:6;3163;3156:22;3117:2;3215:9;3202:23;3234:33;3261:5;3234:33;:::i;:::-;3286:5;-1:-1:-1;3342:2:1;3327:18;;3314:32;3369:18;3358:30;;3355:2;;;3406:6;3398;3391:22;3355:2;3434:51;3477:7;3468:6;3457:9;3453:22;3434:51;:::i;:::-;3424:61;;;3532:2;3521:9;3517:18;3504:32;3494:42;;3583:2;3572:9;3568:18;3555:32;3545:42;;3639:3;3628:9;3624:19;3611:33;3653;3678:7;3653:33;:::i;:::-;3705:7;3695:17;;;3107:611;;;;;;;;:::o;3723:327::-;;;3852:2;3840:9;3831:7;3827:23;3823:32;3820:2;;;3873:6;3865;3858:22;3820:2;3917:9;3904:23;3936:33;3963:5;3936:33;:::i;:::-;3988:5;4040:2;4025:18;;;;4012:32;;-1:-1:-1;;;3810:240:1:o;4055:604::-;;;;;;4233:3;4221:9;4212:7;4208:23;4204:33;4201:2;;;4255:6;4247;4240:22;4201:2;4299:9;4286:23;4318:33;4345:5;4318:33;:::i;:::-;4370:5;-1:-1:-1;4422:2:1;4407:18;;4394:32;;-1:-1:-1;4473:2:1;4458:18;;4445:32;;-1:-1:-1;4524:2:1;4509:18;;4496:32;;-1:-1:-1;4580:3:1;4565:19;;4552:33;4594;4552;4594;:::i;4664:395::-;;;;4810:2;4798:9;4789:7;4785:23;4781:32;4778:2;;;4831:6;4823;4816:22;4778:2;4875:9;4862:23;4894:33;4921:5;4894:33;:::i;:::-;4946:5;4998:2;4983:18;;4970:32;;-1:-1:-1;5049:2:1;5034:18;;;5021:32;;4768:291;-1:-1:-1;;;4768:291:1:o;5064:533::-;;;;;;5244:3;5232:9;5223:7;5219:23;5215:33;5212:2;;;5266:6;5258;5251:22;5212:2;5310:9;5297:23;5329:33;5356:5;5329:33;:::i;:::-;5381:5;5433:2;5418:18;;5405:32;;-1:-1:-1;5484:2:1;5469:18;;5456:32;;5535:2;5520:18;;5507:32;;-1:-1:-1;5586:3:1;5571:19;5558:33;;-1:-1:-1;5202:395:1;-1:-1:-1;;;5202:395:1:o;5602:297::-;;5722:2;5710:9;5701:7;5697:23;5693:32;5690:2;;;5743:6;5735;5728:22;5690:2;5780:9;5774:16;5833:5;5826:13;5819:21;5812:5;5809:32;5799:2;;5860:6;5852;5845:22;5904:575;;;6053:2;6041:9;6032:7;6028:23;6024:32;6021:2;;;6074:6;6066;6059:22;6021:2;6119:9;6106:23;6148:18;6189:2;6181:6;6178:14;6175:2;;;6210:6;6202;6195:22;6175:2;6238:51;6281:7;6272:6;6261:9;6257:22;6238:51;:::i;:::-;6228:61;;6342:2;6331:9;6327:18;6314:32;6298:48;;6371:2;6361:8;6358:16;6355:2;;;6392:6;6384;6377:22;6355:2;;6420:53;6465:7;6454:8;6443:9;6439:24;6420:53;:::i;:::-;6410:63;;;6011:468;;;;;:::o;6484:190::-;;6596:2;6584:9;6575:7;6571:23;6567:32;6564:2;;;6617:6;6609;6602:22;6564:2;-1:-1:-1;6645:23:1;;6554:120;-1:-1:-1;6554:120:1:o;6679:403::-;;;;6833:2;6821:9;6812:7;6808:23;6804:32;6801:2;;;6854:6;6846;6839:22;6801:2;6895:9;6882:23;6872:33;;6955:2;6944:9;6940:18;6927:32;6968:33;6995:5;6968:33;:::i;:::-;6791:291;;7020:5;;-1:-1:-1;;;7072:2:1;7057:18;;;;7044:32;;6791:291::o;7087:258::-;;;7216:2;7204:9;7195:7;7191:23;7187:32;7184:2;;;7237:6;7229;7222:22;7184:2;-1:-1:-1;;7265:23:1;;;7335:2;7320:18;;;7307:32;;-1:-1:-1;7174:171:1:o;7350:259::-;;7471:2;7459:9;7450:7;7446:23;7442:32;7439:2;;;7492:6;7484;7477:22;7439:2;7529:9;7523:16;7548:31;7573:5;7548:31;:::i;7614:259::-;;7695:5;7689:12;7722:6;7717:3;7710:19;7738:63;7794:6;7787:4;7782:3;7778:14;7771:4;7764:5;7760:16;7738:63;:::i;:::-;7855:2;7834:15;-1:-1:-1;;7830:29:1;7821:39;;;;7862:4;7817:50;;7665:208;-1:-1:-1;;7665:208:1:o;7878:274::-;;8045:6;8039:13;8061:53;8107:6;8102:3;8095:4;8087:6;8083:17;8061:53;:::i;:::-;8130:16;;;;;8015:137;-1:-1:-1;;8015:137:1:o;8157:415::-;;8352:6;8346:13;8368:53;8414:6;8409:3;8402:4;8394:6;8390:17;8368:53;:::i;:::-;8490:2;8486:15;;;;-1:-1:-1;;8482:53:1;8443:16;;;;8468:68;;;8563:2;8552:14;;8322:250;-1:-1:-1;;8322:250:1:o;8577:380::-;8819:66;8807:79;;8911:2;8902:12;;8895:28;;;;8948:2;8939:12;;8797:160::o;8962:392::-;-1:-1:-1;;;9220:27:1;;9272:1;9263:11;;9256:27;;;;9308:2;9299:12;;9292:28;9345:2;9336:12;;9210:144::o;9359:203::-;-1:-1:-1;;;;;9523:32:1;;;;9505:51;;9493:2;9478:18;;9460:102::o;9567:282::-;-1:-1:-1;;;;;9767:32:1;;;;9749:51;;9831:2;9816:18;;9809:34;9737:2;9722:18;;9704:145::o;9854:616::-;-1:-1:-1;;;;;10213:15:1;;;10195:34;;10260:2;10245:18;;10238:34;;;;10308:15;;;10303:2;10288:18;;10281:43;10360:15;;10355:2;10340:18;;10333:43;10407:3;10392:19;;10385:35;;;;10175:3;10436:19;;10429:35;;;;10144:3;10129:19;;10111:359::o;10475:433::-;-1:-1:-1;;;;;10732:15:1;;;10714:34;;10784:15;;10779:2;10764:18;;10757:43;10836:2;10831;10816:18;;10809:30;;;10475:433;;10856:46;;10883:18;;10875:6;10856:46;:::i;:::-;10848:54;10666:242;-1:-1:-1;;;;;10666:242:1:o;10913:375::-;-1:-1:-1;;;;;11171:15:1;;;11153:34;;11223:15;;;;11218:2;11203:18;;11196:43;11270:2;11255:18;;11248:34;;;;11103:2;11088:18;;11070:218::o;11572:375::-;-1:-1:-1;;;;;11830:15:1;;;11812:34;;11877:2;11862:18;;11855:34;;;;11925:15;;;11920:2;11905:18;;11898:43;11762:2;11747:18;;11729:218::o;11952:635::-;12123:2;12175:21;;;12245:13;;12148:18;;;12267:22;;;11952:635;;12123:2;12346:15;;;;12320:2;12305:18;;;11952:635;12392:169;12406:6;12403:1;12400:13;12392:169;;;12467:13;;12455:26;;12536:15;;;;12501:12;;;;12428:1;12421:9;12392:169;;;-1:-1:-1;12578:3:1;;12103:484;-1:-1:-1;;;;;;12103:484:1:o;12592:489::-;12851:25;;;12907:2;12892:18;;12885:34;;;;12950:2;12935:18;;12928:34;;;;12993:2;12978:18;;12971:34;-1:-1:-1;;;;;13042:32:1;13036:3;13021:19;;13014:61;12838:3;12823:19;;12805:276::o;13086:417::-;13317:25;;;13373:2;13358:18;;13351:34;;;;-1:-1:-1;;;;;13421:32:1;13416:2;13401:18;;13394:60;13485:2;13470:18;;13463:34;13304:3;13289:19;;13271:232::o;13508:398::-;13735:25;;;13808:4;13796:17;;;;13791:2;13776:18;;13769:45;13845:2;13830:18;;13823:34;13888:2;13873:18;;13866:34;13722:3;13707:19;;13689:217::o;13911:219::-;;14058:2;14047:9;14040:21;14078:46;14120:2;14109:9;14105:18;14097:6;14078:46;:::i;14361:408::-;14563:2;14545:21;;;14602:2;14582:18;;;14575:30;14641:34;14636:2;14621:18;;14614:62;-1:-1:-1;;;14707:2:1;14692:18;;14685:42;14759:3;14744:19;;14535:234::o;14774:351::-;14976:2;14958:21;;;15015:2;14995:18;;;14988:30;15054:29;15049:2;15034:18;;15027:57;15116:2;15101:18;;14948:177::o;15130:402::-;15332:2;15314:21;;;15371:2;15351:18;;;15344:30;15410:34;15405:2;15390:18;;15383:62;-1:-1:-1;;;15476:2:1;15461:18;;15454:36;15522:3;15507:19;;15304:228::o;15537:352::-;15739:2;15721:21;;;15778:2;15758:18;;;15751:30;15817;15812:2;15797:18;;15790:58;15880:2;15865:18;;15711:178::o;15894:425::-;16096:2;16078:21;;;16135:2;16115:18;;;16108:30;16174:34;16169:2;16154:18;;16147:62;16245:31;16240:2;16225:18;;16218:59;16309:3;16294:19;;16068:251::o;16324:347::-;16526:2;16508:21;;;16565:2;16545:18;;;16538:30;16604:25;16599:2;16584:18;;16577:53;16662:2;16647:18;;16498:173::o;16676:351::-;16878:2;16860:21;;;16917:2;16897:18;;;16890:30;16956:29;16951:2;16936:18;;16929:57;17018:2;17003:18;;16850:177::o;17032:347::-;17234:2;17216:21;;;17273:2;17253:18;;;17246:30;17312:25;17307:2;17292:18;;17285:53;17370:2;17355:18;;17206:173::o;17384:343::-;17586:2;17568:21;;;17625:2;17605:18;;;17598:30;-1:-1:-1;;;17659:2:1;17644:18;;17637:49;17718:2;17703:18;;17558:169::o;17732:350::-;17934:2;17916:21;;;17973:2;17953:18;;;17946:30;18012:28;18007:2;17992:18;;17985:56;18073:2;18058:18;;17906:176::o;18087:406::-;18289:2;18271:21;;;18328:2;18308:18;;;18301:30;18367:34;18362:2;18347:18;;18340:62;-1:-1:-1;;;18433:2:1;18418:18;;18411:40;18483:3;18468:19;;18261:232::o;18498:343::-;18700:2;18682:21;;;18739:2;18719:18;;;18712:30;-1:-1:-1;;;18773:2:1;18758:18;;18751:49;18832:2;18817:18;;18672:169::o;18846:411::-;19048:2;19030:21;;;19087:2;19067:18;;;19060:30;19126:34;19121:2;19106:18;;19099:62;-1:-1:-1;;;19192:2:1;19177:18;;19170:45;19247:3;19232:19;;19020:237::o;19262:402::-;19464:2;19446:21;;;19503:2;19483:18;;;19476:30;19542:34;19537:2;19522:18;;19515:62;-1:-1:-1;;;19608:2:1;19593:18;;19586:36;19654:3;19639:19;;19436:228::o;19669:341::-;19871:2;19853:21;;;19910:2;19890:18;;;19883:30;-1:-1:-1;;;19944:2:1;19929:18;;19922:47;20001:2;19986:18;;19843:167::o;20015:354::-;20217:2;20199:21;;;20256:2;20236:18;;;20229:30;20295:32;20290:2;20275:18;;20268:60;20360:2;20345:18;;20189:180::o;20374:402::-;20576:2;20558:21;;;20615:2;20595:18;;;20588:30;20654:34;20649:2;20634:18;;20627:62;-1:-1:-1;;;20720:2:1;20705:18;;20698:36;20766:3;20751:19;;20548:228::o;20781:350::-;20983:2;20965:21;;;21022:2;21002:18;;;20995:30;21061:28;21056:2;21041:18;;21034:56;21122:2;21107:18;;20955:176::o;21136:352::-;21338:2;21320:21;;;21377:2;21357:18;;;21350:30;21416;21411:2;21396:18;;21389:58;21479:2;21464:18;;21310:178::o;21896:349::-;22098:2;22080:21;;;22137:2;22117:18;;;22110:30;22176:27;22171:2;22156:18;;22149:55;22236:2;22221:18;;22070:175::o;22250:407::-;22452:2;22434:21;;;22491:2;22471:18;;;22464:30;22530:34;22525:2;22510:18;;22503:62;-1:-1:-1;;;22596:2:1;22581:18;;22574:41;22647:3;22632:19;;22424:233::o;22662:341::-;22864:2;22846:21;;;22903:2;22883:18;;;22876:30;-1:-1:-1;;;22937:2:1;22922:18;;22915:47;22994:2;22979:18;;22836:167::o;23008:408::-;23210:2;23192:21;;;23249:2;23229:18;;;23222:30;23288:34;23283:2;23268:18;;23261:62;-1:-1:-1;;;23354:2:1;23339:18;;23332:42;23406:3;23391:19;;23182:234::o;23421:400::-;23623:2;23605:21;;;23662:2;23642:18;;;23635:30;23701:34;23696:2;23681:18;;23674:62;-1:-1:-1;;;23767:2:1;23752:18;;23745:34;23811:3;23796:19;;23595:226::o;23826:353::-;24028:2;24010:21;;;24067:2;24047:18;;;24040:30;24106:31;24101:2;24086:18;;24079:59;24170:2;24155:18;;24000:179::o;24184:410::-;24386:2;24368:21;;;24425:2;24405:18;;;24398:30;24464:34;24459:2;24444:18;;24437:62;-1:-1:-1;;;24530:2:1;24515:18;;24508:44;24584:3;24569:19;;24358:236::o;24599:401::-;24801:2;24783:21;;;24840:2;24820:18;;;24813:30;24879:34;24874:2;24859:18;;24852:62;-1:-1:-1;;;24945:2:1;24930:18;;24923:35;24990:3;24975:19;;24773:227::o;25005:353::-;25207:2;25189:21;;;25246:2;25226:18;;;25219:30;25285:31;25280:2;25265:18;;25258:59;25349:2;25334:18;;25179:179::o;25363:397::-;25565:2;25547:21;;;25604:2;25584:18;;;25577:30;25643:34;25638:2;25623:18;;25616:62;-1:-1:-1;;;25709:2:1;25694:18;;25687:31;25750:3;25735:19;;25537:223::o;25765:356::-;25967:2;25949:21;;;25986:18;;;25979:30;26045:34;26040:2;26025:18;;26018:62;26112:2;26097:18;;25939:182::o;26126:348::-;26328:2;26310:21;;;26367:2;26347:18;;;26340:30;26406:26;26401:2;26386:18;;26379:54;26465:2;26450:18;;26300:174::o;26479:397::-;26681:2;26663:21;;;26720:2;26700:18;;;26693:30;26759:34;26754:2;26739:18;;26732:62;-1:-1:-1;;;26825:2:1;26810:18;;26803:31;26866:3;26851:19;;26653:223::o;26881:355::-;27083:2;27065:21;;;27122:2;27102:18;;;27095:30;27161:33;27156:2;27141:18;;27134:61;27227:2;27212:18;;27055:181::o;27241:397::-;27443:2;27425:21;;;27482:2;27462:18;;;27455:30;27521:34;27516:2;27501:18;;27494:62;-1:-1:-1;;;27587:2:1;27572:18;;27565:31;27628:3;27613:19;;27415:223::o;27643:353::-;27845:2;27827:21;;;27884:2;27864:18;;;27857:30;27923:31;27918:2;27903:18;;27896:59;27987:2;27972:18;;27817:179::o;28001:402::-;28203:2;28185:21;;;28242:2;28222:18;;;28215:30;28281:34;28276:2;28261:18;;28254:62;-1:-1:-1;;;28347:2:1;28332:18;;28325:36;28393:3;28378:19;;28175:228::o;28408:406::-;28610:2;28592:21;;;28649:2;28629:18;;;28622:30;28688:34;28683:2;28668:18;;28661:62;-1:-1:-1;;;28754:2:1;28739:18;;28732:40;28804:3;28789:19;;28582:232::o;28819:339::-;29021:2;29003:21;;;29060:2;29040:18;;;29033:30;-1:-1:-1;;;29094:2:1;29079:18;;29072:45;29149:2;29134:18;;28993:165::o;29163:353::-;29365:2;29347:21;;;29404:2;29384:18;;;29377:30;29443:31;29438:2;29423:18;;29416:59;29507:2;29492:18;;29337:179::o;29521:356::-;29723:2;29705:21;;;29742:18;;;29735:30;29801:34;29796:2;29781:18;;29774:62;29868:2;29853:18;;29695:182::o;29882:177::-;30028:25;;;30016:2;30001:18;;29983:76::o;30064:591::-;30351:25;;;-1:-1:-1;;;;;30450:15:1;;;30445:2;30430:18;;30423:43;30502:15;;;;30497:2;30482:18;;30475:43;30549:2;30534:18;;30527:34;30592:3;30577:19;;30570:35;;;;30403:3;30621:19;;30614:35;30338:3;30323:19;;30305:350::o;30660:735::-;31003:25;;;-1:-1:-1;;;;;31102:15:1;;;31097:2;31082:18;;31075:43;31154:15;;;;31149:2;31134:18;;31127:43;31201:2;31186:18;;31179:34;;;;31244:3;31229:19;;31222:35;31055:3;31273:19;;31266:35;31332:3;31317:19;;31310:35;;;;31376:3;31361:19;;31354:35;30990:3;30975:19;;30957:438::o;31400:417::-;31631:25;;;-1:-1:-1;;;;;31692:32:1;;;;31687:2;31672:18;;31665:60;31756:2;31741:18;;31734:34;31799:2;31784:18;;31777:34;31618:3;31603:19;;31585:232::o;31822:248::-;31996:25;;;32052:2;32037:18;;32030:34;31984:2;31969:18;;31951:119::o;32075:242::-;32145:2;32139:9;32175:17;;;32222:18;32207:34;;32243:22;;;32204:62;32201:2;;;32269:9;32201:2;32296;32289:22;32119:198;;-1:-1:-1;32119:198:1:o;32322:183::-;;32421:18;32413:6;32410:30;32407:2;;;32443:9;32407:2;-1:-1:-1;32494:4:1;32475:17;;;32471:28;;32397:108::o;32510:258::-;32582:1;32592:113;32606:6;32603:1;32600:13;32592:113;;;32682:11;;;32676:18;32663:11;;;32656:39;32628:2;32621:10;32592:113;;;32723:6;32720:1;32717:13;32714:2;;;-1:-1:-1;;32758:1:1;32740:16;;32733:27;32563:205::o;32773:133::-;-1:-1:-1;;;;;32850:31:1;;32840:42;;32830:2;;32896:1;32893;32886:12;32911:116;32997:4;32990:5;32986:16;32979:5;32976:27;32966:2;;33017:1;33014;33007:12
Swarm Source
ipfs://081551c64fc3f0e4587888105794dc843bd4418707c0e021ae5c34d11ca6fe53
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.