Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
1,000,000,000 EdFi
Holders
361
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.897162291896173827 EdFiValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
EdFi
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-05-11 */ // SPDX-License-Identifier: MIT /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // Dependency file: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) // pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { 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. * * _Available since v3.4._ */ 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. * * _Available since v3.4._ */ 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 addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // Dependency file: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) // pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // Dependency file: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts/utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // Dependency file: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) // pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // Dependency file: contracts/interfaces/IUniswapV2Factory.sol // pragma solidity >=0.5.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; } // Dependency file: contracts/interfaces/IUniswapV2Pair.sol // pragma solidity >=0.5.0; 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; } // Dependency file: contracts/interfaces/IUniswapV2Router01.sol // pragma solidity >=0.6.2; 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); } // Dependency file: contracts/interfaces/IUniswapV2Router02.sol // pragma solidity >=0.6.2; // import "contracts/interfaces/IUniswapV2Router01.sol"; 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; } // Dependency file: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; // import "@openzeppelin/contracts/utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // Dependency file: contracts/parts/Withdrawable.sol // pragma solidity ^0.8.9; // import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; // import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; abstract contract Withdrawable { using SafeERC20 for IERC20; using Address for address; event WithdrawToken(address token, address recipient, uint256 amount); event Withdraw(address recipient, uint256 amount); function _deliverFunds( address _recipient, uint256 _value, string memory _message ) internal { (bool sent, ) = payable(_recipient).call{value: _value}(""); require(sent, _message); } function _deliverTokens( address _token, address _recipient, uint256 _value ) internal { IERC20(_token).safeTransfer(_recipient, _value); } function _withdraw(address _recipient, uint256 _amount) internal virtual { require(_recipient != address(0x0), "Withdraw: address is zero"); require( _amount <= address(this).balance, "Withdraw: not enought ETH balance" ); _afterWithdraw(_recipient, _amount); _deliverFunds(_recipient, _amount, "Withdraw: Can't send ETH"); emit Withdraw(_recipient, _amount); } function _afterWithdraw(address _recipient, uint256 _amount) internal virtual {} function _withdrawToken( address _token, address _recipient, uint256 _amount ) internal virtual { require(_recipient != address(0x0), "Withdraw: address is zero"); require( _amount <= IERC20(_token).balanceOf(address(this)), "Withdraw: not enought token balance" ); IERC20(_token).safeTransfer(_recipient, _amount); _afterWithdrawToken(_token, _recipient, _amount); emit WithdrawToken(_token, _recipient, _amount); } function _afterWithdrawToken( address _token, address _recipient, uint256 _amount ) internal virtual {} } // Root file: contracts/EdFi.sol pragma solidity ^0.8.0; // import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; // import "@openzeppelin/contracts/utils/math/SafeMath.sol"; // import "@openzeppelin/contracts/access/Ownable.sol"; // import "@openzeppelin/contracts/utils/Address.sol"; // import "contracts/interfaces/IUniswapV2Factory.sol"; // import "contracts/interfaces/IUniswapV2Pair.sol"; // import "contracts/interfaces/IUniswapV2Router02.sol"; // import "contracts/parts/Withdrawable.sol"; contract EdFi is Context, IERC20, Withdrawable, Ownable { using SafeMath for uint256; using Address for address; // dead address address internal constant DEAD_ADDRESS = 0x000000000000000000000000000000000000dEaD; uint256 internal constant PRECISION = 1 ether; //user balances multiplied reward mapping(address => uint256) private _rOwned; //user original balances mapping(address => uint256) private _tOwned; //allowances mapping(address => mapping(address => uint256)) private _allowances; //bots mapping(address => bool) private _isSniper; address[] private _confirmedSnipers; //excluded from fees mapping(address => bool) private _isExcludedFee; //excluded from rewards mapping(address => bool) private _isExcludedReward; //excluded array address[] private _excluded; string private constant _name = "EdFi"; string private constant _symbol = "EdFi"; uint8 private constant _decimals = 18; //max uint256 uint256 private constant MAX = ~uint256(0); //total supply uint256 private constant _tTotal = 1_000_000_000 ether; //total with rewards uint256 private _rTotal = (MAX - (MAX % _tTotal)); //total fees uint256 private _tFeeTotal; //Fees //reflection fee uint256 public reflectionFee; uint256 private _previousReflectFee; //treasury fee uint256 public treasuryFee; uint256 private _previousTreasuryFee; //Liquify fee uint256 public liquidityFee; uint256 private _previousLiquidityFee; //fee rate for minimum fees balance uint256 public feeRate; //launch time uint256 public launchTime; //uint256 IUniswapV2Router02 public uniswapRouter; address public uniswapPair; mapping(address => bool) private _isUniswapPair; address public treasuryWallet; //burn address address public buybackReceiver = DEAD_ADDRESS; bool private _isSelling; bool private _tradingOpen; bool private _transferOpen; bool private _takeFeeOnTransferEnabled; bool private _takeFeeOnBuyEnabled; bool private _takeFeeOnSellEnabled; uint256 public maxSellAmount = 5 ether; mapping(address => bool) public authorized; modifier isAuthorized() { require( (authorized[_msgSender()] || owner() == _msgSender()), "EdFi Token: not authorized user" ); _; } event SwapETHForTokens(address whereTo, uint256 amountIn, address[] path); event SwapTokensForETH(uint256 amountIn, address[] path); event SwapAndLiquify(uint256 ETHAddedForLp, uint256 tokensAddedForLp); event Authorized(address user, bool isAuth); constructor() { //mint to tokens to sender _rOwned[_msgSender()] = _rTotal; emit Transfer(address(0), _msgSender(), _tTotal); } function init( address _routerAddress, address _treasuryAddress, uint256 _reflectionFee, uint256 _treasuryFee, uint256 _liquidityFee, uint256 _feeRate ) external onlyOwner { treasuryWallet = _treasuryAddress; IUniswapV2Router02 _uniswapRouter = IUniswapV2Router02( _routerAddress ); uniswapPair = IUniswapV2Factory(_uniswapRouter.factory()) .createPair(address(this), _uniswapRouter.WETH()); uniswapRouter = _uniswapRouter; //exclude owner from fees _isExcludedFee[owner()] = true; //exclude this contract from fees _isExcludedFee[address(this)] = true; require( _reflectionFee <= 100 && _treasuryFee <= 100 && _liquidityFee <= 100 && _feeRate <= 100, "fee cannot exceed 100%" ); reflectionFee = _reflectionFee; _previousReflectFee = reflectionFee; treasuryFee = _treasuryFee; _previousTreasuryFee = treasuryFee; liquidityFee = _liquidityFee; _previousLiquidityFee = liquidityFee; feeRate = _feeRate; } /// @notice start trading function openTrading() external onlyOwner { _tradingOpen = true; _transferOpen = true; launchTime = block.timestamp; _takeFeeOnTransferEnabled = false; _takeFeeOnBuyEnabled = true; _takeFeeOnSellEnabled = true; } function authorize(address _user, bool _isAuth) external onlyOwner { authorized[_user] = _isAuth; emit Authorized(_user, _isAuth); } /// @notice token name function name() external pure returns (string memory) { return _name; } /// @notice symbol function symbol() external pure returns (string memory) { return _symbol; } /// @notice decimals function decimals() external pure returns (uint8) { return _decimals; } /// @notice total supply function totalSupply() external pure override returns (uint256) { return _tTotal; } /// @notice balance of function balanceOf(address account) public view override returns (uint256) { if (_isExcludedReward[account]) return _tOwned[account]; return tokenFromReflection(_rOwned[account]); //return tokens with reflection } function transfer(address recipient, uint256 amount) external override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) external view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) external override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom( address sender, address recipient, uint256 amount ) external override returns (bool) { _transfer(sender, recipient, amount); _approve( sender, _msgSender(), _allowances[sender][_msgSender()].sub( amount, "BEP20: transfer amount exceeds allowance" ) ); return true; } function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue) ); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender].sub( subtractedValue, "BEP20: decreased allowance below zero" ) ); return true; } ///@notice total fees function totalFees() external view returns (uint256) { return _tFeeTotal; } ///@notice get amount with deduction fees or no function reflectionFromToken(uint256 tAmount, bool deductTransferFee) external view returns (uint256) { require(tAmount <= _tTotal, "Amount must be less than supply"); if (!deductTransferFee) { (uint256 rAmount, , , , , ) = _getValues(tAmount); return rAmount; } else { (, uint256 rTransferAmount, , , , ) = _getValues(tAmount); return rTransferAmount; } } ///@notice get tokens from reflection function tokenFromReflection(uint256 rAmount) public view returns (uint256) { require( rAmount <= _rTotal, "Amount must be less than total reflections" ); uint256 currentRate = _getRate(); return rAmount.div(currentRate); } function excludeFromReward(address account) external onlyOwner { require(!_isExcludedReward[account], "Account is already excluded"); if (_rOwned[account] > 0) { _tOwned[account] = tokenFromReflection(_rOwned[account]); } _isExcludedReward[account] = true; _excluded.push(account); } function includeInReward(address account) external onlyOwner { require(_isExcludedReward[account], "Account is already included"); for (uint256 i = 0; i < _excluded.length; i++) { if (_excluded[i] == account) { _excluded[i] = _excluded[_excluded.length - 1]; _tOwned[account] = 0; _isExcludedReward[account] = false; _excluded.pop(); break; } } } function _approve( address owner, address spender, uint256 amount ) private { require(owner != address(0), "BEP20: approve from the zero address"); require(spender != address(0), "BEP20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _transfer( address from, address to, uint256 amount ) private { require(from != address(0), "BEP20: transfer from the zero address"); require(to != address(0), "BEP20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); require(!_isSniper[to], "Stop sniping!"); require(!_isSniper[from], "Stop sniping!"); require(!_isSniper[_msgSender()], "Stop sniping!"); require( _transferOpen || from == owner(), "transferring tokens is not currently allowed" ); bool takeFee = true; bool isBuying; bool isSelling; // buy if ( (from == uniswapPair || _isUniswapPair[from]) && to != address(uniswapRouter) && _tradingOpen ) { isBuying = true; // normal buy, check for snipers if (!isExcludedFromFee(to)) { require(_tradingOpen, "Trading not yet enabled."); // antibot if (block.timestamp == launchTime) { _isSniper[to] = true; _confirmedSnipers.push(to); } } if (!_takeFeeOnBuyEnabled) { takeFee = false; } } // sell or transfer if ( _tradingOpen && from != uniswapPair && !_isUniswapPair[from] && from != address(uniswapRouter) ) { //if sell check max amount if ( to == uniswapPair || _isUniswapPair[to] || to == address(uniswapRouter) ) { isSelling = true; if (!_takeFeeOnSellEnabled) { takeFee = false; } (uint256 reserve0, uint256 reserve1, ) = IUniswapV2Pair( uniswapPair ).getReserves(); (reserve0, reserve1) = IUniswapV2Pair(uniswapPair) .token0() == address(this) ? (reserve0, reserve1) : (reserve1, reserve0); uint256 estimatedEquivalentETH = uniswapRouter.getAmountOut( amount, reserve0, reserve1 ); require( estimatedEquivalentETH <= maxSellAmount, "the amount of the sale is more than the available one" ); } } if (!isSelling && !isBuying && !_takeFeeOnTransferEnabled) { takeFee = false; } if ((isExcludedFromFee(from) || isExcludedFromFee(to))) { takeFee = false; } _tokenTransfer(from, to, amount, takeFee); } function distribute() external isAuthorized { uint256 _contractTokenBalance = balanceOf(address(this)); if (_contractTokenBalance > 0) { uint256 maxSwapAmount = balanceOf(uniswapPair) .mul(feeRate) .mul(PRECISION) .div(100) .div(PRECISION); if (_contractTokenBalance > maxSwapAmount) { _contractTokenBalance = maxSwapAmount; } _distribute(_contractTokenBalance); } } function _distribute(uint256 _contractTokenBalance) private { uint256 ETHBalanceBefore = address(this).balance; uint256 _liquidityFeeTotal = _liquidityFeeAggregate(); //get fees without reflection fee uint256 liquidityFeeBalance = _contractTokenBalance .mul(liquidityFee) .div(_liquidityFeeTotal); _contractTokenBalance = _contractTokenBalance - liquidityFeeBalance; _distributeForETH(_contractTokenBalance); uint256 ETHBalanceAfter = address(this).balance; uint256 ETHBalanceUpdate = ETHBalanceAfter.sub(ETHBalanceBefore); // send ETH to treasury address uint256 treasuryETHBalance = ETHBalanceUpdate; if (treasuryETHBalance > 0) { _deliverFunds( treasuryWallet, treasuryETHBalance, "Cant send ETH to wallet" ); } if (liquidityFeeBalance > 0) { _liquifyTokens(liquidityFeeBalance); } } function _liquifyTokens(uint256 amount) private { // split the contract balance into halves uint256 half = amount.div(2); uint256 otherHalf = amount.sub(half); if (otherHalf > balanceOf(address(this))) { otherHalf = balanceOf(address(this)); } uint256 initialBalance = address(this).balance; _distributeForETH(half); uint256 newBalance = address(this).balance.sub(initialBalance); _addLiquidity(otherHalf, newBalance); } function _addLiquidity(uint256 _tokenAmount, uint256 _ETHAmount) internal { // approve token transfer to cover all possible scenarios _approve(address(this), address(uniswapRouter), _tokenAmount); (bool success, ) = payable(address(uniswapRouter)).call{ value: _ETHAmount }( abi.encodeWithSignature( "addLiquidityETH(address,uint256,uint256,uint256,address,uint256)", address(this), _tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable, buybackReceiver, block.timestamp ) ); if (success) { emit SwapAndLiquify(_ETHAmount, _tokenAmount); } } function _distributeForETH(uint256 tokenAmount) private { // generate the uniswap pair path of token -> wETH address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapRouter.WETH(); _approve(address(this), address(uniswapRouter), tokenAmount); (bool success, ) = payable(address(uniswapRouter)).call( abi.encodeWithSignature( "swapExactTokensForETHSupportingFeeOnTransferTokens(uint256,uint256,address[],address,uint256)", tokenAmount, 0, // accept any amount of ETH path, address(this), // the contract block.timestamp ) ); if (success) { emit SwapTokensForETH(tokenAmount, path); } } function _tokenTransfer( address sender, address recipient, uint256 amount, bool takeFee ) private { if (!takeFee) { _removeAllFee(); } if (_isExcludedReward[sender] && !_isExcludedReward[recipient]) { _transferFromExcluded(sender, recipient, amount); } else if (!_isExcludedReward[sender] && _isExcludedReward[recipient]) { _transferToExcluded(sender, recipient, amount); } else if (_isExcludedReward[sender] && _isExcludedReward[recipient]) { _transferBothExcluded(sender, recipient, amount); } else { _transferStandard(sender, recipient, amount); } if (!takeFee) _restoreAllFee(); } function _transferStandard( address sender, address recipient, uint256 tAmount ) private { ( uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity ) = _getValues(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeLiquidity(tLiquidity); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } function _transferToExcluded( address sender, address recipient, uint256 tAmount ) private { ( uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity ) = _getValues(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeLiquidity(tLiquidity); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } function _transferFromExcluded( address sender, address recipient, uint256 tAmount ) private { ( uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity ) = _getValues(tAmount); _tOwned[sender] = _tOwned[sender].sub(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeLiquidity(tLiquidity); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } function _transferBothExcluded( address sender, address recipient, uint256 tAmount ) private { ( uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity ) = _getValues(tAmount); _tOwned[sender] = _tOwned[sender].sub(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeLiquidity(tLiquidity); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } function _reflectFee(uint256 rFee, uint256 tFee) private { _rTotal = _rTotal.sub(rFee); _tFeeTotal = _tFeeTotal.add(tFee); } function _getValues(uint256 tAmount) private view returns ( uint256, uint256, uint256, uint256, uint256, uint256 ) { ( uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity ) = _getTValues(tAmount); (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues( tAmount, tFee, tLiquidity, _getRate() ); return ( rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity ); } function _getTValues(uint256 tAmount) private view returns ( uint256, uint256, uint256 ) { uint256 tFee = _calculateReflectFee(tAmount); uint256 tLiquidity = _calculateLiquidityFee(tAmount); uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity); return (tTransferAmount, tFee, tLiquidity); } function _getRValues( uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 currentRate ) private pure returns ( uint256, uint256, uint256 ) { uint256 rAmount = tAmount.mul(currentRate); uint256 rFee = tFee.mul(currentRate); uint256 rLiquidity = tLiquidity.mul(currentRate); uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity); return (rAmount, rTransferAmount, rFee); } function _getRate() private view returns (uint256) { (uint256 rSupply, uint256 tSupply) = _getCurrentSupply(); return rSupply.div(tSupply); } function _getCurrentSupply() private view returns (uint256, uint256) { uint256 rSupply = _rTotal; uint256 tSupply = _tTotal; for (uint256 i = 0; i < _excluded.length; i++) { if ( _rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply ) return (_rTotal, _tTotal); rSupply = rSupply.sub(_rOwned[_excluded[i]]); tSupply = tSupply.sub(_tOwned[_excluded[i]]); } if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal); return (rSupply, tSupply); } function _takeLiquidity(uint256 tLiquidity) private { uint256 currentRate = _getRate(); uint256 rLiquidity = tLiquidity.mul(currentRate); _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity); if (_isExcludedReward[address(this)]) _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity); } function _calculateReflectFee(uint256 _amount) private view returns (uint256) { return _amount.mul(reflectionFee).mul(PRECISION).div(100).div(PRECISION); } function _liquidityFeeAggregate() private view returns (uint256) { return treasuryFee.add(liquidityFee); } function _calculateLiquidityFee(uint256 _amount) private view returns (uint256) { return _amount.mul(_liquidityFeeAggregate()).mul(PRECISION).div(100).div( PRECISION ); } function _removeAllFee() private { if (reflectionFee == 0 && treasuryFee == 0 && liquidityFee == 0) return; _previousReflectFee = reflectionFee; _previousTreasuryFee = treasuryFee; _previousLiquidityFee = liquidityFee; reflectionFee = 0; treasuryFee = 0; liquidityFee = 0; } function _restoreAllFee() private { reflectionFee = _previousReflectFee; treasuryFee = _previousTreasuryFee; liquidityFee = _previousLiquidityFee; } function getSellSlippage(address seller) external view returns (uint256) { uint256 feeAgg = treasuryFee.add(reflectionFee).add(liquidityFee); return isExcludedFromFee(seller) ? 0 : feeAgg; } function isuniswapPair(address _pair) external view returns (bool) { if (_pair == uniswapPair) return true; return _isUniswapPair[_pair]; } function takeFeeOnTransferEnabled() external view returns (bool) { return _takeFeeOnTransferEnabled; } function takeFeeOnBuyEnabled() external view returns (bool) { return _takeFeeOnBuyEnabled; } function takeFeeOnSellEnabled() external view returns (bool) { return _takeFeeOnSellEnabled; } function isExcludedFromFee(address account) public view returns (bool) { return _isExcludedFee[account]; } function isExcludedFromReward(address account) external view returns (bool) { return _isExcludedReward[account]; } function excludeFromFee(address account) external onlyOwner { _isExcludedFee[account] = true; } function includeInFee(address account) external onlyOwner { _isExcludedFee[account] = false; } function setReflectionFeePercent(uint256 _newFee) external onlyOwner { require(_newFee <= 100, "fee cannot exceed 100%"); reflectionFee = _newFee; } function setTreasuryFeePercent(uint256 _newFee) external onlyOwner { require(_newFee <= 100, "fee cannot exceed 100%"); treasuryFee = _newFee; } function setLiquidityFeePercent(uint256 _newFee) external onlyOwner { require(_newFee <= 100, "fee cannot exceed 100%"); liquidityFee = _newFee; } function setTreasuryAddress(address _treasuryWallet) external onlyOwner { treasuryWallet = payable(_treasuryWallet); } function setTakeFeeOnBuyEnabled(bool _enabled) external onlyOwner { _takeFeeOnBuyEnabled = _enabled; } function setTakeFeeOnSellEnabled(bool _enabled) external onlyOwner { _takeFeeOnSellEnabled = _enabled; } function setTakeFeeOnTransferEnabled(bool _enabled) external onlyOwner { _takeFeeOnTransferEnabled = _enabled; } function setMaxSellAmount(uint256 _maxSellAmount) external onlyOwner { maxSellAmount = _maxSellAmount; } function setuniswapRouter(address _uniswapRouterAddress) external onlyOwner { uniswapRouter = IUniswapV2Router02(_uniswapRouterAddress); } function setBuybackReceiver(address _receiver) external onlyOwner { buybackReceiver = _receiver; } function adduniswapPair(address _pair) external onlyOwner { _isUniswapPair[_pair] = true; } function removeuniswapPair(address _pair) external onlyOwner { _isUniswapPair[_pair] = false; } function setCanTransfer(bool _canTransfer) external onlyOwner { _transferOpen = _canTransfer; } function isRemovedSniper(address account) external view returns (bool) { return _isSniper[account]; } function removeSniper(address account) external onlyOwner { require( account != address(uniswapRouter), "We can not blacklist Uniswap" ); require(!_isSniper[account], "Account is already blacklisted"); _isSniper[account] = true; _confirmedSnipers.push(account); } function amnestySniper(address account) external onlyOwner { require(_isSniper[account], "Account is not blacklisted"); for (uint256 i = 0; i < _confirmedSnipers.length; i++) { if (_confirmedSnipers[i] == account) { _confirmedSnipers[i] = _confirmedSnipers[ _confirmedSnipers.length - 1 ]; _isSniper[account] = false; _confirmedSnipers.pop(); break; } } } function setFeeRate(uint256 _rate) external onlyOwner { feeRate = _rate; } // to recieve ETH from uniswapRouter when swaping receive() external payable {} /// @notice management function function withdrawToken(address _token, address _recipient) external virtual onlyOwner { uint256 amount = IERC20(_token).balanceOf(address(this)); _withdrawToken(_token, _recipient, amount); _afterWithdrawToken(_token, _recipient, amount); } /// @notice management function function withdrawSomeToken( address _token, address _recipient, uint256 _amount ) public virtual onlyOwner { _withdrawToken(_token, _recipient, _amount); _afterWithdrawToken(_token, _recipient, _amount); } ///@notice withdraw all ETH. function withdraw() external virtual onlyOwner { _withdraw(_msgSender(), address(this).balance); } ///@notice withdraw some ETH function withdrawSome(address _recipient, uint256 _amount) external virtual onlyOwner { _withdraw(_recipient, _amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"isAuth","type":"bool"}],"name":"Authorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"ETHAddedForLp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensAddedForLp","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"whereTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapETHForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","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":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawToken","type":"event"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"}],"name":"adduniswapPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"amnestySniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"_isAuth","type":"bool"}],"name":"authorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"seller","type":"address"}],"name":"getSellSlippage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_routerAddress","type":"address"},{"internalType":"address","name":"_treasuryAddress","type":"address"},{"internalType":"uint256","name":"_reflectionFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_feeRate","type":"uint256"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isRemovedSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"}],"name":"isuniswapPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"}],"name":"removeuniswapPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"setBuybackReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_canTransfer","type":"bool"}],"name":"setCanTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"setFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"setLiquidityFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSellAmount","type":"uint256"}],"name":"setMaxSellAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"setReflectionFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setTakeFeeOnBuyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setTakeFeeOnSellEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setTakeFeeOnTransferEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryWallet","type":"address"}],"name":"setTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"setTreasuryFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_uniswapRouterAddress","type":"address"}],"name":"setuniswapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"takeFeeOnBuyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"takeFeeOnSellEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"takeFeeOnTransferEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawSome","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawSomeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526200001e6b033b2e3c9fd0803ce800000060001962000117565b6200002c906000196200013a565b600955601780546001600160a01b03191661dead179055674563918244f400006018553480156200005c57600080fd5b506200006833620000c7565b6009543360008181526001602090815260408083209490945592516b033b2e3c9fd0803ce80000008152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a362000162565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000826200013557634e487b7160e01b600052601260045260246000fd5b500690565b818103818111156200015c57634e487b7160e01b600052601160045260246000fd5b92915050565b613f9180620001726000396000f3fe6080604052600436106103c75760003560e01c806366d602ae116101f2578063a457c2d71161010d578063d9fff755116100a0578063e4fc6b6d1161006f578063e4fc6b6d14610b79578063e99c9d0914610b8e578063ea2f0b3714610bae578063f2fde38b14610bce57600080fd5b8063d9fff75514610ad4578063dc6571eb14610af3578063dce0333614610b13578063dd62ed3e14610b3357600080fd5b8063c816841b116100dc578063c816841b14610a69578063c9567bf914610a89578063cc32d17614610a9e578063d74611bc14610ab457600080fd5b8063a457c2d7146109d9578063a9059cbb146109f9578063b918161114610a19578063c1051d8f14610a4957600080fd5b80638da5cb5b1161018557806396d386e41161015457806396d386e41461096e57806396eced441461098e578063978bbdb9146109ad57806398118cb4146109c357600080fd5b80638da5cb5b146109105780638ee88c531461092e5780638ef588fc1461094e57806395d89b41146103d357600080fd5b806375ae267d116101c157806375ae267d1461088b578063790ca413146108ab57806383ad7994146108c157806388f82020146108d757600080fd5b806366d602ae1461082057806370a0823114610836578063715018a614610856578063735de9f71461086b57600080fd5b806339509351116102e25780634d8d9efa116102755780635af3832a116102445780635af3832a14610787578063610d5b19146107a757806361ec6830146107e05780636605bfda1461080057600080fd5b80634d8d9efa1461070857806352390c02146107275780635342acb41461074757806356e1221c1461076757600080fd5b80634549b039116102b15780634549b0391461068857806345596e2e146106a85780634626402b146106c8578063489931f0146106e857600080fd5b806339509351146106135780633aeac4e1146106335780633ccfd60b14610653578063437823ec1461066857600080fd5b80632b51c7c01161035a57806333251a0b1161032957806333251a0b14610593578063340c8cc0146105b35780633491218c146105d35780633685d419146105f357600080fd5b80632b51c7c0146105175780632d1fb389146105375780632d83811914610557578063313ce5671461057757600080fd5b806318160ddd1161039657806318160ddd146104805780631df59e2f1461049f5780631f7ede2b146104d757806323b872dd146104f757600080fd5b806306fdde03146103d3578063095ea7b31461040f5780630b2a808c1461043f57806313114a9d1461046157600080fd5b366103ce57005b600080fd5b3480156103df57600080fd5b5060408051808201825260048152634564466960e01b602082015290516104069190613a56565b60405180910390f35b34801561041b57600080fd5b5061042f61042a366004613a9e565b610bee565b6040519015158152602001610406565b34801561044b57600080fd5b5061045f61045a366004613aca565b610c05565b005b34801561046d57600080fd5b50600a545b604051908152602001610406565b34801561048c57600080fd5b506b033b2e3c9fd0803ce8000000610472565b3480156104ab57600080fd5b506017546104bf906001600160a01b031681565b6040516001600160a01b039091168152602001610406565b3480156104e357600080fd5b5061045f6104f2366004613ae7565b610dbb565b34801561050357600080fd5b5061042f610512366004613b00565b610e0b565b34801561052357600080fd5b5061045f610532366004613b00565b610e75565b34801561054357600080fd5b5061045f610552366004613b4f565b610eaf565b34801561056357600080fd5b50610472610572366004613ae7565b610f3d565b34801561058357600080fd5b5060405160128152602001610406565b34801561059f57600080fd5b5061045f6105ae366004613aca565b610fba565b3480156105bf57600080fd5b5061045f6105ce366004613a9e565b611111565b3480156105df57600080fd5b5061045f6105ee366004613b88565b611145565b3480156105ff57600080fd5b5061045f61060e366004613aca565b61118d565b34801561061f57600080fd5b5061042f61062e366004613a9e565b611319565b34801561063f57600080fd5b5061045f61064e366004613ba5565b61134f565b34801561065f57600080fd5b5061045f6113f1565b34801561067457600080fd5b5061045f610683366004613aca565b611427565b34801561069457600080fd5b506104726106a3366004613bd3565b611475565b3480156106b457600080fd5b5061045f6106c3366004613ae7565b61150c565b3480156106d457600080fd5b506016546104bf906001600160a01b031681565b3480156106f457600080fd5b5061045f610703366004613aca565b61153b565b34801561071457600080fd5b50601754600160b81b900460ff1661042f565b34801561073357600080fd5b5061045f610742366004613aca565b611589565b34801561075357600080fd5b5061042f610762366004613aca565b6116dc565b34801561077357600080fd5b5061045f610782366004613ae7565b6116fa565b34801561079357600080fd5b5061042f6107a2366004613aca565b61174a565b3480156107b357600080fd5b5061042f6107c2366004613aca565b6001600160a01b031660009081526004602052604090205460ff1690565b3480156107ec57600080fd5b5061045f6107fb366004613b88565b61178a565b34801561080c57600080fd5b5061045f61081b366004613aca565b6117d2565b34801561082c57600080fd5b5061047260185481565b34801561084257600080fd5b50610472610851366004613aca565b61181e565b34801561086257600080fd5b5061045f61187d565b34801561087757600080fd5b506013546104bf906001600160a01b031681565b34801561089757600080fd5b5061045f6108a6366004613b88565b6118b1565b3480156108b757600080fd5b5061047260125481565b3480156108cd57600080fd5b50610472600b5481565b3480156108e357600080fd5b5061042f6108f2366004613aca565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561091c57600080fd5b506000546001600160a01b03166104bf565b34801561093a57600080fd5b5061045f610949366004613ae7565b6118f9565b34801561095a57600080fd5b5061045f610969366004613aca565b611949565b34801561097a57600080fd5b5061045f610989366004613b88565b611995565b34801561099a57600080fd5b50601754600160c81b900460ff1661042f565b3480156109b957600080fd5b5061047260115481565b3480156109cf57600080fd5b50610472600f5481565b3480156109e557600080fd5b5061042f6109f4366004613a9e565b6119dd565b348015610a0557600080fd5b5061042f610a14366004613a9e565b611a2c565b348015610a2557600080fd5b5061042f610a34366004613aca565b60196020526000908152604090205460ff1681565b348015610a5557600080fd5b5061045f610a64366004613bf8565b611a39565b348015610a7557600080fd5b506014546104bf906001600160a01b031681565b348015610a9557600080fd5b5061045f611ca1565b348015610aaa57600080fd5b50610472600d5481565b348015610ac057600080fd5b5061045f610acf366004613aca565b611cec565b348015610ae057600080fd5b50601754600160c01b900460ff1661042f565b348015610aff57600080fd5b50610472610b0e366004613aca565b611d37565b348015610b1f57600080fd5b5061045f610b2e366004613aca565b611d7b565b348015610b3f57600080fd5b50610472610b4e366004613ba5565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b348015610b8557600080fd5b5061045f611dc7565b348015610b9a57600080fd5b5061045f610ba9366004613ae7565b611eb7565b348015610bba57600080fd5b5061045f610bc9366004613aca565b611ee6565b348015610bda57600080fd5b5061045f610be9366004613aca565b611f31565b6000610bfb338484611fc9565b5060015b92915050565b6000546001600160a01b03163314610c385760405162461bcd60e51b8152600401610c2f90613c51565b60405180910390fd5b6001600160a01b03811660009081526004602052604090205460ff16610ca05760405162461bcd60e51b815260206004820152601a60248201527f4163636f756e74206973206e6f7420626c61636b6c69737465640000000000006044820152606401610c2f565b60005b600554811015610db757816001600160a01b031660058281548110610cca57610cca613c86565b6000918252602090912001546001600160a01b031603610da55760058054610cf490600190613cb2565b81548110610d0457610d04613c86565b600091825260209091200154600580546001600160a01b039092169183908110610d3057610d30613c86565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600490915260409020805460ff191690556005805480610d7f57610d7f613cc5565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610daf81613cdb565b915050610ca3565b5050565b6000546001600160a01b03163314610de55760405162461bcd60e51b8152600401610c2f90613c51565b6064811115610e065760405162461bcd60e51b8152600401610c2f90613cf4565b600b55565b6000610e188484846120ed565b610e6a8433610e6585604051806060016040528060288152602001613f0f602891396001600160a01b038a16600090815260036020908152604080832033845290915290205491906127f8565b611fc9565b5060015b9392505050565b6000546001600160a01b03163314610e9f5760405162461bcd60e51b8152600401610c2f90613c51565b610eaa838383612824565b505050565b6000546001600160a01b03163314610ed95760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b038216600081815260196020908152604091829020805460ff19168515159081179091558251938452908301527f4c0079b9bcd37cd5d29a13938effd97c881798cbc6bd52a3026a29d94b27d1bf91015b60405180910390a15050565b6000600954821115610fa45760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610c2f565b6000610fae61299e565b9050610e6e83826129c1565b6000546001600160a01b03163314610fe45760405162461bcd60e51b8152600401610c2f90613c51565b6013546001600160a01b03908116908216036110425760405162461bcd60e51b815260206004820152601c60248201527f57652063616e206e6f7420626c61636b6c69737420556e6973776170000000006044820152606401610c2f565b6001600160a01b03811660009081526004602052604090205460ff16156110ab5760405162461bcd60e51b815260206004820152601e60248201527f4163636f756e7420697320616c726561647920626c61636b6c697374656400006044820152606401610c2f565b6001600160a01b03166000818152600460205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319169091179055565b6000546001600160a01b0316331461113b5760405162461bcd60e51b8152600401610c2f90613c51565b610db782826129cd565b6000546001600160a01b0316331461116f5760405162461bcd60e51b8152600401610c2f90613c51565b60178054911515600160c01b0260ff60c01b19909216919091179055565b6000546001600160a01b031633146111b75760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03811660009081526007602052604090205460ff1661121f5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610c2f565b60005b600854811015610db757816001600160a01b03166008828154811061124957611249613c86565b6000918252602090912001546001600160a01b031603611307576008805461127390600190613cb2565b8154811061128357611283613c86565b600091825260209091200154600880546001600160a01b0390921691839081106112af576112af613c86565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600790925220805460ff191690556008805480610d7f57610d7f613cc5565b8061131181613cdb565b915050611222565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610bfb918590610e659086612af8565b6000546001600160a01b031633146113795760405162461bcd60e51b8152600401610c2f90613c51565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156113c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e49190613d24565b9050610eaa838383612824565b6000546001600160a01b0316331461141b5760405162461bcd60e51b8152600401610c2f90613c51565b61142533476129cd565b565b6000546001600160a01b031633146114515760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b60006b033b2e3c9fd0803ce80000008311156114d35760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610c2f565b816114f25760006114e384612b04565b50939550610bff945050505050565b60006114fd84612b04565b50929550610bff945050505050565b6000546001600160a01b031633146115365760405162461bcd60e51b8152600401610c2f90613c51565b601155565b6000546001600160a01b031633146115655760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03166000908152601560205260409020805460ff19166001179055565b6000546001600160a01b031633146115b35760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03811660009081526007602052604090205460ff161561161c5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610c2f565b6001600160a01b03811660009081526001602052604090205415611676576001600160a01b03811660009081526001602052604090205461165c90610f3d565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b6001600160a01b031660009081526006602052604090205460ff1690565b6000546001600160a01b031633146117245760405162461bcd60e51b8152600401610c2f90613c51565b60648111156117455760405162461bcd60e51b8152600401610c2f90613cf4565b600d55565b6014546000906001600160a01b039081169083160361176b57506001919050565b506001600160a01b031660009081526015602052604090205460ff1690565b6000546001600160a01b031633146117b45760405162461bcd60e51b8152600401610c2f90613c51565b60178054911515600160b81b0260ff60b81b19909216919091179055565b6000546001600160a01b031633146117fc5760405162461bcd60e51b8152600401610c2f90613c51565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526007602052604081205460ff161561185b57506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610bff90610f3d565b6000546001600160a01b031633146118a75760405162461bcd60e51b8152600401610c2f90613c51565b6114256000612b53565b6000546001600160a01b031633146118db5760405162461bcd60e51b8152600401610c2f90613c51565b60178054911515600160b01b0260ff60b01b19909216919091179055565b6000546001600160a01b031633146119235760405162461bcd60e51b8152600401610c2f90613c51565b60648111156119445760405162461bcd60e51b8152600401610c2f90613cf4565b600f55565b6000546001600160a01b031633146119735760405162461bcd60e51b8152600401610c2f90613c51565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146119bf5760405162461bcd60e51b8152600401610c2f90613c51565b60178054911515600160c81b0260ff60c81b19909216919091179055565b6000610bfb3384610e6585604051806060016040528060258152602001613f37602591393360009081526003602090815260408083206001600160a01b038d16845290915290205491906127f8565b6000610bfb3384846120ed565b6000546001600160a01b03163314611a635760405162461bcd60e51b8152600401610c2f90613c51565b84601660006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000869050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611acd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af19190613d3d565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b629190613d3d565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611baf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd39190613d3d565b601480546001600160a01b03199081166001600160a01b03938416179091556013805490911683831617905560008054909116815260066020526040808220805460ff199081166001908117909255308452919092208054909116909117905560648511801590611c45575060648411155b8015611c52575060648311155b8015611c5f575060648211155b611c7b5760405162461bcd60e51b8152600401610c2f90613cf4565b50600b849055600c93909355600d829055600e91909155600f8190556010556011555050565b6000546001600160a01b03163314611ccb5760405162461bcd60e51b8152600401610c2f90613c51565b601780544260125564ffffffffff60a81b191664010100010160a81b179055565b6000546001600160a01b03163314611d165760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03166000908152601560205260409020805460ff19169055565b600080611d5d600f54611d57600b54600d54612af890919063ffffffff16565b90612af8565b9050611d68836116dc565b611d725780610e6e565b60009392505050565b6000546001600160a01b03163314611da55760405162461bcd60e51b8152600401610c2f90613c51565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526019602052604090205460ff1680611def57506000546001600160a01b031633145b611e3b5760405162461bcd60e51b815260206004820152601f60248201527f4564466920546f6b656e3a206e6f7420617574686f72697a65642075736572006044820152606401610c2f565b6000611e463061181e565b90508015611eb4576000611e9d670de0b6b3a7640000611e976064611e97670de0b6b3a7640000611e91601154611e91601460009054906101000a90046001600160a01b031661181e565b90612ba3565b906129c1565b905080821115611eab578091505b610db782612baf565b50565b6000546001600160a01b03163314611ee15760405162461bcd60e51b8152600401610c2f90613c51565b601855565b6000546001600160a01b03163314611f105760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b03163314611f5b5760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b038116611fc05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c2f565b611eb481612b53565b6001600160a01b03831661202b5760405162461bcd60e51b8152602060048201526024808201527f42455032303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c2f565b6001600160a01b03821661208c5760405162461bcd60e51b815260206004820152602260248201527f42455032303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c2f565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166121515760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c2f565b6001600160a01b0382166121b35760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c2f565b600081116122155760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610c2f565b6001600160a01b03821660009081526004602052604090205460ff161561224e5760405162461bcd60e51b8152600401610c2f90613d5a565b6001600160a01b03831660009081526004602052604090205460ff16156122875760405162461bcd60e51b8152600401610c2f90613d5a565b3360009081526004602052604090205460ff16156122b75760405162461bcd60e51b8152600401610c2f90613d5a565b601754600160b01b900460ff16806122dc57506000546001600160a01b038481169116145b61233d5760405162461bcd60e51b815260206004820152602c60248201527f7472616e7366657272696e6720746f6b656e73206973206e6f7420637572726560448201526b1b9d1b1e48185b1b1bddd95960a21b6064820152608401610c2f565b60145460019060009081906001600160a01b038781169116148061237957506001600160a01b03861660009081526015602052604090205460ff165b801561239357506013546001600160a01b03868116911614155b80156123a85750601754600160a81b900460ff165b1561249c57600191506123ba856116dc565b61248657601754600160a81b900460ff166124175760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642e00000000000000006044820152606401610c2f565b6012544203612486576001600160a01b0385166000818152600460205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b03191690911790555b601754600160c01b900460ff1661249c57600092505b601754600160a81b900460ff1680156124c357506014546001600160a01b03878116911614155b80156124e857506001600160a01b03861660009081526015602052604090205460ff16155b801561250257506013546001600160a01b03878116911614155b15612796576014546001600160a01b038681169116148061253b57506001600160a01b03851660009081526015602052604090205460ff165b8061255357506013546001600160a01b038681169116145b156127965750601754600190600160c81b900460ff1661257257600092505b600080601460009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156125c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ec9190613d9d565b506001600160701b031691506001600160701b03169150306001600160a01b0316601460009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612660573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126849190613d3d565b6001600160a01b03161461269957808261269c565b81815b601354604051630153543560e21b8152600481018a905260248101849052604481018390529294509092506000916001600160a01b039091169063054d50d490606401602060405180830381865afa1580156126fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127209190613d24565b90506018548111156127925760405162461bcd60e51b815260206004820152603560248201527f74686520616d6f756e74206f66207468652073616c65206973206d6f7265207460448201527468616e2074686520617661696c61626c65206f6e6560581b6064820152608401610c2f565b5050505b801580156127a2575081155b80156127b85750601754600160b81b900460ff16155b156127c257600092505b6127cb866116dc565b806127da57506127da856116dc565b156127e457600092505b6127f086868686612c68565b505050505050565b6000818484111561281c5760405162461bcd60e51b8152600401610c2f9190613a56565b505050900390565b6001600160a01b0382166128765760405162461bcd60e51b815260206004820152601960248201527857697468647261773a2061646472657373206973207a65726f60381b6044820152606401610c2f565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa1580156128ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128de9190613d24565b8111156129395760405162461bcd60e51b815260206004820152602360248201527f57697468647261773a206e6f7420656e6f7567687420746f6b656e2062616c616044820152626e636560e81b6064820152608401610c2f565b61294d6001600160a01b0384168383612d99565b604080516001600160a01b038086168252841660208201529081018290527f037238854fe57fbf51f09946f854fc3916fe83938d6521f09bd05463839f1304906060015b60405180910390a1505050565b60008060006129ab612deb565b90925090506129ba82826129c1565b9250505090565b6000610e6e8284613ded565b6001600160a01b038216612a1f5760405162461bcd60e51b815260206004820152601960248201527857697468647261773a2061646472657373206973207a65726f60381b6044820152606401610c2f565b47811115612a795760405162461bcd60e51b815260206004820152602160248201527f57697468647261773a206e6f7420656e6f75676874204554482062616c616e636044820152606560f81b6064820152608401610c2f565b612ab982826040518060400160405280601881526020017f57697468647261773a2043616e27742073656e64204554480000000000000000815250612f93565b604080516001600160a01b0384168152602081018390527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649101610f31565b6000610e6e8284613e0f565b6000806000806000806000806000612b1b8a613010565b9250925092506000806000612b398d8686612b3461299e565b613052565b919f909e50909c50959a5093985091965092945050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610e6e8284613e22565b476000612bba6130a2565b90506000612bd782611e97600f5487612ba390919063ffffffff16565b9050612be38185613cb2565b9350612bee846130c0565b476000612bfb8286613286565b9050808015612c505760165460408051808201909152601781527f43616e742073656e642045544820746f2077616c6c65740000000000000000006020820152612c50916001600160a01b0316908390612f93565b8315612c5f57612c5f84613292565b50505050505050565b80612c7557612c756132ed565b6001600160a01b03841660009081526007602052604090205460ff168015612cb657506001600160a01b03831660009081526007602052604090205460ff16155b15612ccb57612cc6848484613332565b612d77565b6001600160a01b03841660009081526007602052604090205460ff16158015612d0c57506001600160a01b03831660009081526007602052604090205460ff165b15612d1c57612cc6848484613458565b6001600160a01b03841660009081526007602052604090205460ff168015612d5c57506001600160a01b03831660009081526007602052604090205460ff165b15612d6c57612cc6848484613501565b612d77848484613574565b80612d9357612d93600c54600b55600e54600d55601054600f55565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610eaa9084906135b8565b60095460009081906b033b2e3c9fd0803ce8000000825b600854811015612f5057826001600060088481548110612e2457612e24613c86565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612e8f5750816002600060088481548110612e6857612e68613c86565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612eae575050600954936b033b2e3c9fd0803ce80000009350915050565b612ef46001600060088481548110612ec857612ec8613c86565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490613286565b9250612f3c6002600060088481548110612f1057612f10613c86565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390613286565b915080612f4881613cdb565b915050612e02565b50600954612f6a906b033b2e3c9fd0803ce80000006129c1565b821015612f8a575050600954926b033b2e3c9fd0803ce800000092509050565b90939092509050565b6000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114612fe0576040519150601f19603f3d011682016040523d82523d6000602084013e612fe5565b606091505b505090508082906130095760405162461bcd60e51b8152600401610c2f9190613a56565b5050505050565b60008060008061301f8561368a565b9050600061302c866136be565b905060006130448261303e8986613286565b90613286565b979296509094509092505050565b60008080806130618886612ba3565b9050600061306f8887612ba3565b9050600061307d8888612ba3565b9050600061308f8261303e8686613286565b939b939a50919850919650505050505050565b60006130bb600f54600d54612af890919063ffffffff16565b905090565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106130f5576130f5613c86565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561314e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131729190613d3d565b8160018151811061318557613185613c86565b6001600160a01b0392831660209182029290920101526013546131ab9130911684611fc9565b6013546040516000916001600160a01b0316906131d49085908490869030904290602401613e7d565b60408051601f198184030181529181526020820180516001600160e01b031663791ac94760e01b179052516132099190613ebc565b6000604051808303816000865af19150503d8060008114613246576040519150601f19603f3d011682016040523d82523d6000602084013e61324b565b606091505b505090508015610eaa577f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78383604051612991929190613ed8565b6000610e6e8284613cb2565b600061329f8260026129c1565b905060006132ad8383613286565b90506132b83061181e565b8111156132cb576132c83061181e565b90505b476132d5836130c0565b60006132e14783613286565b905061300983826136ef565b600b541580156132fd5750600d54155b80156133095750600f54155b1561331057565b600b8054600c55600d8054600e55600f80546010556000928390559082905555565b60008060008060008061334487612b04565b6001600160a01b038f16600090815260026020526040902054959b509399509197509550935091506133769088613286565b6001600160a01b038a166000908152600260209081526040808320939093556001905220546133a59087613286565b6001600160a01b03808b1660009081526001602052604080822093909355908a16815220546133d49086612af8565b6001600160a01b0389166000908152600160205260409020556133f681613805565b613400848361388d565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161344591815260200190565b60405180910390a3505050505050505050565b60008060008060008061346a87612b04565b6001600160a01b038f16600090815260016020526040902054959b5093995091975095509350915061349c9087613286565b6001600160a01b03808b16600090815260016020908152604080832094909455918b168152600290915220546134d29084612af8565b6001600160a01b0389166000908152600260209081526040808320939093556001905220546133d49086612af8565b60008060008060008061351387612b04565b6001600160a01b038f16600090815260026020526040902054959b509399509197509550935091506135459088613286565b6001600160a01b038a1660009081526002602090815260408083209390935560019052205461349c9087613286565b60008060008060008061358687612b04565b6001600160a01b038f16600090815260016020526040902054959b509399509197509550935091506133a59087613286565b600061360d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138b19092919063ffffffff16565b805190915015610eaa578080602001905181019061362b9190613ef1565b610eaa5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610c2f565b6000610bff670de0b6b3a7640000611e976064611e97670de0b6b3a7640000611e91600b5489612ba390919063ffffffff16565b6000610bff670de0b6b3a7640000611e976064611e97670de0b6b3a7640000611e916136e86130a2565b8990612ba3565b6013546137079030906001600160a01b031684611fc9565b60135460175460405130602482015260448101859052600060648201819052608482018190526001600160a01b0392831660a48301524260c4830152929190911690839060e40160408051601f198184030181529181526020820180516001600160e01b031663f305d71960e01b179052516137839190613ebc565b60006040518083038185875af1925050503d80600081146137c0576040519150601f19603f3d011682016040523d82523d6000602084013e6137c5565b606091505b505090508015610eaa5760408051838152602081018590527f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f83814869101612991565b600061380f61299e565b9050600061381d8383612ba3565b3060009081526001602052604090205490915061383a9082612af8565b3060009081526001602090815260408083209390935560079052205460ff1615610eaa57306000908152600260205260409020546138789084612af8565b30600090815260026020526040902055505050565b60095461389a9083613286565b600955600a546138aa9082612af8565b600a555050565b60606138c084846000856138c8565b949350505050565b6060824710156139295760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610c2f565b6001600160a01b0385163b6139805760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c2f565b600080866001600160a01b0316858760405161399c9190613ebc565b60006040518083038185875af1925050503d80600081146139d9576040519150601f19603f3d011682016040523d82523d6000602084013e6139de565b606091505b50915091506139ee8282866139f9565b979650505050505050565b60608315613a08575081610e6e565b825115613a185782518084602001fd5b8160405162461bcd60e51b8152600401610c2f9190613a56565b60005b83811015613a4d578181015183820152602001613a35565b50506000910152565b6020815260008251806020840152613a75816040850160208701613a32565b601f01601f19169190910160400192915050565b6001600160a01b0381168114611eb457600080fd5b60008060408385031215613ab157600080fd5b8235613abc81613a89565b946020939093013593505050565b600060208284031215613adc57600080fd5b8135610e6e81613a89565b600060208284031215613af957600080fd5b5035919050565b600080600060608486031215613b1557600080fd5b8335613b2081613a89565b92506020840135613b3081613a89565b929592945050506040919091013590565b8015158114611eb457600080fd5b60008060408385031215613b6257600080fd5b8235613b6d81613a89565b91506020830135613b7d81613b41565b809150509250929050565b600060208284031215613b9a57600080fd5b8135610e6e81613b41565b60008060408385031215613bb857600080fd5b8235613bc381613a89565b91506020830135613b7d81613a89565b60008060408385031215613be657600080fd5b823591506020830135613b7d81613b41565b60008060008060008060c08789031215613c1157600080fd5b8635613c1c81613a89565b95506020870135613c2c81613a89565b95989597505050506040840135936060810135936080820135935060a0909101359150565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610bff57610bff613c9c565b634e487b7160e01b600052603160045260246000fd5b600060018201613ced57613ced613c9c565b5060010190565b6020808252601690820152756665652063616e6e6f7420657863656564203130302560501b604082015260600190565b600060208284031215613d3657600080fd5b5051919050565b600060208284031215613d4f57600080fd5b8151610e6e81613a89565b6020808252600d908201526c53746f7020736e6970696e672160981b604082015260600190565b80516001600160701b0381168114613d9857600080fd5b919050565b600080600060608486031215613db257600080fd5b613dbb84613d81565b9250613dc960208501613d81565b9150604084015163ffffffff81168114613de257600080fd5b809150509250925092565b600082613e0a57634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610bff57610bff613c9c565b8082028115828204841417610bff57610bff613c9c565b600081518084526020808501945080840160005b83811015613e725781516001600160a01b031687529582019590820190600101613e4d565b509495945050505050565b85815260ff8516602082015260a060408201526000613e9f60a0830186613e39565b6001600160a01b0394909416606083015250608001529392505050565b60008251613ece818460208701613a32565b9190910192915050565b8281526040602082015260006138c06040830184613e39565b600060208284031215613f0357600080fd5b8151610e6e81613b4156fe42455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636542455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212205fd9e0358af49c6dea1e05c1726e9165f994b289b9f8bcde57313ad07e18840964736f6c63430008120033
Deployed Bytecode
0x6080604052600436106103c75760003560e01c806366d602ae116101f2578063a457c2d71161010d578063d9fff755116100a0578063e4fc6b6d1161006f578063e4fc6b6d14610b79578063e99c9d0914610b8e578063ea2f0b3714610bae578063f2fde38b14610bce57600080fd5b8063d9fff75514610ad4578063dc6571eb14610af3578063dce0333614610b13578063dd62ed3e14610b3357600080fd5b8063c816841b116100dc578063c816841b14610a69578063c9567bf914610a89578063cc32d17614610a9e578063d74611bc14610ab457600080fd5b8063a457c2d7146109d9578063a9059cbb146109f9578063b918161114610a19578063c1051d8f14610a4957600080fd5b80638da5cb5b1161018557806396d386e41161015457806396d386e41461096e57806396eced441461098e578063978bbdb9146109ad57806398118cb4146109c357600080fd5b80638da5cb5b146109105780638ee88c531461092e5780638ef588fc1461094e57806395d89b41146103d357600080fd5b806375ae267d116101c157806375ae267d1461088b578063790ca413146108ab57806383ad7994146108c157806388f82020146108d757600080fd5b806366d602ae1461082057806370a0823114610836578063715018a614610856578063735de9f71461086b57600080fd5b806339509351116102e25780634d8d9efa116102755780635af3832a116102445780635af3832a14610787578063610d5b19146107a757806361ec6830146107e05780636605bfda1461080057600080fd5b80634d8d9efa1461070857806352390c02146107275780635342acb41461074757806356e1221c1461076757600080fd5b80634549b039116102b15780634549b0391461068857806345596e2e146106a85780634626402b146106c8578063489931f0146106e857600080fd5b806339509351146106135780633aeac4e1146106335780633ccfd60b14610653578063437823ec1461066857600080fd5b80632b51c7c01161035a57806333251a0b1161032957806333251a0b14610593578063340c8cc0146105b35780633491218c146105d35780633685d419146105f357600080fd5b80632b51c7c0146105175780632d1fb389146105375780632d83811914610557578063313ce5671461057757600080fd5b806318160ddd1161039657806318160ddd146104805780631df59e2f1461049f5780631f7ede2b146104d757806323b872dd146104f757600080fd5b806306fdde03146103d3578063095ea7b31461040f5780630b2a808c1461043f57806313114a9d1461046157600080fd5b366103ce57005b600080fd5b3480156103df57600080fd5b5060408051808201825260048152634564466960e01b602082015290516104069190613a56565b60405180910390f35b34801561041b57600080fd5b5061042f61042a366004613a9e565b610bee565b6040519015158152602001610406565b34801561044b57600080fd5b5061045f61045a366004613aca565b610c05565b005b34801561046d57600080fd5b50600a545b604051908152602001610406565b34801561048c57600080fd5b506b033b2e3c9fd0803ce8000000610472565b3480156104ab57600080fd5b506017546104bf906001600160a01b031681565b6040516001600160a01b039091168152602001610406565b3480156104e357600080fd5b5061045f6104f2366004613ae7565b610dbb565b34801561050357600080fd5b5061042f610512366004613b00565b610e0b565b34801561052357600080fd5b5061045f610532366004613b00565b610e75565b34801561054357600080fd5b5061045f610552366004613b4f565b610eaf565b34801561056357600080fd5b50610472610572366004613ae7565b610f3d565b34801561058357600080fd5b5060405160128152602001610406565b34801561059f57600080fd5b5061045f6105ae366004613aca565b610fba565b3480156105bf57600080fd5b5061045f6105ce366004613a9e565b611111565b3480156105df57600080fd5b5061045f6105ee366004613b88565b611145565b3480156105ff57600080fd5b5061045f61060e366004613aca565b61118d565b34801561061f57600080fd5b5061042f61062e366004613a9e565b611319565b34801561063f57600080fd5b5061045f61064e366004613ba5565b61134f565b34801561065f57600080fd5b5061045f6113f1565b34801561067457600080fd5b5061045f610683366004613aca565b611427565b34801561069457600080fd5b506104726106a3366004613bd3565b611475565b3480156106b457600080fd5b5061045f6106c3366004613ae7565b61150c565b3480156106d457600080fd5b506016546104bf906001600160a01b031681565b3480156106f457600080fd5b5061045f610703366004613aca565b61153b565b34801561071457600080fd5b50601754600160b81b900460ff1661042f565b34801561073357600080fd5b5061045f610742366004613aca565b611589565b34801561075357600080fd5b5061042f610762366004613aca565b6116dc565b34801561077357600080fd5b5061045f610782366004613ae7565b6116fa565b34801561079357600080fd5b5061042f6107a2366004613aca565b61174a565b3480156107b357600080fd5b5061042f6107c2366004613aca565b6001600160a01b031660009081526004602052604090205460ff1690565b3480156107ec57600080fd5b5061045f6107fb366004613b88565b61178a565b34801561080c57600080fd5b5061045f61081b366004613aca565b6117d2565b34801561082c57600080fd5b5061047260185481565b34801561084257600080fd5b50610472610851366004613aca565b61181e565b34801561086257600080fd5b5061045f61187d565b34801561087757600080fd5b506013546104bf906001600160a01b031681565b34801561089757600080fd5b5061045f6108a6366004613b88565b6118b1565b3480156108b757600080fd5b5061047260125481565b3480156108cd57600080fd5b50610472600b5481565b3480156108e357600080fd5b5061042f6108f2366004613aca565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561091c57600080fd5b506000546001600160a01b03166104bf565b34801561093a57600080fd5b5061045f610949366004613ae7565b6118f9565b34801561095a57600080fd5b5061045f610969366004613aca565b611949565b34801561097a57600080fd5b5061045f610989366004613b88565b611995565b34801561099a57600080fd5b50601754600160c81b900460ff1661042f565b3480156109b957600080fd5b5061047260115481565b3480156109cf57600080fd5b50610472600f5481565b3480156109e557600080fd5b5061042f6109f4366004613a9e565b6119dd565b348015610a0557600080fd5b5061042f610a14366004613a9e565b611a2c565b348015610a2557600080fd5b5061042f610a34366004613aca565b60196020526000908152604090205460ff1681565b348015610a5557600080fd5b5061045f610a64366004613bf8565b611a39565b348015610a7557600080fd5b506014546104bf906001600160a01b031681565b348015610a9557600080fd5b5061045f611ca1565b348015610aaa57600080fd5b50610472600d5481565b348015610ac057600080fd5b5061045f610acf366004613aca565b611cec565b348015610ae057600080fd5b50601754600160c01b900460ff1661042f565b348015610aff57600080fd5b50610472610b0e366004613aca565b611d37565b348015610b1f57600080fd5b5061045f610b2e366004613aca565b611d7b565b348015610b3f57600080fd5b50610472610b4e366004613ba5565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b348015610b8557600080fd5b5061045f611dc7565b348015610b9a57600080fd5b5061045f610ba9366004613ae7565b611eb7565b348015610bba57600080fd5b5061045f610bc9366004613aca565b611ee6565b348015610bda57600080fd5b5061045f610be9366004613aca565b611f31565b6000610bfb338484611fc9565b5060015b92915050565b6000546001600160a01b03163314610c385760405162461bcd60e51b8152600401610c2f90613c51565b60405180910390fd5b6001600160a01b03811660009081526004602052604090205460ff16610ca05760405162461bcd60e51b815260206004820152601a60248201527f4163636f756e74206973206e6f7420626c61636b6c69737465640000000000006044820152606401610c2f565b60005b600554811015610db757816001600160a01b031660058281548110610cca57610cca613c86565b6000918252602090912001546001600160a01b031603610da55760058054610cf490600190613cb2565b81548110610d0457610d04613c86565b600091825260209091200154600580546001600160a01b039092169183908110610d3057610d30613c86565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600490915260409020805460ff191690556005805480610d7f57610d7f613cc5565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610daf81613cdb565b915050610ca3565b5050565b6000546001600160a01b03163314610de55760405162461bcd60e51b8152600401610c2f90613c51565b6064811115610e065760405162461bcd60e51b8152600401610c2f90613cf4565b600b55565b6000610e188484846120ed565b610e6a8433610e6585604051806060016040528060288152602001613f0f602891396001600160a01b038a16600090815260036020908152604080832033845290915290205491906127f8565b611fc9565b5060015b9392505050565b6000546001600160a01b03163314610e9f5760405162461bcd60e51b8152600401610c2f90613c51565b610eaa838383612824565b505050565b6000546001600160a01b03163314610ed95760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b038216600081815260196020908152604091829020805460ff19168515159081179091558251938452908301527f4c0079b9bcd37cd5d29a13938effd97c881798cbc6bd52a3026a29d94b27d1bf91015b60405180910390a15050565b6000600954821115610fa45760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610c2f565b6000610fae61299e565b9050610e6e83826129c1565b6000546001600160a01b03163314610fe45760405162461bcd60e51b8152600401610c2f90613c51565b6013546001600160a01b03908116908216036110425760405162461bcd60e51b815260206004820152601c60248201527f57652063616e206e6f7420626c61636b6c69737420556e6973776170000000006044820152606401610c2f565b6001600160a01b03811660009081526004602052604090205460ff16156110ab5760405162461bcd60e51b815260206004820152601e60248201527f4163636f756e7420697320616c726561647920626c61636b6c697374656400006044820152606401610c2f565b6001600160a01b03166000818152600460205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319169091179055565b6000546001600160a01b0316331461113b5760405162461bcd60e51b8152600401610c2f90613c51565b610db782826129cd565b6000546001600160a01b0316331461116f5760405162461bcd60e51b8152600401610c2f90613c51565b60178054911515600160c01b0260ff60c01b19909216919091179055565b6000546001600160a01b031633146111b75760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03811660009081526007602052604090205460ff1661121f5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610c2f565b60005b600854811015610db757816001600160a01b03166008828154811061124957611249613c86565b6000918252602090912001546001600160a01b031603611307576008805461127390600190613cb2565b8154811061128357611283613c86565b600091825260209091200154600880546001600160a01b0390921691839081106112af576112af613c86565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600790925220805460ff191690556008805480610d7f57610d7f613cc5565b8061131181613cdb565b915050611222565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610bfb918590610e659086612af8565b6000546001600160a01b031633146113795760405162461bcd60e51b8152600401610c2f90613c51565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156113c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e49190613d24565b9050610eaa838383612824565b6000546001600160a01b0316331461141b5760405162461bcd60e51b8152600401610c2f90613c51565b61142533476129cd565b565b6000546001600160a01b031633146114515760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b60006b033b2e3c9fd0803ce80000008311156114d35760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610c2f565b816114f25760006114e384612b04565b50939550610bff945050505050565b60006114fd84612b04565b50929550610bff945050505050565b6000546001600160a01b031633146115365760405162461bcd60e51b8152600401610c2f90613c51565b601155565b6000546001600160a01b031633146115655760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03166000908152601560205260409020805460ff19166001179055565b6000546001600160a01b031633146115b35760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03811660009081526007602052604090205460ff161561161c5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610c2f565b6001600160a01b03811660009081526001602052604090205415611676576001600160a01b03811660009081526001602052604090205461165c90610f3d565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b6001600160a01b031660009081526006602052604090205460ff1690565b6000546001600160a01b031633146117245760405162461bcd60e51b8152600401610c2f90613c51565b60648111156117455760405162461bcd60e51b8152600401610c2f90613cf4565b600d55565b6014546000906001600160a01b039081169083160361176b57506001919050565b506001600160a01b031660009081526015602052604090205460ff1690565b6000546001600160a01b031633146117b45760405162461bcd60e51b8152600401610c2f90613c51565b60178054911515600160b81b0260ff60b81b19909216919091179055565b6000546001600160a01b031633146117fc5760405162461bcd60e51b8152600401610c2f90613c51565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526007602052604081205460ff161561185b57506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610bff90610f3d565b6000546001600160a01b031633146118a75760405162461bcd60e51b8152600401610c2f90613c51565b6114256000612b53565b6000546001600160a01b031633146118db5760405162461bcd60e51b8152600401610c2f90613c51565b60178054911515600160b01b0260ff60b01b19909216919091179055565b6000546001600160a01b031633146119235760405162461bcd60e51b8152600401610c2f90613c51565b60648111156119445760405162461bcd60e51b8152600401610c2f90613cf4565b600f55565b6000546001600160a01b031633146119735760405162461bcd60e51b8152600401610c2f90613c51565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146119bf5760405162461bcd60e51b8152600401610c2f90613c51565b60178054911515600160c81b0260ff60c81b19909216919091179055565b6000610bfb3384610e6585604051806060016040528060258152602001613f37602591393360009081526003602090815260408083206001600160a01b038d16845290915290205491906127f8565b6000610bfb3384846120ed565b6000546001600160a01b03163314611a635760405162461bcd60e51b8152600401610c2f90613c51565b84601660006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000869050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611acd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af19190613d3d565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b629190613d3d565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611baf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd39190613d3d565b601480546001600160a01b03199081166001600160a01b03938416179091556013805490911683831617905560008054909116815260066020526040808220805460ff199081166001908117909255308452919092208054909116909117905560648511801590611c45575060648411155b8015611c52575060648311155b8015611c5f575060648211155b611c7b5760405162461bcd60e51b8152600401610c2f90613cf4565b50600b849055600c93909355600d829055600e91909155600f8190556010556011555050565b6000546001600160a01b03163314611ccb5760405162461bcd60e51b8152600401610c2f90613c51565b601780544260125564ffffffffff60a81b191664010100010160a81b179055565b6000546001600160a01b03163314611d165760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03166000908152601560205260409020805460ff19169055565b600080611d5d600f54611d57600b54600d54612af890919063ffffffff16565b90612af8565b9050611d68836116dc565b611d725780610e6e565b60009392505050565b6000546001600160a01b03163314611da55760405162461bcd60e51b8152600401610c2f90613c51565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526019602052604090205460ff1680611def57506000546001600160a01b031633145b611e3b5760405162461bcd60e51b815260206004820152601f60248201527f4564466920546f6b656e3a206e6f7420617574686f72697a65642075736572006044820152606401610c2f565b6000611e463061181e565b90508015611eb4576000611e9d670de0b6b3a7640000611e976064611e97670de0b6b3a7640000611e91601154611e91601460009054906101000a90046001600160a01b031661181e565b90612ba3565b906129c1565b905080821115611eab578091505b610db782612baf565b50565b6000546001600160a01b03163314611ee15760405162461bcd60e51b8152600401610c2f90613c51565b601855565b6000546001600160a01b03163314611f105760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b03163314611f5b5760405162461bcd60e51b8152600401610c2f90613c51565b6001600160a01b038116611fc05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c2f565b611eb481612b53565b6001600160a01b03831661202b5760405162461bcd60e51b8152602060048201526024808201527f42455032303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c2f565b6001600160a01b03821661208c5760405162461bcd60e51b815260206004820152602260248201527f42455032303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c2f565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166121515760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c2f565b6001600160a01b0382166121b35760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c2f565b600081116122155760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610c2f565b6001600160a01b03821660009081526004602052604090205460ff161561224e5760405162461bcd60e51b8152600401610c2f90613d5a565b6001600160a01b03831660009081526004602052604090205460ff16156122875760405162461bcd60e51b8152600401610c2f90613d5a565b3360009081526004602052604090205460ff16156122b75760405162461bcd60e51b8152600401610c2f90613d5a565b601754600160b01b900460ff16806122dc57506000546001600160a01b038481169116145b61233d5760405162461bcd60e51b815260206004820152602c60248201527f7472616e7366657272696e6720746f6b656e73206973206e6f7420637572726560448201526b1b9d1b1e48185b1b1bddd95960a21b6064820152608401610c2f565b60145460019060009081906001600160a01b038781169116148061237957506001600160a01b03861660009081526015602052604090205460ff165b801561239357506013546001600160a01b03868116911614155b80156123a85750601754600160a81b900460ff165b1561249c57600191506123ba856116dc565b61248657601754600160a81b900460ff166124175760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642e00000000000000006044820152606401610c2f565b6012544203612486576001600160a01b0385166000818152600460205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b03191690911790555b601754600160c01b900460ff1661249c57600092505b601754600160a81b900460ff1680156124c357506014546001600160a01b03878116911614155b80156124e857506001600160a01b03861660009081526015602052604090205460ff16155b801561250257506013546001600160a01b03878116911614155b15612796576014546001600160a01b038681169116148061253b57506001600160a01b03851660009081526015602052604090205460ff165b8061255357506013546001600160a01b038681169116145b156127965750601754600190600160c81b900460ff1661257257600092505b600080601460009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156125c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ec9190613d9d565b506001600160701b031691506001600160701b03169150306001600160a01b0316601460009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612660573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126849190613d3d565b6001600160a01b03161461269957808261269c565b81815b601354604051630153543560e21b8152600481018a905260248101849052604481018390529294509092506000916001600160a01b039091169063054d50d490606401602060405180830381865afa1580156126fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127209190613d24565b90506018548111156127925760405162461bcd60e51b815260206004820152603560248201527f74686520616d6f756e74206f66207468652073616c65206973206d6f7265207460448201527468616e2074686520617661696c61626c65206f6e6560581b6064820152608401610c2f565b5050505b801580156127a2575081155b80156127b85750601754600160b81b900460ff16155b156127c257600092505b6127cb866116dc565b806127da57506127da856116dc565b156127e457600092505b6127f086868686612c68565b505050505050565b6000818484111561281c5760405162461bcd60e51b8152600401610c2f9190613a56565b505050900390565b6001600160a01b0382166128765760405162461bcd60e51b815260206004820152601960248201527857697468647261773a2061646472657373206973207a65726f60381b6044820152606401610c2f565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa1580156128ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128de9190613d24565b8111156129395760405162461bcd60e51b815260206004820152602360248201527f57697468647261773a206e6f7420656e6f7567687420746f6b656e2062616c616044820152626e636560e81b6064820152608401610c2f565b61294d6001600160a01b0384168383612d99565b604080516001600160a01b038086168252841660208201529081018290527f037238854fe57fbf51f09946f854fc3916fe83938d6521f09bd05463839f1304906060015b60405180910390a1505050565b60008060006129ab612deb565b90925090506129ba82826129c1565b9250505090565b6000610e6e8284613ded565b6001600160a01b038216612a1f5760405162461bcd60e51b815260206004820152601960248201527857697468647261773a2061646472657373206973207a65726f60381b6044820152606401610c2f565b47811115612a795760405162461bcd60e51b815260206004820152602160248201527f57697468647261773a206e6f7420656e6f75676874204554482062616c616e636044820152606560f81b6064820152608401610c2f565b612ab982826040518060400160405280601881526020017f57697468647261773a2043616e27742073656e64204554480000000000000000815250612f93565b604080516001600160a01b0384168152602081018390527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649101610f31565b6000610e6e8284613e0f565b6000806000806000806000806000612b1b8a613010565b9250925092506000806000612b398d8686612b3461299e565b613052565b919f909e50909c50959a5093985091965092945050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610e6e8284613e22565b476000612bba6130a2565b90506000612bd782611e97600f5487612ba390919063ffffffff16565b9050612be38185613cb2565b9350612bee846130c0565b476000612bfb8286613286565b9050808015612c505760165460408051808201909152601781527f43616e742073656e642045544820746f2077616c6c65740000000000000000006020820152612c50916001600160a01b0316908390612f93565b8315612c5f57612c5f84613292565b50505050505050565b80612c7557612c756132ed565b6001600160a01b03841660009081526007602052604090205460ff168015612cb657506001600160a01b03831660009081526007602052604090205460ff16155b15612ccb57612cc6848484613332565b612d77565b6001600160a01b03841660009081526007602052604090205460ff16158015612d0c57506001600160a01b03831660009081526007602052604090205460ff165b15612d1c57612cc6848484613458565b6001600160a01b03841660009081526007602052604090205460ff168015612d5c57506001600160a01b03831660009081526007602052604090205460ff165b15612d6c57612cc6848484613501565b612d77848484613574565b80612d9357612d93600c54600b55600e54600d55601054600f55565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610eaa9084906135b8565b60095460009081906b033b2e3c9fd0803ce8000000825b600854811015612f5057826001600060088481548110612e2457612e24613c86565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612e8f5750816002600060088481548110612e6857612e68613c86565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612eae575050600954936b033b2e3c9fd0803ce80000009350915050565b612ef46001600060088481548110612ec857612ec8613c86565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490613286565b9250612f3c6002600060088481548110612f1057612f10613c86565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390613286565b915080612f4881613cdb565b915050612e02565b50600954612f6a906b033b2e3c9fd0803ce80000006129c1565b821015612f8a575050600954926b033b2e3c9fd0803ce800000092509050565b90939092509050565b6000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114612fe0576040519150601f19603f3d011682016040523d82523d6000602084013e612fe5565b606091505b505090508082906130095760405162461bcd60e51b8152600401610c2f9190613a56565b5050505050565b60008060008061301f8561368a565b9050600061302c866136be565b905060006130448261303e8986613286565b90613286565b979296509094509092505050565b60008080806130618886612ba3565b9050600061306f8887612ba3565b9050600061307d8888612ba3565b9050600061308f8261303e8686613286565b939b939a50919850919650505050505050565b60006130bb600f54600d54612af890919063ffffffff16565b905090565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106130f5576130f5613c86565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561314e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131729190613d3d565b8160018151811061318557613185613c86565b6001600160a01b0392831660209182029290920101526013546131ab9130911684611fc9565b6013546040516000916001600160a01b0316906131d49085908490869030904290602401613e7d565b60408051601f198184030181529181526020820180516001600160e01b031663791ac94760e01b179052516132099190613ebc565b6000604051808303816000865af19150503d8060008114613246576040519150601f19603f3d011682016040523d82523d6000602084013e61324b565b606091505b505090508015610eaa577f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78383604051612991929190613ed8565b6000610e6e8284613cb2565b600061329f8260026129c1565b905060006132ad8383613286565b90506132b83061181e565b8111156132cb576132c83061181e565b90505b476132d5836130c0565b60006132e14783613286565b905061300983826136ef565b600b541580156132fd5750600d54155b80156133095750600f54155b1561331057565b600b8054600c55600d8054600e55600f80546010556000928390559082905555565b60008060008060008061334487612b04565b6001600160a01b038f16600090815260026020526040902054959b509399509197509550935091506133769088613286565b6001600160a01b038a166000908152600260209081526040808320939093556001905220546133a59087613286565b6001600160a01b03808b1660009081526001602052604080822093909355908a16815220546133d49086612af8565b6001600160a01b0389166000908152600160205260409020556133f681613805565b613400848361388d565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161344591815260200190565b60405180910390a3505050505050505050565b60008060008060008061346a87612b04565b6001600160a01b038f16600090815260016020526040902054959b5093995091975095509350915061349c9087613286565b6001600160a01b03808b16600090815260016020908152604080832094909455918b168152600290915220546134d29084612af8565b6001600160a01b0389166000908152600260209081526040808320939093556001905220546133d49086612af8565b60008060008060008061351387612b04565b6001600160a01b038f16600090815260026020526040902054959b509399509197509550935091506135459088613286565b6001600160a01b038a1660009081526002602090815260408083209390935560019052205461349c9087613286565b60008060008060008061358687612b04565b6001600160a01b038f16600090815260016020526040902054959b509399509197509550935091506133a59087613286565b600061360d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138b19092919063ffffffff16565b805190915015610eaa578080602001905181019061362b9190613ef1565b610eaa5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610c2f565b6000610bff670de0b6b3a7640000611e976064611e97670de0b6b3a7640000611e91600b5489612ba390919063ffffffff16565b6000610bff670de0b6b3a7640000611e976064611e97670de0b6b3a7640000611e916136e86130a2565b8990612ba3565b6013546137079030906001600160a01b031684611fc9565b60135460175460405130602482015260448101859052600060648201819052608482018190526001600160a01b0392831660a48301524260c4830152929190911690839060e40160408051601f198184030181529181526020820180516001600160e01b031663f305d71960e01b179052516137839190613ebc565b60006040518083038185875af1925050503d80600081146137c0576040519150601f19603f3d011682016040523d82523d6000602084013e6137c5565b606091505b505090508015610eaa5760408051838152602081018590527f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f83814869101612991565b600061380f61299e565b9050600061381d8383612ba3565b3060009081526001602052604090205490915061383a9082612af8565b3060009081526001602090815260408083209390935560079052205460ff1615610eaa57306000908152600260205260409020546138789084612af8565b30600090815260026020526040902055505050565b60095461389a9083613286565b600955600a546138aa9082612af8565b600a555050565b60606138c084846000856138c8565b949350505050565b6060824710156139295760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610c2f565b6001600160a01b0385163b6139805760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c2f565b600080866001600160a01b0316858760405161399c9190613ebc565b60006040518083038185875af1925050503d80600081146139d9576040519150601f19603f3d011682016040523d82523d6000602084013e6139de565b606091505b50915091506139ee8282866139f9565b979650505050505050565b60608315613a08575081610e6e565b825115613a185782518084602001fd5b8160405162461bcd60e51b8152600401610c2f9190613a56565b60005b83811015613a4d578181015183820152602001613a35565b50506000910152565b6020815260008251806020840152613a75816040850160208701613a32565b601f01601f19169190910160400192915050565b6001600160a01b0381168114611eb457600080fd5b60008060408385031215613ab157600080fd5b8235613abc81613a89565b946020939093013593505050565b600060208284031215613adc57600080fd5b8135610e6e81613a89565b600060208284031215613af957600080fd5b5035919050565b600080600060608486031215613b1557600080fd5b8335613b2081613a89565b92506020840135613b3081613a89565b929592945050506040919091013590565b8015158114611eb457600080fd5b60008060408385031215613b6257600080fd5b8235613b6d81613a89565b91506020830135613b7d81613b41565b809150509250929050565b600060208284031215613b9a57600080fd5b8135610e6e81613b41565b60008060408385031215613bb857600080fd5b8235613bc381613a89565b91506020830135613b7d81613a89565b60008060408385031215613be657600080fd5b823591506020830135613b7d81613b41565b60008060008060008060c08789031215613c1157600080fd5b8635613c1c81613a89565b95506020870135613c2c81613a89565b95989597505050506040840135936060810135936080820135935060a0909101359150565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610bff57610bff613c9c565b634e487b7160e01b600052603160045260246000fd5b600060018201613ced57613ced613c9c565b5060010190565b6020808252601690820152756665652063616e6e6f7420657863656564203130302560501b604082015260600190565b600060208284031215613d3657600080fd5b5051919050565b600060208284031215613d4f57600080fd5b8151610e6e81613a89565b6020808252600d908201526c53746f7020736e6970696e672160981b604082015260600190565b80516001600160701b0381168114613d9857600080fd5b919050565b600080600060608486031215613db257600080fd5b613dbb84613d81565b9250613dc960208501613d81565b9150604084015163ffffffff81168114613de257600080fd5b809150509250925092565b600082613e0a57634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610bff57610bff613c9c565b8082028115828204841417610bff57610bff613c9c565b600081518084526020808501945080840160005b83811015613e725781516001600160a01b031687529582019590820190600101613e4d565b509495945050505050565b85815260ff8516602082015260a060408201526000613e9f60a0830186613e39565b6001600160a01b0394909416606083015250608001529392505050565b60008251613ece818460208701613a32565b9190910192915050565b8281526040602082015260006138c06040830184613e39565b600060208284031215613f0357600080fd5b8151610e6e81613b4156fe42455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636542455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212205fd9e0358af49c6dea1e05c1726e9165f994b289b9f8bcde57313ad07e18840964736f6c63430008120033
Deployed Bytecode Sourcemap
38413:29416:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43158:85;;;;;;;;;;-1:-1:-1;43230:5:0;;;;;;;;;;;-1:-1:-1;;;43230:5:0;;;;43158:85;;;;43230:5;43158:85;:::i;:::-;;;;;;;;44301:195;;;;;;;;;;-1:-1:-1;44301:195:0;;;;;:::i;:::-;;:::i;:::-;;;1291:14:1;;1284:22;1266:41;;1254:2;1239:18;44301:195:0;1126:187:1;66100:519:0;;;;;;;;;;-1:-1:-1;66100:519:0;;;;;:::i;:::-;;:::i;:::-;;45707:89;;;;;;;;;;-1:-1:-1;45778:10:0;;45707:89;;;1716:25:1;;;1704:2;1689:18;45707:89:0;1570:177:1;43521:97:0;;;;;;;;;;-1:-1:-1;39584:19:0;43521:97;;40396:45;;;;;;;;;;-1:-1:-1;40396:45:0;;;;-1:-1:-1;;;;;40396:45:0;;;;;;-1:-1:-1;;;;;1916:32:1;;;1898:51;;1886:2;1871:18;40396:45:0;1752:203:1;63799:171:0;;;;;;;;;;-1:-1:-1;63799:171:0;;;;;:::i;:::-;;:::i;44504:448::-;;;;;;;;;;-1:-1:-1;44504:448:0;;;;;:::i;:::-;;:::i;67203:260::-;;;;;;;;;;-1:-1:-1;67203:260:0;;;;;:::i;:::-;;:::i;42965:157::-;;;;;;;;;;-1:-1:-1;42965:157:0;;;;;:::i;:::-;;:::i;46389:322::-;;;;;;;;;;-1:-1:-1;46389:322:0;;;;;:::i;:::-;;:::i;43398:85::-;;;;;;;;;;-1:-1:-1;43398:85:0;;39448:2;3258:36:1;;3246:2;3231:18;43398:85:0;3116:184:1;65753:339:0;;;;;;;;;;-1:-1:-1;65753:339:0;;;;;:::i;:::-;;:::i;67659:167::-;;;;;;;;;;-1:-1:-1;67659:167:0;;;;;:::i;:::-;;:::i;64470:116::-;;;;;;;;;;-1:-1:-1;64470:116:0;;;;;:::i;:::-;;:::i;47073:489::-;;;;;;;;;;-1:-1:-1;47073:489:0;;;;;:::i;:::-;;:::i;44960:302::-;;;;;;;;;;-1:-1:-1;44960:302:0;;;;;:::i;:::-;;:::i;66852:306::-;;;;;;;;;;-1:-1:-1;66852:306:0;;;;;:::i;:::-;;:::i;67505:112::-;;;;;;;;;;;;;:::i;63566:109::-;;;;;;;;;;-1:-1:-1;63566:109:0;;;;;:::i;:::-;;:::i;45857:481::-;;;;;;;;;;-1:-1:-1;45857:481:0;;;;;:::i;:::-;;:::i;66627:88::-;;;;;;;;;;-1:-1:-1;66627:88:0;;;;;:::i;:::-;;:::i;40338:29::-;;;;;;;;;;-1:-1:-1;40338:29:0;;;;-1:-1:-1;;;;;40338:29:0;;;65283:105;;;;;;;;;;-1:-1:-1;65283:105:0;;;;;:::i;:::-;;:::i;62916:116::-;;;;;;;;;;-1:-1:-1;62999:25:0;;-1:-1:-1;;;62999:25:0;;;;62916:116;;46719:346;;;;;;;;;;-1:-1:-1;46719:346:0;;;;;:::i;:::-;;:::i;63270:120::-;;;;;;;;;;-1:-1:-1;63270:120:0;;;;;:::i;:::-;;:::i;63978:167::-;;;;;;;;;;-1:-1:-1;63978:167:0;;;;;:::i;:::-;;:::i;62746:162::-;;;;;;;;;;-1:-1:-1;62746:162:0;;;;;:::i;:::-;;:::i;65630:115::-;;;;;;;;;;-1:-1:-1;65630:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;65719:18:0;65695:4;65719:18;;;:9;:18;;;;;;;;;65630:115;64720:126;;;;;;;;;;-1:-1:-1;64720:126:0;;;;;:::i;:::-;;:::i;64330:132::-;;;;;;;;;;-1:-1:-1;64330:132:0;;;;;:::i;:::-;;:::i;40675:38::-;;;;;;;;;;;;;;;;43654:236;;;;;;;;;;-1:-1:-1;43654:236:0;;;;;:::i;:::-;;:::i;12479:103::-;;;;;;;;;;;;;:::i;40203:39::-;;;;;;;;;;-1:-1:-1;40203:39:0;;;;-1:-1:-1;;;;;40203:39:0;;;65513:109;;;;;;;;;;-1:-1:-1;65513:109:0;;;;;:::i;:::-;;:::i;40152:25::-;;;;;;;;;;;;;;;;39785:28;;;;;;;;;;;;;;;;63398:160;;;;;;;;;;-1:-1:-1;63398:160:0;;;;;:::i;:::-;-1:-1:-1;;;;;63524:26:0;63495:4;63524:26;;;:17;:26;;;;;;;;;63398:160;11828:87;;;;;;;;;;-1:-1:-1;11874:7:0;11901:6;-1:-1:-1;;;;;11901:6:0;11828:87;;64153:169;;;;;;;;;;-1:-1:-1;64153:169:0;;;;;:::i;:::-;;:::i;65163:112::-;;;;;;;;;;-1:-1:-1;65163:112:0;;;;;:::i;:::-;;:::i;64594:118::-;;;;;;;;;;-1:-1:-1;64594:118:0;;;;;:::i;:::-;;:::i;63154:108::-;;;;;;;;;;-1:-1:-1;63233:21:0;;-1:-1:-1;;;63233:21:0;;;;63154:108;;40102:22;;;;;;;;;;;;;;;;39981:27;;;;;;;;;;;;;;;;45270:402;;;;;;;;;;-1:-1:-1;45270:402:0;;;;;:::i;:::-;;:::i;43898:201::-;;;;;;;;;;-1:-1:-1;43898:201:0;;;;;:::i;:::-;;:::i;40722:42::-;;;;;;;;;;-1:-1:-1;40722:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;41408:1237;;;;;;;;;;-1:-1:-1;41408:1237:0;;;;;:::i;:::-;;:::i;40249:26::-;;;;;;;;;;-1:-1:-1;40249:26:0;;;;-1:-1:-1;;;;;40249:26:0;;;42684:273;;;;;;;;;;;;;:::i;39884:26::-;;;;;;;;;;;;;;;;65396:109;;;;;;;;;;-1:-1:-1;65396:109:0;;;;;:::i;:::-;;:::i;63040:106::-;;;;;;;;;;-1:-1:-1;63118:20:0;;-1:-1:-1;;;63118:20:0;;;;63040:106;;62523:215;;;;;;;;;;-1:-1:-1;62523:215:0;;;;;:::i;:::-;;:::i;64980:175::-;;;;;;;;;;-1:-1:-1;64980:175:0;;;;;:::i;:::-;;:::i;44107:186::-;;;;;;;;;;-1:-1:-1;44107:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;44258:18:0;;;44226:7;44258:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;44107:186;50937:539;;;;;;;;;;;;;:::i;64854:118::-;;;;;;;;;;-1:-1:-1;64854:118:0;;;;;:::i;:::-;;:::i;63683:108::-;;;;;;;;;;-1:-1:-1;63683:108:0;;;;;:::i;:::-;;:::i;12737:201::-;;;;;;;;;;-1:-1:-1;12737:201:0;;;;;:::i;:::-;;:::i;44301:195::-;44405:4;44427:39;10562:10;44450:7;44459:6;44427:8;:39::i;:::-;-1:-1:-1;44484:4:0;44301:195;;;;;:::o;66100:519::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;66178:18:0;::::1;;::::0;;;:9:::1;:18;::::0;;;;;::::1;;66170:57;;;::::0;-1:-1:-1;;;66170:57:0;;5724:2:1;66170:57:0::1;::::0;::::1;5706:21:1::0;5763:2;5743:18;;;5736:30;5802:28;5782:18;;;5775:56;5848:18;;66170:57:0::1;5522:350:1::0;66170:57:0::1;66243:9;66238:374;66262:17;:24:::0;66258:28;::::1;66238:374;;;66336:7;-1:-1:-1::0;;;;;66312:31:0::1;:17;66330:1;66312:20;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;66312:20:0::1;:31:::0;66308:293:::1;;66387:17;66427:24:::0;;:28:::1;::::0;66454:1:::1;::::0;66427:28:::1;:::i;:::-;66387:87;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;66364:17:::1;:20:::0;;-1:-1:-1;;;;;66387:87:0;;::::1;::::0;66382:1;;66364:20;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:110:::0;;-1:-1:-1;;;;;;66364:110:0::1;-1:-1:-1::0;;;;;66364:110:0;;::::1;;::::0;;66493:18;;::::1;::::0;;:9:::1;:18:::0;;;;;;:26;;-1:-1:-1;;66493:26:0::1;::::0;;66538:17:::1;:23:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;66538:23:0;;;;;-1:-1:-1;;;;;;66538:23:0::1;::::0;;;;;66238:374:::1;66100:519:::0;:::o;66308:293::-:1;66288:3:::0;::::1;::::0;::::1;:::i;:::-;;;;66238:374;;;;66100:519:::0;:::o;63799:171::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;63898:3:::1;63887:7;:14;;63879:49;;;;-1:-1:-1::0;;;63879:49:0::1;;;;;;;:::i;:::-;63939:13;:23:::0;63799:171::o;44504:448::-;44638:4;44655:36;44665:6;44673:9;44684:6;44655:9;:36::i;:::-;44702:220;44725:6;10562:10;44773:138;44829:6;44773:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44773:19:0;;;;;;:11;:19;;;;;;;;10562:10;44773:33;;;;;;;;;;:37;:138::i;:::-;44702:8;:220::i;:::-;-1:-1:-1;44940:4:0;44504:448;;;;;;:::o;67203:260::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;67353:43:::1;67368:6;67376:10;67388:7;67353:14;:43::i;:::-;67203:260:::0;;;:::o;42965:157::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43043:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;;:27;;-1:-1:-1;;43043:27:0::1;::::0;::::1;;::::0;;::::1;::::0;;;43088:26;;7065:51:1;;;7132:18;;;7125:50;43088:26:0::1;::::0;7038:18:1;43088:26:0::1;;;;;;;;42965:157:::0;;:::o;46389:322::-;46483:7;46541;;46530;:18;;46508:110;;;;-1:-1:-1;;;46508:110:0;;7388:2:1;46508:110:0;;;7370:21:1;7427:2;7407:18;;;7400:30;7466:34;7446:18;;;7439:62;-1:-1:-1;;;7517:18:1;;;7510:40;7567:19;;46508:110:0;7186:406:1;46508:110:0;46629:19;46651:10;:8;:10::i;:::-;46629:32;-1:-1:-1;46679:24:0;:7;46629:32;46679:11;:24::i;65753:339::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;65863:13:::1;::::0;-1:-1:-1;;;;;65863:13:0;;::::1;65844:33:::0;;::::1;::::0;65822:111:::1;;;::::0;-1:-1:-1;;;65822:111:0;;7799:2:1;65822:111:0::1;::::0;::::1;7781:21:1::0;7838:2;7818:18;;;7811:30;7877;7857:18;;;7850:58;7925:18;;65822:111:0::1;7597:352:1::0;65822:111:0::1;-1:-1:-1::0;;;;;65953:18:0;::::1;;::::0;;;:9:::1;:18;::::0;;;;;::::1;;65952:19;65944:62;;;::::0;-1:-1:-1;;;65944:62:0;;8156:2:1;65944:62:0::1;::::0;::::1;8138:21:1::0;8195:2;8175:18;;;8168:30;8234:32;8214:18;;;8207:60;8284:18;;65944:62:0::1;7954:354:1::0;65944:62:0::1;-1:-1:-1::0;;;;;66017:18:0::1;;::::0;;;:9:::1;:18;::::0;;;;:25;;-1:-1:-1;;66017:25:0::1;66038:4;66017:25:::0;;::::1;::::0;;;66053:17:::1;:31:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;66053:31:0::1;::::0;;::::1;::::0;;65753:339::o;67659:167::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;67788:30:::1;67798:10;67810:7;67788:9;:30::i;64470:116::-:0;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;64547:20:::1;:31:::0;;;::::1;;-1:-1:-1::0;;;64547:31:0::1;-1:-1:-1::0;;;;64547:31:0;;::::1;::::0;;;::::1;::::0;;64470:116::o;47073:489::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47153:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;::::1;;47145:66;;;::::0;-1:-1:-1;;;47145:66:0;;8515:2:1;47145:66:0::1;::::0;::::1;8497:21:1::0;8554:2;8534:18;;;8527:30;8593:29;8573:18;;;8566:57;8640:18;;47145:66:0::1;8313:351:1::0;47145:66:0::1;47227:9;47222:333;47246:9;:16:::0;47242:20;::::1;47222:333;;;47304:7;-1:-1:-1::0;;;;;47288:23:0::1;:9;47298:1;47288:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;47288:12:0::1;:23:::0;47284:260:::1;;47347:9;47357:16:::0;;:20:::1;::::0;47376:1:::1;::::0;47357:20:::1;:::i;:::-;47347:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;47332:9:::1;:12:::0;;-1:-1:-1;;;;;47347:31:0;;::::1;::::0;47342:1;;47332:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;47332:46:0::1;-1:-1:-1::0;;;;;47332:46:0;;::::1;;::::0;;47397:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;47436:17:::1;:26:::0;;;;:34;;-1:-1:-1;;47436:34:0::1;::::0;;47489:9:::1;:15:::0;;;::::1;;;;:::i;47284:260::-;47264:3:::0;::::1;::::0;::::1;:::i;:::-;;;;47222:333;;44960:302:::0;10562:10;45077:4;45171:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;45171:34:0;;;;;;;;;;45077:4;;45099:133;;45149:7;;45171:50;;45210:10;45171:38;:50::i;66852:306::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;66998:39:::1;::::0;-1:-1:-1;;;66998:39:0;;67031:4:::1;66998:39;::::0;::::1;1898:51:1::0;66981:14:0::1;::::0;-1:-1:-1;;;;;66998:24:0;::::1;::::0;::::1;::::0;1871:18:1;;66998:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66981:56;;67050:42;67065:6;67073:10;67085:6;67050:14;:42::i;67505:112::-:0;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;67563:46:::1;10562:10:::0;67587:21:::1;67563:9;:46::i;:::-;67505:112::o:0;63566:109::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;63637:23:0::1;;::::0;;;:14:::1;:23;::::0;;;;:30;;-1:-1:-1;;63637:30:0::1;63663:4;63637:30;::::0;;63566:109::o;45857:481::-;45977:7;39584:19;46010:7;:18;;46002:62;;;;-1:-1:-1;;;46002:62:0;;9060:2:1;46002:62:0;;;9042:21:1;9099:2;9079:18;;;9072:30;9138:33;9118:18;;;9111:61;9189:18;;46002:62:0;8858:355:1;46002:62:0;46080:17;46075:256;;46115:15;46144:19;46155:7;46144:10;:19::i;:::-;-1:-1:-1;46114:49:0;;-1:-1:-1;46178:14:0;;-1:-1:-1;;;;;46178:14:0;46075:256;46228:23;46263:19;46274:7;46263:10;:19::i;:::-;-1:-1:-1;46225:57:0;;-1:-1:-1;46297:22:0;;-1:-1:-1;;;;;46297:22:0;66627:88;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;66692:7:::1;:15:::0;66627:88::o;65283:105::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;65352:21:0::1;;::::0;;;:14:::1;:21;::::0;;;;:28;;-1:-1:-1;;65352:28:0::1;65376:4;65352:28;::::0;;65283:105::o;46719:346::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46802:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;::::1;;46801:27;46793:67;;;::::0;-1:-1:-1;;;46793:67:0;;9420:2:1;46793:67:0::1;::::0;::::1;9402:21:1::0;9459:2;9439:18;;;9432:30;9498:29;9478:18;;;9471:57;9545:18;;46793:67:0::1;9218:351:1::0;46793:67:0::1;-1:-1:-1::0;;;;;46875:16:0;::::1;46894:1;46875:16:::0;;;:7:::1;:16;::::0;;;;;:20;46871:109:::1;;-1:-1:-1::0;;;;;46951:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;46931:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;46912:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;46871:109:::1;-1:-1:-1::0;;;;;46990:26:0::1;;::::0;;;:17:::1;:26;::::0;;;;:33;;-1:-1:-1;;46990:33:0::1;47019:4;46990:33:::0;;::::1;::::0;;;47034:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;47034:23:0::1;::::0;;::::1;::::0;;46719:346::o;63270:120::-;-1:-1:-1;;;;;63359:23:0;63335:4;63359:23;;;:14;:23;;;;;;;;;63270:120::o;63978:167::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;64075:3:::1;64064:7;:14;;64056:49;;;;-1:-1:-1::0;;;64056:49:0::1;;;;;;;:::i;:::-;64116:11;:21:::0;63978:167::o;62746:162::-;62837:11;;62807:4;;-1:-1:-1;;;;;62837:11:0;;;62828:20;;;;62824:37;;-1:-1:-1;62857:4:0;;62746:162;-1:-1:-1;62746:162:0:o;62824:37::-;-1:-1:-1;;;;;;62879:21:0;;;;;:14;:21;;;;;;;;;62746:162::o;64720:126::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;64802:25:::1;:36:::0;;;::::1;;-1:-1:-1::0;;;64802:36:0::1;-1:-1:-1::0;;;;64802:36:0;;::::1;::::0;;;::::1;::::0;;64720:126::o;64330:132::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;64413:14:::1;:41:::0;;-1:-1:-1;;;;;;64413:41:0::1;-1:-1:-1::0;;;;;64413:41:0;;;::::1;::::0;;;::::1;::::0;;64330:132::o;43654:236::-;-1:-1:-1;;;;;43744:26:0;;43720:7;43744:26;;;:17;:26;;;;;;;;43740:55;;;-1:-1:-1;;;;;;43779:16:0;;;;;:7;:16;;;;;;;43654:236::o;43740:55::-;-1:-1:-1;;;;;43833:16:0;;;;;;:7;:16;;;;;;43813:37;;:19;:37::i;12479:103::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;12544:30:::1;12571:1;12544:18;:30::i;65513:109::-:0;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;65586:13:::1;:28:::0;;;::::1;;-1:-1:-1::0;;;65586:28:0::1;-1:-1:-1::0;;;;65586:28:0;;::::1;::::0;;;::::1;::::0;;65513:109::o;64153:169::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;64251:3:::1;64240:7;:14;;64232:49;;;;-1:-1:-1::0;;;64232:49:0::1;;;;;;;:::i;:::-;64292:12;:22:::0;64153:169::o;65163:112::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;65240:15:::1;:27:::0;;-1:-1:-1;;;;;;65240:27:0::1;-1:-1:-1::0;;;;;65240:27:0;;;::::1;::::0;;;::::1;::::0;;65163:112::o;64594:118::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;64672:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;64672:32:0::1;-1:-1:-1::0;;;;64672:32:0;;::::1;::::0;;;::::1;::::0;;64594:118::o;45270:402::-;45392:4;45414:228;10562:10;45464:7;45486:145;45543:15;45486:145;;;;;;;;;;;;;;;;;10562:10;45486:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;45486:34:0;;;;;;;;;;;;:38;:145::i;43898:201::-;44005:4;44027:42;10562:10;44051:9;44062:6;44027:9;:42::i;41408:1237::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;41667:16:::1;41650:14;;:33;;;;;-1:-1:-1::0;;;;;41650:33:0::1;;;;;-1:-1:-1::0;;;;;41650:33:0::1;;;;;;41696;41765:14;41696:94;;41833:14;-1:-1:-1::0;;;;;41833:22:0::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41815:68:0::1;;41892:4;41899:14;-1:-1:-1::0;;;;;41899:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41815:106;::::0;-1:-1:-1;;;;;;41815:106:0::1;::::0;;;;;;-1:-1:-1;;;;;10060:15:1;;;41815:106:0::1;::::0;::::1;10042:34:1::0;10112:15;;10092:18;;;10085:43;9977:18;;41815:106:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41801:11;:120:::0;;-1:-1:-1;;;;;;41801:120:0;;::::1;-1:-1:-1::0;;;;;41801:120:0;;::::1;;::::0;;;41934:13:::1;:30:::0;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;11901:6:0;;;;;42012:23;;:14:::1;:23;::::0;;;;;:30;;-1:-1:-1;;42012:30:0;;::::1;-1:-1:-1::0;42012:30:0;;::::1;::::0;;;42121:4:::1;42098:29:::0;;;;;;:36;;;;::::1;::::0;;::::1;::::0;;42187:3:::1;42169:21:::0;::::1;::::0;::::1;::::0;:57:::1;;;42223:3;42207:12;:19;;42169:57;:94;;;;;42260:3;42243:13;:20;;42169:94;:126;;;;;42292:3;42280:8;:15;;42169:126;42147:198;;;;-1:-1:-1::0;;;42147:198:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;42358:13:0::1;:30:::0;;;42399:19:::1;:35:::0;;;;42447:11:::1;:26:::0;;;42484:20:::1;:34:::0;;;;42531:12:::1;:28:::0;;;42570:21:::1;:36:::0;42619:7:::1;:18:::0;-1:-1:-1;;41408:1237:0:o;42684:273::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;42737:12:::1;:19:::0;;42811:15:::1;42798:10;:28:::0;-1:-1:-1;;;;42921:28:0;-1:-1:-1;;;42921:28:0;;;42684:273::o;65396:109::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;65468:21:0::1;65492:5;65468:21:::0;;;:14:::1;:21;::::0;;;;:29;;-1:-1:-1;;65468:29:0::1;::::0;;65396:109::o;62523:215::-;62587:7;62607:14;62624:48;62659:12;;62624:30;62640:13;;62624:11;;:15;;:30;;;;:::i;:::-;:34;;:48::i;:::-;62607:65;;62692:25;62710:6;62692:17;:25::i;:::-;:38;;62724:6;62692:38;;;62720:1;62685:45;62523:215;-1:-1:-1;;;62523:215:0:o;64980:175::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;65090:13:::1;:57:::0;;-1:-1:-1;;;;;;65090:57:0::1;-1:-1:-1::0;;;;;65090:57:0;;;::::1;::::0;;;::::1;::::0;;64980:175::o;50937:539::-;10562:10;40831:24;;;;:10;:24;;;;;;;;;:51;;-1:-1:-1;11874:7:0;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;40859:23;40831:51;40808:134;;;;-1:-1:-1;;;40808:134:0;;10341:2:1;40808:134:0;;;10323:21:1;10380:2;10360:18;;;10353:30;10419:33;10399:18;;;10392:61;10470:18;;40808:134:0;10139:355:1;40808:134:0;50992:29:::1;51024:24;51042:4;51024:9;:24::i;:::-;50992:56:::0;-1:-1:-1;51065:25:0;;51061:408:::1;;51107:21;51131:146;38703:7;51131:113;51240:3;51131:86;38703:7;51131:53;51176:7;;51131:22;51141:11;;;;;;;;;-1:-1:-1::0;;;;;51141:11:0::1;51131:9;:22::i;:::-;:44:::0;::::1;:53::i;:86::-;:108:::0;::::1;:113::i;:146::-;51107:170;;51322:13;51298:21;:37;51294:115;;;51380:13;51356:37;;51294:115;51423:34;51435:21;51423:11;:34::i;51061:408::-;50981:495;50937:539::o:0;64854:118::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;64934:13:::1;:30:::0;64854:118::o;63683:108::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;63752:23:0::1;63778:5;63752:23:::0;;;:14:::1;:23;::::0;;;;:31;;-1:-1:-1;;63752:31:0::1;::::0;;63683:108::o;12737:201::-;11874:7;11901:6;-1:-1:-1;;;;;11901:6:0;10562:10;12048:23;12040:68;;;;-1:-1:-1;;;12040:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12826:22:0;::::1;12818:73;;;::::0;-1:-1:-1;;;12818:73:0;;10701:2:1;12818:73:0::1;::::0;::::1;10683:21:1::0;10740:2;10720:18;;;10713:30;10779:34;10759:18;;;10752:62;-1:-1:-1;;;10830:18:1;;;10823:36;10876:19;;12818:73:0::1;10499:402:1::0;12818:73:0::1;12902:28;12921:8;12902:18;:28::i;47570:371::-:0;-1:-1:-1;;;;;47697:19:0;;47689:68;;;;-1:-1:-1;;;47689:68:0;;11108:2:1;47689:68:0;;;11090:21:1;11147:2;11127:18;;;11120:30;11186:34;11166:18;;;11159:62;-1:-1:-1;;;11237:18:1;;;11230:34;11281:19;;47689:68:0;10906:400:1;47689:68:0;-1:-1:-1;;;;;47776:21:0;;47768:68;;;;-1:-1:-1;;;47768:68:0;;11513:2:1;47768:68:0;;;11495:21:1;11552:2;11532:18;;;11525:30;11591:34;11571:18;;;11564:62;-1:-1:-1;;;11642:18:1;;;11635:32;11684:19;;47768:68:0;11311:398:1;47768:68:0;-1:-1:-1;;;;;47849:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;47901:32;;1716:25:1;;;47901:32:0;;1689:18:1;47901:32:0;;;;;;;47570:371;;;:::o;47949:2980::-;-1:-1:-1;;;;;48071:18:0;;48063:68;;;;-1:-1:-1;;;48063:68:0;;11916:2:1;48063:68:0;;;11898:21:1;11955:2;11935:18;;;11928:30;11994:34;11974:18;;;11967:62;-1:-1:-1;;;12045:18:1;;;12038:35;12090:19;;48063:68:0;11714:401:1;48063:68:0;-1:-1:-1;;;;;48150:16:0;;48142:64;;;;-1:-1:-1;;;48142:64:0;;12322:2:1;48142:64:0;;;12304:21:1;12361:2;12341:18;;;12334:30;12400:34;12380:18;;;12373:62;-1:-1:-1;;;12451:18:1;;;12444:33;12494:19;;48142:64:0;12120:399:1;48142:64:0;48234:1;48225:6;:10;48217:64;;;;-1:-1:-1;;;48217:64:0;;12726:2:1;48217:64:0;;;12708:21:1;12765:2;12745:18;;;12738:30;12804:34;12784:18;;;12777:62;-1:-1:-1;;;12855:18:1;;;12848:39;12904:19;;48217:64:0;12524:405:1;48217:64:0;-1:-1:-1;;;;;48301:13:0;;;;;;:9;:13;;;;;;;;48300:14;48292:40;;;;-1:-1:-1;;;48292:40:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48352:15:0;;;;;;:9;:15;;;;;;;;48351:16;48343:42;;;;-1:-1:-1;;;48343:42:0;;;;;;;:::i;:::-;10562:10;48405:23;;;;:9;:23;;;;;;;;48404:24;48396:50;;;;-1:-1:-1;;;48396:50:0;;;;;;;:::i;:::-;48479:13;;-1:-1:-1;;;48479:13:0;;;;;:32;;-1:-1:-1;11874:7:0;11901:6;-1:-1:-1;;;;;48496:15:0;;;11901:6;;48496:15;48479:32;48457:126;;;;-1:-1:-1;;;48457:126:0;;13478:2:1;48457:126:0;;;13460:21:1;13517:2;13497:18;;;13490:30;13556:34;13536:18;;;13529:62;-1:-1:-1;;;13607:18:1;;;13600:42;13659:19;;48457:126:0;13276:408:1;48457:126:0;48722:11;;48611:4;;48596:12;;;;-1:-1:-1;;;;;48714:19:0;;;48722:11;;48714:19;;:43;;-1:-1:-1;;;;;;48737:20:0;;;;;;:14;:20;;;;;;;;48714:43;48713:90;;;;-1:-1:-1;48789:13:0;;-1:-1:-1;;;;;48775:28:0;;;48789:13;;48775:28;;48713:90;:119;;;;-1:-1:-1;48820:12:0;;-1:-1:-1;;;48820:12:0;;;;48713:119;48695:653;;;48870:4;48859:15;;48942:21;48960:2;48942:17;:21::i;:::-;48937:307;;48992:12;;-1:-1:-1;;;48992:12:0;;;;48984:49;;;;-1:-1:-1;;;48984:49:0;;13891:2:1;48984:49:0;;;13873:21:1;13930:2;13910:18;;;13903:30;13969:26;13949:18;;;13942:54;14013:18;;48984:49:0;13689:348:1;48984:49:0;49105:10;;49086:15;:29;49082:147;;-1:-1:-1;;;;;49140:13:0;;;;;;:9;:13;;;;;:20;;-1:-1:-1;;49140:20:0;49156:4;49140:20;;;;;;49183:17;:26;;;;;;;;;;;;;;-1:-1:-1;;;;;;49183:26:0;;;;;;49082:147;49265:20;;-1:-1:-1;;;49265:20:0;;;;49260:77;;49316:5;49306:15;;49260:77;49407:12;;-1:-1:-1;;;49407:12:0;;;;:48;;;;-1:-1:-1;49444:11:0;;-1:-1:-1;;;;;49436:19:0;;;49444:11;;49436:19;;49407:48;:86;;;;-1:-1:-1;;;;;;49473:20:0;;;;;;:14;:20;;;;;;;;49472:21;49407:86;:133;;;;-1:-1:-1;49526:13:0;;-1:-1:-1;;;;;49510:30:0;;;49526:13;;49510:30;;49407:133;49389:1256;;;49635:11;;-1:-1:-1;;;;;49629:17:0;;;49635:11;;49629:17;;:56;;-1:-1:-1;;;;;;49667:18:0;;;;;;:14;:18;;;;;;;;49629:56;:105;;;-1:-1:-1;49720:13:0;;-1:-1:-1;;;;;49706:28:0;;;49720:13;;49706:28;49629:105;49607:1027;;;-1:-1:-1;49811:21:0;;49781:4;;-1:-1:-1;;;49811:21:0;;;;49806:86;;49867:5;49857:15;;49806:86;49913:16;49931;49990:11;;;;;;;;;-1:-1:-1;;;;;49990:11:0;-1:-1:-1;;;;;49953:79:0;;:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49912:122;-1:-1:-1;;;;;49912:122:0;;;-1:-1:-1;;;;;49912:122:0;;;50148:4;-1:-1:-1;;;;;50078:75:0;50093:11;;;;;;;;;-1:-1:-1;;;;;50093:11:0;-1:-1:-1;;;;;50078:56:0;;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50078:75:0;;:163;;50222:8;50232;50078:163;;;50178:8;50188;50078:163;50295:13;;:136;;-1:-1:-1;;;50295:136:0;;;;;14892:25:1;;;14933:18;;;14926:34;;;14976:18;;;14969:34;;;50055:186:0;;-1:-1:-1;50055:186:0;;-1:-1:-1;50262:30:0;;-1:-1:-1;;;;;50295:13:0;;;;:26;;14865:18:1;;50295:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50262:169;;50508:13;;50482:22;:39;;50452:166;;;;-1:-1:-1;;;50452:166:0;;15216:2:1;50452:166:0;;;15198:21:1;15255:2;15235:18;;;15228:30;15294:34;15274:18;;;15267:62;-1:-1:-1;;;15345:18:1;;;15338:51;15406:19;;50452:166:0;15014:417:1;50452:166:0;49750:884;;;49607:1027;50662:9;50661:10;:23;;;;;50676:8;50675:9;50661:23;:53;;;;-1:-1:-1;50689:25:0;;-1:-1:-1;;;50689:25:0;;;;50688:26;50661:53;50657:101;;;50741:5;50731:15;;50657:101;50775:23;50793:4;50775:17;:23::i;:::-;:48;;;;50802:21;50820:2;50802:17;:21::i;:::-;50770:98;;;50851:5;50841:15;;50770:98;50880:41;50895:4;50901:2;50905:6;50913:7;50880:14;:41::i;:::-;48052:2877;;;47949:2980;;;:::o;7903:240::-;8023:7;8084:12;8076:6;;;;8068:29;;;;-1:-1:-1;;;8068:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;8119:5:0;;;7903:240::o;37205:539::-;-1:-1:-1;;;;;37352:26:0;;37344:64;;;;-1:-1:-1;;;37344:64:0;;15638:2:1;37344:64:0;;;15620:21:1;15677:2;15657:18;;;15650:30;-1:-1:-1;;;15696:18:1;;;15689:55;15761:18;;37344:64:0;15436:349:1;37344:64:0;37452:39;;-1:-1:-1;;;37452:39:0;;37485:4;37452:39;;;1898:51:1;-1:-1:-1;;;;;37452:24:0;;;;;1871:18:1;;37452:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37441:7;:50;;37419:135;;;;-1:-1:-1;;;37419:135:0;;15992:2:1;37419:135:0;;;15974:21:1;16031:2;16011:18;;;16004:30;16070:34;16050:18;;;16043:62;-1:-1:-1;;;16121:18:1;;;16114:33;16164:19;;37419:135:0;15790:399:1;37419:135:0;37567:48;-1:-1:-1;;;;;37567:27:0;;37595:10;37607:7;37567:27;:48::i;:::-;37694:42;;;-1:-1:-1;;;;;16452:15:1;;;16434:34;;16504:15;;16499:2;16484:18;;16477:43;16536:18;;;16529:34;;;37694:42:0;;16384:2:1;16369:18;37694:42:0;;;;;;;;37205:539;;;:::o;60210:164::-;60252:7;60273:15;60290;60309:19;:17;:19::i;:::-;60272:56;;-1:-1:-1;60272:56:0;-1:-1:-1;60346:20:0;60272:56;;60346:11;:20::i;:::-;60339:27;;;;60210:164;:::o;6761:98::-;6819:7;6846:5;6850:1;6846;:5;:::i;36636:450::-;-1:-1:-1;;;;;36728:26:0;;36720:64;;;;-1:-1:-1;;;36720:64:0;;15638:2:1;36720:64:0;;;15620:21:1;15677:2;15657:18;;;15650:30;-1:-1:-1;;;15696:18:1;;;15689:55;15761:18;;36720:64:0;15436:349:1;36720:64:0;36828:21;36817:7;:32;;36795:115;;;;-1:-1:-1;;;36795:115:0;;16998:2:1;36795:115:0;;;16980:21:1;17037:2;17017:18;;;17010:30;17076:34;17056:18;;;17049:62;-1:-1:-1;;;17127:18:1;;;17120:31;17168:19;;36795:115:0;16796:397:1;36795:115:0;36971:62;36985:10;36997:7;36971:62;;;;;;;;;;;;;;;;;:13;:62::i;:::-;37049:29;;;-1:-1:-1;;;;;17390:32:1;;17372:51;;17454:2;17439:18;;17432:34;;;37049:29:0;;17345:18:1;37049:29:0;17198:274:1;5624:98:0;5682:7;5709:5;5713:1;5709;:5;:::i;58472:742::-;58572:7;58594;58616;58638;58660;58682;58732:23;58770:12;58797:18;58829:20;58841:7;58829:11;:20::i;:::-;58717:132;;;;;;58861:15;58878:23;58903:12;58919:113;58945:7;58967:4;58986:10;59011;:8;:10::i;:::-;58919:11;:113::i;:::-;58860:172;;;;-1:-1:-1;58860:172:0;;-1:-1:-1;59136:15:0;;-1:-1:-1;59166:4:0;;-1:-1:-1;59185:10:0;;-1:-1:-1;58472:742:0;;-1:-1:-1;;;;;58472:742:0:o;13098:191::-;13172:16;13191:6;;-1:-1:-1;;;;;13208:17:0;;;-1:-1:-1;;;;;;13208:17:0;;;;;;13241:40;;13191:6;;;;;;;13241:40;;13172:16;13241:40;13161:128;13098:191;:::o;6362:98::-;6420:7;6447:5;6451:1;6447;:5;:::i;51484:1040::-;51582:21;51555:24;51645;:22;:24::i;:::-;51616:53;;51716:27;51746:91;51818:18;51746:53;51786:12;;51746:21;:39;;:53;;;;:::i;:91::-;51716:121;-1:-1:-1;51874:43:0;51716:121;51874:21;:43;:::i;:::-;51850:67;;51930:40;51948:21;51930:17;:40::i;:::-;52009:21;51983:23;52068:37;52009:21;52088:16;52068:19;:37::i;:::-;52041:64;-1:-1:-1;52041:64:0;52221:22;;52217:197;;52292:14;;52260:142;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52292:14:0;;52325:18;;52260:13;:142::i;:::-;52430:23;;52426:91;;52470:35;52485:19;52470:14;:35::i;:::-;51544:980;;;;;;51484:1040;:::o;54731:772::-;54887:7;54882:56;;54911:15;:13;:15::i;:::-;-1:-1:-1;;;;;54954:25:0;;;;;;:17;:25;;;;;;;;:58;;;;-1:-1:-1;;;;;;54984:28:0;;;;;;:17;:28;;;;;;;;54983:29;54954:58;54950:503;;;55029:48;55051:6;55059:9;55070:6;55029:21;:48::i;:::-;54950:503;;;-1:-1:-1;;;;;55100:25:0;;;;;;:17;:25;;;;;;;;55099:26;:58;;;;-1:-1:-1;;;;;;55129:28:0;;;;;;:17;:28;;;;;;;;55099:58;55095:358;;;55174:46;55194:6;55202:9;55213:6;55174:19;:46::i;55095:358::-;-1:-1:-1;;;;;55242:25:0;;;;;;:17;:25;;;;;;;;:57;;;;-1:-1:-1;;;;;;55271:28:0;;;;;;:17;:28;;;;;;;;55242:57;55238:215;;;55316:48;55338:6;55346:9;55357:6;55316:21;:48::i;55238:215::-;55397:44;55415:6;55423:9;55434:6;55397:17;:44::i;:::-;55470:7;55465:30;;55479:16;62396:19;;62380:13;:35;62440:20;;62426:11;:34;62486:21;;62471:12;:36;62335:180;55479:16;54731:772;;;;:::o;32437:211::-;32581:58;;;-1:-1:-1;;;;;17390:32:1;;32581:58:0;;;17372:51:1;17439:18;;;;17432:34;;;32581:58:0;;;;;;;;;;17345:18:1;;;;32581:58:0;;;;;;;;-1:-1:-1;;;;;32581:58:0;-1:-1:-1;;;32581:58:0;;;32554:86;;32574:5;;32554:19;:86::i;60382:605::-;60480:7;;60433;;;;39584:19;60433:7;60534:338;60558:9;:16;60554:20;;60534:338;;;60642:7;60618;:21;60626:9;60636:1;60626:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;60626:12:0;60618:21;;;;;;;;;;;;;:31;;:83;;;60694:7;60670;:21;60678:9;60688:1;60678:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;60678:12:0;60670:21;;;;;;;;;;;;;:31;60618:83;60596:146;;;-1:-1:-1;;60725:7:0;;;39584:19;;-1:-1:-1;60382:605:0;-1:-1:-1;;60382:605:0:o;60596:146::-;60767:34;60779:7;:21;60787:9;60797:1;60787:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;60787:12:0;60779:21;;;;;;;;;;;;;60767:7;;:11;:34::i;:::-;60757:44;;60826:34;60838:7;:21;60846:9;60856:1;60846:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;60846:12:0;60838:21;;;;;;;;;;;;;60826:7;;:11;:34::i;:::-;60816:44;-1:-1:-1;60576:3:0;;;;:::i;:::-;;;;60534:338;;;-1:-1:-1;60896:7:0;;:20;;39584:19;60896:11;:20::i;:::-;60886:7;:30;60882:61;;;-1:-1:-1;;60926:7:0;;;39584:19;;-1:-1:-1;60382:605:0;-1:-1:-1;60382:605:0:o;60882:61::-;60962:7;;60971;;-1:-1:-1;60382:605:0;-1:-1:-1;60382:605:0:o;36195:240::-;36333:9;36356:10;-1:-1:-1;;;;;36348:24:0;36380:6;36348:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36332:59;;;36412:4;36418:8;36404:23;;;;;-1:-1:-1;;;36404:23:0;;;;;;;;:::i;:::-;;36321:114;36195:240;;;:::o;59222:418::-;59323:7;59345;59367;59402:12;59417:29;59438:7;59417:20;:29::i;:::-;59402:44;;59457:18;59478:31;59501:7;59478:22;:31::i;:::-;59457:52;-1:-1:-1;59520:23:0;59546:33;59457:52;59546:17;:7;59558:4;59546:11;:17::i;:::-;:21;;:33::i;:::-;59520:59;59615:4;;-1:-1:-1;59621:10:0;;-1:-1:-1;59222:418:0;;-1:-1:-1;;;59222:418:0:o;59648:554::-;59847:7;;;;59944:24;:7;59956:11;59944;:24::i;:::-;59926:42;-1:-1:-1;59979:12:0;59994:21;:4;60003:11;59994:8;:21::i;:::-;59979:36;-1:-1:-1;60026:18:0;60047:27;:10;60062:11;60047:14;:27::i;:::-;60026:48;-1:-1:-1;60085:23:0;60111:33;60026:48;60111:17;:7;60123:4;60111:11;:17::i;:33::-;60163:7;;;;-1:-1:-1;60189:4:0;;-1:-1:-1;59648:554:0;;-1:-1:-1;;;;;;;59648:554:0:o;61586:120::-;61642:7;61669:29;61685:12;;61669:11;;:15;;:29;;;;:::i;:::-;61662:36;;61586:120;:::o;53881:842::-;54032:16;;;54046:1;54032:16;;;;;;;;54008:21;;54032:16;;;;;;;;;;-1:-1:-1;54032:16:0;54008:40;;54077:4;54059;54064:1;54059:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54059:23:0;;;:7;;;;;;;;;;:23;;;;54103:13;;:20;;;-1:-1:-1;;;54103:20:0;;;;:13;;;;;:18;;:20;;;;;54059:7;;54103:20;;;;;:13;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54093:4;54098:1;54093:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54093:30:0;;;:7;;;;;;;;;:30;54168:13;;54136:60;;54153:4;;54168:13;54184:11;54136:8;:60::i;:::-;54244:13;;54279:335;;54210:12;;-1:-1:-1;;;;;54244:13:0;;54279:335;;54435:11;;54210:12;;54513:4;;54544;;54584:15;;54279:335;;;:::i;:::-;;;;-1:-1:-1;;54279:335:0;;;;;;;;;;;;;;-1:-1:-1;;;;;54279:335:0;-1:-1:-1;;;54279:335:0;;;54228:397;;;54279:335;54228:397;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54209:416;;;54640:7;54636:80;;;54669:35;54686:11;54699:4;54669:35;;;;;;;:::i;6005:98::-;6063:7;6090:5;6094:1;6090;:5;:::i;52532:529::-;52642:12;52657:13;:6;52668:1;52657:10;:13::i;:::-;52642:28;-1:-1:-1;52681:17:0;52701:16;:6;52642:28;52701:10;:16::i;:::-;52681:36;;52746:24;52764:4;52746:9;:24::i;:::-;52734:9;:36;52730:105;;;52799:24;52817:4;52799:9;:24::i;:::-;52787:36;;52730:105;52872:21;52906:23;52924:4;52906:17;:23::i;:::-;52942:18;52963:41;:21;52989:14;52963:25;:41::i;:::-;52942:62;;53017:36;53031:9;53042:10;53017:13;:36::i;61981:346::-;62029:13;;:18;:38;;;;-1:-1:-1;62051:11:0;;:16;62029:38;:59;;;;-1:-1:-1;62071:12:0;;:17;62029:59;62025:72;;;61981:346::o;62025:72::-;62131:13;;;62109:19;:35;62178:11;;;62155:20;:34;62224:12;;;62200:21;:36;-1:-1:-1;62249:17:0;;;;62277:15;;;;62303:16;61981:346::o;56856:688::-;57007:15;57037:23;57075:12;57102:23;57140:12;57167:18;57199:19;57210:7;57199:10;:19::i;:::-;-1:-1:-1;;;;;57249:15:0;;;;;;:7;:15;;;;;;56992:226;;-1:-1:-1;56992:226:0;;-1:-1:-1;56992:226:0;;-1:-1:-1;56992:226:0;-1:-1:-1;56992:226:0;-1:-1:-1;56992:226:0;-1:-1:-1;57249:28:0;;57269:7;57249:19;:28::i;:::-;-1:-1:-1;;;;;57231:15:0;;;;;;:7;:15;;;;;;;;:46;;;;57306:7;:15;;;;:28;;57326:7;57306:19;:28::i;:::-;-1:-1:-1;;;;;57288:15:0;;;;;;;:7;:15;;;;;;:46;;;;57366:18;;;;;;;:39;;57389:15;57366:22;:39::i;:::-;-1:-1:-1;;;;;57345:18:0;;;;;;:7;:18;;;;;:60;57416:26;57431:10;57416:14;:26::i;:::-;57453:23;57465:4;57471;57453:11;:23::i;:::-;57509:9;-1:-1:-1;;;;;57492:44:0;57501:6;-1:-1:-1;;;;;57492:44:0;;57520:15;57492:44;;;;1716:25:1;;1704:2;1689:18;;1570:177;57492:44:0;;;;;;;;56981:563;;;;;;56856:688;;;:::o;56148:700::-;56297:15;56327:23;56365:12;56392:23;56430:12;56457:18;56489:19;56500:7;56489:10;:19::i;:::-;-1:-1:-1;;;;;56539:15:0;;;;;;:7;:15;;;;;;56282:226;;-1:-1:-1;56282:226:0;;-1:-1:-1;56282:226:0;;-1:-1:-1;56282:226:0;-1:-1:-1;56282:226:0;-1:-1:-1;56282:226:0;-1:-1:-1;56539:28:0;;56282:226;56539:19;:28::i;:::-;-1:-1:-1;;;;;56521:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;56599:18;;;;;:7;:18;;;;;:39;;56622:15;56599:22;:39::i;:::-;-1:-1:-1;;;;;56578:18:0;;;;;;:7;:18;;;;;;;;:60;;;;56670:7;:18;;;;:39;;56693:15;56670:22;:39::i;57552:757::-;57703:15;57733:23;57771:12;57798:23;57836:12;57863:18;57895:19;57906:7;57895:10;:19::i;:::-;-1:-1:-1;;;;;57943:15:0;;;;;;:7;:15;;;;;;57688:226;;-1:-1:-1;57688:226:0;;-1:-1:-1;57688:226:0;;-1:-1:-1;57688:226:0;-1:-1:-1;57688:226:0;-1:-1:-1;57688:226:0;-1:-1:-1;57943:28:0;;57963:7;57943:19;:28::i;:::-;-1:-1:-1;;;;;57925:15:0;;;;;;:7;:15;;;;;;;;:46;;;;58000:7;:15;;;;:28;;58020:7;58000:19;:28::i;55511:629::-;55658:15;55688:23;55726:12;55753:23;55791:12;55818:18;55850:19;55861:7;55850:10;:19::i;:::-;-1:-1:-1;;;;;55900:15:0;;;;;;:7;:15;;;;;;55643:226;;-1:-1:-1;55643:226:0;;-1:-1:-1;55643:226:0;;-1:-1:-1;55643:226:0;-1:-1:-1;55643:226:0;-1:-1:-1;55643:226:0;-1:-1:-1;55900:28:0;;55643:226;55900:19;:28::i;35010:716::-;35434:23;35460:69;35488:4;35460:69;;;;;;;;;;;;;;;;;35468:5;-1:-1:-1;;;;;35460:27:0;;;:69;;;;;:::i;:::-;35544:17;;35434:95;;-1:-1:-1;35544:21:0;35540:179;;35641:10;35630:30;;;;;;;;;;;;:::i;:::-;35622:85;;;;-1:-1:-1;;;35622:85:0;;20265:2:1;35622:85:0;;;20247:21:1;20304:2;20284:18;;;20277:30;20343:34;20323:18;;;20316:62;-1:-1:-1;;;20394:18:1;;;20387:40;20444:19;;35622:85:0;20063:406:1;61364:214:0;61460:7;61505:65;38703:7;61505:50;61551:3;61505:41;38703:7;61505:26;61517:13;;61505:7;:11;;:26;;;;:::i;61714:259::-;61812:7;61857:108;38703:7;61857:61;61914:3;61857:52;38703:7;61857:37;61869:24;:22;:24::i;:::-;61857:7;;:11;:37::i;53069:804::-;53253:13;;53221:61;;53238:4;;-1:-1:-1;;;;;53253:13:0;53269:12;53221:8;:61::i;:::-;53330:13;;53693:15;;53408:349;;53543:4;53408:349;;;20811:34:1;20861:18;;;20854:34;;;53296:12:0;20904:18:1;;;20897:45;;;20958:18;;;20951:45;;;-1:-1:-1;;;;;53693:15:0;;;21012:19:1;;;21005:44;53727:15:0;21065:19:1;;;21058:35;53296:12:0;53330:13;;;;;53372:10;;20745:19:1;;53408:349:0;;;-1:-1:-1;;53408:349:0;;;;;;;;;;;;;;-1:-1:-1;;;;;53408:349:0;-1:-1:-1;;;53408:349:0;;;53314:454;;;53408:349;53314:454;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53295:473;;;53785:7;53781:85;;;53814:40;;;21278:25:1;;;21334:2;21319:18;;21312:34;;;53814:40:0;;21251:18:1;53814:40:0;21104:248:1;60995:361:0;61058:19;61080:10;:8;:10::i;:::-;61058:32;-1:-1:-1;61101:18:0;61122:27;:10;61058:32;61122:14;:27::i;:::-;61201:4;61185:22;;;;:7;:22;;;;;;61101:48;;-1:-1:-1;61185:38:0;;61101:48;61185:26;:38::i;:::-;61176:4;61160:22;;;;:7;:22;;;;;;;;:63;;;;61238:17;:32;;;;;;61234:114;;;61326:4;61310:22;;;;:7;:22;;;;;;:38;;61337:10;61310:26;:38::i;:::-;61301:4;61285:22;;;;:7;:22;;;;;:63;61047:309;;60995:361;:::o;58317:147::-;58395:7;;:17;;58407:4;58395:11;:17::i;:::-;58385:7;:27;58436:10;;:20;;58451:4;58436:14;:20::i;:::-;58423:10;:33;-1:-1:-1;;58317:147:0:o;17288:229::-;17425:12;17457:52;17479:6;17487:4;17493:1;17496:12;17457:21;:52::i;:::-;17450:59;17288:229;-1:-1:-1;;;;17288:229:0:o;18408:510::-;18578:12;18636:5;18611:21;:30;;18603:81;;;;-1:-1:-1;;;18603:81:0;;21559:2:1;18603:81:0;;;21541:21:1;21598:2;21578:18;;;21571:30;21637:34;21617:18;;;21610:62;-1:-1:-1;;;21688:18:1;;;21681:36;21734:19;;18603:81:0;21357:402:1;18603:81:0;-1:-1:-1;;;;;14838:19:0;;;18695:60;;;;-1:-1:-1;;;18695:60:0;;21966:2:1;18695:60:0;;;21948:21:1;22005:2;21985:18;;;21978:30;22044:31;22024:18;;;22017:59;22093:18;;18695:60:0;21764:353:1;18695:60:0;18769:12;18783:23;18810:6;-1:-1:-1;;;;;18810:11:0;18829:5;18836:4;18810:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18768:73;;;;18859:51;18876:7;18885:10;18897:12;18859:16;:51::i;:::-;18852:58;18408:510;-1:-1:-1;;;;;;;18408:510:0:o;21094:712::-;21244:12;21273:7;21269:530;;;-1:-1:-1;21304:10:0;21297:17;;21269:530;21418:17;;:21;21414:374;;21616:10;21610:17;21677:15;21664:10;21660:2;21656:19;21649:44;21414:374;21759:12;21752:20;;-1:-1:-1;;;21752:20:0;;;;;;;;:::i;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:131::-;-1:-1:-1;;;;;745:31:1;;735:42;;725:70;;791:1;788;781:12;806:315;874:6;882;935:2;923:9;914:7;910:23;906:32;903:52;;;951:1;948;941:12;903:52;990:9;977:23;1009:31;1034:5;1009:31;:::i;:::-;1059:5;1111:2;1096:18;;;;1083:32;;-1:-1:-1;;;806:315:1:o;1318:247::-;1377:6;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1485:9;1472:23;1504:31;1529:5;1504:31;:::i;1960:180::-;2019:6;2072:2;2060:9;2051:7;2047:23;2043:32;2040:52;;;2088:1;2085;2078:12;2040:52;-1:-1:-1;2111:23:1;;1960:180;-1:-1:-1;1960:180:1:o;2145:456::-;2222:6;2230;2238;2291:2;2279:9;2270:7;2266:23;2262:32;2259:52;;;2307:1;2304;2297:12;2259:52;2346:9;2333:23;2365:31;2390:5;2365:31;:::i;:::-;2415:5;-1:-1:-1;2472:2:1;2457:18;;2444:32;2485:33;2444:32;2485:33;:::i;:::-;2145:456;;2537:7;;-1:-1:-1;;;2591:2:1;2576:18;;;;2563:32;;2145:456::o;2606:118::-;2692:5;2685:13;2678:21;2671:5;2668:32;2658:60;;2714:1;2711;2704:12;2729:382;2794:6;2802;2855:2;2843:9;2834:7;2830:23;2826:32;2823:52;;;2871:1;2868;2861:12;2823:52;2910:9;2897:23;2929:31;2954:5;2929:31;:::i;:::-;2979:5;-1:-1:-1;3036:2:1;3021:18;;3008:32;3049:30;3008:32;3049:30;:::i;:::-;3098:7;3088:17;;;2729:382;;;;;:::o;3305:241::-;3361:6;3414:2;3402:9;3393:7;3389:23;3385:32;3382:52;;;3430:1;3427;3420:12;3382:52;3469:9;3456:23;3488:28;3510:5;3488:28;:::i;3551:388::-;3619:6;3627;3680:2;3668:9;3659:7;3655:23;3651:32;3648:52;;;3696:1;3693;3686:12;3648:52;3735:9;3722:23;3754:31;3779:5;3754:31;:::i;:::-;3804:5;-1:-1:-1;3861:2:1;3846:18;;3833:32;3874:33;3833:32;3874:33;:::i;3944:309::-;4009:6;4017;4070:2;4058:9;4049:7;4045:23;4041:32;4038:52;;;4086:1;4083;4076:12;4038:52;4122:9;4109:23;4099:33;;4182:2;4171:9;4167:18;4154:32;4195:28;4217:5;4195:28;:::i;4493:663::-;4597:6;4605;4613;4621;4629;4637;4690:3;4678:9;4669:7;4665:23;4661:33;4658:53;;;4707:1;4704;4697:12;4658:53;4746:9;4733:23;4765:31;4790:5;4765:31;:::i;:::-;4815:5;-1:-1:-1;4872:2:1;4857:18;;4844:32;4885:33;4844:32;4885:33;:::i;:::-;4493:663;;4937:7;;-1:-1:-1;;;;4991:2:1;4976:18;;4963:32;;5042:2;5027:18;;5014:32;;5093:3;5078:19;;5065:33;;-1:-1:-1;5145:3:1;5130:19;;;5117:33;;-1:-1:-1;4493:663:1:o;5161:356::-;5363:2;5345:21;;;5382:18;;;5375:30;5441:34;5436:2;5421:18;;5414:62;5508:2;5493:18;;5161:356::o;5877:127::-;5938:10;5933:3;5929:20;5926:1;5919:31;5969:4;5966:1;5959:15;5993:4;5990:1;5983:15;6009:127;6070:10;6065:3;6061:20;6058:1;6051:31;6101:4;6098:1;6091:15;6125:4;6122:1;6115:15;6141:128;6208:9;;;6229:11;;;6226:37;;;6243:18;;:::i;6274:127::-;6335:10;6330:3;6326:20;6323:1;6316:31;6366:4;6363:1;6356:15;6390:4;6387:1;6380:15;6406:135;6445:3;6466:17;;;6463:43;;6486:18;;:::i;:::-;-1:-1:-1;6533:1:1;6522:13;;6406:135::o;6546:346::-;6748:2;6730:21;;;6787:2;6767:18;;;6760:30;-1:-1:-1;;;6821:2:1;6806:18;;6799:52;6883:2;6868:18;;6546:346::o;8669:184::-;8739:6;8792:2;8780:9;8771:7;8767:23;8763:32;8760:52;;;8808:1;8805;8798:12;8760:52;-1:-1:-1;8831:16:1;;8669:184;-1:-1:-1;8669:184:1:o;9574:251::-;9644:6;9697:2;9685:9;9676:7;9672:23;9668:32;9665:52;;;9713:1;9710;9703:12;9665:52;9745:9;9739:16;9764:31;9789:5;9764:31;:::i;12934:337::-;13136:2;13118:21;;;13175:2;13155:18;;;13148:30;-1:-1:-1;;;13209:2:1;13194:18;;13187:43;13262:2;13247:18;;12934:337::o;14042:188::-;14121:13;;-1:-1:-1;;;;;14163:42:1;;14153:53;;14143:81;;14220:1;14217;14210:12;14143:81;14042:188;;;:::o;14235:450::-;14322:6;14330;14338;14391:2;14379:9;14370:7;14366:23;14362:32;14359:52;;;14407:1;14404;14397:12;14359:52;14430:40;14460:9;14430:40;:::i;:::-;14420:50;;14489:49;14534:2;14523:9;14519:18;14489:49;:::i;:::-;14479:59;;14581:2;14570:9;14566:18;14560:25;14625:10;14618:5;14614:22;14607:5;14604:33;14594:61;;14651:1;14648;14641:12;14594:61;14674:5;14664:15;;;14235:450;;;;;:::o;16574:217::-;16614:1;16640;16630:132;;16684:10;16679:3;16675:20;16672:1;16665:31;16719:4;16716:1;16709:15;16747:4;16744:1;16737:15;16630:132;-1:-1:-1;16776:9:1;;16574:217::o;17477:125::-;17542:9;;;17563:10;;;17560:36;;;17576:18;;:::i;17607:168::-;17680:9;;;17711;;17728:15;;;17722:22;;17708:37;17698:71;;17749:18;;:::i;18122:461::-;18175:3;18213:5;18207:12;18240:6;18235:3;18228:19;18266:4;18295:2;18290:3;18286:12;18279:19;;18332:2;18325:5;18321:14;18353:1;18363:195;18377:6;18374:1;18371:13;18363:195;;;18442:13;;-1:-1:-1;;;;;18438:39:1;18426:52;;18498:12;;;;18533:15;;;;18474:1;18392:9;18363:195;;;-1:-1:-1;18574:3:1;;18122:461;-1:-1:-1;;;;;18122:461:1:o;18588:591::-;18885:6;18874:9;18867:25;18940:4;18932:6;18928:17;18923:2;18912:9;18908:18;18901:45;18982:3;18977:2;18966:9;18962:18;18955:31;18848:4;19003:57;19055:3;19044:9;19040:19;19032:6;19003:57;:::i;:::-;-1:-1:-1;;;;;19096:32:1;;;;19091:2;19076:18;;19069:60;-1:-1:-1;19160:3:1;19145:19;19138:35;18995:65;18588:591;-1:-1:-1;;;18588:591:1:o;19184:287::-;19313:3;19351:6;19345:13;19367:66;19426:6;19421:3;19414:4;19406:6;19402:17;19367:66;:::i;:::-;19449:16;;;;;19184:287;-1:-1:-1;;19184:287:1:o;19476:332::-;19683:6;19672:9;19665:25;19726:2;19721;19710:9;19706:18;19699:30;19646:4;19746:56;19798:2;19787:9;19783:18;19775:6;19746:56;:::i;19813:245::-;19880:6;19933:2;19921:9;19912:7;19908:23;19904:32;19901:52;;;19949:1;19946;19939:12;19901:52;19981:9;19975:16;20000:28;20022:5;20000:28;:::i
Swarm Source
ipfs://5fd9e0358af49c6dea1e05c1726e9165f994b289b9f8bcde57313ad07e188409
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.