More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 147 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Zap In Token | 2363680 | 31 hrs ago | IN | 0 S | 0.00027085 | ||||
Zap In Token | 2361753 | 31 hrs ago | IN | 0 S | 0.00024951 | ||||
Zap In Token | 2361214 | 31 hrs ago | IN | 0 S | 0.0002679 | ||||
Zap In Token | 2360720 | 31 hrs ago | IN | 0 S | 0.00025221 | ||||
Zap In Token | 2360685 | 31 hrs ago | IN | 0 S | 0.00025221 | ||||
Zap In Token | 2360643 | 31 hrs ago | IN | 0 S | 0.00025221 | ||||
Zap In Token | 2360587 | 31 hrs ago | IN | 0 S | 0.00025222 | ||||
Zap In Token | 2360558 | 31 hrs ago | IN | 0 S | 0.00025221 | ||||
Zap In Token | 2360543 | 31 hrs ago | IN | 0 S | 0.00025221 | ||||
Zap In Token | 2360513 | 31 hrs ago | IN | 0 S | 0.00025221 | ||||
Zap In Token | 2360479 | 31 hrs ago | IN | 0 S | 0.00025221 | ||||
Zap In Token | 2360456 | 31 hrs ago | IN | 0 S | 0.00025221 | ||||
Zap In Token | 2360338 | 31 hrs ago | IN | 0 S | 0.00027108 | ||||
Zap In Token | 2360159 | 31 hrs ago | IN | 0 S | 0.00025222 | ||||
Zap In Token | 2356031 | 32 hrs ago | IN | 0 S | 0.00027108 | ||||
Zap In Token | 2333788 | 37 hrs ago | IN | 0 S | 0.00025221 | ||||
Zap In Token | 2333698 | 37 hrs ago | IN | 0 S | 0.00025221 | ||||
Zap In Token | 2323885 | 40 hrs ago | IN | 0 S | 0.00025221 | ||||
Zap In Token | 2323864 | 40 hrs ago | IN | 0 S | 0.00025221 | ||||
Zap In Token | 2323847 | 40 hrs ago | IN | 0 S | 0.00025221 | ||||
Zap In Token | 2322456 | 41 hrs ago | IN | 0 S | 0.00026791 | ||||
Zap In Token | 2308631 | 44 hrs ago | IN | 0 S | 0.00026791 | ||||
Zap In Token | 2306825 | 45 hrs ago | IN | 0 S | 0.00024948 | ||||
Zap In Token | 2306688 | 45 hrs ago | IN | 0 S | 0.00026776 | ||||
Zap In Token | 2305604 | 45 hrs ago | IN | 0 S | 0.00025209 |
Loading...
Loading
Contract Name:
zapper
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2024-12-31 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.7; // Part: IHyperswapRouter01 interface IHyperswapRouter01 { function factory() external pure returns (address); function WFTM() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityFTM( address token, uint amountTokenDesired, uint amountTokenMin, uint amountFTMMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountFTM, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityFTM( address token, uint liquidity, uint amountTokenMin, uint amountFTMMin, address to, uint deadline ) external returns (uint amountToken, uint amountFTM); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityFTMWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountFTMMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountFTM); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactFTMForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactFTM(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForFTM(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapFTMForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // Part: IUniswapV2Pair interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint 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 (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint 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 (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); 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 (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // Part: IUniswapV2Router01 interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // Part: OpenZeppelin/[email protected]/IERC20 /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // Part: IVault interface IVault is IERC20 { function deposit(uint256 amount) external; function withdraw(uint256 shares) external; function want() external pure returns (address); } // Part: OpenZeppelin/[email protected]/Address /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // Part: OpenZeppelin/[email protected]/SafeMath // 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 no longer needed starting with Solidity 0.8. 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. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * 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; } } } // Part: TransferHelper // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove(address token, address to, uint value) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED'); } function safeTransfer(address token, address to, uint value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED'); } function safeTransferFrom(address token, address from, address to, uint value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED'); } function safeTransferETH(address to, uint value) internal { (bool success,) = to.call{value:value}(new bytes(0)); require(success, 'TransferHelper: ETH_TRANSFER_FAILED'); } } // Part: OpenZeppelin/[email protected]/SafeERC20 /** * @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' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) + 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 // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: Context.sol pragma solidity ^0.8.7; /* * @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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: Ownable.sol pragma solidity ^0.8.7; /** * @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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: IZap.sol interface IZap { function estimateZapInToken(address _from, address _to, address _router, uint _amt) external view returns (uint256, uint256); function swapToken(address _from, uint amount, address _to, address routerAddr, address _recipient) external; function swapToNative(address _from, uint amount, address routerAddr, address _recipient) external; function zapIn(address _to, address routerAddr, address _recipient) external payable; function zapInToken(address _from, uint amount, address _to, address routerAddr, address _recipient) external; function zapAcross(address _from, uint amount, address _toRouter, address _recipient) external; function zapOut(address _from, uint amount, address routerAddr, address _recipient) external; function zapOutToken(address _from, uint amount, address _to, address routerAddr, address _recipient) external; } // File: zapper.sol contract zapper is Ownable, IZap { using SafeMath for uint; using SafeERC20 for IERC20; /* ========== STATE VARIABLES ========== */ address private WNATIVE; address public validRouter; mapping(address => mapping(address => address)) private tokenBridgeForRouter; mapping(address => bool) public isFeeOnTransfer; mapping (address => bool) public useNativeRouter; constructor(address _WNATIVE) Ownable() { WNATIVE = _WNATIVE; } modifier authRouter(address _authRouter) { require(_authRouter == validRouter, "invalid router"); _; } /* ========== External Functions ========== */ receive() external payable {} function zapInToken(address _from, uint amount, address _to, address routerAddr, address _recipient) authRouter(routerAddr) external override { _approveTokenIfNeeded(_from, routerAddr); if (isFeeOnTransfer[_from]) { IERC20(_from).transferFrom(msg.sender, address(this), amount); _swapTokenToLP(_from, IERC20(_from).balanceOf(address(this)), _to, _recipient, routerAddr); return; } else { // From an ERC20 to an LP token, through specified router, going through base asset if necessary IERC20(_from).safeTransferFrom(msg.sender, address(this), amount); // we'll need this approval to add liquidity _approveTokenIfNeeded(_from, routerAddr); _swapTokenToLP(_from, amount, _to, _recipient, routerAddr); return; } } function estimateZapInToken(address _from, address _to, address _router, uint _amt) authRouter(_router) public view override returns (uint256, uint256) { // get pairs for desired lp if (_from == IUniswapV2Pair(_to).token0() || _from == IUniswapV2Pair(_to).token1()) { // check if we already have one of the assets // if so, we're going to sell half of _from for the other token we need // figure out which token we need, and approve address other = _from == IUniswapV2Pair(_to).token0() ? IUniswapV2Pair(_to).token1() : IUniswapV2Pair(_to).token0(); // calculate amount of _from to sell uint sellAmount = _amt.div(2); // execute swap uint otherAmount = _estimateSwap(_from, sellAmount, other, _router); if (_from == IUniswapV2Pair(_to).token0()) { return (sellAmount, otherAmount); } else { return (otherAmount, sellAmount); } } else { // go through native token for highest liquidity uint nativeAmount = _from == WNATIVE ? _amt : _estimateSwap(_from, _amt, WNATIVE, _router); if (WNATIVE == IUniswapV2Pair(_to).token0()) { return (nativeAmount.div(2), _estimateSwap(WNATIVE, nativeAmount.div(2), IUniswapV2Pair(_to).token1(), _router )); } if (WNATIVE == IUniswapV2Pair(_to).token1()) { return (_estimateSwap(WNATIVE, nativeAmount.div(2), IUniswapV2Pair(_to).token0(), _router ), nativeAmount.div(2)); } return (_estimateSwap(WNATIVE, nativeAmount.div(2), IUniswapV2Pair(_to).token0(), _router ), _estimateSwap(WNATIVE, nativeAmount.div(2), IUniswapV2Pair(_to).token1(), _router)); } } function zapIn(address _to, address routerAddr, address _recipient) authRouter(routerAddr) external payable override { // from Native to an LP token through the specified router _swapNativeToLP(_to, msg.value, _recipient, routerAddr); if (address(this).balance != 0) { TransferHelper.safeTransferETH(msg.sender, address(this).balance); } } function zapAcross(address _from, uint amount, address _toRouter, address _recipient) authRouter(_toRouter) external override { IERC20(_from).safeTransferFrom(msg.sender, address(this), amount); IUniswapV2Pair pair = IUniswapV2Pair(_from); _approveTokenIfNeeded(pair.token0(), _toRouter); _approveTokenIfNeeded(pair.token1(), _toRouter); IERC20(_from).safeTransfer(_from, amount); uint amt0; uint amt1; (amt0, amt1) = pair.burn(address(this)); IUniswapV2Router01(_toRouter).addLiquidity(pair.token0(), pair.token1(), amt0, amt1, 0, 0, _recipient, block.timestamp); } function zapOut(address _from, uint amount, address routerAddr, address _recipient) authRouter(routerAddr) external override { // from an LP token to Native through specified router // take the LP token IERC20(_from).safeTransferFrom(msg.sender, address(this), amount); _approveTokenIfNeeded(_from, routerAddr); // get pairs for LP address token0 = IUniswapV2Pair(_from).token0(); address token1 = IUniswapV2Pair(_from).token1(); _approveTokenIfNeeded(token0, routerAddr); _approveTokenIfNeeded(token1, routerAddr); // check if either is already native token if (token0 == WNATIVE || token1 == WNATIVE) { // if so, we only need to swap one, figure out which and how much address token = token0 != WNATIVE ? token0 : token1; uint amtToken; uint amtETH; (amtToken, amtETH) = IUniswapV2Router01(routerAddr).removeLiquidityETH(token, amount, 0, 0, address(this), block.timestamp); // swap with msg.sender as recipient, so they already get the Native _swapTokenForNative(token, amtToken, _recipient, routerAddr); // send other half of Native TransferHelper.safeTransferETH(_recipient, amtETH); } else { // convert both for Native with msg.sender as recipient uint amt0; uint amt1; (amt0, amt1) = IUniswapV2Router01(routerAddr).removeLiquidity(token0, token1, amount, 0, 0, address(this), block.timestamp); _swapTokenForNative(token0, amt0, _recipient, routerAddr); _swapTokenForNative(token1, amt1, _recipient, routerAddr); } } function zapOutToken(address _from, uint amount, address _to, address routerAddr, address _recipient) authRouter(routerAddr) external override { // from an LP token to an ERC20 through specified router IERC20(_from).safeTransferFrom(msg.sender, address(this), amount); _approveTokenIfNeeded(_from, routerAddr); address token0 = IUniswapV2Pair(_from).token0(); address token1 = IUniswapV2Pair(_from).token1(); _approveTokenIfNeeded(token0, routerAddr); _approveTokenIfNeeded(token1, routerAddr); uint amt0; uint amt1; (amt0, amt1) = IUniswapV2Router01(routerAddr).removeLiquidity(token0, token1, amount, 0, 0, address(this), block.timestamp); if (token0 != _to) { amt0 = _swap(token0, amt0, _to, address(this), routerAddr); } if (token1 != _to) { amt1 = _swap(token1, amt1, _to, address(this), routerAddr); } IERC20(_to).safeTransfer(_recipient, amt0.add(amt1)); } function swapToken(address _from, uint amount, address _to, address routerAddr, address _recipient) authRouter(routerAddr) external override { IERC20(_from).safeTransferFrom(msg.sender, address(this), amount); _approveTokenIfNeeded(_from, routerAddr); _swap(_from, amount, _to, _recipient, routerAddr); } function swapToNative(address _from, uint amount, address routerAddr, address _recipient) authRouter(routerAddr) external override { IERC20(_from).safeTransferFrom(msg.sender, address(this), amount); _approveTokenIfNeeded(_from, routerAddr); _swapTokenForNative(_from, amount, _recipient, routerAddr); } /* ========== Private Functions ========== */ function _approveTokenIfNeeded(address token, address router) private { if (IERC20(token).allowance(address(this), router) == 0) { IERC20(token).safeApprove(router, type(uint).max); } } function _swapTokenToLP(address _from, uint amount, address _to, address recipient, address routerAddr) private returns (uint) { // get pairs for desired lp if (_from == IUniswapV2Pair(_to).token0() || _from == IUniswapV2Pair(_to).token1()) { // check if we already have one of the assets // if so, we're going to sell half of _from for the other token we need // figure out which token we need, and approve address other = _from == IUniswapV2Pair(_to).token0() ? IUniswapV2Pair(_to).token1() : IUniswapV2Pair(_to).token0(); _approveTokenIfNeeded(other, routerAddr); // calculate amount of _from to sell uint sellAmount = amount.div(2); // execute swap uint otherAmount = _swap(_from, sellAmount, other, address(this), routerAddr); uint liquidity; ( , , liquidity) = IUniswapV2Router01(routerAddr).addLiquidity(_from, other, amount.sub(sellAmount), otherAmount, 0, 0, recipient, block.timestamp); return liquidity; } else { // go through native token for highest liquidity uint nativeAmount = _swapTokenForNative(_from, amount, address(this), routerAddr); return _swapNativeToLP(_to, nativeAmount, recipient, routerAddr); } } function _swapNativeToLP(address _LP, uint amount, address recipient, address routerAddress) private returns (uint) { // LP IUniswapV2Pair pair = IUniswapV2Pair(_LP); address token0 = pair.token0(); address token1 = pair.token1(); uint liquidity; if (token0 == WNATIVE || token1 == WNATIVE) { address token = token0 == WNATIVE ? token1 : token0; ( , , liquidity) = _swapHalfNativeAndProvide(token, amount, routerAddress, recipient); } else { ( , , liquidity) = _swapNativeToEqualTokensAndProvide(token0, token1, amount, routerAddress, recipient); } return liquidity; } function _swapHalfNativeAndProvide(address token, uint amount, address routerAddress, address recipient) private returns (uint, uint, uint) { uint swapValue = amount.div(2); uint tokenAmount = _swapNativeForToken(token, swapValue, address(this), routerAddress); _approveTokenIfNeeded(token, routerAddress); if (useNativeRouter[routerAddress]) { IHyperswapRouter01 router = IHyperswapRouter01(routerAddress); return router.addLiquidityFTM{value : amount.sub(swapValue)}(token, tokenAmount, 0, 0, recipient, block.timestamp); } else { IUniswapV2Router01 router = IUniswapV2Router01(routerAddress); return router.addLiquidityETH{value : amount.sub(swapValue)}(token, tokenAmount, 0, 0, recipient, block.timestamp); } } function _swapNativeToEqualTokensAndProvide(address token0, address token1, uint amount, address routerAddress, address recipient) private returns (uint, uint, uint) { uint swapValue = amount.div(2); uint token0Amount = _swapNativeForToken(token0, swapValue, address(this), routerAddress); uint token1Amount = _swapNativeForToken(token1, amount.sub(swapValue), address(this), routerAddress); _approveTokenIfNeeded(token0, routerAddress); _approveTokenIfNeeded(token1, routerAddress); IUniswapV2Router01 router = IUniswapV2Router01(routerAddress); return router.addLiquidity(token0, token1, token0Amount, token1Amount, 0, 0, recipient, block.timestamp); } function _swapNativeForToken(address token, uint value, address recipient, address routerAddr) private returns (uint) { address[] memory path; IUniswapV2Router01 router = IUniswapV2Router01(routerAddr); if (tokenBridgeForRouter[token][routerAddr] != address(0)) { path = new address[](3); path[0] = WNATIVE; path[1] = tokenBridgeForRouter[token][routerAddr]; path[2] = token; } else { path = new address[](2); path[0] = WNATIVE; path[1] = token; } uint[] memory amounts = router.swapExactETHForTokens{value : value}(0, path, recipient, block.timestamp); return amounts[amounts.length - 1]; } function _swapTokenForNative(address token, uint amount, address recipient, address routerAddr) private returns (uint) { address[] memory path; IUniswapV2Router01 router = IUniswapV2Router01(routerAddr); if (tokenBridgeForRouter[token][routerAddr] != address(0)) { path = new address[](3); path[0] = token; path[1] = tokenBridgeForRouter[token][routerAddr]; path[2] = router.WETH(); } else { path = new address[](2); path[0] = token; path[1] = router.WETH(); } if (isFeeOnTransfer[token]) { router.swapExactTokensForETHSupportingFeeOnTransferTokens(amount, 0, path, recipient, block.timestamp); return IERC20(token).balanceOf(address(this)); } else { uint[] memory amounts = router.swapExactTokensForETH(amount, 0, path, recipient, block.timestamp); return amounts[amounts.length - 1]; } } function _swap(address _from, uint amount, address _to, address recipient, address routerAddr) private returns (uint) { IUniswapV2Router01 router = IUniswapV2Router01(routerAddr); address fromBridge = tokenBridgeForRouter[_from][routerAddr]; address toBridge = tokenBridgeForRouter[_to][routerAddr]; address[] memory path; if (fromBridge != address(0) && toBridge != address(0)) { // both have bridge if (fromBridge != toBridge) { path = new address[](5); path[0] = _from; path[1] = fromBridge; path[2] = WNATIVE; path[3] = toBridge; path[4] = _to; } else { path = new address[](3); path[0] = _from; path[1] = fromBridge; path[2] = _to; } } else if (fromBridge != address(0)) { // from has bridge if (fromBridge == _to) { path = new address[](2); path[0] = _from; path[1] = _to; } else if (_to == WNATIVE) { path = new address[](3); path[0] = _from; path[1] = fromBridge; path[2] = WNATIVE; } else { path = new address[](4); path[0] = _from; path[1] = fromBridge; path[2] = WNATIVE; path[3] = _to; } } else if (toBridge != address(0)) { // only _to ha a bridge, not _from if (_from == toBridge) { path = new address[](2); path[0] = _from; path[1] = _to; } else if (_from == WNATIVE) { path = new address[](3); path[0] = WNATIVE; path[1] = toBridge; path[2] = _to; } else { path = new address[](4); path[0] = _from; path[1] = WNATIVE; path[2] = toBridge; path[3] = _to; } } else if (_from == WNATIVE || _to == WNATIVE) { path = new address[](2); path[0] = _from; path[1] = _to; } else { // Go through WNative path = new address[](3); path[0] = _from; path[1] = WNATIVE; path[2] = _to; } uint[] memory amounts; if (isFeeOnTransfer[_from]) { router.swapExactTokensForTokensSupportingFeeOnTransferTokens(amount, 0, path, recipient, block.timestamp); return IERC20(_to).balanceOf(address(this)); } else { amounts = router.swapExactTokensForTokens(amount, 0, path, recipient, block.timestamp); } return amounts[amounts.length - 1]; } function _estimateSwap(address _from, uint amount, address _to, address routerAddr) private view returns (uint) { IUniswapV2Router01 router = IUniswapV2Router01(routerAddr); address fromBridge = tokenBridgeForRouter[_from][routerAddr]; address toBridge = tokenBridgeForRouter[_to][routerAddr]; address[] memory path; if (fromBridge != address(0) && toBridge != address(0)) { if (fromBridge != toBridge) { path = new address[](5); path[0] = _from; path[1] = fromBridge; path[2] = WNATIVE; path[3] = toBridge; path[4] = _to; } else { path = new address[](3); path[0] = _from; path[1] = fromBridge; path[2] = _to; } } else if (fromBridge != address(0)) { if (fromBridge == _to) { path = new address[](2); path[0] = _from; path[1] = _to; } else if (_to == WNATIVE) { path = new address[](3); path[0] = _from; path[1] = fromBridge; path[2] = WNATIVE; } else { path = new address[](4); path[0] = _from; path[1] = fromBridge; path[2] = WNATIVE; path[3] = _to; } } else if (toBridge != address(0)) { if (_from == toBridge) { path = new address[](2); path[0] = _from; path[1] = _to; } else if (_from == WNATIVE) { path = new address[](3); path[0] = WNATIVE; path[1] = toBridge; path[2] = _to; } else { path = new address[](4); path[0] = _from; path[1] = WNATIVE; path[2] = toBridge; path[3] = _to; } } else if (_from == WNATIVE || _to == WNATIVE) { path = new address[](2); path[0] = _from; path[1] = _to; } else { // Go through WNative path = new address[](3); path[0] = _from; path[1] = WNATIVE; path[2] = _to; } uint[] memory amounts = router.getAmountsOut(amount, path); return amounts[amounts.length - 1]; } /* ========== RESTRICTED FUNCTIONS ========== */ function setTokenBridgeForRouter(address token, address router, address bridgeToken) external onlyOwner { tokenBridgeForRouter[token][router] = bridgeToken; } function setValidRouter(address _validRouter) external onlyOwner { validRouter = _validRouter; } function withdraw(address token) external onlyOwner { if (token == address(0)) { payable(owner()).transfer(address(this).balance); return; } IERC20(token).transfer(owner(), IERC20(token).balanceOf(address(this))); } function setUseNativeRouter(address router) external onlyOwner { useNativeRouter[router] = true; } function setIsFeeOnTransfer(address token) external onlyOwner { isFeeOnTransfer[token] = true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_WNATIVE","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_router","type":"address"},{"internalType":"uint256","name":"_amt","type":"uint256"}],"name":"estimateZapInToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeOnTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"setIsFeeOnTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"bridgeToken","type":"address"}],"name":"setTokenBridgeForRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"setUseNativeRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_validRouter","type":"address"}],"name":"setValidRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"routerAddr","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"swapToNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"routerAddr","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"swapToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"useNativeRouter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"validRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_toRouter","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"zapAcross","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"routerAddr","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"zapIn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"routerAddr","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"zapInToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"routerAddr","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"zapOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"routerAddr","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"zapOutToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620043763803806200437683398101604081905262000034916200009b565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b0319166001600160a01b0392909216919091179055620000cd565b600060208284031215620000ae57600080fd5b81516001600160a01b0381168114620000c657600080fd5b9392505050565b61429980620000dd6000396000f3fe6080604052600436106101185760003560e01c806388f61f9f116100a05780639416cbc6116100645780639416cbc6146102fe578063ba2ebf961461033e578063caaae7f51461035e578063cee6202c1461038e578063f2fde38b146103ae57600080fd5b806388f61f9f1461024b57806388fbe4191461026b57806389fecbd51461028b5780638da5cb5b146102ab5780638e8d8152146102c957600080fd5b806351cff8d9116100e757806351cff8d9146101b65780635424888b146101d65780635cc7647c146101f65780636de6332d14610216578063715018a61461023657600080fd5b8063104bfe551461012457806313aab8ef146101465780631b71afbd1461018357806335e8b7d5146101a357600080fd5b3661011f57005b600080fd5b34801561013057600080fd5b5061014461013f366004613c6e565b6103ce565b005b34801561015257600080fd5b50600254610166906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561018f57600080fd5b5061014461019e366004613d97565b610425565b6101446101b1366004613ca8565b61067a565b3480156101c257600080fd5b506101446101d1366004613c6e565b6106cc565b3480156101e257600080fd5b506101446101f1366004613ca8565b61085b565b34801561020257600080fd5b50610144610211366004613d44565b6108c2565b34801561022257600080fd5b50610144610231366004613c6e565b610bc2565b34801561024257600080fd5b50610144610c0e565b34801561025757600080fd5b50610144610266366004613d44565b610c82565b34801561027757600080fd5b50610144610286366004613c6e565b610f94565b34801561029757600080fd5b506101446102a6366004613d44565b610fe2565b3480156102b757600080fd5b506000546001600160a01b0316610166565b3480156102d557600080fd5b506102e96102e4366004613cf3565b611044565b6040805192835260208301919091520161017a565b34801561030a57600080fd5b5061032e610319366004613c6e565b60056020526000908152604090205460ff1681565b604051901515815260200161017a565b34801561034a57600080fd5b50610144610359366004613d97565b611674565b34801561036a57600080fd5b5061032e610379366004613c6e565b60046020526000908152604090205460ff1681565b34801561039a57600080fd5b506101446103a9366004613d97565b6116cf565b3480156103ba57600080fd5b506101446103c9366004613c6e565b611867565b6000546001600160a01b031633146104015760405162461bcd60e51b81526004016103f890614105565b60405180910390fd5b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b60025482906001600160a01b038083169116146104545760405162461bcd60e51b81526004016103f8906140dd565b6104696001600160a01b038716333088611951565b61047386846119bc565b6000866001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156104ae57600080fd5b505afa1580156104c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e69190613c8b565b90506000876001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561052357600080fd5b505afa158015610537573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055b9190613c8b565b905061056782866119bc565b61057181866119bc565b600080866001600160a01b031663baa2abde85858c60008030426040518863ffffffff1660e01b81526004016105ad9796959493929190613fb1565b6040805180830381600087803b1580156105c657600080fd5b505af11580156105da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105fe9190613eff565b90925090506001600160a01b03848116908916146106265761062384838a308b611a55565b91505b876001600160a01b0316836001600160a01b03161461064f5761064c83828a308b611a55565b90505b61066e8661065d84846122ca565b6001600160a01b038b1691906122dd565b50505050505050505050565b60025482906001600160a01b038083169116146106a95760405162461bcd60e51b81526004016103f8906140dd565b6106b584348486612312565b5047156106c6576106c6334761248d565b50505050565b6000546001600160a01b031633146106f65760405162461bcd60e51b81526004016103f890614105565b6001600160a01b03811661074257600080546040516001600160a01b03909116914780156108fc02929091818181858888f1935050505015801561073e573d6000803e3d6000fd5b5050565b806001600160a01b031663a9059cbb6107636000546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b1580156107a257600080fd5b505afa1580156107b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107da9190613ee6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561082057600080fd5b505af1158015610834573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073e9190613ec4565b50565b6000546001600160a01b031633146108855760405162461bcd60e51b81526004016103f890614105565b6001600160a01b03928316600090815260036020908152604080832094861683529390529190912080546001600160a01b03191691909216179055565b60025482906001600160a01b038083169116146108f15760405162461bcd60e51b81526004016103f8906140dd565b6109066001600160a01b038616333087611951565b61091085846119bc565b6000856001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561094b57600080fd5b505afa15801561095f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109839190613c8b565b90506000866001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156109c057600080fd5b505afa1580156109d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f89190613c8b565b9050610a0482866119bc565b610a0e81866119bc565b6001546001600160a01b0383811691161480610a3757506001546001600160a01b038281169116145b15610b0e576001546000906001600160a01b0384811691161415610a5b5781610a5d565b825b9050600080876001600160a01b03166302751cec848b60008030426040518763ffffffff1660e01b8152600401610a999695949392919061403a565b6040805180830381600087803b158015610ab257600080fd5b505af1158015610ac6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aea9190613eff565b9092509050610afb8383898b612556565b50610b06878261248d565b505050610bb9565b600080866001600160a01b031663baa2abde85858b60008030426040518863ffffffff1660e01b8152600401610b4a9796959493929190613fb1565b6040805180830381600087803b158015610b6357600080fd5b505af1158015610b77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9b9190613eff565b9092509050610bac8483888a612556565b5061066e8382888a612556565b50505050505050565b6000546001600160a01b03163314610bec5760405162461bcd60e51b81526004016103f890614105565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610c385760405162461bcd60e51b81526004016103f890614105565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60025482906001600160a01b03808316911614610cb15760405162461bcd60e51b81526004016103f8906140dd565b610cc66001600160a01b038616333087611951565b6000859050610d45816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610d0757600080fd5b505afa158015610d1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3f9190613c8b565b856119bc565b610d81816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610d0757600080fd5b610d956001600160a01b03871687876122dd565b60405163226bf2d160e21b815230600482015260009081906001600160a01b038416906389afcb44906024016040805180830381600087803b158015610dda57600080fd5b505af1158015610dee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e129190613eff565b8092508193505050856001600160a01b031663e8e33700846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610e6257600080fd5b505afa158015610e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9a9190613c8b565b856001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610ed357600080fd5b505afa158015610ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0b9190613c8b565b85856000808c426040518963ffffffff1660e01b8152600401610f35989796959493929190613ff1565b606060405180830381600087803b158015610f4f57600080fd5b505af1158015610f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f879190613f23565b5050505050505050505050565b6000546001600160a01b03163314610fbe5760405162461bcd60e51b81526004016103f890614105565b6001600160a01b03166000908152600560205260409020805460ff19166001179055565b60025482906001600160a01b038083169116146110115760405162461bcd60e51b81526004016103f8906140dd565b6110266001600160a01b038616333087611951565b61103085846119bc565b61103c85858486612556565b505050505050565b600254600090819084906001600160a01b038083169116146110785760405162461bcd60e51b81526004016103f8906140dd565b856001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156110b157600080fd5b505afa1580156110c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e99190613c8b565b6001600160a01b0316876001600160a01b031614806111895750856001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561113c57600080fd5b505afa158015611150573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111749190613c8b565b6001600160a01b0316876001600160a01b0316145b156113c2576000866001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156111c957600080fd5b505afa1580156111dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112019190613c8b565b6001600160a01b0316886001600160a01b03161461128f57866001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561125257600080fd5b505afa158015611266573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128a9190613c8b565b611300565b866001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156112c857600080fd5b505afa1580156112dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113009190613c8b565b9050600061130f866002612996565b9050600061131f8a83858b6129a2565b9050886001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561135a57600080fd5b505afa15801561136e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113929190613c8b565b6001600160a01b03168a6001600160a01b031614156113b757909450925061166a9050565b9450925061166a9050565b6001546000906001600160a01b038981169116146113f9576001546113f490899087906001600160a01b0316896129a2565b6113fb565b845b9050866001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561143657600080fd5b505afa15801561144a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146e9190613c8b565b6001546001600160a01b039081169116141561152b5761148f816002612996565b600154611521906001600160a01b03166114aa846002612996565b8a6001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156114e357600080fd5b505afa1580156114f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151b9190613c8b565b8a6129a2565b935093505061166a565b866001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561156457600080fd5b505afa158015611578573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159c9190613c8b565b6001546001600160a01b039081169116141561164f57600154611644906001600160a01b03166115cd836002612996565b896001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561160657600080fd5b505afa15801561161a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163e9190613c8b565b896129a2565b611521826002612996565b60015461148f906001600160a01b03166115cd836002612996565b5094509492505050565b60025482906001600160a01b038083169116146116a35760405162461bcd60e51b81526004016103f8906140dd565b6116b86001600160a01b038716333088611951565b6116c286846119bc565b610bb98686868587611a55565b60025482906001600160a01b038083169116146116fe5760405162461bcd60e51b81526004016103f8906140dd565b61170886846119bc565b6001600160a01b03861660009081526004602052604090205460ff161561183b576040516323b872dd60e01b8152336004820152306024820152604481018690526001600160a01b038716906323b872dd90606401602060405180830381600087803b15801561177757600080fd5b505af115801561178b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117af9190613ec4565b506040516370a0823160e01b81523060048201526118359087906001600160a01b038216906370a082319060240160206040518083038186803b1580156117f557600080fd5b505afa158015611809573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182d9190613ee6565b868587613101565b5061103c565b6118506001600160a01b038716333088611951565b61185a86846119bc565b6118358686868587613101565b6000546001600160a01b031633146118915760405162461bcd60e51b81526004016103f890614105565b6001600160a01b0381166118f65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103f8565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03808516602483015283166044820152606481018290526106c69085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613481565b604051636eb1769f60e11b81523060048201526001600160a01b03828116602483015283169063dd62ed3e9060440160206040518083038186803b158015611a0357600080fd5b505afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b9190613ee6565b61073e5761073e6001600160a01b03831682600019613553565b6001600160a01b03808616600090815260036020818152604080842085871680865290835281852054898716865293835281852090855290915282205491928492918116911660608215801590611ab457506001600160a01b03821615155b15611c9657816001600160a01b0316836001600160a01b031614611bf95760408051600580825260c08201909252906020820160a0803683370190505090508981600081518110611b0757611b07614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611b3b57611b3b614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110611b6c57611b6c614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600381518110611ba057611ba0614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508781600481518110611bd457611bd4614222565b60200260200101906001600160a01b031690816001600160a01b0316815250506120f7565b6040805160038082526080820190925290602082016060803683370190505090508981600081518110611c2e57611c2e614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611c6257611c62614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508781600281518110611bd457611bd4614222565b6001600160a01b03831615611eb457876001600160a01b0316836001600160a01b03161415611d365760025b604051908082528060200260200182016040528015611ceb578160200160208202803683370190505b5090508981600081518110611d0257611d02614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508781600181518110611bd457611bd4614222565b6001546001600160a01b0389811691161415611de6576040805160038082526080820190925290602082016060803683370190505090508981600081518110611d8157611d81614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611db557611db5614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110611bd457611bd4614222565b60408051600480825260a0820190925290602082016080803683370190505090508981600081518110611e1b57611e1b614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611e4f57611e4f614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110611e8057611e80614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508781600381518110611bd457611bd4614222565b6001600160a01b0382161561200857816001600160a01b03168a6001600160a01b03161415611ee4576002611cc2565b6001546001600160a01b038b811691161415611f6f57604080516003808252608082019092529060208201606080368337505060015482519293506001600160a01b031691839150600090611f3b57611f3b614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600181518110611c6257611c62614222565b60408051600480825260a0820190925290602082016080803683370190505090508981600081518110611fa457611fa4614222565b6001600160a01b0392831660209182029290920101526001805483519216918391908110611fd457611fd4614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600281518110611e8057611e80614222565b6001546001600160a01b038b81169116148061203157506001546001600160a01b038981169116145b1561203d576002611cc2565b604080516003808252608082019092529060208201606080368337019050509050898160008151811061207257612072614222565b6001600160a01b03928316602091820292909201015260018054835192169183919081106120a2576120a2614222565b60200260200101906001600160a01b031690816001600160a01b03168152505087816002815181106120d6576120d6614222565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6001600160a01b038a1660009081526004602052604090205460609060ff161561220557604051635c11d79560e01b81526001600160a01b03861690635c11d79590612150908d9060009087908e904290600401614153565b600060405180830381600087803b15801561216a57600080fd5b505af115801561217e573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201526001600160a01b038c1692506370a08231915060240160206040518083038186803b1580156121c157600080fd5b505afa1580156121d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f99190613ee6565b955050505050506122c1565b6040516338ed173960e01b81526001600160a01b038616906338ed17399061223a908d9060009087908e904290600401614153565b600060405180830381600087803b15801561225457600080fd5b505af1158015612268573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122909190810190613dff565b905080600182516122a191906141c9565b815181106122b1576122b1614222565b6020026020010151955050505050505b95945050505050565b60006122d6828461418f565b9392505050565b6040516001600160a01b03831660248201526044810182905261230d90849063a9059cbb60e01b90606401611985565b505050565b6000808590506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561235357600080fd5b505afa158015612367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238b9190613c8b565b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156123c857600080fd5b505afa1580156123dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124009190613c8b565b6001549091506000906001600160a01b038481169116148061242f57506001546001600160a01b038381169116145b1561246d576001546000906001600160a01b038581169116146124525783612454565b825b9050612462818a898b613677565b935061247f92505050565b61247a83838a898b61378a565b925050505b93505050505b949350505050565b604080516000808252602082019092526001600160a01b0384169083906040516124b79190613f95565b60006040518083038185875af1925050503d80600081146124f4576040519150601f19603f3d011682016040523d82523d6000602084013e6124f9565b606091505b505090508061230d5760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b60648201526084016103f8565b6001600160a01b03848116600090815260036020908152604080832084861684529091528120549091606091849116156126d55760408051600380825260808201909252906020820160608036833701905050915086826000815181106125bf576125bf614222565b6001600160a01b0392831660209182029290920181019190915288821660009081526003825260408082208885168352909252205483519116908390600190811061260c5761260c614222565b60200260200101906001600160a01b031690816001600160a01b031681525050806001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561266557600080fd5b505afa158015612679573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269d9190613c8b565b826002815181106126b0576126b0614222565b60200260200101906001600160a01b031690816001600160a01b0316815250506127ce565b6040805160028082526060820183529091602083019080368337019050509150868260008151811061270957612709614222565b60200260200101906001600160a01b031690816001600160a01b031681525050806001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561276257600080fd5b505afa158015612776573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279a9190613c8b565b826001815181106127ad576127ad614222565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6001600160a01b03871660009081526004602052604090205460ff16156128d65760405163791ac94760e01b81526001600160a01b0382169063791ac9479061282490899060009087908b904290600401614153565b600060405180830381600087803b15801561283e57600080fd5b505af1158015612852573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201526001600160a01b038a1692506370a08231915060240160206040518083038186803b15801561289557600080fd5b505afa1580156128a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128cd9190613ee6565b92505050612485565b6040516318cbafe560e01b81526000906001600160a01b038316906318cbafe59061290d908a90859088908c904290600401614153565b600060405180830381600087803b15801561292757600080fd5b505af115801561293b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129639190810190613dff565b9050806001825161297491906141c9565b8151811061298457612984614222565b60200260200101519350505050612485565b60006122d682846141a7565b6001600160a01b03808516600090815260036020818152604080842085871680865290835281852054888716865293835281852090855290915282205491928492918116911660608215801590612a0157506001600160a01b03821615155b15612be357816001600160a01b0316836001600160a01b031614612b465760408051600580825260c08201909252906020820160a0803683370190505090508881600081518110612a5457612a54614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110612a8857612a88614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110612ab957612ab9614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600381518110612aed57612aed614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508681600481518110612b2157612b21614222565b60200260200101906001600160a01b031690816001600160a01b031681525050613044565b6040805160038082526080820190925290602082016060803683370190505090508881600081518110612b7b57612b7b614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110612baf57612baf614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508681600281518110612b2157612b21614222565b6001600160a01b03831615612e0157866001600160a01b0316836001600160a01b03161415612c835760025b604051908082528060200260200182016040528015612c38578160200160208202803683370190505b5090508881600081518110612c4f57612c4f614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508681600181518110612b2157612b21614222565b6001546001600160a01b0388811691161415612d33576040805160038082526080820190925290602082016060803683370190505090508881600081518110612cce57612cce614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110612d0257612d02614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110612b2157612b21614222565b60408051600480825260a0820190925290602082016080803683370190505090508881600081518110612d6857612d68614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110612d9c57612d9c614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110612dcd57612dcd614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508681600381518110612b2157612b21614222565b6001600160a01b03821615612f5557816001600160a01b0316896001600160a01b03161415612e31576002612c0f565b6001546001600160a01b038a811691161415612ebc57604080516003808252608082019092529060208201606080368337505060015482519293506001600160a01b031691839150600090612e8857612e88614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600181518110612baf57612baf614222565b60408051600480825260a0820190925290602082016080803683370190505090508881600081518110612ef157612ef1614222565b6001600160a01b0392831660209182029290920101526001805483519216918391908110612f2157612f21614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600281518110612dcd57612dcd614222565b6001546001600160a01b038a811691161480612f7e57506001546001600160a01b038881169116145b15612f8a576002612c0f565b6040805160038082526080820190925290602082016060803683370190505090508881600081518110612fbf57612fbf614222565b6001600160a01b0392831660209182029290920101526001805483519216918391908110612fef57612fef614222565b60200260200101906001600160a01b031690816001600160a01b031681525050868160028151811061302357613023614222565b60200260200101906001600160a01b031690816001600160a01b0316815250505b60405163d06ca61f60e01b81526000906001600160a01b0386169063d06ca61f90613075908c90869060040161413a565b60006040518083038186803b15801561308d57600080fd5b505afa1580156130a1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130c99190810190613dff565b905080600182516130da91906141c9565b815181106130ea576130ea614222565b602002602001015195505050505050949350505050565b6000836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561313c57600080fd5b505afa158015613150573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131749190613c8b565b6001600160a01b0316866001600160a01b031614806132145750836001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156131c757600080fd5b505afa1580156131db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ff9190613c8b565b6001600160a01b0316866001600160a01b0316145b1561345d576000846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561325457600080fd5b505afa158015613268573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061328c9190613c8b565b6001600160a01b0316876001600160a01b03161461331a57846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156132dd57600080fd5b505afa1580156132f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133159190613c8b565b61338b565b846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561335357600080fd5b505afa158015613367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061338b9190613c8b565b905061339781846119bc565b60006133a4876002612996565b905060006133b58983853089611a55565b905060006001600160a01b03861663e8e337008b866133d48d88613880565b866000808e426040518963ffffffff1660e01b81526004016133fd989796959493929190613ff1565b606060405180830381600087803b15801561341757600080fd5b505af115801561342b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061344f9190613f23565b96506122c195505050505050565b600061346b87873086612556565b905061347985828686612312565b9150506122c1565b60006134d6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661388c9092919063ffffffff16565b80519091501561230d57808060200190518101906134f49190613ec4565b61230d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f8565b8015806135dc5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156135a257600080fd5b505afa1580156135b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135da9190613ee6565b155b6136475760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b60648201526084016103f8565b6040516001600160a01b03831660248201526044810182905261230d90849063095ea7b360e01b90606401611985565b6000808080613687876002612996565b905060006136978983308a61389b565b90506136a389886119bc565b6001600160a01b03871660009081526005602052604090205460ff161561376657866001600160a01b03811663d427d12c6136de8b86613880565b8c856000808d426040518863ffffffff1660e01b81526004016137069695949392919061403a565b6060604051808303818588803b15801561371f57600080fd5b505af1158015613733573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906137589190613f23565b955095509550505050613780565b866001600160a01b03811663f305d7196136de8b86613880565b9450945094915050565b600080808061379a876002612996565b905060006137aa8a83308a61389b565b905060006137c38a6137bc8b86613880565b308b61389b565b90506137cf8b896119bc565b6137d98a896119bc565b6000889050806001600160a01b031663e8e337008d8d86866000808f426040518963ffffffff1660e01b8152600401613819989796959493929190613ff1565b606060405180830381600087803b15801561383357600080fd5b505af1158015613847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061386b9190613f23565b96509650965050505050955095509592505050565b60006122d682846141c9565b60606124858484600085613b0d565b6001600160a01b03848116600090815260036020908152604080832084861684529091528120549091606091849116156139b657604080516003808252608082019092529060208201606080368337505060015482519294506001600160a01b03169184915060009061391057613910614222565b6001600160a01b0392831660209182029290920181019190915288821660009081526003825260408082208885168352909252205483519116908390600190811061395d5761395d614222565b60200260200101906001600160a01b031690816001600160a01b031681525050868260028151811061399157613991614222565b60200260200101906001600160a01b031690816001600160a01b031681525050613a4b565b6040805160028082526060820183529091602083019080368337505060015482519294506001600160a01b0316918491506000906139f6576139f6614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508682600181518110613a2a57613a2a614222565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6000816001600160a01b0316637ff36ab5886000868a426040518663ffffffff1660e01b8152600401613a819493929190614075565b6000604051808303818588803b158015613a9a57600080fd5b505af1158015613aae573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052613ad79190810190613dff565b90508060018251613ae891906141c9565b81518110613af857613af8614222565b60200260200101519350505050949350505050565b606082471015613b6e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103f8565b843b613bbc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f8565b600080866001600160a01b03168587604051613bd89190613f95565b60006040518083038185875af1925050503d8060008114613c15576040519150601f19603f3d011682016040523d82523d6000602084013e613c1a565b606091505b5091509150613c2a828286613c35565b979650505050505050565b60608315613c445750816122d6565b825115613c545782518084602001fd5b8160405162461bcd60e51b81526004016103f891906140aa565b600060208284031215613c8057600080fd5b81356122d68161424e565b600060208284031215613c9d57600080fd5b81516122d68161424e565b600080600060608486031215613cbd57600080fd5b8335613cc88161424e565b92506020840135613cd88161424e565b91506040840135613ce88161424e565b809150509250925092565b60008060008060808587031215613d0957600080fd5b8435613d148161424e565b93506020850135613d248161424e565b92506040850135613d348161424e565b9396929550929360600135925050565b60008060008060808587031215613d5a57600080fd5b8435613d658161424e565b9350602085013592506040850135613d7c8161424e565b91506060850135613d8c8161424e565b939692955090935050565b600080600080600060a08688031215613daf57600080fd5b8535613dba8161424e565b9450602086013593506040860135613dd18161424e565b92506060860135613de18161424e565b91506080860135613df18161424e565b809150509295509295909350565b60006020808385031215613e1257600080fd5b825167ffffffffffffffff80821115613e2a57600080fd5b818501915085601f830112613e3e57600080fd5b815181811115613e5057613e50614238565b8060051b604051601f19603f83011681018181108582111715613e7557613e75614238565b604052828152858101935084860182860187018a1015613e9457600080fd5b600095505b83861015613eb7578051855260019590950194938601938601613e99565b5098975050505050505050565b600060208284031215613ed657600080fd5b815180151581146122d657600080fd5b600060208284031215613ef857600080fd5b5051919050565b60008060408385031215613f1257600080fd5b505080516020909101519092909150565b600080600060608486031215613f3857600080fd5b8351925060208401519150604084015190509250925092565b600081518084526020808501945080840160005b83811015613f8a5781516001600160a01b031687529582019590820190600101613f65565b509495945050505050565b60008251613fa78184602087016141e0565b9190910192915050565b6001600160a01b039788168152958716602087015260408601949094526060850192909252608084015290921660a082015260c081019190915260e00190565b6001600160a01b039889168152968816602088015260408701959095526060860193909352608085019190915260a084015290921660c082015260e08101919091526101000190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b84815260806020820152600061408e6080830186613f51565b6001600160a01b03949094166040830152506060015292915050565b60208152600082518060208401526140c98160408501602087016141e0565b601f01601f19169190910160400192915050565b6020808252600e908201526d34b73b30b634b2103937baba32b960911b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8281526040602082015260006124856040830184613f51565b85815284602082015260a06040820152600061417260a0830186613f51565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156141a2576141a261420c565b500190565b6000826141c457634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156141db576141db61420c565b500390565b60005b838110156141fb5781810151838201526020016141e3565b838111156106c65750506000910152565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461085857600080fdfea2646970667358221220b81396dcf7fbc45db4cbcfdc7a11d320388a6fe6a2c8a9865b4dc9be15be0f8b64736f6c63430008070033000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Deployed Bytecode
0x6080604052600436106101185760003560e01c806388f61f9f116100a05780639416cbc6116100645780639416cbc6146102fe578063ba2ebf961461033e578063caaae7f51461035e578063cee6202c1461038e578063f2fde38b146103ae57600080fd5b806388f61f9f1461024b57806388fbe4191461026b57806389fecbd51461028b5780638da5cb5b146102ab5780638e8d8152146102c957600080fd5b806351cff8d9116100e757806351cff8d9146101b65780635424888b146101d65780635cc7647c146101f65780636de6332d14610216578063715018a61461023657600080fd5b8063104bfe551461012457806313aab8ef146101465780631b71afbd1461018357806335e8b7d5146101a357600080fd5b3661011f57005b600080fd5b34801561013057600080fd5b5061014461013f366004613c6e565b6103ce565b005b34801561015257600080fd5b50600254610166906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561018f57600080fd5b5061014461019e366004613d97565b610425565b6101446101b1366004613ca8565b61067a565b3480156101c257600080fd5b506101446101d1366004613c6e565b6106cc565b3480156101e257600080fd5b506101446101f1366004613ca8565b61085b565b34801561020257600080fd5b50610144610211366004613d44565b6108c2565b34801561022257600080fd5b50610144610231366004613c6e565b610bc2565b34801561024257600080fd5b50610144610c0e565b34801561025757600080fd5b50610144610266366004613d44565b610c82565b34801561027757600080fd5b50610144610286366004613c6e565b610f94565b34801561029757600080fd5b506101446102a6366004613d44565b610fe2565b3480156102b757600080fd5b506000546001600160a01b0316610166565b3480156102d557600080fd5b506102e96102e4366004613cf3565b611044565b6040805192835260208301919091520161017a565b34801561030a57600080fd5b5061032e610319366004613c6e565b60056020526000908152604090205460ff1681565b604051901515815260200161017a565b34801561034a57600080fd5b50610144610359366004613d97565b611674565b34801561036a57600080fd5b5061032e610379366004613c6e565b60046020526000908152604090205460ff1681565b34801561039a57600080fd5b506101446103a9366004613d97565b6116cf565b3480156103ba57600080fd5b506101446103c9366004613c6e565b611867565b6000546001600160a01b031633146104015760405162461bcd60e51b81526004016103f890614105565b60405180910390fd5b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b60025482906001600160a01b038083169116146104545760405162461bcd60e51b81526004016103f8906140dd565b6104696001600160a01b038716333088611951565b61047386846119bc565b6000866001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156104ae57600080fd5b505afa1580156104c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e69190613c8b565b90506000876001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561052357600080fd5b505afa158015610537573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055b9190613c8b565b905061056782866119bc565b61057181866119bc565b600080866001600160a01b031663baa2abde85858c60008030426040518863ffffffff1660e01b81526004016105ad9796959493929190613fb1565b6040805180830381600087803b1580156105c657600080fd5b505af11580156105da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105fe9190613eff565b90925090506001600160a01b03848116908916146106265761062384838a308b611a55565b91505b876001600160a01b0316836001600160a01b03161461064f5761064c83828a308b611a55565b90505b61066e8661065d84846122ca565b6001600160a01b038b1691906122dd565b50505050505050505050565b60025482906001600160a01b038083169116146106a95760405162461bcd60e51b81526004016103f8906140dd565b6106b584348486612312565b5047156106c6576106c6334761248d565b50505050565b6000546001600160a01b031633146106f65760405162461bcd60e51b81526004016103f890614105565b6001600160a01b03811661074257600080546040516001600160a01b03909116914780156108fc02929091818181858888f1935050505015801561073e573d6000803e3d6000fd5b5050565b806001600160a01b031663a9059cbb6107636000546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b1580156107a257600080fd5b505afa1580156107b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107da9190613ee6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561082057600080fd5b505af1158015610834573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073e9190613ec4565b50565b6000546001600160a01b031633146108855760405162461bcd60e51b81526004016103f890614105565b6001600160a01b03928316600090815260036020908152604080832094861683529390529190912080546001600160a01b03191691909216179055565b60025482906001600160a01b038083169116146108f15760405162461bcd60e51b81526004016103f8906140dd565b6109066001600160a01b038616333087611951565b61091085846119bc565b6000856001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561094b57600080fd5b505afa15801561095f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109839190613c8b565b90506000866001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156109c057600080fd5b505afa1580156109d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f89190613c8b565b9050610a0482866119bc565b610a0e81866119bc565b6001546001600160a01b0383811691161480610a3757506001546001600160a01b038281169116145b15610b0e576001546000906001600160a01b0384811691161415610a5b5781610a5d565b825b9050600080876001600160a01b03166302751cec848b60008030426040518763ffffffff1660e01b8152600401610a999695949392919061403a565b6040805180830381600087803b158015610ab257600080fd5b505af1158015610ac6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aea9190613eff565b9092509050610afb8383898b612556565b50610b06878261248d565b505050610bb9565b600080866001600160a01b031663baa2abde85858b60008030426040518863ffffffff1660e01b8152600401610b4a9796959493929190613fb1565b6040805180830381600087803b158015610b6357600080fd5b505af1158015610b77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9b9190613eff565b9092509050610bac8483888a612556565b5061066e8382888a612556565b50505050505050565b6000546001600160a01b03163314610bec5760405162461bcd60e51b81526004016103f890614105565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610c385760405162461bcd60e51b81526004016103f890614105565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60025482906001600160a01b03808316911614610cb15760405162461bcd60e51b81526004016103f8906140dd565b610cc66001600160a01b038616333087611951565b6000859050610d45816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610d0757600080fd5b505afa158015610d1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3f9190613c8b565b856119bc565b610d81816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610d0757600080fd5b610d956001600160a01b03871687876122dd565b60405163226bf2d160e21b815230600482015260009081906001600160a01b038416906389afcb44906024016040805180830381600087803b158015610dda57600080fd5b505af1158015610dee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e129190613eff565b8092508193505050856001600160a01b031663e8e33700846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610e6257600080fd5b505afa158015610e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9a9190613c8b565b856001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610ed357600080fd5b505afa158015610ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0b9190613c8b565b85856000808c426040518963ffffffff1660e01b8152600401610f35989796959493929190613ff1565b606060405180830381600087803b158015610f4f57600080fd5b505af1158015610f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f879190613f23565b5050505050505050505050565b6000546001600160a01b03163314610fbe5760405162461bcd60e51b81526004016103f890614105565b6001600160a01b03166000908152600560205260409020805460ff19166001179055565b60025482906001600160a01b038083169116146110115760405162461bcd60e51b81526004016103f8906140dd565b6110266001600160a01b038616333087611951565b61103085846119bc565b61103c85858486612556565b505050505050565b600254600090819084906001600160a01b038083169116146110785760405162461bcd60e51b81526004016103f8906140dd565b856001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156110b157600080fd5b505afa1580156110c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e99190613c8b565b6001600160a01b0316876001600160a01b031614806111895750856001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561113c57600080fd5b505afa158015611150573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111749190613c8b565b6001600160a01b0316876001600160a01b0316145b156113c2576000866001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156111c957600080fd5b505afa1580156111dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112019190613c8b565b6001600160a01b0316886001600160a01b03161461128f57866001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561125257600080fd5b505afa158015611266573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128a9190613c8b565b611300565b866001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156112c857600080fd5b505afa1580156112dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113009190613c8b565b9050600061130f866002612996565b9050600061131f8a83858b6129a2565b9050886001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561135a57600080fd5b505afa15801561136e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113929190613c8b565b6001600160a01b03168a6001600160a01b031614156113b757909450925061166a9050565b9450925061166a9050565b6001546000906001600160a01b038981169116146113f9576001546113f490899087906001600160a01b0316896129a2565b6113fb565b845b9050866001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561143657600080fd5b505afa15801561144a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146e9190613c8b565b6001546001600160a01b039081169116141561152b5761148f816002612996565b600154611521906001600160a01b03166114aa846002612996565b8a6001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156114e357600080fd5b505afa1580156114f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151b9190613c8b565b8a6129a2565b935093505061166a565b866001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561156457600080fd5b505afa158015611578573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159c9190613c8b565b6001546001600160a01b039081169116141561164f57600154611644906001600160a01b03166115cd836002612996565b896001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561160657600080fd5b505afa15801561161a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163e9190613c8b565b896129a2565b611521826002612996565b60015461148f906001600160a01b03166115cd836002612996565b5094509492505050565b60025482906001600160a01b038083169116146116a35760405162461bcd60e51b81526004016103f8906140dd565b6116b86001600160a01b038716333088611951565b6116c286846119bc565b610bb98686868587611a55565b60025482906001600160a01b038083169116146116fe5760405162461bcd60e51b81526004016103f8906140dd565b61170886846119bc565b6001600160a01b03861660009081526004602052604090205460ff161561183b576040516323b872dd60e01b8152336004820152306024820152604481018690526001600160a01b038716906323b872dd90606401602060405180830381600087803b15801561177757600080fd5b505af115801561178b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117af9190613ec4565b506040516370a0823160e01b81523060048201526118359087906001600160a01b038216906370a082319060240160206040518083038186803b1580156117f557600080fd5b505afa158015611809573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182d9190613ee6565b868587613101565b5061103c565b6118506001600160a01b038716333088611951565b61185a86846119bc565b6118358686868587613101565b6000546001600160a01b031633146118915760405162461bcd60e51b81526004016103f890614105565b6001600160a01b0381166118f65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103f8565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03808516602483015283166044820152606481018290526106c69085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613481565b604051636eb1769f60e11b81523060048201526001600160a01b03828116602483015283169063dd62ed3e9060440160206040518083038186803b158015611a0357600080fd5b505afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b9190613ee6565b61073e5761073e6001600160a01b03831682600019613553565b6001600160a01b03808616600090815260036020818152604080842085871680865290835281852054898716865293835281852090855290915282205491928492918116911660608215801590611ab457506001600160a01b03821615155b15611c9657816001600160a01b0316836001600160a01b031614611bf95760408051600580825260c08201909252906020820160a0803683370190505090508981600081518110611b0757611b07614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611b3b57611b3b614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110611b6c57611b6c614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600381518110611ba057611ba0614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508781600481518110611bd457611bd4614222565b60200260200101906001600160a01b031690816001600160a01b0316815250506120f7565b6040805160038082526080820190925290602082016060803683370190505090508981600081518110611c2e57611c2e614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611c6257611c62614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508781600281518110611bd457611bd4614222565b6001600160a01b03831615611eb457876001600160a01b0316836001600160a01b03161415611d365760025b604051908082528060200260200182016040528015611ceb578160200160208202803683370190505b5090508981600081518110611d0257611d02614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508781600181518110611bd457611bd4614222565b6001546001600160a01b0389811691161415611de6576040805160038082526080820190925290602082016060803683370190505090508981600081518110611d8157611d81614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611db557611db5614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110611bd457611bd4614222565b60408051600480825260a0820190925290602082016080803683370190505090508981600081518110611e1b57611e1b614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611e4f57611e4f614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110611e8057611e80614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508781600381518110611bd457611bd4614222565b6001600160a01b0382161561200857816001600160a01b03168a6001600160a01b03161415611ee4576002611cc2565b6001546001600160a01b038b811691161415611f6f57604080516003808252608082019092529060208201606080368337505060015482519293506001600160a01b031691839150600090611f3b57611f3b614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600181518110611c6257611c62614222565b60408051600480825260a0820190925290602082016080803683370190505090508981600081518110611fa457611fa4614222565b6001600160a01b0392831660209182029290920101526001805483519216918391908110611fd457611fd4614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600281518110611e8057611e80614222565b6001546001600160a01b038b81169116148061203157506001546001600160a01b038981169116145b1561203d576002611cc2565b604080516003808252608082019092529060208201606080368337019050509050898160008151811061207257612072614222565b6001600160a01b03928316602091820292909201015260018054835192169183919081106120a2576120a2614222565b60200260200101906001600160a01b031690816001600160a01b03168152505087816002815181106120d6576120d6614222565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6001600160a01b038a1660009081526004602052604090205460609060ff161561220557604051635c11d79560e01b81526001600160a01b03861690635c11d79590612150908d9060009087908e904290600401614153565b600060405180830381600087803b15801561216a57600080fd5b505af115801561217e573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201526001600160a01b038c1692506370a08231915060240160206040518083038186803b1580156121c157600080fd5b505afa1580156121d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f99190613ee6565b955050505050506122c1565b6040516338ed173960e01b81526001600160a01b038616906338ed17399061223a908d9060009087908e904290600401614153565b600060405180830381600087803b15801561225457600080fd5b505af1158015612268573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122909190810190613dff565b905080600182516122a191906141c9565b815181106122b1576122b1614222565b6020026020010151955050505050505b95945050505050565b60006122d6828461418f565b9392505050565b6040516001600160a01b03831660248201526044810182905261230d90849063a9059cbb60e01b90606401611985565b505050565b6000808590506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561235357600080fd5b505afa158015612367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238b9190613c8b565b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156123c857600080fd5b505afa1580156123dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124009190613c8b565b6001549091506000906001600160a01b038481169116148061242f57506001546001600160a01b038381169116145b1561246d576001546000906001600160a01b038581169116146124525783612454565b825b9050612462818a898b613677565b935061247f92505050565b61247a83838a898b61378a565b925050505b93505050505b949350505050565b604080516000808252602082019092526001600160a01b0384169083906040516124b79190613f95565b60006040518083038185875af1925050503d80600081146124f4576040519150601f19603f3d011682016040523d82523d6000602084013e6124f9565b606091505b505090508061230d5760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b60648201526084016103f8565b6001600160a01b03848116600090815260036020908152604080832084861684529091528120549091606091849116156126d55760408051600380825260808201909252906020820160608036833701905050915086826000815181106125bf576125bf614222565b6001600160a01b0392831660209182029290920181019190915288821660009081526003825260408082208885168352909252205483519116908390600190811061260c5761260c614222565b60200260200101906001600160a01b031690816001600160a01b031681525050806001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561266557600080fd5b505afa158015612679573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269d9190613c8b565b826002815181106126b0576126b0614222565b60200260200101906001600160a01b031690816001600160a01b0316815250506127ce565b6040805160028082526060820183529091602083019080368337019050509150868260008151811061270957612709614222565b60200260200101906001600160a01b031690816001600160a01b031681525050806001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561276257600080fd5b505afa158015612776573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279a9190613c8b565b826001815181106127ad576127ad614222565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6001600160a01b03871660009081526004602052604090205460ff16156128d65760405163791ac94760e01b81526001600160a01b0382169063791ac9479061282490899060009087908b904290600401614153565b600060405180830381600087803b15801561283e57600080fd5b505af1158015612852573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201526001600160a01b038a1692506370a08231915060240160206040518083038186803b15801561289557600080fd5b505afa1580156128a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128cd9190613ee6565b92505050612485565b6040516318cbafe560e01b81526000906001600160a01b038316906318cbafe59061290d908a90859088908c904290600401614153565b600060405180830381600087803b15801561292757600080fd5b505af115801561293b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129639190810190613dff565b9050806001825161297491906141c9565b8151811061298457612984614222565b60200260200101519350505050612485565b60006122d682846141a7565b6001600160a01b03808516600090815260036020818152604080842085871680865290835281852054888716865293835281852090855290915282205491928492918116911660608215801590612a0157506001600160a01b03821615155b15612be357816001600160a01b0316836001600160a01b031614612b465760408051600580825260c08201909252906020820160a0803683370190505090508881600081518110612a5457612a54614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110612a8857612a88614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110612ab957612ab9614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600381518110612aed57612aed614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508681600481518110612b2157612b21614222565b60200260200101906001600160a01b031690816001600160a01b031681525050613044565b6040805160038082526080820190925290602082016060803683370190505090508881600081518110612b7b57612b7b614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110612baf57612baf614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508681600281518110612b2157612b21614222565b6001600160a01b03831615612e0157866001600160a01b0316836001600160a01b03161415612c835760025b604051908082528060200260200182016040528015612c38578160200160208202803683370190505b5090508881600081518110612c4f57612c4f614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508681600181518110612b2157612b21614222565b6001546001600160a01b0388811691161415612d33576040805160038082526080820190925290602082016060803683370190505090508881600081518110612cce57612cce614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110612d0257612d02614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110612b2157612b21614222565b60408051600480825260a0820190925290602082016080803683370190505090508881600081518110612d6857612d68614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110612d9c57612d9c614222565b6001600160a01b039283166020918202929092010152600154825191169082906002908110612dcd57612dcd614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508681600381518110612b2157612b21614222565b6001600160a01b03821615612f5557816001600160a01b0316896001600160a01b03161415612e31576002612c0f565b6001546001600160a01b038a811691161415612ebc57604080516003808252608082019092529060208201606080368337505060015482519293506001600160a01b031691839150600090612e8857612e88614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600181518110612baf57612baf614222565b60408051600480825260a0820190925290602082016080803683370190505090508881600081518110612ef157612ef1614222565b6001600160a01b0392831660209182029290920101526001805483519216918391908110612f2157612f21614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508181600281518110612dcd57612dcd614222565b6001546001600160a01b038a811691161480612f7e57506001546001600160a01b038881169116145b15612f8a576002612c0f565b6040805160038082526080820190925290602082016060803683370190505090508881600081518110612fbf57612fbf614222565b6001600160a01b0392831660209182029290920101526001805483519216918391908110612fef57612fef614222565b60200260200101906001600160a01b031690816001600160a01b031681525050868160028151811061302357613023614222565b60200260200101906001600160a01b031690816001600160a01b0316815250505b60405163d06ca61f60e01b81526000906001600160a01b0386169063d06ca61f90613075908c90869060040161413a565b60006040518083038186803b15801561308d57600080fd5b505afa1580156130a1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130c99190810190613dff565b905080600182516130da91906141c9565b815181106130ea576130ea614222565b602002602001015195505050505050949350505050565b6000836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561313c57600080fd5b505afa158015613150573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131749190613c8b565b6001600160a01b0316866001600160a01b031614806132145750836001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156131c757600080fd5b505afa1580156131db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ff9190613c8b565b6001600160a01b0316866001600160a01b0316145b1561345d576000846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561325457600080fd5b505afa158015613268573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061328c9190613c8b565b6001600160a01b0316876001600160a01b03161461331a57846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156132dd57600080fd5b505afa1580156132f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133159190613c8b565b61338b565b846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561335357600080fd5b505afa158015613367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061338b9190613c8b565b905061339781846119bc565b60006133a4876002612996565b905060006133b58983853089611a55565b905060006001600160a01b03861663e8e337008b866133d48d88613880565b866000808e426040518963ffffffff1660e01b81526004016133fd989796959493929190613ff1565b606060405180830381600087803b15801561341757600080fd5b505af115801561342b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061344f9190613f23565b96506122c195505050505050565b600061346b87873086612556565b905061347985828686612312565b9150506122c1565b60006134d6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661388c9092919063ffffffff16565b80519091501561230d57808060200190518101906134f49190613ec4565b61230d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f8565b8015806135dc5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156135a257600080fd5b505afa1580156135b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135da9190613ee6565b155b6136475760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b60648201526084016103f8565b6040516001600160a01b03831660248201526044810182905261230d90849063095ea7b360e01b90606401611985565b6000808080613687876002612996565b905060006136978983308a61389b565b90506136a389886119bc565b6001600160a01b03871660009081526005602052604090205460ff161561376657866001600160a01b03811663d427d12c6136de8b86613880565b8c856000808d426040518863ffffffff1660e01b81526004016137069695949392919061403a565b6060604051808303818588803b15801561371f57600080fd5b505af1158015613733573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906137589190613f23565b955095509550505050613780565b866001600160a01b03811663f305d7196136de8b86613880565b9450945094915050565b600080808061379a876002612996565b905060006137aa8a83308a61389b565b905060006137c38a6137bc8b86613880565b308b61389b565b90506137cf8b896119bc565b6137d98a896119bc565b6000889050806001600160a01b031663e8e337008d8d86866000808f426040518963ffffffff1660e01b8152600401613819989796959493929190613ff1565b606060405180830381600087803b15801561383357600080fd5b505af1158015613847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061386b9190613f23565b96509650965050505050955095509592505050565b60006122d682846141c9565b60606124858484600085613b0d565b6001600160a01b03848116600090815260036020908152604080832084861684529091528120549091606091849116156139b657604080516003808252608082019092529060208201606080368337505060015482519294506001600160a01b03169184915060009061391057613910614222565b6001600160a01b0392831660209182029290920181019190915288821660009081526003825260408082208885168352909252205483519116908390600190811061395d5761395d614222565b60200260200101906001600160a01b031690816001600160a01b031681525050868260028151811061399157613991614222565b60200260200101906001600160a01b031690816001600160a01b031681525050613a4b565b6040805160028082526060820183529091602083019080368337505060015482519294506001600160a01b0316918491506000906139f6576139f6614222565b60200260200101906001600160a01b031690816001600160a01b0316815250508682600181518110613a2a57613a2a614222565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6000816001600160a01b0316637ff36ab5886000868a426040518663ffffffff1660e01b8152600401613a819493929190614075565b6000604051808303818588803b158015613a9a57600080fd5b505af1158015613aae573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052613ad79190810190613dff565b90508060018251613ae891906141c9565b81518110613af857613af8614222565b60200260200101519350505050949350505050565b606082471015613b6e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103f8565b843b613bbc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f8565b600080866001600160a01b03168587604051613bd89190613f95565b60006040518083038185875af1925050503d8060008114613c15576040519150601f19603f3d011682016040523d82523d6000602084013e613c1a565b606091505b5091509150613c2a828286613c35565b979650505050505050565b60608315613c445750816122d6565b825115613c545782518084602001fd5b8160405162461bcd60e51b81526004016103f891906140aa565b600060208284031215613c8057600080fd5b81356122d68161424e565b600060208284031215613c9d57600080fd5b81516122d68161424e565b600080600060608486031215613cbd57600080fd5b8335613cc88161424e565b92506020840135613cd88161424e565b91506040840135613ce88161424e565b809150509250925092565b60008060008060808587031215613d0957600080fd5b8435613d148161424e565b93506020850135613d248161424e565b92506040850135613d348161424e565b9396929550929360600135925050565b60008060008060808587031215613d5a57600080fd5b8435613d658161424e565b9350602085013592506040850135613d7c8161424e565b91506060850135613d8c8161424e565b939692955090935050565b600080600080600060a08688031215613daf57600080fd5b8535613dba8161424e565b9450602086013593506040860135613dd18161424e565b92506060860135613de18161424e565b91506080860135613df18161424e565b809150509295509295909350565b60006020808385031215613e1257600080fd5b825167ffffffffffffffff80821115613e2a57600080fd5b818501915085601f830112613e3e57600080fd5b815181811115613e5057613e50614238565b8060051b604051601f19603f83011681018181108582111715613e7557613e75614238565b604052828152858101935084860182860187018a1015613e9457600080fd5b600095505b83861015613eb7578051855260019590950194938601938601613e99565b5098975050505050505050565b600060208284031215613ed657600080fd5b815180151581146122d657600080fd5b600060208284031215613ef857600080fd5b5051919050565b60008060408385031215613f1257600080fd5b505080516020909101519092909150565b600080600060608486031215613f3857600080fd5b8351925060208401519150604084015190509250925092565b600081518084526020808501945080840160005b83811015613f8a5781516001600160a01b031687529582019590820190600101613f65565b509495945050505050565b60008251613fa78184602087016141e0565b9190910192915050565b6001600160a01b039788168152958716602087015260408601949094526060850192909252608084015290921660a082015260c081019190915260e00190565b6001600160a01b039889168152968816602088015260408701959095526060860193909352608085019190915260a084015290921660c082015260e08101919091526101000190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b84815260806020820152600061408e6080830186613f51565b6001600160a01b03949094166040830152506060015292915050565b60208152600082518060208401526140c98160408501602087016141e0565b601f01601f19169190910160400192915050565b6020808252600e908201526d34b73b30b634b2103937baba32b960911b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8281526040602082015260006124856040830184613f51565b85815284602082015260a06040820152600061417260a0830186613f51565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156141a2576141a261420c565b500190565b6000826141c457634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156141db576141db61420c565b500390565b60005b838110156141fb5781810151838201526020016141e3565b838111156106c65750506000910152565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461085857600080fdfea2646970667358221220b81396dcf7fbc45db4cbcfdc7a11d320388a6fe6a2c8a9865b4dc9be15be0f8b64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
-----Decoded View---------------
Arg [0] : _WNATIVE (address): 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Deployed Bytecode Sourcemap
37719:20227:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57833:110;;;;;;;;;;-1:-1:-1;57833:110:0;;;;;:::i;:::-;;:::i;:::-;;37905:26;;;;;;;;;;-1:-1:-1;37905:26:0;;;;-1:-1:-1;;;;;37905:26:0;;;;;;-1:-1:-1;;;;;6069:32:1;;;6051:51;;6039:2;6024:18;37905:26:0;;;;;;;;43964:1031;;;;;;;;;;-1:-1:-1;43964:1031:0;;;;;:::i;:::-;;:::i;41150:393::-;;;;;;:::i;:::-;;:::i;57430:275::-;;;;;;;;;;-1:-1:-1;57430:275:0;;;;;:::i;:::-;;:::i;57133:171::-;;;;;;;;;;-1:-1:-1;57133:171:0;;;;;:::i;:::-;;:::i;42215:1741::-;;;;;;;;;;-1:-1:-1;42215:1741:0;;;;;:::i;:::-;;:::i;57312:110::-;;;;;;;;;;-1:-1:-1;57312:110:0;;;;;:::i;:::-;;:::i;36221:148::-;;;;;;;;;;;;;:::i;41551:656::-;;;;;;;;;;-1:-1:-1;41551:656:0;;;;;:::i;:::-;;:::i;57713:112::-;;;;;;;;;;-1:-1:-1;57713:112:0;;;;;:::i;:::-;;:::i;45347:335::-;;;;;;;;;;-1:-1:-1;45347:335:0;;;;;:::i;:::-;;:::i;35570:87::-;;;;;;;;;;-1:-1:-1;35616:7:0;35643:6;-1:-1:-1;;;;;35643:6:0;35570:87;;39322:1820;;;;;;;;;;-1:-1:-1;39322:1820:0;;;;;:::i;:::-;;:::i;:::-;;;;14458:25:1;;;14514:2;14499:18;;14492:34;;;;14431:18;39322:1820:0;14284:248:1;38079:48:0;;;;;;;;;;-1:-1:-1;38079:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9316:14:1;;9309:22;9291:41;;9279:2;9264:18;38079:48:0;9151:187:1;45003:336:0;;;;;;;;;;-1:-1:-1;45003:336:0;;;;;:::i;:::-;;:::i;38023:47::-;;;;;;;;;;-1:-1:-1;38023:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;38444:870;;;;;;;;;;-1:-1:-1;38444:870:0;;;;;:::i;:::-;;:::i;36524:244::-;;;;;;;;;;-1:-1:-1;36524:244:0;;;;;:::i;:::-;;:::i;57833:110::-;35616:7;35643:6;-1:-1:-1;;;;;35643:6:0;34241:10;35790:23;35782:68;;;;-1:-1:-1;;;35782:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;57906:22:0::1;;::::0;;;:15:::1;:22;::::0;;;;:29;;-1:-1:-1;;57906:29:0::1;57931:4;57906:29;::::0;;57833:110::o;43964:1031::-;38295:11;;44077:10;;-1:-1:-1;;;;;38280:26:0;;;38295:11;;38280:26;38272:53;;;;-1:-1:-1;;;38272:53:0;;;;;;;:::i;:::-;44184:65:::1;-1:-1:-1::0;;;;;44184:30:0;::::1;44215:10;44235:4;44242:6:::0;44184:30:::1;:65::i;:::-;44260:40;44282:5;44289:10;44260:21;:40::i;:::-;44313:14;44345:5;-1:-1:-1::0;;;;;44330:28:0::1;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44313:47;;44371:14;44403:5;-1:-1:-1::0;;;;;44388:28:0::1;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44371:47;;44429:41;44451:6;44459:10;44429:21;:41::i;:::-;44481;44503:6;44511:10;44481:21;:41::i;:::-;44533:9;44553::::0;44607:10:::1;-1:-1:-1::0;;;;;44588:46:0::1;;44635:6;44643;44651;44659:1;44662::::0;44673:4:::1;44680:15;44588:108;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44573:123:::0;;-1:-1:-1;44573:123:0;-1:-1:-1;;;;;;44711:13:0;;::::1;::::0;;::::1;;44707:104;;44748:51;44754:6;44762:4;44768:3;44781:4;44788:10;44748:5;:51::i;:::-;44741:58;;44707:104;44835:3;-1:-1:-1::0;;;;;44825:13:0::1;:6;-1:-1:-1::0;;;;;44825:13:0::1;;44821:104;;44862:51;44868:6;44876:4;44882:3;44895:4;44902:10;44862:5;:51::i;:::-;44855:58;;44821:104;44935:52;44960:10:::0;44972:14:::1;:4:::0;44981;44972:8:::1;:14::i;:::-;-1:-1:-1::0;;;;;44935:24:0;::::1;::::0;:52;:24:::1;:52::i;:::-;44107:888;;;;43964:1031:::0;;;;;;:::o;41150:393::-;38295:11;;41229:10;;-1:-1:-1;;;;;38280:26:0;;;38295:11;;38280:26;38272:53;;;;-1:-1:-1;;;38272:53:0;;;;;;;:::i;:::-;41346:55:::1;41362:3;41367:9;41378:10;41390;41346:15;:55::i;:::-;-1:-1:-1::0;41416:21:0::1;:26:::0;41412:124:::1;;41459:65;41490:10;41502:21;41459:30;:65::i;:::-;41150:393:::0;;;;:::o;57430:275::-;35616:7;35643:6;-1:-1:-1;;;;;35643:6:0;34241:10;35790:23;35782:68;;;;-1:-1:-1;;;35782:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57497:19:0;::::1;57493:121;;35616:7:::0;35643:6;;57533:48:::1;::::0;-1:-1:-1;;;;;35643:6:0;;;;57559:21:::1;57533:48:::0;::::1;;;::::0;57559:21;;57533:48;35616:7;57533:48;57559:21;35643:6;57533:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;57430:275:::0;:::o;57493:121::-:1;57633:5;-1:-1:-1::0;;;;;57626:22:0::1;;57649:7;35616::::0;35643:6;-1:-1:-1;;;;;35643:6:0;;35570:87;57649:7:::1;57658:38;::::0;-1:-1:-1;;;57658:38:0;;57690:4:::1;57658:38;::::0;::::1;6051:51:1::0;-1:-1:-1;;;;;57658:23:0;::::1;::::0;::::1;::::0;6024:18:1;;57658:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57626:71;::::0;-1:-1:-1;;;;;;57626:71:0::1;::::0;;;;;;-1:-1:-1;;;;;8452:32:1;;;57626:71:0::1;::::0;::::1;8434:51:1::0;8501:18;;;8494:34;8407:18;;57626:71:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35861:1::-;57430:275:::0;:::o;57133:171::-;35616:7;35643:6;-1:-1:-1;;;;;35643:6:0;34241:10;35790:23;35782:68;;;;-1:-1:-1;;;35782:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57247:27:0;;::::1;;::::0;;;:20:::1;:27;::::0;;;;;;;:35;;::::1;::::0;;;;;;;;;:49;;-1:-1:-1;;;;;;57247:49:0::1;::::0;;;::::1;;::::0;;57133:171::o;42215:1741::-;38295:11;;42310:10;;-1:-1:-1;;;;;38280:26:0;;;38295:11;;38280:26;38272:53;;;;-1:-1:-1;;;38272:53:0;;;;;;;:::i;:::-;42445:65:::1;-1:-1:-1::0;;;;;42445:30:0;::::1;42476:10;42496:4;42503:6:::0;42445:30:::1;:65::i;:::-;42521:40;42543:5;42550:10;42521:21;:40::i;:::-;42603:14;42635:5;-1:-1:-1::0;;;;;42620:28:0::1;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42603:47;;42661:14;42693:5;-1:-1:-1::0;;;;;42678:28:0::1;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42661:47;;42719:41;42741:6;42749:10;42719:21;:41::i;:::-;42771;42793:6;42801:10;42771:21;:41::i;:::-;42889:7;::::0;-1:-1:-1;;;;;42879:17:0;;::::1;42889:7:::0;::::1;42879:17;::::0;:38:::1;;-1:-1:-1::0;42910:7:0::1;::::0;-1:-1:-1;;;;;42900:17:0;;::::1;42910:7:::0;::::1;42900:17;42879:38;42875:1074;;;43039:7;::::0;43013:13:::1;::::0;-1:-1:-1;;;;;43029:17:0;;::::1;43039:7:::0;::::1;43029:17;;:35;;43058:6;43029:35;;;43049:6;43029:35;43013:51;;43079:13;43107:11:::0;43173:10:::1;-1:-1:-1::0;;;;;43154:49:0::1;;43204:5;43211:6;43219:1;43222::::0;43233:4:::1;43240:15;43154:102;;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43133:123:::0;;-1:-1:-1;43133:123:0;-1:-1:-1;43353:60:0::1;43373:5:::0;43133:123;43390:10;43402;43353:19:::1;:60::i;:::-;;43470:50;43501:10;43513:6;43470:30;:50::i;:::-;42919:613;;;42875:1074;;;43622:9;43646::::0;43704:10:::1;-1:-1:-1::0;;;;;43685:46:0::1;;43732:6;43740;43748;43756:1;43759::::0;43770:4:::1;43777:15;43685:108;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43670:123:::0;;-1:-1:-1;43670:123:0;-1:-1:-1;43808:57:0::1;43828:6:::0;43670:123;43842:10;43854;43808:19:::1;:57::i;:::-;;43880;43900:6;43908:4;43914:10;43926;43880:19;:57::i;42875:1074::-;42340:1616;;42215:1741:::0;;;;;:::o;57312:110::-;35616:7;35643:6;-1:-1:-1;;;;;35643:6:0;34241:10;35790:23;35782:68;;;;-1:-1:-1;;;35782:68:0;;;;;;;:::i;:::-;57388:11:::1;:26:::0;;-1:-1:-1;;;;;;57388:26:0::1;-1:-1:-1::0;;;;;57388:26:0;;;::::1;::::0;;;::::1;::::0;;57312:110::o;36221:148::-;35616:7;35643:6;-1:-1:-1;;;;;35643:6:0;34241:10;35790:23;35782:68;;;;-1:-1:-1;;;35782:68:0;;;;;;;:::i;:::-;36328:1:::1;36312:6:::0;;36291:40:::1;::::0;-1:-1:-1;;;;;36312:6:0;;::::1;::::0;36291:40:::1;::::0;36328:1;;36291:40:::1;36359:1;36342:19:::0;;-1:-1:-1;;;;;;36342:19:0::1;::::0;;36221:148::o;41551:656::-;38295:11;;41648:9;;-1:-1:-1;;;;;38280:26:0;;;38295:11;;38280:26;38272:53;;;;-1:-1:-1;;;38272:53:0;;;;;;;:::i;:::-;41688:65:::1;-1:-1:-1::0;;;;;41688:30:0;::::1;41719:10;41739:4;41746:6:::0;41688:30:::1;:65::i;:::-;41766:19;41803:5;41766:43;;41820:47;41842:4;-1:-1:-1::0;;;;;41842:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41857:9;41820:21;:47::i;:::-;41878;41900:4;-1:-1:-1::0;;;;;41900:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;41878:47;41938:41;-1:-1:-1::0;;;;;41938:26:0;::::1;41965:5:::0;41972:6;41938:26:::1;:41::i;:::-;42045:24;::::0;-1:-1:-1;;;42045:24:0;;42063:4:::1;42045:24;::::0;::::1;6051:51:1::0;41990:9:0::1;::::0;;;-1:-1:-1;;;;;42045:9:0;::::1;::::0;::::1;::::0;6024:18:1;;42045:24:0::1;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42030:39;;;;;;;;42099:9;-1:-1:-1::0;;;;;42080:42:0::1;;42123:4;-1:-1:-1::0;;;;;42123:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42138:4;-1:-1:-1::0;;;;;42138:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42153:4;42159;42165:1;42168::::0;42171:10:::1;42183:15;42080:119;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;41677:530;;;41551:656:::0;;;;;:::o;57713:112::-;35616:7;35643:6;-1:-1:-1;;;;;35643:6:0;34241:10;35790:23;35782:68;;;;-1:-1:-1;;;35782:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57787:23:0::1;;::::0;;;:15:::1;:23;::::0;;;;:30;;-1:-1:-1;;57787:30:0::1;57813:4;57787:30;::::0;;57713:112::o;45347:335::-;38295:11;;45448:10;;-1:-1:-1;;;;;38280:26:0;;;38295:11;;38280:26;38272:53;;;;-1:-1:-1;;;38272:53:0;;;;;;;:::i;:::-;45489:65:::1;-1:-1:-1::0;;;;;45489:30:0;::::1;45520:10;45540:4;45547:6:::0;45489:30:::1;:65::i;:::-;45565:40;45587:5;45594:10;45565:21;:40::i;:::-;45616:58;45636:5;45643:6;45651:10;45663;45616:19;:58::i;:::-;;45347:335:::0;;;;;:::o;39322:1820::-;38295:11;;39456:7;;;;39417;;-1:-1:-1;;;;;38280:26:0;;;38295:11;;38280:26;38272:53;;;;-1:-1:-1;;;38272:53:0;;;;;;;:::i;:::-;39550:3:::1;-1:-1:-1::0;;;;;39535:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39526:37:0::1;:5;-1:-1:-1::0;;;;;39526:37:0::1;;:78;;;;39591:3;-1:-1:-1::0;;;;;39576:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39567:37:0::1;:5;-1:-1:-1::0;;;;;39567:37:0::1;;39526:78;39522:1613;;;39812:13;39852:3;-1:-1:-1::0;;;;;39837:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39828:37:0::1;:5;-1:-1:-1::0;;;;;39828:37:0::1;;:99;;39914:3;-1:-1:-1::0;;;;;39899:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39828:99;;;39883:3;-1:-1:-1::0;;;;;39868:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39812:115:::0;-1:-1:-1;39992:15:0::1;40010:11;:4:::0;40019:1:::1;40010:8;:11::i;:::-;39992:29;;40065:16;40084:48;40098:5;40105:10;40117:5;40124:7;40084:13;:48::i;:::-;40065:67;;40175:3;-1:-1:-1::0;;;;;40160:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40151:37:0::1;:5;-1:-1:-1::0;;;;;40151:37:0::1;;40147:183;;;40217:10:::0;;-1:-1:-1;40229:11:0;-1:-1:-1;40209:32:0::1;::::0;-1:-1:-1;40209:32:0::1;40147:183;40290:11:::0;-1:-1:-1;40303:10:0;-1:-1:-1;40282:32:0::1;::::0;-1:-1:-1;40282:32:0::1;39522:1613;40453:7;::::0;40424:17:::1;::::0;-1:-1:-1;;;;;40444:16:0;;::::1;40453:7:::0;::::1;40444:16;:70;;40497:7;::::0;40470:44:::1;::::0;40484:5;;40491:4;;-1:-1:-1;;;;;40497:7:0::1;40506::::0;40470:13:::1;:44::i;:::-;40444:70;;;40463:4;40444:70;40424:90;;40559:3;-1:-1:-1::0;;;;;40544:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40533:7;::::0;-1:-1:-1;;;;;40533:7:0;;::::1;:39:::0;::::1;;40529:193;;;40601:19;:12:::0;40618:1:::1;40601:16;:19::i;:::-;40636:7;::::0;40622:83:::1;::::0;-1:-1:-1;;;;;40636:7:0::1;40645:19;:12:::0;40662:1:::1;40645:16;:19::i;:::-;40681:3;-1:-1:-1::0;;;;;40666:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40696:7;40622:13;:83::i;:::-;40593:113;;;;;;;40529:193;40766:3;-1:-1:-1::0;;;;;40751:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40740:7;::::0;-1:-1:-1;;;;;40740:7:0;;::::1;:39:::0;::::1;;40736:193;;;40822:7;::::0;40808:83:::1;::::0;-1:-1:-1;;;;;40822:7:0::1;40831:19;:12:::0;40848:1:::1;40831:16;:19::i;:::-;40867:3;-1:-1:-1::0;;;;;40852:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40882:7;40808:13;:83::i;:::-;40893:19;:12:::0;40910:1:::1;40893:16;:19::i;40736:193::-;40969:7;::::0;40955:83:::1;::::0;-1:-1:-1;;;;;40969:7:0::1;40978:19;:12:::0;40995:1:::1;40978:16;:19::i;39522:1613::-;39322:1820:::0;;;;;;;;:::o;45003:336::-;38295:11;;45114:10;;-1:-1:-1;;;;;38280:26:0;;;38295:11;;38280:26;38272:53;;;;-1:-1:-1;;;38272:53:0;;;;;;;:::i;:::-;45155:65:::1;-1:-1:-1::0;;;;;45155:30:0;::::1;45186:10;45206:4;45213:6:::0;45155:30:::1;:65::i;:::-;45231:40;45253:5;45260:10;45231:21;:40::i;:::-;45282:49;45288:5;45295:6;45303:3;45308:10;45320;45282:5;:49::i;38444:870::-:0;38295:11;;38556:10;;-1:-1:-1;;;;;38280:26:0;;;38295:11;;38280:26;38272:53;;;;-1:-1:-1;;;38272:53:0;;;;;;;:::i;:::-;38597:40:::1;38619:5;38626:10;38597:21;:40::i;:::-;-1:-1:-1::0;;;;;38654:22:0;::::1;;::::0;;;:15:::1;:22;::::0;;;;;::::1;;38650:657;;;38693:61;::::0;-1:-1:-1;;;38693:61:0;;38720:10:::1;38693:61;::::0;::::1;6662:34:1::0;38740:4:0::1;6712:18:1::0;;;6705:43;6764:18;;;6757:34;;;-1:-1:-1;;;;;38693:26:0;::::1;::::0;::::1;::::0;6597:18:1;;38693:61:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;38791:38:0::1;::::0;-1:-1:-1;;;38791:38:0;;38823:4:::1;38791:38;::::0;::::1;6051:51:1::0;38769:90:0::1;::::0;38784:5;;-1:-1:-1;;;;;38791:23:0;::::1;::::0;::::1;::::0;6024:18:1;;38791:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38831:3;38836:10;38848;38769:14;:90::i;:::-;;38874:7;;38650:657;39023:65;-1:-1:-1::0;;;;;39023:30:0;::::1;39054:10;39074:4;39081:6:::0;39023:30:::1;:65::i;:::-;39161:40;39183:5;39190:10;39161:21;:40::i;:::-;39216:58;39231:5;39238:6;39246:3;39251:10;39263;39216:14;:58::i;36524:244::-:0;35616:7;35643:6;-1:-1:-1;;;;;35643:6:0;34241:10;35790:23;35782:68;;;;-1:-1:-1;;;35782:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36613:22:0;::::1;36605:73;;;::::0;-1:-1:-1;;;36605:73:0;;10448:2:1;36605:73:0::1;::::0;::::1;10430:21:1::0;10487:2;10467:18;;;10460:30;10526:34;10506:18;;;10499:62;-1:-1:-1;;;10577:18:1;;;10570:36;10623:19;;36605:73:0::1;10246:402:1::0;36605:73:0::1;36715:6;::::0;;36694:38:::1;::::0;-1:-1:-1;;;;;36694:38:0;;::::1;::::0;36715:6;::::1;::::0;36694:38:::1;::::0;::::1;36743:6;:17:::0;;-1:-1:-1;;;;;;36743:17:0::1;-1:-1:-1::0;;;;;36743:17:0;;;::::1;::::0;;;::::1;::::0;;36524:244::o;30554:205::-;30682:68;;-1:-1:-1;;;;;6680:15:1;;;30682:68:0;;;6662:34:1;6732:15;;6712:18;;;6705:43;6764:18;;;6757:34;;;30655:96:0;;30675:5;;-1:-1:-1;;;30705:27:0;6597:18:1;;30682:68:0;;;;-1:-1:-1;;30682:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;30682:68:0;-1:-1:-1;;;;;;30682:68:0;;;;;;;;;;30655:19;:96::i;45745:221::-;45830:46;;-1:-1:-1;;;45830:46:0;;45862:4;45830:46;;;6325:34:1;-1:-1:-1;;;;;6395:15:1;;;6375:18;;;6368:43;45830:23:0;;;;;6260:18:1;;45830:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45826:133;;45898:49;-1:-1:-1;;;;;45898:25:0;;45924:6;-1:-1:-1;;45898:25:0;:49::i;51515:2969::-;-1:-1:-1;;;;;51736:27:0;;;51627:4;51736:27;;;:20;:27;;;;;;;;:39;;;;;;;;;;;;;51805:25;;;;;;;;;;;:37;;;;;;;;;51627:4;;51691:10;;51736:39;;;;51805:37;51855:21;51893:24;;;;;:50;;-1:-1:-1;;;;;;51921:22:0;;;;51893:50;51889:2158;;;51998:8;-1:-1:-1;;;;;51984:22:0;:10;-1:-1:-1;;;;;51984:22:0;;51980:433;;52034:16;;;52048:1;52034:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52034:16:0;52027:23;;52079:5;52069:4;52074:1;52069:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;52069:15:0;;;-1:-1:-1;;;;;52069:15:0;;;;;52113:10;52103:4;52108:1;52103:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;52103:20:0;;;:7;;;;;;;;;:20;52152:7;;52142;;52152;;;52142:4;;52147:1;;52142:7;;;;;;:::i;:::-;;;;;;:17;-1:-1:-1;;;;;52142:17:0;;;-1:-1:-1;;;;;52142:17:0;;;;;52188:8;52178:4;52183:1;52178:7;;;;;;;;:::i;:::-;;;;;;:18;-1:-1:-1;;;;;52178:18:0;;;-1:-1:-1;;;;;52178:18:0;;;;;52225:3;52215:4;52220:1;52215:7;;;;;;;;:::i;:::-;;;;;;:13;-1:-1:-1;;;;;52215:13:0;;;-1:-1:-1;;;;;52215:13:0;;;;;51889:2158;;51980:433;52276:16;;;52290:1;52276:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52276:16:0;52269:23;;52321:5;52311:4;52316:1;52311:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;52311:15:0;;;-1:-1:-1;;;;;52311:15:0;;;;;52355:10;52345:4;52350:1;52345:7;;;;;;;;:::i;:::-;;;;;;:20;-1:-1:-1;;;;;52345:20:0;;;-1:-1:-1;;;;;52345:20:0;;;;;52394:3;52384:4;52389:1;52384:7;;;;;;;;:::i;51889:2158::-;-1:-1:-1;;;;;52434:24:0;;;52430:1617;;52512:3;-1:-1:-1;;;;;52498:17:0;:10;-1:-1:-1;;;;;52498:17:0;;52494:558;;;52557:1;52543:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52543:16:0;;52536:23;;52588:5;52578:4;52583:1;52578:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;52578:15:0;;;-1:-1:-1;;;;;52578:15:0;;;;;52622:3;52612:4;52617:1;52612:7;;;;;;;;:::i;52494:558::-;52671:7;;-1:-1:-1;;;;;52664:14:0;;;52671:7;;52664:14;52660:392;;;52706:16;;;52720:1;52706:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52706:16:0;52699:23;;52751:5;52741:4;52746:1;52741:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;52741:15:0;;;-1:-1:-1;;;;;52741:15:0;;;;;52785:10;52775:4;52780:1;52775:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;52775:20:0;;;:7;;;;;;;;;:20;52824:7;;52814;;52824;;;52814:4;;52819:1;;52814:7;;;;;;:::i;52660:392::-;52879:16;;;52893:1;52879:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52879:16:0;52872:23;;52924:5;52914:4;52919:1;52914:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;52914:15:0;;;-1:-1:-1;;;;;52914:15:0;;;;;52958:10;52948:4;52953:1;52948:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;52948:20:0;;;:7;;;;;;;;;:20;52997:7;;52987;;52997;;;52987:4;;52992:1;;52987:7;;;;;;:::i;:::-;;;;;;:17;-1:-1:-1;;;;;52987:17:0;;;-1:-1:-1;;;;;52987:17:0;;;;;53033:3;53023:4;53028:1;53023:7;;;;;;;;:::i;52430:1617::-;-1:-1:-1;;;;;53073:22:0;;;53069:978;;53160:8;-1:-1:-1;;;;;53151:17:0;:5;-1:-1:-1;;;;;53151:17:0;;53147:554;;;53210:1;53196:16;;53147:554;53313:7;;-1:-1:-1;;;;;53304:16:0;;;53313:7;;53304:16;53300:401;;;53348:16;;;53362:1;53348:16;;;;;;;;;;;;;;;;;;-1:-1:-1;;53393:7:0;;53383;;;;-1:-1:-1;;;;;;53393:7:0;;53383;;-1:-1:-1;53393:7:0;;53383;;;;:::i;:::-;;;;;;:17;-1:-1:-1;;;;;53383:17:0;;;-1:-1:-1;;;;;53383:17:0;;;;;53429:8;53419:4;53424:1;53419:7;;;;;;;;:::i;53300:401::-;53530:16;;;53544:1;53530:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53530:16:0;53523:23;;53575:5;53565:4;53570:1;53565:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;53565:15:0;;;:7;;;;;;;;;:15;53609:7;;;53599;;53609;;;53599:4;;53609:7;53599;;;;;;:::i;:::-;;;;;;:17;-1:-1:-1;;;;;53599:17:0;;;-1:-1:-1;;;;;53599:17:0;;;;;53645:8;53635:4;53640:1;53635:7;;;;;;;;:::i;53069:978::-;53731:7;;-1:-1:-1;;;;;53722:16:0;;;53731:7;;53722:16;;:34;;-1:-1:-1;53749:7:0;;-1:-1:-1;;;;;53742:14:0;;;53749:7;;53742:14;53722:34;53718:329;;;53794:1;53780:16;;53718:329;53929:16;;;53943:1;53929:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53929:16:0;53922:23;;53970:5;53960:4;53965:1;53960:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;53960:15:0;;;:7;;;;;;;;;:15;54000:7;;;53990;;54000;;;53990:4;;54000:7;53990;;;;;;:::i;:::-;;;;;;:17;-1:-1:-1;;;;;53990:17:0;;;-1:-1:-1;;;;;53990:17:0;;;;;54032:3;54022:4;54027:1;54022:7;;;;;;;;:::i;:::-;;;;;;:13;-1:-1:-1;;;;;54022:13:0;;;-1:-1:-1;;;;;54022:13:0;;;;;53718:329;-1:-1:-1;;;;;54097:22:0;;;;;;:15;:22;;;;;;54059:21;;54097:22;;54093:337;;;54136:105;;-1:-1:-1;;;54136:105:0;;-1:-1:-1;;;;;54136:60:0;;;;;:105;;54197:6;;54205:1;;54208:4;;54214:9;;54225:15;;54136:105;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54263:36:0;;-1:-1:-1;;;54263:36:0;;54293:4;54263:36;;;6051:51:1;-1:-1:-1;;;;;54263:21:0;;;-1:-1:-1;54263:21:0;;-1:-1:-1;6024:18:1;;54263:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54256:43;;;;;;;;;54093:337;54342:76;;-1:-1:-1;;;54342:76:0;;-1:-1:-1;;;;;54342:31:0;;;;;:76;;54374:6;;54382:1;;54385:4;;54391:9;;54402:15;;54342:76;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54342:76:0;;;;;;;;;;;;:::i;:::-;54332:86;;54449:7;54474:1;54457:7;:14;:18;;;;:::i;:::-;54449:27;;;;;;;;:::i;:::-;;;;;;;54442:34;;;;;;;51515:2969;;;;;;;;:::o;23973:98::-;24031:7;24058:5;24062:1;24058;:5;:::i;:::-;24051:12;23973:98;-1:-1:-1;;;23973:98:0:o;30369:177::-;30479:58;;-1:-1:-1;;;;;8452:32:1;;30479:58:0;;;8434:51:1;8501:18;;;8494:34;;;30452:86:0;;30472:5;;-1:-1:-1;;;30502:23:0;8407:18:1;;30479:58:0;8260:274:1;30452:86:0;30369:177;;;:::o;47338:741::-;47448:4;47488:19;47525:3;47488:41;;47544:14;47561:4;-1:-1:-1;;;;;47561:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47544:30;;47589:14;47606:4;-1:-1:-1;;;;;47606:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47677:7;;47589:30;;-1:-1:-1;47634:14:0;;-1:-1:-1;;;;;47667:17:0;;;47677:7;;47667:17;;:38;;-1:-1:-1;47698:7:0;;-1:-1:-1;;;;;47688:17:0;;;47698:7;;47688:17;47667:38;47663:378;;;47752:7;;47726:13;;-1:-1:-1;;;;;47742:17:0;;;47752:7;;47742:17;:35;;47771:6;47742:35;;;47762:6;47742:35;47726:51;;47815:66;47841:5;47848:6;47856:13;47871:9;47815:25;:66::i;:::-;47796:85;-1:-1:-1;47663:378:0;;-1:-1:-1;;;47663:378:0;;47941:84;47976:6;47984;47992;48000:13;48015:9;47941:34;:84::i;:::-;47922:103;-1:-1:-1;;;47663:378:0;48062:9;-1:-1:-1;;;;47338:741:0;;;;;;;:::o;29577:195::-;29685:12;;;29647;29685;;;;;;;;;-1:-1:-1;;;;;29664:7:0;;;29678:5;;29664:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29646:52;;;29717:7;29709:55;;;;-1:-1:-1;;;29709:55:0;;12324:2:1;29709:55:0;;;12306:21:1;12363:2;12343:18;;;12336:30;12402:34;12382:18;;;12375:62;-1:-1:-1;;;12453:18:1;;;12446:33;12496:19;;29709:55:0;12122:399:1;50494:1013:0;-1:-1:-1;;;;;50731:27:0;;;50607:4;50731:27;;;:20;:27;;;;;;;;:39;;;;;;;;;;;50607:4;;50624:21;;50703:10;;50731:39;:53;50727:365;;50808:16;;;50822:1;50808:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50808:16:0;50801:23;;50849:5;50839:4;50844:1;50839:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50839:15:0;;;:7;;;;;;;;;;:15;;;;50879:27;;;;;;;:20;:27;;;;;;:39;;;;;;;;;;50869:7;;50879:39;;;50869:4;;50879:39;;50869:7;;;;;;:::i;:::-;;;;;;:49;-1:-1:-1;;;;;50869:49:0;;;-1:-1:-1;;;;;50869:49:0;;;;;50943:6;-1:-1:-1;;;;;50943:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50933:4;50938:1;50933:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;50933:23:0;;;-1:-1:-1;;;;;50933:23:0;;;;;50727:365;;;50996:16;;;51010:1;50996:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50996:16:0;50989:23;;51037:5;51027:4;51032:1;51027:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;51027:15:0;;;-1:-1:-1;;;;;51027:15:0;;;;;51067:6;-1:-1:-1;;;;;51067:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51057:4;51062:1;51057:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;51057:23:0;;;-1:-1:-1;;;;;51057:23:0;;;;;50727:365;-1:-1:-1;;;;;51108:22:0;;;;;;:15;:22;;;;;;;;51104:396;;;51147:102;;-1:-1:-1;;;51147:102:0;;-1:-1:-1;;;;;51147:57:0;;;;;:102;;51205:6;;51213:1;;51216:4;;51222:9;;51233:15;;51147:102;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51271:38:0;;-1:-1:-1;;;51271:38:0;;51303:4;51271:38;;;6051:51:1;-1:-1:-1;;;;;51271:23:0;;;-1:-1:-1;51271:23:0;;-1:-1:-1;6024:18:1;;51271:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51264:45;;;;;;51104:396;51366:73;;-1:-1:-1;;;51366:73:0;;51342:21;;-1:-1:-1;;;;;51366:28:0;;;;;:73;;51395:6;;51342:21;;51406:4;;51412:9;;51423:15;;51366:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51366:73:0;;;;;;;;;;;;:::i;:::-;51342:97;;51461:7;51486:1;51469:7;:14;:18;;;;:::i;:::-;51461:27;;;;;;;;:::i;:::-;;;;;;;51454:34;;;;;;;25110:98;25168:7;25195:5;25199:1;25195;:5;:::i;54492:2575::-;-1:-1:-1;;;;;54707:27:0;;;54598:4;54707:27;;;:20;:27;;;;;;;;:39;;;;;;;;;;;;;54776:25;;;;;;;;;;;:37;;;;;;;;;54598:4;;54662:10;;54707:39;;;;54776:37;54826:21;54864:24;;;;;:50;;-1:-1:-1;;;;;;54892:22:0;;;;54864:50;54860:2084;;;54949:8;-1:-1:-1;;;;;54935:22:0;:10;-1:-1:-1;;;;;54935:22:0;;54931:433;;54985:16;;;54999:1;54985:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54985:16:0;54978:23;;55030:5;55020:4;55025:1;55020:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;55020:15:0;;;-1:-1:-1;;;;;55020:15:0;;;;;55064:10;55054:4;55059:1;55054:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;55054:20:0;;;:7;;;;;;;;;:20;55103:7;;55093;;55103;;;55093:4;;55098:1;;55093:7;;;;;;:::i;:::-;;;;;;:17;-1:-1:-1;;;;;55093:17:0;;;-1:-1:-1;;;;;55093:17:0;;;;;55139:8;55129:4;55134:1;55129:7;;;;;;;;:::i;:::-;;;;;;:18;-1:-1:-1;;;;;55129:18:0;;;-1:-1:-1;;;;;55129:18:0;;;;;55176:3;55166:4;55171:1;55166:7;;;;;;;;:::i;:::-;;;;;;:13;-1:-1:-1;;;;;55166:13:0;;;-1:-1:-1;;;;;55166:13:0;;;;;54860:2084;;54931:433;55227:16;;;55241:1;55227:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55227:16:0;55220:23;;55272:5;55262:4;55267:1;55262:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;55262:15:0;;;-1:-1:-1;;;;;55262:15:0;;;;;55306:10;55296:4;55301:1;55296:7;;;;;;;;:::i;:::-;;;;;;:20;-1:-1:-1;;;;;55296:20:0;;;-1:-1:-1;;;;;55296:20:0;;;;;55345:3;55335:4;55340:1;55335:7;;;;;;;;:::i;54860:2084::-;-1:-1:-1;;;;;55385:24:0;;;55381:1563;;55444:3;-1:-1:-1;;;;;55430:17:0;:10;-1:-1:-1;;;;;55430:17:0;;55426:558;;;55489:1;55475:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55475:16:0;;55468:23;;55520:5;55510:4;55515:1;55510:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;55510:15:0;;;-1:-1:-1;;;;;55510:15:0;;;;;55554:3;55544:4;55549:1;55544:7;;;;;;;;:::i;55426:558::-;55603:7;;-1:-1:-1;;;;;55596:14:0;;;55603:7;;55596:14;55592:392;;;55638:16;;;55652:1;55638:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55638:16:0;55631:23;;55683:5;55673:4;55678:1;55673:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;55673:15:0;;;-1:-1:-1;;;;;55673:15:0;;;;;55717:10;55707:4;55712:1;55707:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;55707:20:0;;;:7;;;;;;;;;:20;55756:7;;55746;;55756;;;55746:4;;55751:1;;55746:7;;;;;;:::i;55592:392::-;55811:16;;;55825:1;55811:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55811:16:0;55804:23;;55856:5;55846:4;55851:1;55846:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;55846:15:0;;;-1:-1:-1;;;;;55846:15:0;;;;;55890:10;55880:4;55885:1;55880:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;55880:20:0;;;:7;;;;;;;;;:20;55929:7;;55919;;55929;;;55919:4;;55924:1;;55919:7;;;;;;:::i;:::-;;;;;;:17;-1:-1:-1;;;;;55919:17:0;;;-1:-1:-1;;;;;55919:17:0;;;;;55965:3;55955:4;55960:1;55955:7;;;;;;;;:::i;55381:1563::-;-1:-1:-1;;;;;56005:22:0;;;56001:943;;56057:8;-1:-1:-1;;;;;56048:17:0;:5;-1:-1:-1;;;;;56048:17:0;;56044:554;;;56107:1;56093:16;;56044:554;56210:7;;-1:-1:-1;;;;;56201:16:0;;;56210:7;;56201:16;56197:401;;;56245:16;;;56259:1;56245:16;;;;;;;;;;;;;;;;;;-1:-1:-1;;56290:7:0;;56280;;;;-1:-1:-1;;;;;;56290:7:0;;56280;;-1:-1:-1;56290:7:0;;56280;;;;:::i;:::-;;;;;;:17;-1:-1:-1;;;;;56280:17:0;;;-1:-1:-1;;;;;56280:17:0;;;;;56326:8;56316:4;56321:1;56316:7;;;;;;;;:::i;56197:401::-;56427:16;;;56441:1;56427:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56427:16:0;56420:23;;56472:5;56462:4;56467:1;56462:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56462:15:0;;;:7;;;;;;;;;:15;56506:7;;;56496;;56506;;;56496:4;;56506:7;56496;;;;;;:::i;:::-;;;;;;:17;-1:-1:-1;;;;;56496:17:0;;;-1:-1:-1;;;;;56496:17:0;;;;;56542:8;56532:4;56537:1;56532:7;;;;;;;;:::i;56001:943::-;56628:7;;-1:-1:-1;;;;;56619:16:0;;;56628:7;;56619:16;;:34;;-1:-1:-1;56646:7:0;;-1:-1:-1;;;;;56639:14:0;;;56646:7;;56639:14;56619:34;56615:329;;;56691:1;56677:16;;56615:329;56826:16;;;56840:1;56826:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56826:16:0;56819:23;;56867:5;56857:4;56862:1;56857:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56857:15:0;;;:7;;;;;;;;;:15;56897:7;;;56887;;56897;;;56887:4;;56897:7;56887;;;;;;:::i;:::-;;;;;;:17;-1:-1:-1;;;;;56887:17:0;;;-1:-1:-1;;;;;56887:17:0;;;;;56929:3;56919:4;56924:1;56919:7;;;;;;;;:::i;:::-;;;;;;:13;-1:-1:-1;;;;;56919:13:0;;;-1:-1:-1;;;;;56919:13:0;;;;;56615:329;56980:34;;-1:-1:-1;;;56980:34:0;;56956:21;;-1:-1:-1;;;;;56980:20:0;;;;;:34;;57001:6;;57009:4;;56980:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56980:34:0;;;;;;;;;;;;:::i;:::-;56956:58;;57032:7;57057:1;57040:7;:14;:18;;;;:::i;:::-;57032:27;;;;;;;;:::i;:::-;;;;;;;57025:34;;;;;;;54492:2575;;;;;;:::o;45974:1356::-;46095:4;46185:3;-1:-1:-1;;;;;46170:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46161:37:0;:5;-1:-1:-1;;;;;46161:37:0;;:78;;;;46226:3;-1:-1:-1;;;;;46211:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46202:37:0;:5;-1:-1:-1;;;;;46202:37:0;;46161:78;46157:1166;;;46447:13;46487:3;-1:-1:-1;;;;;46472:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46463:37:0;:5;-1:-1:-1;;;;;46463:37:0;;:99;;46549:3;-1:-1:-1;;;;;46534:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46463:99;;;46518:3;-1:-1:-1;;;;;46503:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46447:115;;46577:40;46599:5;46606:10;46577:21;:40::i;:::-;46682:15;46700:13;:6;46711:1;46700:10;:13::i;:::-;46682:31;;46757:16;46776:58;46782:5;46789:10;46801:5;46816:4;46823:10;46776:5;:58::i;:::-;46757:77;-1:-1:-1;46849:14:0;-1:-1:-1;;;;;46897:43:0;;;46941:5;46948;46955:22;:6;46966:10;46955;:22::i;:::-;46979:11;46992:1;46995;46998:9;47009:15;46897:128;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46878:147;-1:-1:-1;47040:16:0;;-1:-1:-1;;;;;;47040:16:0;46157:1166;47151:17;47171:61;47191:5;47198:6;47214:4;47221:10;47171:19;:61::i;:::-;47151:81;;47254:57;47270:3;47275:12;47289:9;47300:10;47254:15;:57::i;:::-;47247:64;;;;;32803:761;33227:23;33253:69;33281:4;33253:69;;;;;;;;;;;;;;;;;33261:5;-1:-1:-1;;;;;33253:27:0;;;:69;;;;;:::i;:::-;33337:17;;33227:95;;-1:-1:-1;33337:21:0;33333:224;;33479:10;33468:30;;;;;;;;;;;;:::i;:::-;33460:85;;;;-1:-1:-1;;;33460:85:0;;12728:2:1;33460:85:0;;;12710:21:1;12767:2;12747:18;;;12740:30;12806:34;12786:18;;;12779:62;-1:-1:-1;;;12857:18:1;;;12850:40;12907:19;;33460:85:0;12526:406:1;31028:622:0;31398:10;;;31397:62;;-1:-1:-1;31414:39:0;;-1:-1:-1;;;31414:39:0;;31438:4;31414:39;;;6325:34:1;-1:-1:-1;;;;;6395:15:1;;;6375:18;;;6368:43;31414:15:0;;;;;6260:18:1;;31414:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;31397:62;31389:152;;;;-1:-1:-1;;;31389:152:0;;13139:2:1;31389:152:0;;;13121:21:1;13178:2;13158:18;;;13151:30;13217:34;13197:18;;;13190:62;-1:-1:-1;;;13268:18:1;;;13261:52;13330:19;;31389:152:0;12937:418:1;31389:152:0;31579:62;;-1:-1:-1;;;;;8452:32:1;;31579:62:0;;;8434:51:1;8501:18;;;8494:34;;;31552:90:0;;31572:5;;-1:-1:-1;;;31602:22:0;8407:18:1;;31579:62:0;8260:274:1;48087:879:0;48209:4;;;;48259:13;:6;48270:1;48259:10;:13::i;:::-;48242:30;;48287:16;48306:67;48326:5;48333:9;48352:4;48359:13;48306:19;:67::i;:::-;48287:86;;48388:43;48410:5;48417:13;48388:21;:43::i;:::-;-1:-1:-1;;;;;48450:30:0;;;;;;:15;:30;;;;;;;;48446:513;;;48548:13;-1:-1:-1;;;;;48588:22:0;;;48619:21;:6;48630:9;48619:10;:21::i;:::-;48642:5;48649:11;48662:1;48665;48668:9;48679:15;48588:107;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48581:114;;;;;;;;;;;48446:513;48796:13;-1:-1:-1;;;;;48836:22:0;;;48867:21;:6;48878:9;48867:10;:21::i;48087:879::-;;;;;;;;;:::o;48974:750::-;49122:4;;;;49172:13;:6;49183:1;49172:10;:13::i;:::-;49155:30;;49200:17;49220:68;49240:6;49248:9;49267:4;49274:13;49220:19;:68::i;:::-;49200:88;-1:-1:-1;49303:17:0;49323:80;49343:6;49351:21;:6;49362:9;49351:10;:21::i;:::-;49382:4;49389:13;49323:19;:80::i;:::-;49303:100;;49418:44;49440:6;49448:13;49418:21;:44::i;:::-;49477;49499:6;49507:13;49477:21;:44::i;:::-;49536:25;49583:13;49536:61;;49619:6;-1:-1:-1;;;;;49619:19:0;;49639:6;49647;49655:12;49669;49683:1;49686;49689:9;49700:15;49619:97;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49612:104;;;;;;;;;;48974:750;;;;;;;;;:::o;24354:98::-;24412:7;24439:5;24443:1;24439;:5;:::i;16868:195::-;16971:12;17003:52;17025:6;17033:4;17039:1;17042:12;17003:21;:52::i;49732:754::-;-1:-1:-1;;;;;49968:27:0;;;49844:4;49968:27;;;:20;:27;;;;;;;;:39;;;;;;;;;;;49844:4;;49861:21;;49940:10;;49968:39;:53;49964:353;;50045:16;;;50059:1;50045:16;;;;;;;;;;;;;;;;;;-1:-1:-1;;50086:7:0;;50076;;;;-1:-1:-1;;;;;;50086:7:0;;50076;;-1:-1:-1;50086:7:0;;50076;;;;:::i;:::-;-1:-1:-1;;;;;50076:17:0;;;:7;;;;;;;;;;:17;;;;50118:27;;;;;;;:20;:27;;;;;;:39;;;;;;;;;;50108:7;;50118:39;;;50108:4;;50118:39;;50108:7;;;;;;:::i;:::-;;;;;;:49;-1:-1:-1;;;;;50108:49:0;;;-1:-1:-1;;;;;50108:49:0;;;;;50182:5;50172:4;50177:1;50172:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;50172:15:0;;;-1:-1:-1;;;;;50172:15:0;;;;;49964:353;;;50227:16;;;50241:1;50227:16;;;;;;;;;;;;;;;;;;-1:-1:-1;;50268:7:0;;50258;;;;-1:-1:-1;;;;;;50268:7:0;;50258;;-1:-1:-1;50268:7:0;;50258;;;;:::i;:::-;;;;;;:17;-1:-1:-1;;;;;50258:17:0;;;-1:-1:-1;;;;;50258:17:0;;;;;50300:5;50290:4;50295:1;50290:7;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;50290:15:0;;;-1:-1:-1;;;;;50290:15:0;;;;;49964:353;50329:21;50353:6;-1:-1:-1;;;;;50353:28:0;;50390:5;50397:1;50400:4;50406:9;50417:15;50353:80;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50353:80:0;;;;;;;;;;;;:::i;:::-;50329:104;;50451:7;50476:1;50459:7;:14;:18;;;;:::i;:::-;50451:27;;;;;;;;:::i;:::-;;;;;;;50444:34;;;;;49732:754;;;;;;:::o;17920:530::-;18047:12;18105:5;18080:21;:30;;18072:81;;;;-1:-1:-1;;;18072:81:0;;10855:2:1;18072:81:0;;;10837:21:1;10894:2;10874:18;;;10867:30;10933:34;10913:18;;;10906:62;-1:-1:-1;;;10984:18:1;;;10977:36;11030:19;;18072:81:0;10653:402:1;18072:81:0;14317:20;;18164:60;;;;-1:-1:-1;;;18164:60:0;;11966:2:1;18164:60:0;;;11948:21:1;12005:2;11985:18;;;11978:30;12044:31;12024:18;;;12017:59;12093:18;;18164:60:0;11764:353:1;18164:60:0;18298:12;18312:23;18339:6;-1:-1:-1;;;;;18339:11:0;18359:5;18367:4;18339:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18297:75;;;;18390:52;18408:7;18417:10;18429:12;18390:17;:52::i;:::-;18383:59;17920:530;-1:-1:-1;;;;;;;17920:530:0:o;20460:742::-;20575:12;20604:7;20600:595;;;-1:-1:-1;20635:10:0;20628:17;;20600:595;20749:17;;:21;20745:439;;21012:10;21006:17;21073:15;21060:10;21056:2;21052:19;21045:44;20745:439;21155:12;21148:20;;-1:-1:-1;;;21148:20:0;;;;;;;;:::i;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;522:529::-;599:6;607;615;668:2;656:9;647:7;643:23;639:32;636:52;;;684:1;681;674:12;636:52;723:9;710:23;742:31;767:5;742:31;:::i;:::-;792:5;-1:-1:-1;849:2:1;834:18;;821:32;862:33;821:32;862:33;:::i;:::-;914:7;-1:-1:-1;973:2:1;958:18;;945:32;986:33;945:32;986:33;:::i;:::-;1038:7;1028:17;;;522:529;;;;;:::o;1056:598::-;1142:6;1150;1158;1166;1219:3;1207:9;1198:7;1194:23;1190:33;1187:53;;;1236:1;1233;1226:12;1187:53;1275:9;1262:23;1294:31;1319:5;1294:31;:::i;:::-;1344:5;-1:-1:-1;1401:2:1;1386:18;;1373:32;1414:33;1373:32;1414:33;:::i;:::-;1466:7;-1:-1:-1;1525:2:1;1510:18;;1497:32;1538:33;1497:32;1538:33;:::i;:::-;1056:598;;;;-1:-1:-1;1590:7:1;;1644:2;1629:18;1616:32;;-1:-1:-1;;1056:598:1:o;1659:::-;1745:6;1753;1761;1769;1822:3;1810:9;1801:7;1797:23;1793:33;1790:53;;;1839:1;1836;1829:12;1790:53;1878:9;1865:23;1897:31;1922:5;1897:31;:::i;:::-;1947:5;-1:-1:-1;1999:2:1;1984:18;;1971:32;;-1:-1:-1;2055:2:1;2040:18;;2027:32;2068:33;2027:32;2068:33;:::i;:::-;2120:7;-1:-1:-1;2179:2:1;2164:18;;2151:32;2192:33;2151:32;2192:33;:::i;:::-;1659:598;;;;-1:-1:-1;1659:598:1;;-1:-1:-1;;1659:598:1:o;2262:740::-;2357:6;2365;2373;2381;2389;2442:3;2430:9;2421:7;2417:23;2413:33;2410:53;;;2459:1;2456;2449:12;2410:53;2498:9;2485:23;2517:31;2542:5;2517:31;:::i;:::-;2567:5;-1:-1:-1;2619:2:1;2604:18;;2591:32;;-1:-1:-1;2675:2:1;2660:18;;2647:32;2688:33;2647:32;2688:33;:::i;:::-;2740:7;-1:-1:-1;2799:2:1;2784:18;;2771:32;2812:33;2771:32;2812:33;:::i;:::-;2864:7;-1:-1:-1;2923:3:1;2908:19;;2895:33;2937;2895;2937;:::i;:::-;2989:7;2979:17;;;2262:740;;;;;;;;:::o;3007:1116::-;3102:6;3133:2;3176;3164:9;3155:7;3151:23;3147:32;3144:52;;;3192:1;3189;3182:12;3144:52;3225:9;3219:16;3254:18;3295:2;3287:6;3284:14;3281:34;;;3311:1;3308;3301:12;3281:34;3349:6;3338:9;3334:22;3324:32;;3394:7;3387:4;3383:2;3379:13;3375:27;3365:55;;3416:1;3413;3406:12;3365:55;3445:2;3439:9;3467:2;3463;3460:10;3457:36;;;3473:18;;:::i;:::-;3519:2;3516:1;3512:10;3551:2;3545:9;3614:2;3610:7;3605:2;3601;3597:11;3593:25;3585:6;3581:38;3669:6;3657:10;3654:22;3649:2;3637:10;3634:18;3631:46;3628:72;;;3680:18;;:::i;:::-;3716:2;3709:22;3766:18;;;3800:15;;;;-1:-1:-1;3835:11:1;;;3865;;;3861:20;;3858:33;-1:-1:-1;3855:53:1;;;3904:1;3901;3894:12;3855:53;3926:1;3917:10;;3936:156;3950:2;3947:1;3944:9;3936:156;;;4007:10;;3995:23;;3968:1;3961:9;;;;;4038:12;;;;4070;;3936:156;;;-1:-1:-1;4111:6:1;3007:1116;-1:-1:-1;;;;;;;;3007:1116:1:o;4128:277::-;4195:6;4248:2;4236:9;4227:7;4223:23;4219:32;4216:52;;;4264:1;4261;4254:12;4216:52;4296:9;4290:16;4349:5;4342:13;4335:21;4328:5;4325:32;4315:60;;4371:1;4368;4361:12;4410:184;4480:6;4533:2;4521:9;4512:7;4508:23;4504:32;4501:52;;;4549:1;4546;4539:12;4501:52;-1:-1:-1;4572:16:1;;4410:184;-1:-1:-1;4410:184:1:o;4599:245::-;4678:6;4686;4739:2;4727:9;4718:7;4714:23;4710:32;4707:52;;;4755:1;4752;4745:12;4707:52;-1:-1:-1;;4778:16:1;;4834:2;4819:18;;;4813:25;4778:16;;4813:25;;-1:-1:-1;4599:245:1:o;4849:306::-;4937:6;4945;4953;5006:2;4994:9;4985:7;4981:23;4977:32;4974:52;;;5022:1;5019;5012:12;4974:52;5051:9;5045:16;5035:26;;5101:2;5090:9;5086:18;5080:25;5070:35;;5145:2;5134:9;5130:18;5124:25;5114:35;;4849:306;;;;;:::o;5160:461::-;5213:3;5251:5;5245:12;5278:6;5273:3;5266:19;5304:4;5333:2;5328:3;5324:12;5317:19;;5370:2;5363:5;5359:14;5391:1;5401:195;5415:6;5412:1;5409:13;5401:195;;;5480:13;;-1:-1:-1;;;;;5476:39:1;5464:52;;5536:12;;;;5571:15;;;;5512:1;5430:9;5401:195;;;-1:-1:-1;5612:3:1;;5160:461;-1:-1:-1;;;;;5160:461:1:o;5626:274::-;5755:3;5793:6;5787:13;5809:53;5855:6;5850:3;5843:4;5835:6;5831:17;5809:53;:::i;:::-;5878:16;;;;;5626:274;-1:-1:-1;;5626:274:1:o;6802:688::-;-1:-1:-1;;;;;7189:15:1;;;7171:34;;7241:15;;;7236:2;7221:18;;7214:43;7288:2;7273:18;;7266:34;;;;7331:2;7316:18;;7309:34;;;;7374:3;7359:19;;7352:35;7424:15;;;7151:3;7403:19;;7396:44;7471:3;7456:19;;7449:35;;;;7120:3;7105:19;;6802:688::o;7495:760::-;-1:-1:-1;;;;;7910:15:1;;;7892:34;;7962:15;;;7957:2;7942:18;;7935:43;8009:2;7994:18;;7987:34;;;;8052:2;8037:18;;8030:34;;;;8095:3;8080:19;;8073:35;;;;7872:3;8124:19;;8117:35;8189:15;;;8183:3;8168:19;;8161:44;8236:3;8221:19;;8214:35;;;;7841:3;7826:19;;7495:760::o;8539:607::-;-1:-1:-1;;;;;8898:15:1;;;8880:34;;8945:2;8930:18;;8923:34;;;;8988:2;8973:18;;8966:34;;;;9031:2;9016:18;;9009:34;;;;9080:15;;;9074:3;9059:19;;9052:44;8860:3;9112:19;;9105:35;;;;8829:3;8814:19;;8539:607::o;9343:510::-;9614:6;9603:9;9596:25;9657:3;9652:2;9641:9;9637:18;9630:31;9577:4;9678:57;9730:3;9719:9;9715:19;9707:6;9678:57;:::i;:::-;-1:-1:-1;;;;;9771:32:1;;;;9766:2;9751:18;;9744:60;-1:-1:-1;9835:2:1;9820:18;9813:34;9670:65;9343:510;-1:-1:-1;;9343:510:1:o;9858:383::-;10007:2;9996:9;9989:21;9970:4;10039:6;10033:13;10082:6;10077:2;10066:9;10062:18;10055:34;10098:66;10157:6;10152:2;10141:9;10137:18;10132:2;10124:6;10120:15;10098:66;:::i;:::-;10225:2;10204:15;-1:-1:-1;;10200:29:1;10185:45;;;;10232:2;10181:54;;9858:383;-1:-1:-1;;9858:383:1:o;11060:338::-;11262:2;11244:21;;;11301:2;11281:18;;;11274:30;-1:-1:-1;;;11335:2:1;11320:18;;11313:44;11389:2;11374:18;;11060:338::o;11403:356::-;11605:2;11587:21;;;11624:18;;;11617:30;11683:34;11678:2;11663:18;;11656:62;11750:2;11735:18;;11403:356::o;13360:332::-;13567:6;13556:9;13549:25;13610:2;13605;13594:9;13590:18;13583:30;13530:4;13630:56;13682:2;13671:9;13667:18;13659:6;13630:56;:::i;13697:582::-;13996:6;13985:9;13978:25;14039:6;14034:2;14023:9;14019:18;14012:34;14082:3;14077:2;14066:9;14062:18;14055:31;13959:4;14103:57;14155:3;14144:9;14140:19;14132:6;14103:57;:::i;:::-;-1:-1:-1;;;;;14196:32:1;;;;14191:2;14176:18;;14169:60;-1:-1:-1;14260:3:1;14245:19;14238:35;14095:65;13697:582;-1:-1:-1;;;13697:582:1:o;14537:128::-;14577:3;14608:1;14604:6;14601:1;14598:13;14595:39;;;14614:18;;:::i;:::-;-1:-1:-1;14650:9:1;;14537:128::o;14670:217::-;14710:1;14736;14726:132;;14780:10;14775:3;14771:20;14768:1;14761:31;14815:4;14812:1;14805:15;14843:4;14840:1;14833:15;14726:132;-1:-1:-1;14872:9:1;;14670:217::o;14892:125::-;14932:4;14960:1;14957;14954:8;14951:34;;;14965:18;;:::i;:::-;-1:-1:-1;15002:9:1;;14892:125::o;15022:258::-;15094:1;15104:113;15118:6;15115:1;15112:13;15104:113;;;15194:11;;;15188:18;15175:11;;;15168:39;15140:2;15133:10;15104:113;;;15235:6;15232:1;15229:13;15226:48;;;-1:-1:-1;;15270:1:1;15252:16;;15245:27;15022:258::o;15285:127::-;15346:10;15341:3;15337:20;15334:1;15327:31;15377:4;15374:1;15367:15;15401:4;15398:1;15391:15;15417:127;15478:10;15473:3;15469:20;15466:1;15459:31;15509:4;15506:1;15499:15;15533:4;15530:1;15523:15;15549:127;15610:10;15605:3;15601:20;15598:1;15591:31;15641:4;15638:1;15631:15;15665:4;15662:1;15655:15;15681:131;-1:-1:-1;;;;;15756:31:1;;15746:42;;15736:70;;15802:1;15799;15792:12
Swarm Source
ipfs://b81396dcf7fbc45db4cbcfdc7a11d320388a6fe6a2c8a9865b4dc9be15be0f8b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.