Overview
TokenID
393
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
SupBears
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-02-16 */ // Explore 10,000 unique Sup Bears: Pioneers in digital collectibles on ERC404. // Website: supbears.com // Telegram: t.me/supbears404 // Twitter: twitter.com/supbears // Discord: discord.gg/supbears // Litepaper: https://sup-bears.gitbook.io/sup-bears/ // File: ERC404.sol //SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; abstract contract Ownable { event OwnershipTransferred(address indexed user, address indexed newOwner); error Unauthorized(); error InvalidOwner(); address public owner; modifier onlyOwner() virtual { if (msg.sender != owner) revert Unauthorized(); _; } constructor(address _owner) { if (_owner == address(0)) revert InvalidOwner(); owner = _owner; emit OwnershipTransferred(address(0), _owner); } function transferOwnership(address _owner) public virtual onlyOwner { if (_owner == address(0)) revert InvalidOwner(); owner = _owner; emit OwnershipTransferred(msg.sender, _owner); } function revokeOwnership() public virtual onlyOwner { owner = address(0); emit OwnershipTransferred(msg.sender, address(0)); } } abstract contract ERC721Receiver { function onERC721Received(address, address, uint256, bytes calldata) external virtual returns (bytes4) { return ERC721Receiver.onERC721Received.selector; } } /// @notice ERC404 /// A gas-efficient, mixed ERC20 / ERC721 implementation /// with native liquidity and fractionalization. /// /// This is an experimental standard designed to integrate /// with pre-existing ERC20 / ERC721 support as smoothly as /// possible. /// /// @dev In order to support full functionality of ERC20 and ERC721 /// supply assumptions are made that slightly constraint usage. /// Ensure decimals are sufficiently large (standard 18 recommended) /// as ids are effectively encoded in the lowest range of amounts. /// /// NFTs are spent on ERC20 functions in a FILO queue, this is by /// design. /// abstract contract ERC404 is Ownable { // Events event ERC20Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); event Transfer(address indexed from, address indexed to, uint256 indexed id); event ERC721Approval(address indexed owner, address indexed spender, uint256 indexed id); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); // Errors error NotFound(); error AlreadyExists(); error InvalidRecipient(); error InvalidSender(); error UnsafeRecipient(); // Metadata /// @dev Token name string public name; /// @dev Token symbol string public symbol; /// @dev Decimals for fractional representation uint8 public immutable decimals; /// @dev Total supply in fractionalized representation uint256 public totalSupply; /// @dev Current mint counter, monotonically increasing to ensure accurate ownership uint256 public minted; // Mappings /// @dev Balance of user in fractional representation mapping(address => uint256) public balanceOf; /// @dev Allowance of user in fractional representation mapping(address => mapping(address => uint256)) public allowance; /// @dev Approval in native representaion mapping(uint256 => address) public getApproved; /// @dev Approval for all in native representation mapping(address => mapping(address => bool)) public isApprovedForAll; /// @dev Owner of id in native representation mapping(uint256 => address) internal _ownerOf; /// @dev Array of owned ids in native representation mapping(address => uint256[]) public _owned; /// @dev Tracks indices for the _owned mapping mapping(uint256 => uint256) internal _ownedIndex; /// @dev Addresses whitelisted from minting / burning for gas savings (pairs, routers, etc) mapping(address => bool) public whitelist; // Constructor constructor(string memory _name, string memory _symbol, address _owner) Ownable(_owner) { name = _name; symbol = _symbol; decimals = 18; } /// @notice Initialization function to set pairs / etc /// saving gas by avoiding mint / burn on unnecessary targets function setWhitelist(address target, bool state) public onlyOwner { whitelist[target] = state; } /// @notice Function to find owner of a given native token function ownerOf(uint256 id) public view virtual returns (address owner) { owner = _ownerOf[id]; if (owner == address(0)) { revert NotFound(); } } /// @notice tokenURI must be implemented by child contract function tokenURI(uint256 id) public view virtual returns (string memory); /// @notice Function for token approvals /// @dev This function assumes id / native if amount less than or equal to current max id function approve(address spender, uint256 amountOrId) public virtual returns (bool) { if (amountOrId <= minted && amountOrId > 0) { address owner = _ownerOf[amountOrId]; if (msg.sender != owner && !isApprovedForAll[owner][msg.sender]) { revert Unauthorized(); } getApproved[amountOrId] = spender; emit Approval(owner, spender, amountOrId); } else { allowance[msg.sender][spender] = amountOrId; emit Approval(msg.sender, spender, amountOrId); } return true; } /// @notice Function native approvals function setApprovalForAll(address operator, bool approved) public virtual { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } /// @notice Function for mixed transfers /// @dev This function assumes id / native if amount less than or equal to current max id function transferFrom(address from, address to, uint256 amountOrId) public virtual { if (from == address(this)) { _transfer(from, to, amountOrId); return; } if (amountOrId <= minted) { if (from != _ownerOf[amountOrId]) { revert InvalidSender(); } if (to == address(0)) { revert InvalidRecipient(); } if (msg.sender != from && !isApprovedForAll[from][msg.sender] && msg.sender != getApproved[amountOrId]) { revert Unauthorized(); } balanceOf[from] -= _getUnit(); unchecked { balanceOf[to] += _getUnit(); } _ownerOf[amountOrId] = to; delete getApproved[amountOrId]; // update _owned for sender uint256 updatedId = _owned[from][_owned[from].length - 1]; _owned[from][_ownedIndex[amountOrId]] = updatedId; // pop _owned[from].pop(); // update index for the moved id _ownedIndex[updatedId] = _ownedIndex[amountOrId]; // push token to to owned _owned[to].push(amountOrId); // update index for to owned _ownedIndex[amountOrId] = _owned[to].length - 1; emit Transfer(from, to, amountOrId); emit ERC20Transfer(from, to, _getUnit()); } else { uint256 allowed = allowance[from][msg.sender]; if (allowed != type(uint256).max) { allowance[from][msg.sender] = allowed - amountOrId; } _transfer(from, to, amountOrId); } } /// @notice Function for fractional transfers function transfer(address to, uint256 amount) public virtual returns (bool) { return _transfer(msg.sender, to, amount); } /// @notice Function for native transfers with contract support function safeTransferFrom(address from, address to, uint256 id) public virtual { transferFrom(from, to, id); if ( to.code.length != 0 && ERC721Receiver(to).onERC721Received(msg.sender, from, id, "") != ERC721Receiver.onERC721Received.selector ) { revert UnsafeRecipient(); } } /// @notice Function for native transfers with contract support and callback data function safeTransferFrom(address from, address to, uint256 id, bytes calldata data) public virtual { transferFrom(from, to, id); if ( to.code.length != 0 && ERC721Receiver(to).onERC721Received(msg.sender, from, id, data) != ERC721Receiver.onERC721Received.selector ) { revert UnsafeRecipient(); } } /// @notice Internal function for fractional transfers function _transfer(address from, address to, uint256 amount) internal virtual returns (bool) { uint256 unit = _getUnit(); uint256 balanceBeforeSender = balanceOf[from]; uint256 balanceBeforeReceiver = balanceOf[to]; balanceOf[from] -= amount; unchecked { balanceOf[to] += amount; } // Skip burn for certain addresses to save gas if (!whitelist[from]) { uint256 tokens_to_burn = (balanceBeforeSender / unit) - (balanceOf[from] / unit); for (uint256 i = 0; i < tokens_to_burn; i++) { _burn(from); } } // Skip minting for certain addresses to save gas if (!whitelist[to]) { uint256 tokens_to_mint = (balanceOf[to] / unit) - (balanceBeforeReceiver / unit); for (uint256 i = 0; i < tokens_to_mint; i++) { _mint(to); } } emit ERC20Transfer(from, to, amount); return true; } // Internal utility logic function _getUnit() internal view returns (uint256) { return 10 ** decimals; } function _mint(address to) internal virtual { if (to == address(0)) { revert InvalidRecipient(); } unchecked { minted++; } uint256 id = minted; if (_ownerOf[id] != address(0)) { revert AlreadyExists(); } _ownerOf[id] = to; _owned[to].push(id); _ownedIndex[id] = _owned[to].length - 1; emit Transfer(address(0), to, id); } function _burn(address from) internal virtual { if (from == address(0)) { revert InvalidSender(); } uint256 id = _owned[from][_owned[from].length - 1]; _owned[from].pop(); delete _ownedIndex[id]; delete _ownerOf[id]; delete getApproved[id]; emit Transfer(from, address(0), id); } function _setNameSymbol(string memory _name, string memory _symbol) internal { name = _name; symbol = _symbol; } } // File: Interfaces.sol /** * Submitted for verification at Etherscan.io on 2020-06-05 */ pragma solidity ^0.8.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint256); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens(uint256 amountOut, address[] calldata path, address to, uint256 deadline) external payable returns (uint256[] memory amounts); function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) external pure returns (uint256 amountB); function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) external pure returns (uint256 amountOut); function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } interface IERC20 { event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); } interface IWETH { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; } // File: @openzeppelin/contracts/utils/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant NOT_ENTERED = 1; uint256 private constant ENTERED = 2; uint256 private _status; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); constructor() { _status = NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be NOT_ENTERED if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == ENTERED; } } // File: @openzeppelin/contracts/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.20; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol) pragma solidity ^0.8.20; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // 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. */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { 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. */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or * denominator == 0. * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by * Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0 = x * y; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. uint256 twos = denominator & (0 - denominator); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also // works in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded * towards zero. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol) pragma solidity ^0.8.20; /** * @dev String operations. */ library Strings { bytes16 private constant HEX_DIGITS = "0123456789abcdef"; uint8 private constant ADDRESS_LENGTH = 20; /** * @dev The `value` string doesn't fit in the specified `length`. */ error StringsInsufficientHexLength(uint256 value, uint256 length); /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), HEX_DIGITS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toStringSigned(int256 value) internal pure returns (string memory) { return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { uint256 localValue = value; bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = HEX_DIGITS[localValue & 0xf]; localValue >>= 4; } if (localValue != 0) { revert StringsInsufficientHexLength(value, length); } return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal * representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: SupBears.sol pragma solidity ^0.8.0; contract SupBears is ERC404, ReentrancyGuard { struct User { uint256 balance; } string public dataURI; string public baseTokenURI; using Strings for uint256; address public routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; address public WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; address public pair; IUniswapV2Router02 public router; uint256 private divisor = 10_000; uint256 public fees = 500; bool public live; bool public mintEnabled = true; mapping(address => User) public users; mapping(address => bool) public isFeesExempt; event Live(bool live); event MintEnabled(bool mintEnabled); event DataURIUpdated(string dataURI); event BaseURIUpdated(string baseURI); event FeesUpdated(uint256 fees); event FeesExemptUpdated(address account, bool value); constructor() ERC404("Sup Bears", "BEARS", msg.sender) { router = IUniswapV2Router02(routerAddress); pair = IUniswapV2Factory(router.factory()).createPair(address(this), WETH); setDataURI("https://nftstorage.link/ipfs/bafybeicjmixddogf2cey3qduszm2zpa222erno2s2qfyxii6eofki4k5m4/"); setFeesExempt(msg.sender, true); setFeesExempt(address(this), true); setFeesExempt(routerAddress, true); setFeesExempt(address(0), true); setFeesExempt(address(this), true); setWhitelist(msg.sender, true); setWhitelist(address(this), true); setWhitelist(routerAddress, true); setWhitelist(address(0), true); setWhitelist(router.factory(), true); setWhitelist(0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD, true); setWhitelist(address(pair), true); mint(msg.sender, 10000 * 1e18); } function setFeesExempt(address account, bool value) public onlyOwner { isFeesExempt[account] = value; emit FeesExemptUpdated(account, value); } function setFees(uint256 _fees) external onlyOwner { require(_fees <= 1000, "Fees cannot exceed 10%"); fees = _fees; emit FeesUpdated(_fees); } function GoLive() external onlyOwner { require(!live, "Already live"); live = true; emit Live(live); } function setMint(bool _mintEnabled) external onlyOwner { mintEnabled = _mintEnabled; emit MintEnabled(_mintEnabled); } function setDataURI(string memory _dataURI) public onlyOwner { dataURI = _dataURI; emit DataURIUpdated(_dataURI); } function setTokenURI(string memory _tokenURI) external onlyOwner { baseTokenURI = _tokenURI; emit BaseURIUpdated(_tokenURI); } function feesValue(address from, address to, uint256 amount) public view returns (uint256) { if (isFeesExempt[from] || isFeesExempt[to]) return 0; uint256 f = (amount * fees) / divisor; return f; } function tokenURI(uint256 id) public view override returns (string memory) { return bytes(baseTokenURI).length > 0 ? string.concat(baseTokenURI, id.toString(), ".json") : ""; } function getIdsOwnedBy(address owner) public view returns (uint256[] memory) { return _owned[owner]; } function transferFrom(address from, address to, uint256 amountOrId) public override { return super.transferFrom(from, to, amountOrId); } function mint(address to, uint256 amount) private { require(mintEnabled, "Minting is disabled"); balanceOf[address(this)] += amount; totalSupply += amount; _transfer(address(this), to, amount); } function _swap() internal { uint256 balance = balanceOf[address(this)]; address[] memory path = new address[](2); path[0] = address(this); path[1] = WETH; approve(address(router), balance); router.swapExactTokensForETHSupportingFeeOnTransferTokens(balance, 0, path, owner, block.timestamp + 1000); } function _transfer(address from, address to, uint256 amount) internal override returns (bool) { if (isFeesExempt[from] || isFeesExempt[to]) return super._transfer(from, to, amount); require(live, "Not live"); uint256 feesCharged; if (from == pair || to == pair) feesCharged = feesValue(from, to, amount); if (feesCharged > 0) super._transfer(from, address(this), feesCharged); if (from != pair) _swap(); return super._transfer(from, to, amount - feesCharged); } receive() external payable { payable(owner).transfer(msg.value); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"NotFound","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnsafeRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"BaseURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"dataURI","type":"string"}],"name":"DataURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ERC721Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"FeesExemptUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fees","type":"uint256"}],"name":"FeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"live","type":"bool"}],"name":"Live","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"mintEnabled","type":"bool"}],"name":"MintEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"GoLive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_owned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"feesValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getIdsOwnedBy","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeesExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"live","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"routerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_dataURI","type":"string"}],"name":"setDataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fees","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setFeesExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_mintEnabled","type":"bool"}],"name":"setMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"users","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a0604052601080546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d179091556011805490911673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21790556127106014556101f46015556016805461ff00191661010017905534801562000073575f80fd5b50604080518082018252600981526853757020426561727360b81b60208083019190915282518084019093526005835264424541525360d81b9083015290338080620000d2576040516349e27cff60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b03831690811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600162000128848262000e5b565b50600262000137838262000e5b565b5050601260805250506001600d55601054601380546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620001a0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001c6919062000f23565b6011546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303815f875af115801562000215573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200023b919062000f23565b60125f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555062000284604051806080016040528060598152602001620036ea60599139620003e0565b6200029133600162000455565b6200029e30600162000455565b601054620002b7906001600160a01b0316600162000455565b620002c45f600162000455565b620002d130600162000455565b620002de336001620004e1565b620002eb306001620004e1565b60105462000304906001600160a01b03166001620004e1565b620003115f6001620004e1565b6013546040805163c45a015560e01b815290516200038a926001600160a01b03169163c45a01559160048083019260209291908290030181865afa1580156200035c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000382919062000f23565b6001620004e1565b620003ab733fc91a3afd70395cd496c647d5a6cc9d4b2b7fad6001620004e1565b601254620003c4906001600160a01b03166001620004e1565b620003da3369021e19e0c9bab240000062000535565b620011b7565b5f546001600160a01b031633146200040a576040516282b42960e81b815260040160405180910390fd5b600e62000418828262000e5b565b507feb50f9d7f0688d61a30addf284a43b41d4d8ee48d62db879b73c94456f9ae448816040516200044a919062000f4b565b60405180910390a150565b5f546001600160a01b031633146200047f576040516282b42960e81b815260040160405180910390fd5b6001600160a01b0382165f81815260186020908152604091829020805460ff19168515159081179091558251938452908301527f97fbd1483a6efe6e69257041dce6f4ecd1245e16a3e0d7dd8f3b0eadc3146320910160405180910390a15050565b5f546001600160a01b031633146200050b576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091165f908152600c60205260409020805460ff1916911515919091179055565b601654610100900460ff16620005925760405162461bcd60e51b815260206004820152601360248201527f4d696e74696e672069732064697361626c65640000000000000000000000000060448201526064015b60405180910390fd5b305f9081526005602052604081208054839290620005b290849062000fad565b925050819055508060035f828254620005cc919062000fad565b90915550620005df9050308383620005e4565b505050565b6001600160a01b0383165f9081526018602052604081205460ff16806200062257506001600160a01b0383165f9081526018602052604090205460ff165b156200063d576200063584848462000717565b905062000710565b60165460ff166200067c5760405162461bcd60e51b81526020600482015260086024820152674e6f74206c69766560c01b604482015260640162000589565b6012545f906001600160a01b0386811691161480620006a857506012546001600160a01b038581169116145b15620006be57620006bb858585620008d7565b90505b8015620006d457620006d285308362000717565b505b6012546001600160a01b03868116911614620006f457620006f462000943565b6200070c858562000706848762000fc3565b62000717565b9150505b9392505050565b5f806200072362000a69565b6001600160a01b038087165f818152600560205260408082208054948a168352908220549282529394509192909186919062000760838662000fc3565b90915550506001600160a01b038087165f90815260056020908152604080832080548a019055928a168252600c9052205460ff16620007fa576001600160a01b0387165f90815260056020526040812054620007be90859062000fd9565b620007ca858562000fd9565b620007d6919062000fc3565b90505f5b81811015620007f757620007ee8962000a80565b600101620007da565b50505b6001600160a01b0386165f908152600c602052604090205460ff166200087c575f62000827848362000fd9565b6001600160a01b0388165f908152600560205260409020546200084c90869062000fd9565b62000858919062000fc3565b90505f5b818110156200087957620008708862000b98565b6001016200085c565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e03148787604051620008c291815260200190565b60405180910390a35060019695505050505050565b6001600160a01b0383165f9081526018602052604081205460ff16806200091557506001600160a01b0383165f9081526018602052604090205460ff165b156200092357505f62000710565b5f6014546015548462000937919062000ff9565b6200070c919062000fd9565b305f9081526005602052604080822054815160028082526060820190935290929181602001602082028036833701905050905030815f815181106200098c576200098c62001013565b6001600160a01b039283166020918202929092010152601154825191169082906001908110620009c057620009c062001013565b6001600160a01b039283166020918202929092010152601354620009e691168362000c92565b506013545f80546001600160a01b039283169263791ac947928692909186911662000a14426103e862000fad565b6040518663ffffffff1660e01b815260040162000a3695949392919062001027565b5f604051808303815f87803b15801562000a4e575f80fd5b505af115801562000a61573d5f803e3d5ffd5b505050505050565b5f608051600a62000a7b919062001193565b905090565b6001600160a01b03811662000aa857604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0381165f908152600a60205260408120805462000acf9060019062000fc3565b8154811062000ae25762000ae262001013565b905f5260205f2001549050600a5f836001600160a01b03166001600160a01b031681526020019081526020015f2080548062000b225762000b22620011a3565b5f828152602080822083015f19908101839055909201909255828252600b815260408083208390556009825280832080546001600160a01b031990811690915560079092528083208054909216909155518291906001600160a01b038516905f8051602062003743833981519152908390a45050565b6001600160a01b03811662000bc057604051634e46966960e11b815260040160405180910390fd5b60048054600101908190555f818152600960205260409020546001600160a01b03161562000c015760405163119b4fd360e11b815260040160405180910390fd5b5f81815260096020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600a8352908320805460018181018355828652938520018590559252905462000c5a919062000fc3565b5f828152600b602052604080822092909255905182916001600160a01b038516915f8051602062003743833981519152908290a45050565b5f600454821115801562000ca557505f82115b1562000d6b575f828152600960205260409020546001600160a01b031633811480159062000cf657506001600160a01b0381165f90815260086020908152604080832033845290915290205460ff16155b1562000d14576040516282b42960e81b815260040160405180910390fd5b5f8381526007602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416915f8051602062003763833981519152910160405180910390a35062000db4565b335f8181526006602090815260408083206001600160a01b03881680855290835292819020869055518581529192915f8051602062003763833981519152910160405180910390a35b5060015b92915050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168062000de757607f821691505b60208210810362000e0657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620005df57805f5260205f20601f840160051c8101602085101562000e335750805b601f840160051c820191505b8181101562000e54575f815560010162000e3f565b5050505050565b81516001600160401b0381111562000e775762000e7762000dbe565b62000e8f8162000e88845462000dd2565b8462000e0c565b602080601f83116001811462000ec5575f841562000ead5750858301515b5f19600386901b1c1916600185901b17855562000a61565b5f85815260208120601f198616915b8281101562000ef55788860151825594840194600190910190840162000ed4565b508582101562000f1357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121562000f34575f80fd5b81516001600160a01b038116811462000710575f80fd5b5f602080835283518060208501525f5b8181101562000f795785810183015185820160400152820162000f5b565b505f604082860101526040601f19601f8301168501019250505092915050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111562000db85762000db862000f99565b8181038181111562000db85762000db862000f99565b5f8262000ff457634e487b7160e01b5f52601260045260245ffd5b500490565b808202811582820484141762000db85762000db862000f99565b634e487b7160e01b5f52603260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015620010795784516001600160a01b03168352938301939183019160010162001052565b50506001600160a01b03969096166060850152505050608001529392505050565b600181815b80851115620010da57815f1904821115620010be57620010be62000f99565b80851615620010cc57918102915b93841c93908002906200109f565b509250929050565b5f82620010f25750600162000db8565b816200110057505f62000db8565b8160018114620011195760028114620011245762001144565b600191505062000db8565b60ff84111562001138576200113862000f99565b50506001821b62000db8565b5060208310610133831016604e8410600b841016171562001169575081810a62000db8565b6200117583836200109a565b805f19048211156200118b576200118b62000f99565b029392505050565b5f6200071060ff841683620010e2565b634e487b7160e01b5f52603160045260245ffd5b608051612513620011d75f395f81816103b901526117a901526125135ff3fe60806040526004361061024c575f3560e01c80639af1d35a11610134578063c34eb1c4116100b3578063dd62ed3e11610078578063dd62ed3e14610757578063e0df5b6f1461078d578063e985e9c5146107ac578063f28ca1dd146107e5578063f2fde38b146107f9578063f887ea4014610818575f80fd5b8063c34eb1c4146106b9578063c40d24b2146106d8578063c87b56dd14610706578063d123973014610725578063d547cfb714610743575f80fd5b8063a8aa1b31116100f9578063a8aa1b311461061e578063a9059cbb1461063d578063ad5c46481461065c578063b43761071461067b578063b88d4fde1461069a575f80fd5b80639af1d35a146105655780639b19251a1461057a578063a0369a07146105a8578063a22cb465146105d4578063a87430ba146105f3575f80fd5b80633d18678e116101cb57806353d6fd591161019057806353d6fd59146104b15780636352211e146104d057806370a08231146104ef5780638da5cb5b1461051a578063957aa58c1461053857806395d89b4114610551575f80fd5b80633d18678e1461042057806342842e0e1461043f578063429ff28d1461045e5780634c8905281461047d5780634f02c4201461049c575f80fd5b806323b872dd1161021157806323b872dd146103755780632b96895814610394578063313ce567146103a85780633268cc56146103ed5780633b4e935a1461040c575f80fd5b806306fdde031461028e578063081812fc146102b8578063095ea7b31461030457806318160ddd1461033357806318d217c314610356575f80fd5b3661028a575f80546040516001600160a01b03909116913480156108fc02929091818181858888f19350505050158015610288573d5f803e3d5ffd5b005b5f80fd5b348015610299575f80fd5b506102a2610837565b6040516102af9190611db3565b60405180910390f35b3480156102c3575f80fd5b506102ec6102d2366004611de5565b60076020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102af565b34801561030f575f80fd5b5061032361031e366004611e12565b6108c3565b60405190151581526020016102af565b34801561033e575f80fd5b5061034860035481565b6040519081526020016102af565b348015610361575f80fd5b50610288610370366004611e4e565b610a0e565b348015610380575f80fd5b5061028861038f366004611ef9565b610a7e565b34801561039f575f80fd5b50610288610a8e565b3480156103b3575f80fd5b506103db7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016102af565b3480156103f8575f80fd5b506010546102ec906001600160a01b031681565b348015610417575f80fd5b50610288610af2565b34801561042b575f80fd5b5061028861043a366004611de5565b610ba7565b34801561044a575f80fd5b50610288610459366004611ef9565b610c50565b348015610469575f80fd5b50610288610478366004611f41565b610d21565b348015610488575f80fd5b50610348610497366004611ef9565b610d93565b3480156104a7575f80fd5b5061034860045481565b3480156104bc575f80fd5b506102886104cb366004611f5a565b610e03565b3480156104db575f80fd5b506102ec6104ea366004611de5565b610e56565b3480156104fa575f80fd5b50610348610509366004611f8b565b60056020525f908152604090205481565b348015610525575f80fd5b505f546102ec906001600160a01b031681565b348015610543575f80fd5b506016546103239060ff1681565b34801561055c575f80fd5b506102a2610e90565b348015610570575f80fd5b5061034860155481565b348015610585575f80fd5b50610323610594366004611f8b565b600c6020525f908152604090205460ff1681565b3480156105b3575f80fd5b506105c76105c2366004611f8b565b610e9d565b6040516102af9190611fa4565b3480156105df575f80fd5b506102886105ee366004611f5a565b610f06565b3480156105fe575f80fd5b5061034861060d366004611f8b565b60176020525f908152604090205481565b348015610629575f80fd5b506012546102ec906001600160a01b031681565b348015610648575f80fd5b50610323610657366004611e12565b610f71565b348015610667575f80fd5b506011546102ec906001600160a01b031681565b348015610686575f80fd5b50610288610695366004611f5a565b610f7d565b3480156106a5575f80fd5b506102886106b4366004611fe7565b611008565b3480156106c4575f80fd5b506103486106d3366004611e12565b6110cf565b3480156106e3575f80fd5b506103236106f2366004611f8b565b60186020525f908152604090205460ff1681565b348015610711575f80fd5b506102a2610720366004611de5565b6110fa565b348015610730575f80fd5b5060165461032390610100900460ff1681565b34801561074e575f80fd5b506102a2611156565b348015610762575f80fd5b5061034861077136600461207a565b600660209081525f928352604080842090915290825290205481565b348015610798575f80fd5b506102886107a7366004611e4e565b611163565b3480156107b7575f80fd5b506103236107c636600461207a565b600860209081525f928352604080842090915290825290205460ff1681565b3480156107f0575f80fd5b506102a26111c8565b348015610804575f80fd5b50610288610813366004611f8b565b6111d5565b348015610823575f80fd5b506013546102ec906001600160a01b031681565b60018054610844906120a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610870906120a2565b80156108bb5780601f10610892576101008083540402835291602001916108bb565b820191905f5260205f20905b81548152906001019060200180831161089e57829003601f168201915b505050505081565b5f60045482111580156108d557505f82115b156109a9575f828152600960205260409020546001600160a01b031633811480159061092457506001600160a01b0381165f90815260086020908152604080832033845290915290205460ff16155b15610941576040516282b42960e81b815260040160405180910390fd5b5f8381526007602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350610a04565b335f8181526006602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b5f546001600160a01b03163314610a37576040516282b42960e81b815260040160405180910390fd5b600e610a43828261211e565b507feb50f9d7f0688d61a30addf284a43b41d4d8ee48d62db879b73c94456f9ae44881604051610a739190611db3565b60405180910390a150565b610a8983838361126f565b505050565b5f546001600160a01b03163314610ab7576040516282b42960e81b815260040160405180910390fd5b5f80546001600160a01b031916815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b5f546001600160a01b03163314610b1b576040516282b42960e81b815260040160405180910390fd5b60165460ff1615610b625760405162461bcd60e51b815260206004820152600c60248201526b416c7265616479206c69766560a01b60448201526064015b60405180910390fd5b6016805460ff191660019081179091556040519081527f63f89985c88a92552c6e2ce4d4e46e9fbb7a06168c4536e662261decae02f9e79060200160405180910390a1565b5f546001600160a01b03163314610bd0576040516282b42960e81b815260040160405180910390fd5b6103e8811115610c1b5760405162461bcd60e51b8152602060048201526016602482015275466565732063616e6e6f74206578636565642031302560501b6044820152606401610b59565b60158190556040518181527f9fe6eeb0f0541c644a56c67efeb872dbadd803a60b909d7dde1b35a3fe230b0e90602001610a73565b610c5b838383610a7e565b6001600160a01b0382163b15801590610d035750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610cd2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf691906121da565b6001600160e01b03191614155b15610a8957604051633da6393160e01b815260040160405180910390fd5b5f546001600160a01b03163314610d4a576040516282b42960e81b815260040160405180910390fd5b601680548215156101000261ff00199091161790556040517f30d46918504e7d4aa88713881c9c85ce8224770ba203947f54b221f303b6581e90610a7390831515815260200190565b6001600160a01b0383165f9081526018602052604081205460ff1680610dd057506001600160a01b0383165f9081526018602052604090205460ff165b15610ddc57505f610dfc565b5f60145460155484610dee9190612215565b610df8919061222c565b9150505b9392505050565b5f546001600160a01b03163314610e2c576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091165f908152600c60205260409020805460ff1916911515919091179055565b5f818152600960205260409020546001600160a01b031680610e8b5760405163c5723b5160e01b815260040160405180910390fd5b919050565b60028054610844906120a2565b6001600160a01b0381165f908152600a6020908152604091829020805483518184028101840190945280845260609392830182828015610efa57602002820191905f5260205f20905b815481526020019060010190808311610ee6575b50505050509050919050565b335f8181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f610dfc338484611600565b5f546001600160a01b03163314610fa6576040516282b42960e81b815260040160405180910390fd5b6001600160a01b0382165f81815260186020908152604091829020805460ff19168515159081179091558251938452908301527f97fbd1483a6efe6e69257041dce6f4ecd1245e16a3e0d7dd8f3b0eadc3146320910160405180910390a15050565b611013858585610a7e565b6001600160a01b0384163b158015906110aa5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a029061105d9033908a9089908990899060040161224b565b6020604051808303815f875af1158015611079573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061109d91906121da565b6001600160e01b03191614155b156110c857604051633da6393160e01b815260040160405180910390fd5b5050505050565b600a602052815f5260405f2081815481106110e8575f80fd5b905f5260205f20015f91509150505481565b60605f600f805461110a906120a2565b9050116111255760405180602001604052805f815250610a08565b600f61113083611713565b60405160200161114192919061229d565b60405160208183030381529060405292915050565b600f8054610844906120a2565b5f546001600160a01b0316331461118c576040516282b42960e81b815260040160405180910390fd5b600f611198828261211e565b507f6741b2fc379fad678116fe3d4d4b9a1a184ab53ba36b86ad0fa66340b1ab41ad81604051610a739190611db3565b600e8054610844906120a2565b5f546001600160a01b031633146111fe576040516282b42960e81b815260040160405180910390fd5b6001600160a01b038116611225576040516349e27cff60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b306001600160a01b038416036112905761128a838383611600565b50505050565b60045481116115a0575f818152600960205260409020546001600160a01b038481169116146112d257604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0382166112f957604051634e46966960e11b815260040160405180910390fd5b336001600160a01b0384161480159061133557506001600160a01b0383165f90815260086020908152604080832033845290915290205460ff16155b801561135757505f818152600760205260409020546001600160a01b03163314155b15611374576040516282b42960e81b815260040160405180910390fd5b61137c6117a3565b6001600160a01b0384165f90815260056020526040812080549091906113a3908490612330565b909155506113b190506117a3565b6001600160a01b038084165f81815260056020908152604080832080549096019095558582526009815284822080546001600160a01b031990811690941790556007815284822080549093169092559186168252600a9052908120805461141a90600190612330565b8154811061142a5761142a612343565b5f9182526020808320909101546001600160a01b0387168352600a82526040808420868552600b9093529092205481549293508392811061146d5761146d612343565b5f9182526020808320909101929092556001600160a01b0386168152600a909152604090208054806114a1576114a1612357565b5f828152602080822083015f19908101839055909201909255838252600b8152604080832054848452818420556001600160a01b038616808452600a835290832080546001818101835582865293852001869055925290546115039190612330565b5f838152600b602052604080822092909255905183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4826001600160a01b0316846001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314876115896117a3565b60405190815260200160405180910390a350505050565b6001600160a01b0383165f9081526006602090815260408083203384529091529020545f1981146115f9576115d58282612330565b6001600160a01b0385165f9081526006602090815260408083203384529091529020555b6110c88484845b6001600160a01b0383165f9081526018602052604081205460ff168061163d57506001600160a01b0383165f9081526018602052604090205460ff165b156116545761164d8484846117d4565b9050610dfc565b60165460ff166116915760405162461bcd60e51b81526020600482015260086024820152674e6f74206c69766560c01b6044820152606401610b59565b6012545f906001600160a01b03868116911614806116bc57506012546001600160a01b038581169116145b156116cf576116cc858585610d93565b90505b80156116e2576116e08530836117d4565b505b6012546001600160a01b038681169116146116ff576116ff611979565b610df8858561170e8487612330565b6117d4565b60605f61171f83611a91565b60010190505f8167ffffffffffffffff81111561173e5761173e611e3a565b6040519080825280601f01601f191660200182016040528015611768576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461177257509392505050565b5f6117cf7f0000000000000000000000000000000000000000000000000000000000000000600a61244b565b905090565b5f806117de6117a3565b6001600160a01b038087165f818152600560205260408082208054948a16835290822054928252939450919290918691906118198386612330565b90915550506001600160a01b038087165f90815260056020908152604080832080548a019055928a168252600c9052205460ff166118a8576001600160a01b0387165f9081526005602052604081205461187490859061222c565b61187e858561222c565b6118889190612330565b90505f5b818110156118a55761189d89611b68565b60010161188c565b50505b6001600160a01b0386165f908152600c602052604090205460ff1661191f575f6118d2848361222c565b6001600160a01b0388165f908152600560205260409020546118f590869061222c565b6118ff9190612330565b90505f5b8181101561191c5761191488611c89565b600101611903565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161196491815260200190565b60405180910390a35060019695505050505050565b305f9081526005602052604080822054815160028082526060820190935290929181602001602082028036833701905050905030815f815181106119bf576119bf612343565b6001600160a01b0392831660209182029290920101526011548251911690829060019081106119f0576119f0612343565b6001600160a01b039283166020918202929092010152601354611a149116836108c3565b506013545f80546001600160a01b039283169263791ac9479286929091869116611a40426103e8612459565b6040518663ffffffff1660e01b8152600401611a6095949392919061246c565b5f604051808303815f87803b158015611a77575f80fd5b505af1158015611a89573d5f803e3d5ffd5b505050505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611acf5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611afb576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611b1957662386f26fc10000830492506010015b6305f5e1008310611b31576305f5e100830492506008015b6127108310611b4557612710830492506004015b60648310611b57576064830492506002015b600a8310610a085760010192915050565b6001600160a01b038116611b8f57604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0381165f908152600a602052604081208054611bb490600190612330565b81548110611bc457611bc4612343565b905f5260205f2001549050600a5f836001600160a01b03166001600160a01b031681526020019081526020015f20805480611c0157611c01612357565b5f828152602080822083015f19908101839055909201909255828252600b815260408083208390556009825280832080546001600160a01b031990811690915560079092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b038116611cb057604051634e46966960e11b815260040160405180910390fd5b60048054600101908190555f818152600960205260409020546001600160a01b031615611cf05760405163119b4fd360e11b815260040160405180910390fd5b5f81815260096020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600a83529083208054600181810183558286529385200185905592529054611d479190612330565b5f828152600b602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f5b83811015611dab578181015183820152602001611d93565b50505f910152565b602081525f8251806020840152611dd1816040850160208701611d91565b601f01601f19169190910160400192915050565b5f60208284031215611df5575f80fd5b5035919050565b80356001600160a01b0381168114610e8b575f80fd5b5f8060408385031215611e23575f80fd5b611e2c83611dfc565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215611e5e575f80fd5b813567ffffffffffffffff80821115611e75575f80fd5b818401915084601f830112611e88575f80fd5b813581811115611e9a57611e9a611e3a565b604051601f8201601f19908116603f01168101908382118183101715611ec257611ec2611e3a565b81604052828152876020848701011115611eda575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f60608486031215611f0b575f80fd5b611f1484611dfc565b9250611f2260208501611dfc565b9150604084013590509250925092565b80358015158114610e8b575f80fd5b5f60208284031215611f51575f80fd5b610dfc82611f32565b5f8060408385031215611f6b575f80fd5b611f7483611dfc565b9150611f8260208401611f32565b90509250929050565b5f60208284031215611f9b575f80fd5b610dfc82611dfc565b602080825282518282018190525f9190848201906040850190845b81811015611fdb57835183529284019291840191600101611fbf565b50909695505050505050565b5f805f805f60808688031215611ffb575f80fd5b61200486611dfc565b945061201260208701611dfc565b935060408601359250606086013567ffffffffffffffff80821115612035575f80fd5b818801915088601f830112612048575f80fd5b813581811115612056575f80fd5b896020828501011115612067575f80fd5b9699959850939650602001949392505050565b5f806040838503121561208b575f80fd5b61209483611dfc565b9150611f8260208401611dfc565b600181811c908216806120b657607f821691505b6020821081036120d457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610a8957805f5260205f20601f840160051c810160208510156120ff5750805b601f840160051c820191505b818110156110c8575f815560010161210b565b815167ffffffffffffffff81111561213857612138611e3a565b61214c8161214684546120a2565b846120da565b602080601f83116001811461217f575f84156121685750858301515b5f19600386901b1c1916600185901b178555611a89565b5f85815260208120601f198616915b828110156121ad5788860151825594840194600190910190840161218e565b50858210156121ca57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f602082840312156121ea575f80fd5b81516001600160e01b031981168114610dfc575f80fd5b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610a0857610a08612201565b5f8261224657634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290525f828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b5f8084546122aa816120a2565b600182811680156122c257600181146122d757612303565b60ff1984168752821515830287019450612303565b885f526020805f205f5b858110156122fa5781548a8201529084019082016122e1565b50505082870194505b505050508351612317818360208801611d91565b64173539b7b760d91b9101908152600501949350505050565b81810381811115610a0857610a08612201565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b600181815b808511156123a557815f190482111561238b5761238b612201565b8085161561239857918102915b93841c9390800290612370565b509250929050565b5f826123bb57506001610a08565b816123c757505f610a08565b81600181146123dd57600281146123e757612403565b6001915050610a08565b60ff8411156123f8576123f8612201565b50506001821b610a08565b5060208310610133831016604e8410600b8410161715612426575081810a610a08565b612430838361236b565b805f190482111561244357612443612201565b029392505050565b5f610dfc60ff8416836123ad565b80820180821115610a0857610a08612201565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156124bc5784516001600160a01b031683529383019391830191600101612497565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220ce5386bc6816b0e850a4faed936a8fa55f1298985daa3e3ed39238f9314b300f64736f6c6343000817003368747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f62616679626569636a6d697864646f67663263657933716475737a6d327a706132323265726e6f32733271667978696936656f666b69346b356d342fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925
Deployed Bytecode
0x60806040526004361061024c575f3560e01c80639af1d35a11610134578063c34eb1c4116100b3578063dd62ed3e11610078578063dd62ed3e14610757578063e0df5b6f1461078d578063e985e9c5146107ac578063f28ca1dd146107e5578063f2fde38b146107f9578063f887ea4014610818575f80fd5b8063c34eb1c4146106b9578063c40d24b2146106d8578063c87b56dd14610706578063d123973014610725578063d547cfb714610743575f80fd5b8063a8aa1b31116100f9578063a8aa1b311461061e578063a9059cbb1461063d578063ad5c46481461065c578063b43761071461067b578063b88d4fde1461069a575f80fd5b80639af1d35a146105655780639b19251a1461057a578063a0369a07146105a8578063a22cb465146105d4578063a87430ba146105f3575f80fd5b80633d18678e116101cb57806353d6fd591161019057806353d6fd59146104b15780636352211e146104d057806370a08231146104ef5780638da5cb5b1461051a578063957aa58c1461053857806395d89b4114610551575f80fd5b80633d18678e1461042057806342842e0e1461043f578063429ff28d1461045e5780634c8905281461047d5780634f02c4201461049c575f80fd5b806323b872dd1161021157806323b872dd146103755780632b96895814610394578063313ce567146103a85780633268cc56146103ed5780633b4e935a1461040c575f80fd5b806306fdde031461028e578063081812fc146102b8578063095ea7b31461030457806318160ddd1461033357806318d217c314610356575f80fd5b3661028a575f80546040516001600160a01b03909116913480156108fc02929091818181858888f19350505050158015610288573d5f803e3d5ffd5b005b5f80fd5b348015610299575f80fd5b506102a2610837565b6040516102af9190611db3565b60405180910390f35b3480156102c3575f80fd5b506102ec6102d2366004611de5565b60076020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102af565b34801561030f575f80fd5b5061032361031e366004611e12565b6108c3565b60405190151581526020016102af565b34801561033e575f80fd5b5061034860035481565b6040519081526020016102af565b348015610361575f80fd5b50610288610370366004611e4e565b610a0e565b348015610380575f80fd5b5061028861038f366004611ef9565b610a7e565b34801561039f575f80fd5b50610288610a8e565b3480156103b3575f80fd5b506103db7f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff90911681526020016102af565b3480156103f8575f80fd5b506010546102ec906001600160a01b031681565b348015610417575f80fd5b50610288610af2565b34801561042b575f80fd5b5061028861043a366004611de5565b610ba7565b34801561044a575f80fd5b50610288610459366004611ef9565b610c50565b348015610469575f80fd5b50610288610478366004611f41565b610d21565b348015610488575f80fd5b50610348610497366004611ef9565b610d93565b3480156104a7575f80fd5b5061034860045481565b3480156104bc575f80fd5b506102886104cb366004611f5a565b610e03565b3480156104db575f80fd5b506102ec6104ea366004611de5565b610e56565b3480156104fa575f80fd5b50610348610509366004611f8b565b60056020525f908152604090205481565b348015610525575f80fd5b505f546102ec906001600160a01b031681565b348015610543575f80fd5b506016546103239060ff1681565b34801561055c575f80fd5b506102a2610e90565b348015610570575f80fd5b5061034860155481565b348015610585575f80fd5b50610323610594366004611f8b565b600c6020525f908152604090205460ff1681565b3480156105b3575f80fd5b506105c76105c2366004611f8b565b610e9d565b6040516102af9190611fa4565b3480156105df575f80fd5b506102886105ee366004611f5a565b610f06565b3480156105fe575f80fd5b5061034861060d366004611f8b565b60176020525f908152604090205481565b348015610629575f80fd5b506012546102ec906001600160a01b031681565b348015610648575f80fd5b50610323610657366004611e12565b610f71565b348015610667575f80fd5b506011546102ec906001600160a01b031681565b348015610686575f80fd5b50610288610695366004611f5a565b610f7d565b3480156106a5575f80fd5b506102886106b4366004611fe7565b611008565b3480156106c4575f80fd5b506103486106d3366004611e12565b6110cf565b3480156106e3575f80fd5b506103236106f2366004611f8b565b60186020525f908152604090205460ff1681565b348015610711575f80fd5b506102a2610720366004611de5565b6110fa565b348015610730575f80fd5b5060165461032390610100900460ff1681565b34801561074e575f80fd5b506102a2611156565b348015610762575f80fd5b5061034861077136600461207a565b600660209081525f928352604080842090915290825290205481565b348015610798575f80fd5b506102886107a7366004611e4e565b611163565b3480156107b7575f80fd5b506103236107c636600461207a565b600860209081525f928352604080842090915290825290205460ff1681565b3480156107f0575f80fd5b506102a26111c8565b348015610804575f80fd5b50610288610813366004611f8b565b6111d5565b348015610823575f80fd5b506013546102ec906001600160a01b031681565b60018054610844906120a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610870906120a2565b80156108bb5780601f10610892576101008083540402835291602001916108bb565b820191905f5260205f20905b81548152906001019060200180831161089e57829003601f168201915b505050505081565b5f60045482111580156108d557505f82115b156109a9575f828152600960205260409020546001600160a01b031633811480159061092457506001600160a01b0381165f90815260086020908152604080832033845290915290205460ff16155b15610941576040516282b42960e81b815260040160405180910390fd5b5f8381526007602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350610a04565b335f8181526006602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b5f546001600160a01b03163314610a37576040516282b42960e81b815260040160405180910390fd5b600e610a43828261211e565b507feb50f9d7f0688d61a30addf284a43b41d4d8ee48d62db879b73c94456f9ae44881604051610a739190611db3565b60405180910390a150565b610a8983838361126f565b505050565b5f546001600160a01b03163314610ab7576040516282b42960e81b815260040160405180910390fd5b5f80546001600160a01b031916815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b5f546001600160a01b03163314610b1b576040516282b42960e81b815260040160405180910390fd5b60165460ff1615610b625760405162461bcd60e51b815260206004820152600c60248201526b416c7265616479206c69766560a01b60448201526064015b60405180910390fd5b6016805460ff191660019081179091556040519081527f63f89985c88a92552c6e2ce4d4e46e9fbb7a06168c4536e662261decae02f9e79060200160405180910390a1565b5f546001600160a01b03163314610bd0576040516282b42960e81b815260040160405180910390fd5b6103e8811115610c1b5760405162461bcd60e51b8152602060048201526016602482015275466565732063616e6e6f74206578636565642031302560501b6044820152606401610b59565b60158190556040518181527f9fe6eeb0f0541c644a56c67efeb872dbadd803a60b909d7dde1b35a3fe230b0e90602001610a73565b610c5b838383610a7e565b6001600160a01b0382163b15801590610d035750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610cd2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf691906121da565b6001600160e01b03191614155b15610a8957604051633da6393160e01b815260040160405180910390fd5b5f546001600160a01b03163314610d4a576040516282b42960e81b815260040160405180910390fd5b601680548215156101000261ff00199091161790556040517f30d46918504e7d4aa88713881c9c85ce8224770ba203947f54b221f303b6581e90610a7390831515815260200190565b6001600160a01b0383165f9081526018602052604081205460ff1680610dd057506001600160a01b0383165f9081526018602052604090205460ff165b15610ddc57505f610dfc565b5f60145460155484610dee9190612215565b610df8919061222c565b9150505b9392505050565b5f546001600160a01b03163314610e2c576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091165f908152600c60205260409020805460ff1916911515919091179055565b5f818152600960205260409020546001600160a01b031680610e8b5760405163c5723b5160e01b815260040160405180910390fd5b919050565b60028054610844906120a2565b6001600160a01b0381165f908152600a6020908152604091829020805483518184028101840190945280845260609392830182828015610efa57602002820191905f5260205f20905b815481526020019060010190808311610ee6575b50505050509050919050565b335f8181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f610dfc338484611600565b5f546001600160a01b03163314610fa6576040516282b42960e81b815260040160405180910390fd5b6001600160a01b0382165f81815260186020908152604091829020805460ff19168515159081179091558251938452908301527f97fbd1483a6efe6e69257041dce6f4ecd1245e16a3e0d7dd8f3b0eadc3146320910160405180910390a15050565b611013858585610a7e565b6001600160a01b0384163b158015906110aa5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a029061105d9033908a9089908990899060040161224b565b6020604051808303815f875af1158015611079573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061109d91906121da565b6001600160e01b03191614155b156110c857604051633da6393160e01b815260040160405180910390fd5b5050505050565b600a602052815f5260405f2081815481106110e8575f80fd5b905f5260205f20015f91509150505481565b60605f600f805461110a906120a2565b9050116111255760405180602001604052805f815250610a08565b600f61113083611713565b60405160200161114192919061229d565b60405160208183030381529060405292915050565b600f8054610844906120a2565b5f546001600160a01b0316331461118c576040516282b42960e81b815260040160405180910390fd5b600f611198828261211e565b507f6741b2fc379fad678116fe3d4d4b9a1a184ab53ba36b86ad0fa66340b1ab41ad81604051610a739190611db3565b600e8054610844906120a2565b5f546001600160a01b031633146111fe576040516282b42960e81b815260040160405180910390fd5b6001600160a01b038116611225576040516349e27cff60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b306001600160a01b038416036112905761128a838383611600565b50505050565b60045481116115a0575f818152600960205260409020546001600160a01b038481169116146112d257604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0382166112f957604051634e46966960e11b815260040160405180910390fd5b336001600160a01b0384161480159061133557506001600160a01b0383165f90815260086020908152604080832033845290915290205460ff16155b801561135757505f818152600760205260409020546001600160a01b03163314155b15611374576040516282b42960e81b815260040160405180910390fd5b61137c6117a3565b6001600160a01b0384165f90815260056020526040812080549091906113a3908490612330565b909155506113b190506117a3565b6001600160a01b038084165f81815260056020908152604080832080549096019095558582526009815284822080546001600160a01b031990811690941790556007815284822080549093169092559186168252600a9052908120805461141a90600190612330565b8154811061142a5761142a612343565b5f9182526020808320909101546001600160a01b0387168352600a82526040808420868552600b9093529092205481549293508392811061146d5761146d612343565b5f9182526020808320909101929092556001600160a01b0386168152600a909152604090208054806114a1576114a1612357565b5f828152602080822083015f19908101839055909201909255838252600b8152604080832054848452818420556001600160a01b038616808452600a835290832080546001818101835582865293852001869055925290546115039190612330565b5f838152600b602052604080822092909255905183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4826001600160a01b0316846001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314876115896117a3565b60405190815260200160405180910390a350505050565b6001600160a01b0383165f9081526006602090815260408083203384529091529020545f1981146115f9576115d58282612330565b6001600160a01b0385165f9081526006602090815260408083203384529091529020555b6110c88484845b6001600160a01b0383165f9081526018602052604081205460ff168061163d57506001600160a01b0383165f9081526018602052604090205460ff165b156116545761164d8484846117d4565b9050610dfc565b60165460ff166116915760405162461bcd60e51b81526020600482015260086024820152674e6f74206c69766560c01b6044820152606401610b59565b6012545f906001600160a01b03868116911614806116bc57506012546001600160a01b038581169116145b156116cf576116cc858585610d93565b90505b80156116e2576116e08530836117d4565b505b6012546001600160a01b038681169116146116ff576116ff611979565b610df8858561170e8487612330565b6117d4565b60605f61171f83611a91565b60010190505f8167ffffffffffffffff81111561173e5761173e611e3a565b6040519080825280601f01601f191660200182016040528015611768576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461177257509392505050565b5f6117cf7f0000000000000000000000000000000000000000000000000000000000000012600a61244b565b905090565b5f806117de6117a3565b6001600160a01b038087165f818152600560205260408082208054948a16835290822054928252939450919290918691906118198386612330565b90915550506001600160a01b038087165f90815260056020908152604080832080548a019055928a168252600c9052205460ff166118a8576001600160a01b0387165f9081526005602052604081205461187490859061222c565b61187e858561222c565b6118889190612330565b90505f5b818110156118a55761189d89611b68565b60010161188c565b50505b6001600160a01b0386165f908152600c602052604090205460ff1661191f575f6118d2848361222c565b6001600160a01b0388165f908152600560205260409020546118f590869061222c565b6118ff9190612330565b90505f5b8181101561191c5761191488611c89565b600101611903565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161196491815260200190565b60405180910390a35060019695505050505050565b305f9081526005602052604080822054815160028082526060820190935290929181602001602082028036833701905050905030815f815181106119bf576119bf612343565b6001600160a01b0392831660209182029290920101526011548251911690829060019081106119f0576119f0612343565b6001600160a01b039283166020918202929092010152601354611a149116836108c3565b506013545f80546001600160a01b039283169263791ac9479286929091869116611a40426103e8612459565b6040518663ffffffff1660e01b8152600401611a6095949392919061246c565b5f604051808303815f87803b158015611a77575f80fd5b505af1158015611a89573d5f803e3d5ffd5b505050505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611acf5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611afb576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611b1957662386f26fc10000830492506010015b6305f5e1008310611b31576305f5e100830492506008015b6127108310611b4557612710830492506004015b60648310611b57576064830492506002015b600a8310610a085760010192915050565b6001600160a01b038116611b8f57604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0381165f908152600a602052604081208054611bb490600190612330565b81548110611bc457611bc4612343565b905f5260205f2001549050600a5f836001600160a01b03166001600160a01b031681526020019081526020015f20805480611c0157611c01612357565b5f828152602080822083015f19908101839055909201909255828252600b815260408083208390556009825280832080546001600160a01b031990811690915560079092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b038116611cb057604051634e46966960e11b815260040160405180910390fd5b60048054600101908190555f818152600960205260409020546001600160a01b031615611cf05760405163119b4fd360e11b815260040160405180910390fd5b5f81815260096020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600a83529083208054600181810183558286529385200185905592529054611d479190612330565b5f828152600b602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f5b83811015611dab578181015183820152602001611d93565b50505f910152565b602081525f8251806020840152611dd1816040850160208701611d91565b601f01601f19169190910160400192915050565b5f60208284031215611df5575f80fd5b5035919050565b80356001600160a01b0381168114610e8b575f80fd5b5f8060408385031215611e23575f80fd5b611e2c83611dfc565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215611e5e575f80fd5b813567ffffffffffffffff80821115611e75575f80fd5b818401915084601f830112611e88575f80fd5b813581811115611e9a57611e9a611e3a565b604051601f8201601f19908116603f01168101908382118183101715611ec257611ec2611e3a565b81604052828152876020848701011115611eda575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f60608486031215611f0b575f80fd5b611f1484611dfc565b9250611f2260208501611dfc565b9150604084013590509250925092565b80358015158114610e8b575f80fd5b5f60208284031215611f51575f80fd5b610dfc82611f32565b5f8060408385031215611f6b575f80fd5b611f7483611dfc565b9150611f8260208401611f32565b90509250929050565b5f60208284031215611f9b575f80fd5b610dfc82611dfc565b602080825282518282018190525f9190848201906040850190845b81811015611fdb57835183529284019291840191600101611fbf565b50909695505050505050565b5f805f805f60808688031215611ffb575f80fd5b61200486611dfc565b945061201260208701611dfc565b935060408601359250606086013567ffffffffffffffff80821115612035575f80fd5b818801915088601f830112612048575f80fd5b813581811115612056575f80fd5b896020828501011115612067575f80fd5b9699959850939650602001949392505050565b5f806040838503121561208b575f80fd5b61209483611dfc565b9150611f8260208401611dfc565b600181811c908216806120b657607f821691505b6020821081036120d457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610a8957805f5260205f20601f840160051c810160208510156120ff5750805b601f840160051c820191505b818110156110c8575f815560010161210b565b815167ffffffffffffffff81111561213857612138611e3a565b61214c8161214684546120a2565b846120da565b602080601f83116001811461217f575f84156121685750858301515b5f19600386901b1c1916600185901b178555611a89565b5f85815260208120601f198616915b828110156121ad5788860151825594840194600190910190840161218e565b50858210156121ca57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f602082840312156121ea575f80fd5b81516001600160e01b031981168114610dfc575f80fd5b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610a0857610a08612201565b5f8261224657634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290525f828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b5f8084546122aa816120a2565b600182811680156122c257600181146122d757612303565b60ff1984168752821515830287019450612303565b885f526020805f205f5b858110156122fa5781548a8201529084019082016122e1565b50505082870194505b505050508351612317818360208801611d91565b64173539b7b760d91b9101908152600501949350505050565b81810381811115610a0857610a08612201565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b600181815b808511156123a557815f190482111561238b5761238b612201565b8085161561239857918102915b93841c9390800290612370565b509250929050565b5f826123bb57506001610a08565b816123c757505f610a08565b81600181146123dd57600281146123e757612403565b6001915050610a08565b60ff8411156123f8576123f8612201565b50506001821b610a08565b5060208310610133831016604e8410600b8410161715612426575081810a610a08565b612430838361236b565b805f190482111561244357612443612201565b029392505050565b5f610dfc60ff8416836123ad565b80820180821115610a0857610a08612201565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156124bc5784516001600160a01b031683529383019391830191600101612497565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220ce5386bc6816b0e850a4faed936a8fa55f1298985daa3e3ed39238f9314b300f64736f6c63430008170033
Deployed Bytecode Sourcemap
44765:4778:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49506:5;;;49498:34;;-1:-1:-1;;;;;49506:5:0;;;;49522:9;49498:34;;;;;49522:9;;49498:34;49506:5;49498:34;49522:9;49506:5;49498:34;;;;;;;;;;;;;;;;;;;;;44765:4778;;;;2900:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3608:46;;;;;;;;;;-1:-1:-1;3608:46:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;3608:46:0;;;;;;-1:-1:-1;;;;;1019:32:1;;;1001:51;;989:2;974:18;3608:46:0;855:203:1;5282:622:0;;;;;;;;;;-1:-1:-1;5282:622:0;;;;;:::i;:::-;;:::i;:::-;;;1665:14:1;;1658:22;1640:41;;1628:2;1613:18;5282:622:0;1500:187:1;3139:26:0;;;;;;;;;;;;;;;;;;;1838:25:1;;;1826:2;1811:18;3139:26:0;1692:177:1;47257:138:0;;;;;;;;;;-1:-1:-1;47257:138:0;;;;;:::i;:::-;;:::i;48124:150::-;;;;;;;;;;-1:-1:-1;48124:150:0;;;;;:::i;:::-;;:::i;1105:152::-;;;;;;;;;;;;;:::i;3038:31::-;;;;;;;;;;;;;;;;;;3438:4:1;3426:17;;;3408:36;;3396:2;3381:18;3038:31:0;3266:184:1;44965:73:0;;;;;;;;;;-1:-1:-1;44965:73:0;;;;-1:-1:-1;;;;;44965:73:0;;;46964:134;;;;;;;;;;;;;:::i;46780:175::-;;;;;;;;;;-1:-1:-1;46780:175:0;;;;;:::i;:::-;;:::i;8345:363::-;;;;;;;;;;-1:-1:-1;8345:363:0;;;;;:::i;:::-;;:::i;47107:141::-;;;;;;;;;;-1:-1:-1;47107:141:0;;;;;:::i;:::-;;:::i;47562:229::-;;;;;;;;;;-1:-1:-1;47562:229:0;;;;;:::i;:::-;;:::i;3265:21::-;;;;;;;;;;;;;;;;4607:111;;;;;;;;;;-1:-1:-1;4607:111:0;;;;;:::i;:::-;;:::i;4791:194::-;;;;;;;;;;-1:-1:-1;4791:194:0;;;;;:::i;:::-;;:::i;3372:44::-;;;;;;;;;;-1:-1:-1;3372:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;537:20;;;;;;;;;;-1:-1:-1;537:20:0;;;;-1:-1:-1;;;;;537:20:0;;;45258:16;;;;;;;;;;-1:-1:-1;45258:16:0;;;;;;;;2955:20;;;;;;;;;;;;;:::i;45223:25::-;;;;;;;;;;;;;;;;4222:41;;;;;;;;;;-1:-1:-1;4222:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;47999:116;;;;;;;;;;-1:-1:-1;47999:116:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5956:208::-;;;;;;;;;;-1:-1:-1;5956:208:0;;;;;:::i;:::-;;:::i;45321:37::-;;;;;;;;;;-1:-1:-1;45321:37:0;;;;;:::i;:::-;;;;;;;;;;;;;;45116:19;;;;;;;;;;-1:-1:-1;45116:19:0;;;;-1:-1:-1;;;;;45116:19:0;;;8132:135;;;;;;;;;;-1:-1:-1;8132:135:0;;;;;:::i;:::-;;:::i;45045:64::-;;;;;;;;;;-1:-1:-1;45045:64:0;;;;-1:-1:-1;;;;;45045:64:0;;;46605:166;;;;;;;;;;-1:-1:-1;46605:166:0;;;;;:::i;:::-;;:::i;8804:407::-;;;;;;;;;;-1:-1:-1;8804:407:0;;;;;:::i;:::-;;:::i;3962:43::-;;;;;;;;;;-1:-1:-1;3962:43:0;;;;;:::i;:::-;;:::i;45365:44::-;;;;;;;;;;-1:-1:-1;45365:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;47800:190;;;;;;;;;;-1:-1:-1;47800:190:0;;;;;:::i;:::-;;:::i;45281:30::-;;;;;;;;;;-1:-1:-1;45281:30:0;;;;;;;;;;;44900:26;;;;;;;;;;;;;:::i;3487:64::-;;;;;;;;;;-1:-1:-1;3487:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;47404:149;;;;;;;;;;-1:-1:-1;47404:149:0;;;;;:::i;:::-;;:::i;3720:68::-;;;;;;;;;;-1:-1:-1;3720:68:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;44872:21;;;;;;;;;;;;;:::i;875:221::-;;;;;;;;;;-1:-1:-1;875:221:0;;;;;:::i;:::-;;:::i;45142:32::-;;;;;;;;;;-1:-1:-1;45142:32:0;;;;-1:-1:-1;;;;;45142:32:0;;;2900:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5282:622::-;5360:4;5395:6;;5381:10;:20;;:38;;;;;5418:1;5405:10;:14;5381:38;5377:495;;;5436:13;5452:20;;;:8;:20;;;;;;-1:-1:-1;;;;;5452:20:0;5494:10;:19;;;;;:59;;-1:-1:-1;;;;;;5518:23:0;;;;;;:16;:23;;;;;;;;5542:10;5518:35;;;;;;;;;;5517:36;5494:59;5490:121;;;5581:14;;-1:-1:-1;;;5581:14:0;;;;;;;;;;;5490:121;5628:23;;;;:11;:23;;;;;;;;;:33;;-1:-1:-1;;;;;;5628:33:0;-1:-1:-1;;;;;5628:33:0;;;;;;;;;5684:36;;1838:25:1;;;5684:36:0;;;;;;1811:18:1;5684:36:0;;;;;;;5421:311;5377:495;;;5763:10;5753:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;5753:30:0;;;;;;;;;;;;:43;;;5819:41;1838:25:1;;;5753:30:0;;5763:10;5819:41;;1811:18:1;5819:41:0;;;;;;;5377:495;-1:-1:-1;5892:4:0;5282:622;;;;;:::o;47257:138::-;625:5;;-1:-1:-1;;;;;625:5:0;611:10;:19;607:46;;639:14;;-1:-1:-1;;;639:14:0;;;;;;;;;;;607:46;47329:7:::1;:18;47339:8:::0;47329:7;:18:::1;:::i;:::-;;47363:24;47378:8;47363:24;;;;;;:::i;:::-;;;;;;;;47257:138:::0;:::o;48124:150::-;48226:40;48245:4;48251:2;48255:10;48226:18;:40::i;:::-;48124:150;;;:::o;1105:152::-;625:5;;-1:-1:-1;;;;;625:5:0;611:10;:19;607:46;;639:14;;-1:-1:-1;;;639:14:0;;;;;;;;;;;607:46;1184:1:::1;1168:18:::0;;-1:-1:-1;;;;;;1168:18:0::1;::::0;;1205:44:::1;::::0;1226:10:::1;::::0;1205:44:::1;::::0;1184:1;;1205:44:::1;1105:152::o:0;46964:134::-;625:5;;-1:-1:-1;;;;;625:5:0;611:10;:19;607:46;;639:14;;-1:-1:-1;;;639:14:0;;;;;;;;;;;607:46;47021:4:::1;::::0;::::1;;47020:5;47012:30;;;::::0;-1:-1:-1;;;47012:30:0;;8962:2:1;47012:30:0::1;::::0;::::1;8944:21:1::0;9001:2;8981:18;;;8974:30;-1:-1:-1;;;9020:18:1;;;9013:42;9072:18;;47012:30:0::1;;;;;;;;;47053:4;:11:::0;;-1:-1:-1;;47053:11:0::1;47060:4;47053:11:::0;;::::1;::::0;;;47080:10:::1;::::0;1640:41:1;;;47080:10:0::1;::::0;1628:2:1;1613:18;47080:10:0::1;;;;;;;46964:134::o:0;46780:175::-;625:5;;-1:-1:-1;;;;;625:5:0;611:10;:19;607:46;;639:14;;-1:-1:-1;;;639:14:0;;;;;;;;;;;607:46;46859:4:::1;46850:5;:13;;46842:48;;;::::0;-1:-1:-1;;;46842:48:0;;9303:2:1;46842:48:0::1;::::0;::::1;9285:21:1::0;9342:2;9322:18;;;9315:30;-1:-1:-1;;;9361:18:1;;;9354:52;9423:18;;46842:48:0::1;9101:346:1::0;46842:48:0::1;46901:4;:12:::0;;;46929:18:::1;::::0;1838:25:1;;;46929:18:0::1;::::0;1826:2:1;1811:18;46929::0::1;1692:177:1::0;8345:363:0;8435:26;8448:4;8454:2;8458;8435:12;:26::i;:::-;-1:-1:-1;;;;;8493:14:0;;;:19;;;;:145;;-1:-1:-1;8533:61:0;;-1:-1:-1;;;8533:61:0;;;8569:10;8533:61;;;9757:34:1;-1:-1:-1;;;;;9827:15:1;;;9807:18;;;9800:43;9859:18;;;9852:34;;;9922:3;9902:18;;;9895:31;-1:-1:-1;9942:19:1;;;9935:30;8598:40:0;;8533:35;;;;8598:40;;9982:19:1;;8533:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;8533:105:0;;;8493:145;8475:226;;;8672:17;;-1:-1:-1;;;8672:17:0;;;;;;;;;;;47107:141;625:5;;-1:-1:-1;;;;;625:5:0;611:10;:19;607:46;;639:14;;-1:-1:-1;;;639:14:0;;;;;;;;;;;607:46;47173:11:::1;:26:::0;;;::::1;;;;-1:-1:-1::0;;47173:26:0;;::::1;;::::0;;47215:25:::1;::::0;::::1;::::0;::::1;::::0;47187:12;1665:14:1;1658:22;1640:41;;1628:2;1613:18;;1500:187;47562:229:0;-1:-1:-1;;;;;47668:18:0;;47644:7;47668:18;;;:12;:18;;;;;;;;;:38;;-1:-1:-1;;;;;;47690:16:0;;;;;;:12;:16;;;;;;;;47668:38;47664:52;;;-1:-1:-1;47715:1:0;47708:8;;47664:52;47727:9;47757:7;;47749:4;;47740:6;:13;;;;:::i;:::-;47739:25;;;;:::i;:::-;47727:37;-1:-1:-1;;47562:229:0;;;;;;:::o;4607:111::-;625:5;;-1:-1:-1;;;;;625:5:0;611:10;:19;607:46;;639:14;;-1:-1:-1;;;639:14:0;;;;;;;;;;;607:46;-1:-1:-1;;;;;4685:17:0;;;::::1;;::::0;;;:9:::1;:17;::::0;;;;:25;;-1:-1:-1;;4685:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;4607:111::o;4791:194::-;4849:13;4883:12;;;:8;:12;;;;;;-1:-1:-1;;;;;4883:12:0;;4909:69;;4956:10;;-1:-1:-1;;;4956:10:0;;;;;;;;;;;4909:69;4791:194;;;:::o;2955:20::-;;;;;;;:::i;47999:116::-;-1:-1:-1;;;;;48094:13:0;;;;;;:6;:13;;;;;;;;;48087:20;;;;;;;;;;;;;;;;;48058:16;;48087:20;;;48094:13;48087:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47999:116;;;:::o;5956:208::-;6059:10;6042:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;6042:38:0;;;;;;;;;;;;:49;;-1:-1:-1;;6042:49:0;;;;;;;;;;6110:46;;1640:41:1;;;6042:38:0;;6059:10;6110:46;;1613:18:1;6110:46:0;;;;;;;5956:208;;:::o;8132:135::-;8202:4;8226:33;8236:10;8248:2;8252:6;8226:9;:33::i;46605:166::-;625:5;;-1:-1:-1;;;;;625:5:0;611:10;:19;607:46;;639:14;;-1:-1:-1;;;639:14:0;;;;;;;;;;;607:46;-1:-1:-1;;;;;46685:21:0;::::1;;::::0;;;:12:::1;:21;::::0;;;;;;;;:29;;-1:-1:-1;;46685:29:0::1;::::0;::::1;;::::0;;::::1;::::0;;;46730:33;;11134:51:1;;;11201:18;;;11194:50;46730:33:0::1;::::0;11107:18:1;46730:33:0::1;;;;;;;46605:166:::0;;:::o;8804:407::-;8915:26;8928:4;8934:2;8938;8915:12;:26::i;:::-;-1:-1:-1;;;;;8973:14:0;;;:19;;;;:168;;-1:-1:-1;9013:63:0;;-1:-1:-1;;;9013:63:0;;;9101:40;-1:-1:-1;;;;;9013:35:0;;;9101:40;;9013:63;;9049:10;;9061:4;;9067:2;;9071:4;;;;9013:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;9013:128:0;;;8973:168;8955:249;;;9175:17;;-1:-1:-1;;;9175:17:0;;;;;;;;;;;8955:249;8804:407;;;;;:::o;3962:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47800:190::-;47860:13;47922:1;47899:12;47893:26;;;;;:::i;:::-;;;:30;:89;;;;;;;;;;;;;;;;;47940:12;47954:13;:2;:11;:13::i;:::-;47926:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47886:96;47800:190;-1:-1:-1;;47800:190:0:o;44900:26::-;;;;;;;:::i;47404:149::-;625:5;;-1:-1:-1;;;;;625:5:0;611:10;:19;607:46;;639:14;;-1:-1:-1;;;639:14:0;;;;;;;;;;;607:46;47480:12:::1;:24;47495:9:::0;47480:12;:24:::1;:::i;:::-;;47520:25;47535:9;47520:25;;;;;;:::i;44872:21::-:0;;;;;;;:::i;875:221::-;625:5;;-1:-1:-1;;;;;625:5:0;611:10;:19;607:46;;639:14;;-1:-1:-1;;;639:14:0;;;;;;;;;;;607:46;-1:-1:-1;;;;;958:20:0;::::1;954:47;;987:14;;-1:-1:-1::0;;;987:14:0::1;;;;;;;;;;;954:47;1015:5;:14:::0;;-1:-1:-1;;;;;;1015:14:0::1;-1:-1:-1::0;;;;;1015:14:0;::::1;::::0;;::::1;::::0;;1048:40:::1;::::0;1015:14;;1069:10:::1;::::0;1048:40:::1;::::0;1015:5;1048:40:::1;875:221:::0;:::o;6314:1758::-;6428:4;-1:-1:-1;;;;;6412:21:0;;;6408:106;;6450:31;6460:4;6466:2;6470:10;6450:9;:31::i;:::-;;6314:1758;;;:::o;6408:106::-;6542:6;;6528:10;:20;6524:1541;;6577:20;;;;:8;:20;;;;;;-1:-1:-1;;;;;6569:28:0;;;6577:20;;6569:28;6565:91;;6625:15;;-1:-1:-1;;;6625:15:0;;;;;;;;;;;6565:91;-1:-1:-1;;;;;6677:16:0;;6673:82;;6721:18;;-1:-1:-1;;;6721:18:0;;;;;;;;;;;6673:82;6776:10;-1:-1:-1;;;;;6776:18:0;;;;;;:57;;-1:-1:-1;;;;;;6799:22:0;;;;;;:16;:22;;;;;;;;6822:10;6799:34;;;;;;;;;;6798:35;6776:57;:98;;;;-1:-1:-1;6851:23:0;;;;:11;:23;;;;;;-1:-1:-1;;;;;6851:23:0;6837:10;:37;;6776:98;6772:160;;;6902:14;;-1:-1:-1;;;6902:14:0;;;;;;;;;;;6772:160;6968:10;:8;:10::i;:::-;-1:-1:-1;;;;;6949:15:0;;;;;;:9;:15;;;;;:29;;:15;;;:29;;;;;:::i;:::-;;;;-1:-1:-1;7042:10:0;;-1:-1:-1;7042:8:0;:10::i;:::-;-1:-1:-1;;;;;7025:13:0;;;;;;;:9;:13;;;;;;;;:27;;;;;;;;7085:20;;;:8;:20;;;;;:25;;-1:-1:-1;;;;;;7085:25:0;;;;;;;;7132:11;:23;;;;;7125:30;;;;;;;;7234:12;;;;;:6;:12;;;;;7247:19;;:23;;-1:-1:-1;;7247:23:0;:::i;:::-;7234:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;7286:12:0;;;;:6;:12;;;;;;7299:23;;;:11;:23;;;;;;;7286:37;;7234;;-1:-1:-1;7234:37:0;;7286;;;;;;:::i;:::-;;;;;;;;;;;;:49;;;;-1:-1:-1;;;;;7370:12:0;;;;:6;:12;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;7370:18:0;;;;;;;;;;;;7474:23;;;:11;:23;;;;;;;7449:22;;;;;;:48;-1:-1:-1;;;;;7551:10:0;;;;;:6;:10;;;;;:27;;7370:18;7551:27;;;;;;;;;;;;;;;7661:10;;:17;;:21;;7370:18;7661:21;:::i;:::-;7635:23;;;;:11;:23;;;;;;:47;;;;7705:30;;7647:10;;-1:-1:-1;;;;;7705:30:0;;;;;;;;;;;7775:2;-1:-1:-1;;;;;7755:35:0;7769:4;-1:-1:-1;;;;;7755:35:0;;7779:10;:8;:10::i;:::-;7755:35;;1838:25:1;;;1826:2;1811:18;7755:35:0;;;;;;;6550:1252;48124:150;;;:::o;6524:1541::-;-1:-1:-1;;;;;7841:15:0;;7823;7841;;;:9;:15;;;;;;;;7857:10;7841:27;;;;;;;;-1:-1:-1;;7890:28:0;;7886:119;;7969:20;7979:10;7969:7;:20;:::i;:::-;-1:-1:-1;;;;;7939:15:0;;;;;;:9;:15;;;;;;;;7955:10;7939:27;;;;;;;:50;7886:119;8022:31;8032:4;8038:2;8042:10;48901:550;-1:-1:-1;;;;;49013:18:0;;48989:4;49013:18;;;:12;:18;;;;;;;;;:38;;-1:-1:-1;;;;;;49035:16:0;;;;;;:12;:16;;;;;;;;49013:38;49009:84;;;49060:33;49076:4;49082:2;49086:6;49060:15;:33::i;:::-;49053:40;;;;49009:84;49115:4;;;;49107:25;;;;-1:-1:-1;;;49107:25:0;;13703:2:1;49107:25:0;;;13685:21:1;13742:1;13722:18;;;13715:29;-1:-1:-1;;;13760:18:1;;;13753:38;13808:18;;49107:25:0;13501:331:1;49107:25:0;49191:4;;49146:19;;-1:-1:-1;;;;;49183:12:0;;;49191:4;;49183:12;;:26;;-1:-1:-1;49205:4:0;;-1:-1:-1;;;;;49199:10:0;;;49205:4;;49199:10;49183:26;49179:73;;;49225:27;49235:4;49241:2;49245:6;49225:9;:27::i;:::-;49211:41;;49179:73;49270:15;;49266:70;;49287:49;49303:4;49317;49324:11;49287:15;:49::i;:::-;;49266:70;49362:4;;-1:-1:-1;;;;;49354:12:0;;;49362:4;;49354:12;49350:25;;49368:7;:5;:7::i;:::-;49396:47;49412:4;49418:2;49422:20;49431:11;49422:6;:20;:::i;:::-;49396:15;:47::i;42170:718::-;42226:13;42277:14;42294:17;42305:5;42294:10;:17::i;:::-;42314:1;42294:21;42277:38;;42330:20;42364:6;42353:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42353:18:0;-1:-1:-1;42330:41:0;-1:-1:-1;42495:28:0;;;42511:2;42495:28;42552:290;-1:-1:-1;;42584:5:0;-1:-1:-1;;;42721:2:0;42710:14;;42705:32;42584:5;42692:46;42784:2;42775:11;;;-1:-1:-1;42805:21:0;42552:290;42805:21;-1:-1:-1;42863:6:0;42170:718;-1:-1:-1;;;42170:718:0:o;10358:92::-;10401:7;10428:14;10434:8;10428:2;:14;:::i;:::-;10421:21;;10358:92;:::o;9280:1038::-;9367:4;9384:12;9399:10;:8;:10::i;:::-;-1:-1:-1;;;;;9450:15:0;;;9420:27;9450:15;;;:9;:15;;;;;;;;9508:13;;;;;;;;;9535:15;;;9384:25;;-1:-1:-1;9450:15:0;;9508:13;;9554:6;;9450:15;9535:25;9554:6;9450:15;9535:25;:::i;:::-;;;;-1:-1:-1;;;;;;;9599:13:0;;;;;;;:9;:13;;;;;;;;:23;;;;;;9708:15;;;;;:9;:15;;;;;;9703:234;;-1:-1:-1;;;;;9797:15:0;;9740:22;9797:15;;;:9;:15;;;;;;:22;;9815:4;;9797:22;:::i;:::-;9766:26;9788:4;9766:19;:26;:::i;:::-;9765:55;;;;:::i;:::-;9740:80;;9840:9;9835:91;9859:14;9855:1;:18;9835:91;;;9899:11;9905:4;9899:5;:11::i;:::-;9875:3;;9835:91;;;;9725:212;9703:234;-1:-1:-1;;;;;10014:13:0;;;;;;:9;:13;;;;;;;;10009:230;;10044:22;10095:28;10119:4;10095:21;:28;:::i;:::-;-1:-1:-1;;;;;10070:13:0;;;;;;:9;:13;;;;;;:20;;10086:4;;10070:20;:::i;:::-;10069:55;;;;:::i;:::-;10044:80;;10144:9;10139:89;10163:14;10159:1;:18;10139:89;;;10203:9;10209:2;10203:5;:9::i;:::-;10179:3;;10139:89;;;;10029:210;10009:230;10277:2;-1:-1:-1;;;;;10257:31:0;10271:4;-1:-1:-1;;;;;10257:31:0;;10281:6;10257:31;;;;1838:25:1;;1826:2;1811:18;;1692:177;10257:31:0;;;;;;;;-1:-1:-1;10306:4:0;;9280:1038;-1:-1:-1;;;;;;9280:1038:0:o;48534:358::-;48607:4;48571:15;48589:24;;;:9;:24;;;;;;;48648:16;;48662:1;48648:16;;;;;;;;;48589:24;;48571:15;48648:16;;;;;;;;;;;;-1:-1:-1;48648:16:0;48624:40;;48693:4;48675;48680:1;48675:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;48675:23:0;;;:7;;;;;;;;;:23;48719:4;;48709:7;;48719:4;;;48709;;48719;;48709:7;;;;;;:::i;:::-;-1:-1:-1;;;;;48709:14:0;;;:7;;;;;;;;;:14;48750:6;;48734:33;;48750:6;48759:7;48734;:33::i;:::-;-1:-1:-1;48778:6:0;;;48854:5;;-1:-1:-1;;;;;48778:6:0;;;;:57;;48836:7;;48778:6;;48848:4;;48854:5;48861:22;:15;48879:4;48861:22;:::i;:::-;48778:106;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48560:332;;48534:358::o;38561:948::-;38614:7;;-1:-1:-1;;;38692:17:0;;38688:106;;-1:-1:-1;;;38730:17:0;;;-1:-1:-1;38776:2:0;38766:12;38688:106;38821:8;38812:5;:17;38808:106;;38859:8;38850:17;;;-1:-1:-1;38896:2:0;38886:12;38808:106;38941:8;38932:5;:17;38928:106;;38979:8;38970:17;;;-1:-1:-1;39016:2:0;39006:12;38928:106;39061:7;39052:5;:16;39048:103;;39098:7;39089:16;;;-1:-1:-1;39134:1:0;39124:11;39048:103;39178:7;39169:5;:16;39165:103;;39215:7;39206:16;;;-1:-1:-1;39251:1:0;39241:11;39165:103;39295:7;39286:5;:16;39282:103;;39332:7;39323:16;;;-1:-1:-1;39368:1:0;39358:11;39282:103;39412:7;39403:5;:16;39399:68;;39450:1;39440:11;39495:6;38561:948;-1:-1:-1;;38561:948:0:o;10947:375::-;-1:-1:-1;;;;;11008:18:0;;11004:73;;11050:15;;-1:-1:-1;;;11050:15:0;;;;;;;;;;;11004:73;-1:-1:-1;;;;;11103:12:0;;11090:10;11103:12;;;:6;:12;;;;;11116:19;;:23;;11138:1;;11116:23;:::i;:::-;11103:37;;;;;;;;:::i;:::-;;;;;;;;;11090:50;;11151:6;:12;11158:4;-1:-1:-1;;;;;11151:12:0;-1:-1:-1;;;;;11151:12:0;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;11151:18:0;;;;;;;;;;;;11187:15;;;:11;:15;;;;;;11180:22;;;11220:8;:12;;;;;11213:19;;-1:-1:-1;;;;;;11213:19:0;;;;;;11250:11;:15;;;;;;11243:22;;;;;;;;11284:30;11199:2;;11151:18;-1:-1:-1;;;;;11284:30:0;;;;;11151:18;;11284:30;10993:329;10947:375;:::o;10459:479::-;-1:-1:-1;;;;;10518:16:0;;10514:74;;10558:18;;-1:-1:-1;;;10558:18:0;;;;;;;;;;;10514:74;10626:6;:8;;;;;;;;:6;10696:12;;;:8;:12;;;;;;-1:-1:-1;;;;;10696:12:0;:26;10692:81;;10746:15;;-1:-1:-1;;;10746:15:0;;;;;;;;;;;10692:81;10786:12;;;;:8;:12;;;;;;;;:17;;-1:-1:-1;;;;;;10786:17:0;-1:-1:-1;;;;;10786:17:0;;;;;;;;10814:10;;;:6;:10;;;;;:19;;-1:-1:-1;10814:19:0;;;;;;;;;;;;;;;10862:10;;:17;;:21;;-1:-1:-1;10862:21:0;:::i;:::-;10844:15;;;;:11;:15;;;;;;:39;;;;10902:28;;10856:2;;-1:-1:-1;;;;;10902:28:0;;;;;10844:15;;10902:28;10503:435;10459:479;:::o;14:250:1:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:396::-;418:2;407:9;400:21;381:4;450:6;444:13;493:6;488:2;477:9;473:18;466:34;509:79;581:6;576:2;565:9;561:18;556:2;548:6;544:15;509:79;:::i;:::-;649:2;628:15;-1:-1:-1;;624:29:1;609:45;;;;656:2;605:54;;269:396;-1:-1:-1;;269:396:1:o;670:180::-;729:6;782:2;770:9;761:7;757:23;753:32;750:52;;;798:1;795;788:12;750:52;-1:-1:-1;821:23:1;;670:180;-1:-1:-1;670:180:1:o;1063:173::-;1131:20;;-1:-1:-1;;;;;1180:31:1;;1170:42;;1160:70;;1226:1;1223;1216:12;1241:254;1309:6;1317;1370:2;1358:9;1349:7;1345:23;1341:32;1338:52;;;1386:1;1383;1376:12;1338:52;1409:29;1428:9;1409:29;:::i;:::-;1399:39;1485:2;1470:18;;;;1457:32;;-1:-1:-1;;;1241:254:1:o;1874:127::-;1935:10;1930:3;1926:20;1923:1;1916:31;1966:4;1963:1;1956:15;1990:4;1987:1;1980:15;2006:922;2075:6;2128:2;2116:9;2107:7;2103:23;2099:32;2096:52;;;2144:1;2141;2134:12;2096:52;2184:9;2171:23;2213:18;2254:2;2246:6;2243:14;2240:34;;;2270:1;2267;2260:12;2240:34;2308:6;2297:9;2293:22;2283:32;;2353:7;2346:4;2342:2;2338:13;2334:27;2324:55;;2375:1;2372;2365:12;2324:55;2411:2;2398:16;2433:2;2429;2426:10;2423:36;;;2439:18;;:::i;:::-;2514:2;2508:9;2482:2;2568:13;;-1:-1:-1;;2564:22:1;;;2588:2;2560:31;2556:40;2544:53;;;2612:18;;;2632:22;;;2609:46;2606:72;;;2658:18;;:::i;:::-;2698:10;2694:2;2687:22;2733:2;2725:6;2718:18;2773:7;2768:2;2763;2759;2755:11;2751:20;2748:33;2745:53;;;2794:1;2791;2784:12;2745:53;2850:2;2845;2841;2837:11;2832:2;2824:6;2820:15;2807:46;2895:1;2873:15;;;2890:2;2869:24;2862:35;;;;-1:-1:-1;2877:6:1;2006:922;-1:-1:-1;;;;;2006:922:1:o;2933:328::-;3010:6;3018;3026;3079:2;3067:9;3058:7;3054:23;3050:32;3047:52;;;3095:1;3092;3085:12;3047:52;3118:29;3137:9;3118:29;:::i;:::-;3108:39;;3166:38;3200:2;3189:9;3185:18;3166:38;:::i;:::-;3156:48;;3251:2;3240:9;3236:18;3223:32;3213:42;;2933:328;;;;;:::o;3455:160::-;3520:20;;3576:13;;3569:21;3559:32;;3549:60;;3605:1;3602;3595:12;3620:180;3676:6;3729:2;3717:9;3708:7;3704:23;3700:32;3697:52;;;3745:1;3742;3735:12;3697:52;3768:26;3784:9;3768:26;:::i;3805:254::-;3870:6;3878;3931:2;3919:9;3910:7;3906:23;3902:32;3899:52;;;3947:1;3944;3937:12;3899:52;3970:29;3989:9;3970:29;:::i;:::-;3960:39;;4018:35;4049:2;4038:9;4034:18;4018:35;:::i;:::-;4008:45;;3805:254;;;;;:::o;4064:186::-;4123:6;4176:2;4164:9;4155:7;4151:23;4147:32;4144:52;;;4192:1;4189;4182:12;4144:52;4215:29;4234:9;4215:29;:::i;4255:632::-;4426:2;4478:21;;;4548:13;;4451:18;;;4570:22;;;4397:4;;4426:2;4649:15;;;;4623:2;4608:18;;;4397:4;4692:169;4706:6;4703:1;4700:13;4692:169;;;4767:13;;4755:26;;4836:15;;;;4801:12;;;;4728:1;4721:9;4692:169;;;-1:-1:-1;4878:3:1;;4255:632;-1:-1:-1;;;;;;4255:632:1:o;4892:808::-;4989:6;4997;5005;5013;5021;5074:3;5062:9;5053:7;5049:23;5045:33;5042:53;;;5091:1;5088;5081:12;5042:53;5114:29;5133:9;5114:29;:::i;:::-;5104:39;;5162:38;5196:2;5185:9;5181:18;5162:38;:::i;:::-;5152:48;;5247:2;5236:9;5232:18;5219:32;5209:42;;5302:2;5291:9;5287:18;5274:32;5325:18;5366:2;5358:6;5355:14;5352:34;;;5382:1;5379;5372:12;5352:34;5420:6;5409:9;5405:22;5395:32;;5465:7;5458:4;5454:2;5450:13;5446:27;5436:55;;5487:1;5484;5477:12;5436:55;5527:2;5514:16;5553:2;5545:6;5542:14;5539:34;;;5569:1;5566;5559:12;5539:34;5614:7;5609:2;5600:6;5596:2;5592:15;5588:24;5585:37;5582:57;;;5635:1;5632;5625:12;5582:57;4892:808;;;;-1:-1:-1;4892:808:1;;-1:-1:-1;5666:2:1;5658:11;;5688:6;4892:808;-1:-1:-1;;;4892:808:1:o;5705:260::-;5773:6;5781;5834:2;5822:9;5813:7;5809:23;5805:32;5802:52;;;5850:1;5847;5840:12;5802:52;5873:29;5892:9;5873:29;:::i;:::-;5863:39;;5921:38;5955:2;5944:9;5940:18;5921:38;:::i;6205:380::-;6284:1;6280:12;;;;6327;;;6348:61;;6402:4;6394:6;6390:17;6380:27;;6348:61;6455:2;6447:6;6444:14;6424:18;6421:38;6418:161;;6501:10;6496:3;6492:20;6489:1;6482:31;6536:4;6533:1;6526:15;6564:4;6561:1;6554:15;6418:161;;6205:380;;;:::o;6716:518::-;6818:2;6813:3;6810:11;6807:421;;;6854:5;6851:1;6844:16;6898:4;6895:1;6885:18;6968:2;6956:10;6952:19;6949:1;6945:27;6939:4;6935:38;7004:4;6992:10;6989:20;6986:47;;;-1:-1:-1;7027:4:1;6986:47;7082:2;7077:3;7073:12;7070:1;7066:20;7060:4;7056:31;7046:41;;7137:81;7155:2;7148:5;7145:13;7137:81;;;7214:1;7200:16;;7181:1;7170:13;7137:81;;7410:1345;7536:3;7530:10;7563:18;7555:6;7552:30;7549:56;;;7585:18;;:::i;:::-;7614:97;7704:6;7664:38;7696:4;7690:11;7664:38;:::i;:::-;7658:4;7614:97;:::i;:::-;7766:4;;7823:2;7812:14;;7840:1;7835:663;;;;8542:1;8559:6;8556:89;;;-1:-1:-1;8611:19:1;;;8605:26;8556:89;-1:-1:-1;;7367:1:1;7363:11;;;7359:24;7355:29;7345:40;7391:1;7387:11;;;7342:57;8658:81;;7805:944;;7835:663;6663:1;6656:14;;;6700:4;6687:18;;-1:-1:-1;;7871:20:1;;;7989:236;8003:7;8000:1;7997:14;7989:236;;;8092:19;;;8086:26;8071:42;;8184:27;;;;8152:1;8140:14;;;;8019:19;;7989:236;;;7993:3;8253:6;8244:7;8241:19;8238:201;;;8314:19;;;8308:26;-1:-1:-1;;8397:1:1;8393:14;;;8409:3;8389:24;8385:37;8381:42;8366:58;8351:74;;8238:201;-1:-1:-1;;;;;8485:1:1;8469:14;;;8465:22;8452:36;;-1:-1:-1;7410:1345:1:o;10012:290::-;10081:6;10134:2;10122:9;10113:7;10109:23;10105:32;10102:52;;;10150:1;10147;10140:12;10102:52;10176:16;;-1:-1:-1;;;;;;10221:32:1;;10211:43;;10201:71;;10268:1;10265;10258:12;10307:127;10368:10;10363:3;10359:20;10356:1;10349:31;10399:4;10396:1;10389:15;10423:4;10420:1;10413:15;10439:168;10512:9;;;10543;;10560:15;;;10554:22;;10540:37;10530:71;;10581:18;;:::i;10744:217::-;10784:1;10810;10800:132;;10854:10;10849:3;10845:20;10842:1;10835:31;10889:4;10886:1;10879:15;10917:4;10914:1;10907:15;10800:132;-1:-1:-1;10946:9:1;;10744:217::o;11255:662::-;-1:-1:-1;;;;;11534:15:1;;;11516:34;;11586:15;;11581:2;11566:18;;11559:43;11633:2;11618:18;;11611:34;;;11681:3;11676:2;11661:18;;11654:31;;;11701:19;;11694:35;;;11459:4;11722:6;11772;11496:3;11751:19;;11738:49;11837:1;11831:3;11822:6;11811:9;11807:22;11803:32;11796:43;11907:3;11900:2;11896:7;11891:2;11883:6;11879:15;11875:29;11864:9;11860:45;11856:55;11848:63;;11255:662;;;;;;;;:::o;11922:1177::-;12188:3;12217:1;12250:6;12244:13;12280:36;12306:9;12280:36;:::i;:::-;12335:1;12352:17;;;12378:133;;;;12525:1;12520:358;;;;12345:533;;12378:133;-1:-1:-1;;12411:24:1;;12399:37;;12484:14;;12477:22;12465:35;;12456:45;;;-1:-1:-1;12378:133:1;;12520:358;12551:6;12548:1;12541:17;12581:4;12626;12623:1;12613:18;12653:1;12667:165;12681:6;12678:1;12675:13;12667:165;;;12759:14;;12746:11;;;12739:35;12802:16;;;;12696:10;;12667:165;;;12671:3;;;12861:6;12856:3;12852:16;12845:23;;12345:533;;;;;12909:6;12903:13;12925:68;12984:8;12979:3;12972:4;12964:6;12960:17;12925:68;:::i;:::-;-1:-1:-1;;;13015:18:1;;13042:22;;;13091:1;13080:13;;11922:1177;-1:-1:-1;;;;11922:1177:1:o;13104:128::-;13171:9;;;13192:11;;;13189:37;;;13206:18;;:::i;13237:127::-;13298:10;13293:3;13289:20;13286:1;13279:31;13329:4;13326:1;13319:15;13353:4;13350:1;13343:15;13369:127;13430:10;13425:3;13421:20;13418:1;13411:31;13461:4;13458:1;13451:15;13485:4;13482:1;13475:15;13837:416;13926:1;13963:5;13926:1;13977:270;13998:7;13988:8;13985:21;13977:270;;;14057:4;14053:1;14049:6;14045:17;14039:4;14036:27;14033:53;;;14066:18;;:::i;:::-;14116:7;14106:8;14102:22;14099:55;;;14136:16;;;;14099:55;14215:22;;;;14175:15;;;;13977:270;;;13981:3;13837:416;;;;;:::o;14258:806::-;14307:5;14337:8;14327:80;;-1:-1:-1;14378:1:1;14392:5;;14327:80;14426:4;14416:76;;-1:-1:-1;14463:1:1;14477:5;;14416:76;14508:4;14526:1;14521:59;;;;14594:1;14589:130;;;;14501:218;;14521:59;14551:1;14542:10;;14565:5;;;14589:130;14626:3;14616:8;14613:17;14610:43;;;14633:18;;:::i;:::-;-1:-1:-1;;14689:1:1;14675:16;;14704:5;;14501:218;;14803:2;14793:8;14790:16;14784:3;14778:4;14775:13;14771:36;14765:2;14755:8;14752:16;14747:2;14741:4;14738:12;14734:35;14731:77;14728:159;;;-1:-1:-1;14840:19:1;;;14872:5;;14728:159;14919:34;14944:8;14938:4;14919:34;:::i;:::-;14989:6;14985:1;14981:6;14977:19;14968:7;14965:32;14962:58;;;15000:18;;:::i;:::-;15038:20;;14258:806;-1:-1:-1;;;14258:806:1:o;15069:140::-;15127:5;15156:47;15197:4;15187:8;15183:19;15177:4;15156:47;:::i;15214:125::-;15279:9;;;15300:10;;;15297:36;;;15313:18;;:::i;15344:980::-;15606:4;15654:3;15643:9;15639:19;15685:6;15674:9;15667:25;15711:2;15749:6;15744:2;15733:9;15729:18;15722:34;15792:3;15787:2;15776:9;15772:18;15765:31;15816:6;15851;15845:13;15882:6;15874;15867:22;15920:3;15909:9;15905:19;15898:26;;15959:2;15951:6;15947:15;15933:29;;15980:1;15990:195;16004:6;16001:1;15998:13;15990:195;;;16069:13;;-1:-1:-1;;;;;16065:39:1;16053:52;;16160:15;;;;16125:12;;;;16101:1;16019:9;15990:195;;;-1:-1:-1;;;;;;;16241:32:1;;;;16236:2;16221:18;;16214:60;-1:-1:-1;;;16305:3:1;16290:19;16283:35;16202:3;15344:980;-1:-1:-1;;;15344:980:1:o
Swarm Source
ipfs://ce5386bc6816b0e850a4faed936a8fa55f1298985daa3e3ed39238f9314b300f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.