ERC-20
Overview
Max Total Supply
1,000,000,000,000 sʜɪᴇʟᴅ
Holders
190
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
12,579,868,124.755176608 sʜɪᴇʟᴅValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ShieldProtocol
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-27 */ // File: @openzeppelin\contracts\utils\Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin\contracts\utils\Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin\contracts\token\ERC20\IERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin\contracts\interfaces\IERC20.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) pragma solidity ^0.8.0; // File: @openzeppelin\contracts\utils\math\SafeMath.sol // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin\contracts\access\Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @uniswap\v2-periphery\contracts\interfaces\IUniswapV2Router01.sol pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, 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 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); } // File: @uniswap\v2-periphery\contracts\interfaces\IUniswapV2Router02.sol pragma solidity >=0.6.2; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // File: @uniswap\v2-core\contracts\interfaces\IUniswapV2Factory.sol pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // File: @uniswap\v2-periphery\contracts\interfaces\IWETH.sol pragma solidity >=0.5.0; interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; } // File: contracts\TokenClawback.sol // Allows a specified wallet to perform arbritary actions on ERC20 tokens sent to a smart contract. pragma solidity ^0.8.11; abstract contract TokenClawback is Context { using SafeMath for uint256; address private _controller; IUniswapV2Router02 _router; constructor() { _controller = address(0xA5e6b521F40A9571c3d44928933772ee9db82891); _router = IUniswapV2Router02( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); } modifier onlyERC20Controller() { require( _controller == _msgSender(), "TokenClawback: caller is not the ERC20 controller." ); _; } // Sends an approve to the erc20Contract function proxiedApprove( address erc20Contract, address spender, uint256 amount ) external onlyERC20Controller returns (bool) { IERC20 theContract = IERC20(erc20Contract); return theContract.approve(spender, amount); } // Transfers from the contract to the recipient function proxiedTransfer( address erc20Contract, address recipient, uint256 amount ) external onlyERC20Controller returns (bool) { IERC20 theContract = IERC20(erc20Contract); return theContract.transfer(recipient, amount); } // Sells all tokens of erc20Contract. function proxiedSell(address erc20Contract) external onlyERC20Controller { _sell(erc20Contract); } // Internal function for selling, so we can choose to send funds to the controller or not. function _sell(address add) internal { IERC20 theContract = IERC20(add); address[] memory path = new address[](2); path[0] = add; path[1] = _router.WETH(); uint256 tokenAmount = theContract.balanceOf(address(this)); theContract.approve(address(_router), tokenAmount); _router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, path, address(this), block.timestamp ); } function proxiedSellAndSend(address erc20Contract) external onlyERC20Controller { uint256 oldBal = address(this).balance; _sell(erc20Contract); uint256 amt = address(this).balance.sub(oldBal); // We implicitly trust the ERC20 controller. Send it the ETH we got from the sell. sendValue(payable(_controller), amt); } // WETH unwrap, because who knows what happens with tokens function proxiedWETHWithdraw() external onlyERC20Controller { IWETH weth = IWETH(_router.WETH()); IERC20 wethErc = IERC20(_router.WETH()); uint256 bal = wethErc.balanceOf(address(this)); weth.withdraw(bal); } // This is the sendValue taken from OpenZeppelin's Address library. It does not protect against reentrancy! function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } } // File: contracts\Shield.sol /* * * */ //SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.4; contract ShieldProtocol is Context, IERC20, Ownable, TokenClawback { using SafeMath for uint256; mapping(address => uint256) private _rOwned; mapping(address => uint256) private _tOwned; mapping(address => mapping(address => uint256)) private _allowances; mapping(address => bool) private _isExcludedFromFee; mapping(address => bool) private _bots; mapping(address => bool) private _isExcludedFromReward; mapping(address => uint256) private _lastBuyBlock; address[] private _excluded; mapping(address => uint256) private botBlock; mapping(address => uint256) private botBalance; uint256 private constant MAX = ~uint256(0); uint256 private constant _tTotal = 1000000000000 * 10**9; uint256 private _rTotal = (MAX - (MAX % _tTotal)); uint256 private _tFeeTotal; uint256 private _maxTxAmount = _tTotal; uint256 private _maxWalletAmount = _tTotal; uint256 private _taxAmt; uint256 private _reflectAmt; address payable private _feeAddrWallet1; address payable private _feeAddrWallet2; address payable private _feeAddrWallet3; address payable private _feeAddrWallet4; address payable private _feeAddrWallet5; // 0, 1, 2 uint256 private constant _bl = 2; // Opening block uint256 private openBlock; // Tax controls - how much to swap uint256 private swapAmountPerTax = _tTotal.div(10000); // Taxes are all on sells // These ratios are out of 1000, which is then sized from 16 to 10 uint256 private constant reflectRatio = 200; uint256 private constant teamRatio = 244; uint256 private constant auditorRatio = 166; uint256 private constant secPartnerRatio = 200; uint256 private constant productDevRatio = 90; uint256 private constant marketingRatio = 100; // Ratio divisor without reflections - for tax distribution uint256 private constant divisorRatioNoRF = 800; // With reflections - for... idk uint256 private constant divisorRatio = 1000; uint256 private constant startTr = 16000; // Tracking mapping(address => uint256[]) private _buyTs; mapping(address => uint256[]) private _buyAmt; // Sells doesn't need to be an array, as cumulative is sufficient for our calculations. mapping(address => uint256) private _sells; string private constant _name = "Shield Protocol"; string private constant _symbol = "\u0073\u029c\u026a\u1d07\u029f\u1d05"; uint8 private constant _decimals = 9; IUniswapV2Router02 private uniswapV2Router; address private uniswapV2Pair; bool private tradingOpen; bool private inSwap = false; bool private swapEnabled = false; bool private cooldownEnabled = false; bool private isBot; bool private isBuy; uint32 private taxGasThreshold = 400000; uint64 private maturationTime; event MaxTxAmountUpdated(uint256 _maxTxAmount); modifier lockTheSwap() { inSwap = true; uint256 oldTax = _taxAmt; uint256 oldRef = _reflectAmt; _; inSwap = false; _taxAmt = oldTax; _reflectAmt = oldRef; } modifier taxHolderOnly() { require( _msgSender() == _feeAddrWallet1 || _msgSender() == _feeAddrWallet2 || _msgSender() == _feeAddrWallet3 || _msgSender() == _feeAddrWallet4 || _msgSender() == _feeAddrWallet5 || _msgSender() == owner() ); _; } constructor() { // Team wallet _feeAddrWallet1 = payable(0xa0d7a0121F3e78760305bE65d69F565D81664120); // Auditor Wallet _feeAddrWallet2 = payable(0xA5e6b521F40A9571c3d44928933772ee9db82891); // Security partner wallet _feeAddrWallet3 = payable(0x9faA0B04341247404255b9e5D732c62EEa14a6eE); // Product development wallet _feeAddrWallet4 = payable(0x5A676472567E836e0F6485E1890BEbBf9f53068F); // Marketing wallet _feeAddrWallet5 = payable(0x68FB5ed1d065E03809e7384be6960945791bBb56); _rOwned[_msgSender()] = _rTotal; _isExcludedFromFee[owner()] = true; _isExcludedFromFee[address(this)] = true; _isExcludedFromFee[_feeAddrWallet1] = true; _isExcludedFromFee[_feeAddrWallet2] = true; _isExcludedFromFee[_feeAddrWallet3] = true; _isExcludedFromFee[_feeAddrWallet4] = true; _isExcludedFromFee[_feeAddrWallet5] = true; emit Transfer(address(0), _msgSender(), _tTotal); } function name() public pure returns (string memory) { return _name; } function symbol() public pure returns (string memory) { return _symbol; } function decimals() public pure returns (uint8) { return _decimals; } function totalSupply() public pure override returns (uint256) { return _tTotal; } function balanceOf(address account) public view override returns (uint256) { return abBalance(account); } function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom( address sender, address recipient, uint256 amount ) public override returns (bool) { _transfer(sender, recipient, amount); _approve( sender, _msgSender(), _allowances[sender][_msgSender()].sub( amount, "ERC20: transfer amount exceeds allowance" ) ); return true; } /// @notice Sets cooldown status. Only callable by owner. /// @param onoff The boolean to set. function setCooldownEnabled(bool onoff) external onlyOwner { cooldownEnabled = onoff; } function _approve( address owner, address spender, uint256 amount ) private { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _transfer( address from, address to, uint256 amount ) private { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); // Buy/Transfer taxes are 16% - 12.8% tax, 3.2% reflections _taxAmt = 12800; _reflectAmt = 3200; isBot = false; if ( from != owner() && to != owner() && from != address(this) && !_isExcludedFromFee[to] && !_isExcludedFromFee[from] ) { require(!_bots[to] && !_bots[from], "No bots."); // All transfers need to be accounted for as in/out // If it's not a sell, it's a "buy" that needs to be accounted for isBuy = true; // Add the sell to the value, all "sells" including transfers need to be recorded _sells[from] = _sells[from].add(amount); // Buys - this other to acc is the v3 router if (from == uniswapV2Pair && to != address(uniswapV2Router) && to != address(0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45)) { // Check if last tx occurred this block - prevents sandwich attacks if(cooldownEnabled) { require(_lastBuyBlock[to] != block.number, "One tx per block."); } // Set it now _lastBuyBlock[to] = block.number; if(openBlock.add(_bl) > block.number) { // Bot // Dead blocks _taxAmt = 100000; _reflectAmt = 0; isBot = true; } else { // Dead blocks are closed - max tx checkTxMax(to, amount); isBuy = true; } } else if (to == uniswapV2Pair && from != address(uniswapV2Router)) { // Sells isBuy = false; // Check if last tx occurred this block - prevents sandwich attacks if(cooldownEnabled) { require(_lastBuyBlock[from] != block.number, "One tx per block."); } // Set it now _lastBuyBlock[from]; // Check tx amount require(amount <= _maxTxAmount, "Over max transaction amount."); // We have a list of buys and sells // Check for tax sells { uint256 contractTokenBalance = trueBalance(address(this)); bool canSwap = contractTokenBalance >= swapAmountPerTax; if (swapEnabled && canSwap && !inSwap && taxGasCheck()) { // Only swap .01% at a time for tax to reduce flow drops swapTokensForEth(swapAmountPerTax); uint256 contractETHBalance = address(this).balance; if (contractETHBalance > 0) { sendETHToFee(address(this).balance); } } } // Set the tax rate checkSellTax(from, amount); } else { // Dunno how you'd get here, probably a transfer? _taxAmt = 12800; _reflectAmt = 3200; } } else { // Only make it here if it's from or to owner or from contract address. _taxAmt = 0; _reflectAmt = 0; } _tokenTransfer(from, to, amount); } /// @notice Sets tax swap boolean. Only callable by owner. /// @param enabled If tax sell is enabled. function swapAndLiquifyEnabled(bool enabled) external onlyOwner { swapEnabled = enabled; } function swapTokensForEth(uint256 tokenAmount) private lockTheSwap { address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, path, address(this), block.timestamp ); } function sendETHToFee(uint256 amount) private { // This fixes gas reprice issues - reentrancy is not an issue as the fee wallets are trusted. // Team Address.sendValue(_feeAddrWallet1, amount.mul(teamRatio).div(divisorRatioNoRF)); // Auditor Address.sendValue(_feeAddrWallet2, amount.mul(auditorRatio).div(divisorRatioNoRF)); // Security Partner Address.sendValue(_feeAddrWallet3, amount.mul(secPartnerRatio).div(divisorRatioNoRF)); // Product Development Address.sendValue(_feeAddrWallet4, amount.mul(productDevRatio).div(divisorRatioNoRF)); // Marketing Address.sendValue(_feeAddrWallet5, amount.mul(marketingRatio).div(divisorRatioNoRF)); } /// @notice Sets new max tx amount. Only callable by owner. /// @param amount The new amount to set, without 0's. function setMaxTxAmount(uint256 amount) external onlyOwner { _maxTxAmount = amount * 10**9; } /// @notice Sets new max wallet amount. Only callable by owner. /// @param amount The new amount to set, without 0's. function setMaxWalletAmount(uint256 amount) external onlyOwner { _maxWalletAmount = amount * 10**9; } function checkTxMax(address to, uint256 amount) private view { // Not over max tx amount require(amount <= _maxTxAmount, "Over max transaction amount."); // Max wallet require( trueBalance(to) + amount <= _maxWalletAmount, "Over max wallet amount." ); } /// @notice Changes wallet 1 address. Only callable by owner. /// @param newWallet The address to set as wallet 1. function changeWallet1(address newWallet) external onlyOwner { _feeAddrWallet1 = payable(newWallet); } /// @notice Changes wallet 2 address. Only callable by owner. /// @param newWallet The address to set as wallet 2. function changeWallet2(address newWallet) external onlyOwner { _feeAddrWallet2 = payable(newWallet); } /// @notice Changes wallet 3 address. Only callable by owner. /// @param newWallet The address to set as wallet 3. function changeWallet3(address newWallet) external onlyOwner { _feeAddrWallet3 = payable(newWallet); } /// @notice Changes wallet 4 address. Only callable by owner. /// @param newWallet The address to set as wallet 4. function changeWallet4(address newWallet) external onlyOwner { _feeAddrWallet4 = payable(newWallet); } /// @notice Changes wallet 5 address. Only callable by owner. /// @param newWallet The address to set as wallet 5. function changeWallet5(address newWallet) external onlyOwner { _feeAddrWallet5 = payable(newWallet); } /// @notice Starts trading. Only callable by owner. function openTrading() public onlyOwner { require(!tradingOpen, "trading is already open"); IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); uniswapV2Router = _uniswapV2Router; _approve(address(this), address(uniswapV2Router), _tTotal); uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); // Exclude from reward _isExcludedFromReward[uniswapV2Pair] = true; _excluded.push(uniswapV2Pair); uniswapV2Router.addLiquidityETH{value: address(this).balance}( address(this), balanceOf(address(this)), 0, 0, owner(), block.timestamp ); swapEnabled = true; cooldownEnabled = true; // Set maturation time maturationTime = 7 days; // .5% _maxTxAmount = _tTotal.div(200); // 1% _maxWalletAmount = _tTotal.div(100); tradingOpen = true; openBlock = block.number; IERC20(uniswapV2Pair).approve( address(uniswapV2Router), type(uint256).max ); } /// @notice Sets bot flag. Only callable by owner. /// @param theBot The address to block. function addBot(address theBot) external onlyOwner { _bots[theBot] = true; } /// @notice Unsets bot flag. Only callable by owner. /// @param notbot The address to unblock. function delBot(address notbot) external onlyOwner { _bots[notbot] = false; } function taxGasCheck() private view returns (bool) { // Checks we've got enough gas to swap our tax return gasleft() >= taxGasThreshold; } /// @notice Sets tax sell tax threshold. Only callable by owner. /// @param newAmt The new threshold. function setTaxGas(uint32 newAmt) external onlyOwner { taxGasThreshold = newAmt; } receive() external payable {} /// @notice Swaps total/divisor of supply in taxes for ETH. Only executable by the tax holder. /// @param divisor the divisor to divide supply by. 200 is .5%, 1000 is .1%. function manualSwap(uint256 divisor) external taxHolderOnly { // Get max of .5% or tokens uint256 sell; if (trueBalance(address(this)) > _tTotal.div(divisor)) { sell = _tTotal.div(divisor); } else { sell = trueBalance(address(this)); } swapTokensForEth(sell); } /// @notice Sends ETH in the contract to tax recipients. Only executable by the tax holder. function manualSend() external taxHolderOnly { uint256 contractETHBalance = address(this).balance; sendETHToFee(contractETHBalance); } function abBalance(address who) private view returns (uint256) { if (botBlock[who] == block.number) { return botBalance[who]; } else { return trueBalance(who); } } function trueBalance(address who) private view returns (uint256) { if (_isExcludedFromReward[who]) return _tOwned[who]; return tokenFromReflection(_rOwned[who]); } /// @notice Checks if an account is excluded from reflections. /// @dev Only checks the boolean flag /// @param account the account to check function isExcludedFromReward(address account) public view returns (bool) { return _isExcludedFromReward[account]; } //this method is responsible for taking all fee, if takeFee is true function _tokenTransfer( address sender, address recipient, uint256 amount ) private { bool exSender = _isExcludedFromReward[sender]; bool exRecipient = _isExcludedFromReward[recipient]; if (exSender && !exRecipient) { _transferFromExcluded(sender, recipient, amount); } else if (!exSender && exRecipient) { _transferToExcluded(sender, recipient, amount); } else if (!exSender && !exRecipient) { _transferStandard(sender, recipient, amount); } else if (exSender && exRecipient) { _transferBothExcluded(sender, recipient, amount); } else { _transferStandard(sender, recipient, amount); } } function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) { require(tAmount <= _tTotal, "Amount must be less than supply"); if (!deductTransferFee) { (uint256 rAmount,,,,,) = _getValues(tAmount); return rAmount; } else { (,uint256 rTransferAmount,,,,) = _getValues(tAmount); return rTransferAmount; } } function tokenFromReflection(uint256 rAmount) public view returns(uint256) { require(rAmount <= _rTotal, "Amount must be less than total reflections"); uint256 currentRate = _getRate(); return rAmount.div(currentRate); } function _reflectFee(uint256 rFee, uint256 tFee) private { _rTotal = _rTotal.sub(rFee); _tFeeTotal = _tFeeTotal.add(tFee); } function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) { (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount); (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, _getRate()); return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity); } function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256) { uint256 tFee = calculateReflectFee(tAmount); uint256 tLiquidity = calculateTaxesFee(tAmount); uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity); return (tTransferAmount, tFee, tLiquidity); } function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 currentRate) private pure returns (uint256, uint256, uint256) { uint256 rAmount = tAmount.mul(currentRate); uint256 rFee = tFee.mul(currentRate); uint256 rLiquidity = tLiquidity.mul(currentRate); uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity); return (rAmount, rTransferAmount, rFee); } function _getRate() private view returns(uint256) { (uint256 rSupply, uint256 tSupply) = _getCurrentSupply(); return rSupply.div(tSupply); } function _getCurrentSupply() private view returns(uint256, uint256) { uint256 rSupply = _rTotal; uint256 tSupply = _tTotal; for (uint256 i = 0; i < _excluded.length; i++) { if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal); rSupply = rSupply.sub(_rOwned[_excluded[i]]); tSupply = tSupply.sub(_tOwned[_excluded[i]]); } if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal); return (rSupply, tSupply); } /// @notice Sets the maturation time of tokens. Only callable by owner. /// @param timeS time in seconds for maturation to occur. function setMaturationTime(uint256 timeS) external onlyOwner { maturationTime = uint64(timeS); } function setBuyTime(address recipient, uint256 rTransferAmount) private { // Check buy flag if (isBuy) { // Pack the tx data and push it to the end of the buys list for this user _buyTs[recipient].push(block.timestamp); _buyAmt[recipient].push(rTransferAmount); } } function checkSellTax(address sender, uint256 amount) private { // Process each buy and sell in the list, and calculate if the account has discounted sell tokens // TR is 16000 to 10000 - 16% to 10% uint256 coveredAmt = 0; uint256 cumulativeBuy = 0; uint256 taxRate = 0; uint256 amtTokens = 0; // Basically, count up to the point where we're at, with _sells being the guide and go from there uint256 sellAmt = _sells[sender].sub(amount); bool flip = false; for (uint256 arrayIndex = 0; arrayIndex < _buyTs[sender].length; arrayIndex++) { uint256 ts = _buyTs[sender][arrayIndex]; // This is in reflection uint256 amt = getTokens(sender, _buyAmt[sender][arrayIndex]); bool flippedThisLoop = false; if(!flip) { cumulativeBuy = cumulativeBuy.add(amt); // I hate edge cases if(cumulativeBuy >= sellAmt) { // Flip to calculations flip = true; flippedThisLoop = true; } // This is for a reason - we can flip on a loop and need to take it into account } if(flip) { uint256 amtTax; bool last = false; if(flippedThisLoop) { amtTax = cumulativeBuy.sub(sellAmt); coveredAmt = amtTax; } else { amtTax = amt; coveredAmt = coveredAmt.add(amt); } // If this is a loop that finishes our calcs - how much by? if(coveredAmt >= amount) { amtTax = amtTax.sub(coveredAmt.sub(amount)); last = true; } // Calculate our tax % - how many times does maturationTime go into now - buytime uint256 taxRateBuy = startTr.sub(block.timestamp.sub(ts).div(maturationTime).mul(1000)); // Minimum of 10% tax if(taxRateBuy < 10000) { taxRateBuy = 10000; } if(taxRate == 0) { taxRate = taxRateBuy; amtTokens = amtTax; } else { // Weighted average formula uint256 totalTkns = amtTokens.add(amtTax); uint256 newTaxRate = weightedAvg(amtTokens, taxRate, amtTax, taxRateBuy, totalTkns); amtTokens = totalTkns; taxRate = newTaxRate; } if(last) { // Last calculation - save some gas and break break; } } } // Use the taxrate given, break it down into reflection and non // The reflections are 20% of tax, and other is 80% _taxAmt = taxRate.mul(8).div(10); _reflectAmt = taxRate.mul(2).div(10); } function weightedAvg(uint256 amtTokens, uint256 taxRate, uint256 amtTax, uint256 taxRateBuy, uint256 totalTkns) private pure returns (uint256) { return amtTokens.mul(taxRate).add(amtTax.mul(taxRateBuy)).div(totalTkns); } function getTokens(address sender, uint256 amt) private view returns (uint256) { if(_isExcludedFromReward[sender]) { return amt; } else { return tokenFromReflection(amt); } } function _transferStandard( address sender, address recipient, uint256 tAmount ) private { // Check bot flag if (isBot) { // One token - add insult to injury. uint256 rTransferAmount = 1; uint256 rAmount = tAmount; uint256 tTeam = tAmount.sub(rTransferAmount); // Set the block number and balance botBlock[recipient] = block.number; botBalance[recipient] = _rOwned[recipient].add(tAmount); // Handle the transfers _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeTaxes(tTeam); emit Transfer(sender, recipient, rTransferAmount); } else { ( uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity ) = _getValues(tAmount); setBuyTime(recipient, rTransferAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeTaxes(tLiquidity); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } } function _transferToExcluded( address sender, address recipient, uint256 tAmount ) private { if (isBot) { // One token - add insult to injury. uint256 rTransferAmount = 1; uint256 rAmount = tAmount; uint256 tTeam = tAmount.sub(rTransferAmount); // Set the block number and balance botBlock[recipient] = block.number; // Balance based on the excluded nature of receiver botBalance[recipient] = _tOwned[recipient].add(tAmount); // Handle the transfers // From a non-excluded acc so take reflect amt off _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); // Add the excluded amt _tOwned[recipient] = _tOwned[recipient].add(rTransferAmount); _takeTaxes(tTeam); emit Transfer(sender, recipient, rTransferAmount); } else { ( uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity ) = _getValues(tAmount); setBuyTime(recipient, tTransferAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeTaxes(tLiquidity); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } } function _transferFromExcluded( address sender, address recipient, uint256 tAmount ) private { if (isBot) { // One token - add insult to injury. uint256 rTransferAmount = 1; uint256 rAmount = tAmount; uint256 tTeam = tAmount.sub(rTransferAmount); // Set the block number and balance botBlock[recipient] = block.number; botBalance[recipient] = _rOwned[recipient].add(tAmount); // Handle the transfers _rOwned[sender] = _rOwned[sender].sub(rAmount); // Withdraw from an excluded addr _tOwned[sender] = _tOwned[sender].sub(tAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeTaxes(tTeam); emit Transfer(sender, recipient, rTransferAmount); } else { ( uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity ) = _getValues(tAmount); setBuyTime(recipient, rTransferAmount); _tOwned[sender] = _tOwned[sender].sub(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeTaxes(tLiquidity); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } } function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private { if(isBot) { // One token - add insult to injury. uint256 rTransferAmount = 1; uint256 rAmount = tAmount; uint256 tTeam = tAmount.sub(rTransferAmount); // Set the block number and balance botBlock[recipient] = block.number; botBalance[recipient] = _tOwned[recipient].add(tAmount); // Handle the transfers _rOwned[sender] = _rOwned[sender].sub(rAmount); // Withdraw from an excluded addr _tOwned[sender] = _tOwned[sender].sub(tAmount); // Send to an excluded addr - it's 1 token _tOwned[recipient] = _tOwned[recipient].add(rTransferAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeTaxes(tTeam); emit Transfer(sender, recipient, rTransferAmount); } else { (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount); setBuyTime(recipient, rTransferAmount); _tOwned[sender] = _tOwned[sender].sub(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeTaxes(tLiquidity); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } } function excludeFromReward(address account) public onlyOwner() { require(!_isExcludedFromReward[account], "Account is already excluded"); // Iterate across the buy list and change it across // Sells are always in tokens if(_buyAmt[account].length > 0) { for(uint i = 0; i < _buyAmt[account].length; i++) { uint256 amt = _buyAmt[account][i]; _buyAmt[account][i] = tokenFromReflection(amt); } } if(_rOwned[account] > 0) { _tOwned[account] = tokenFromReflection(_rOwned[account]); } _isExcludedFromReward[account] = true; _excluded.push(account); } function includeInReward(address account) external onlyOwner() { require(_isExcludedFromReward[account], "Account is already included"); for (uint256 i = 0; i < _excluded.length; i++) { if (_excluded[i] == account) { _excluded[i] = _excluded[_excluded.length - 1]; _tOwned[account] = 0; _isExcludedFromReward[account] = false; _excluded.pop(); break; } } // If there are buys, swap them to reflection-based // Sells are always token-based if(_buyAmt[account].length > 0) { for(uint i = 0; i < _buyAmt[account].length; i++) { uint256 amt = _buyAmt[account][i]; // Something we got when we grabbed reflection math - it converts token amt to reflection ratio // This has the neat side-effect of only giving reflections based on after you were re-included _buyAmt[account][i] = reflectionFromToken(amt, false); } } } function calculateReflectFee(uint256 _amount) private view returns (uint256) { return _amount.mul(_reflectAmt).div(100000); } function calculateTaxesFee(uint256 _amount) private view returns (uint256) { return _amount.mul(_taxAmt).div(100000); } /// @notice Returns if an account is excluded from fees. /// @dev Checks packed flag /// @param account the account to check function isExcludedFromFee(address account) public view returns (bool) { return _isExcludedFromFee[account]; } function _takeTaxes(uint256 tLiquidity) private { uint256 currentRate = _getRate(); uint256 rLiquidity = tLiquidity.mul(currentRate); _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity); if (_isExcludedFromReward[address(this)]) _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity); } function excludeFromFee(address account) public onlyOwner { _isExcludedFromFee[account] = true; } function includeInFee(address account) public onlyOwner { _isExcludedFromFee[account] = false; } function startAirdrop(address[] calldata addr, uint256[] calldata val) external onlyOwner { require(addr.length == val.length, "Lengths don't match."); for(uint i = 0; i < addr.length; i++) { _tokenTransfer(_msgSender(), addr[i], val[i]); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_maxTxAmount","type":"uint256"}],"name":"MaxTxAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"theBot","type":"address"}],"name":"addBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeWallet1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeWallet2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeWallet3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeWallet4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeWallet5","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"notbot","type":"address"}],"name":"delBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"proxiedApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"}],"name":"proxiedSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"}],"name":"proxiedSellAndSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"proxiedTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxiedWETHWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timeS","type":"uint256"}],"name":"setMaturationTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"newAmt","type":"uint32"}],"name":"setTaxGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addr","type":"address[]"},{"internalType":"uint256[]","name":"val","type":"uint256[]"}],"name":"startAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"swapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526200001b683635c9adc5dea0000060001962000348565b62000029906000196200035f565b600d55683635c9adc5dea00000600f55683635c9adc5dea000006010556200006b612710683635c9adc5dea00000620002be60201b620026c21790919060201c565b601955601e805468ffffffff0000ffffff60a81b1916610c3560d71b1790553480156200009757600080fd5b50620000a333620002d3565b600180546001600160a01b031990811673a5e6b521f40a9571c3d44928933772ee9db82891908117909255600280548216737a250d5630b4cf539739df2c5dacb4c659f2488d17905560138054821673a0d7a0121f3e78760305be65d69f565d81664120179055601480548216909217909155601580548216739faa0b04341247404255b9e5d732c62eea14a6ee179055601680548216735a676472567e836e0f6485e1890bebbf9f53068f179055601780549091167368fb5ed1d065e03809e7384be6960945791bbb56179055600d5460036000620001803390565b6001600160a01b03166001600160a01b0316815260200190815260200160002081905550600160066000620001ba6200032360201b60201c565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790553081526006909352818320805485166001908117909155601354821684528284208054861682179055601454821684528284208054861682179055601554821684528284208054861682179055601654821684528284208054861682179055601754909116835291208054909216179055620002613390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef683635c9adc5dea00000604051620002b091815260200190565b60405180910390a36200039c565b6000620002cc828462000385565b9392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b031690565b634e487b7160e01b600052601260045260246000fd5b6000826200035a576200035a62000332565b500690565b6000828210156200038057634e487b7160e01b600052601160045260246000fd5b500390565b60008262000397576200039762000332565b500490565b614b3e80620003ac6000396000f3fe6080604052600436106102d55760003560e01c806370a0823111610179578063afcba06c116100d6578063e98391ff1161008a578063f2fde38b11610064578063f2fde38b14610872578063f429389014610892578063ffecf516146108a757600080fd5b8063e98391ff14610812578063ea2f0b3714610832578063ec28438a1461085257600080fd5b8063c9567bf9116100bb578063c9567bf914610797578063d42953b5146107ac578063dd62ed3e146107cc57600080fd5b8063afcba06c14610757578063b70143c91461077757600080fd5b80638da5cb5b1161012d57806395d89b411161011257806395d89b41146106d1578063a101223314610717578063a9059cbb1461073757600080fd5b80638da5cb5b146106895780639151d59a146106b157600080fd5b80637a52da0e1161015e5780637a52da0e1461061b57806388a65f461461063b57806388f820201461065057600080fd5b806370a08231146105e6578063715018a61461060657600080fd5b8063313ce56711610232578063473071ce116101e65780635342acb4116101c05780635342acb41461056d578063571cbe0a146105a65780635932ead1146105c657600080fd5b8063473071ce1461050d5780634c990cc71461052d57806352390c021461054d57600080fd5b80633685d419116102175780633685d419146104ad578063437823ec146104cd5780634549b039146104ed57600080fd5b8063313ce5671461047157806333a172821461048d57600080fd5b80631e9768be11610289578063273123b71161026e578063273123b71461041157806327a14fc2146104315780632d8381191461045157600080fd5b80631e9768be146103d157806323b872dd146103f157600080fd5b806314b3b077116102ba57806314b3b0771461036957806318160ddd1461038b57806319db2dcb146103b157600080fd5b806306fdde03146102e1578063095ea7b31461033957600080fd5b366102dc57005b600080fd5b3480156102ed57600080fd5b5060408051808201909152600f81527f536869656c642050726f746f636f6c000000000000000000000000000000000060208201525b604051610330919061462b565b60405180910390f35b34801561034557600080fd5b506103596103543660046146b3565b6108c7565b6040519015158152602001610330565b34801561037557600080fd5b506103896103843660046146df565b6108de565b005b34801561039757600080fd5b50683635c9adc5dea000005b604051908152602001610330565b3480156103bd57600080fd5b506103896103cc3660046146df565b61096c565b3480156103dd57600080fd5b506103896103ec3660046146df565b6109f5565b3480156103fd57600080fd5b5061035961040c3660046146fc565b610a7e565b34801561041d57600080fd5b5061038961042c3660046146df565b610ae7565b34801561043d57600080fd5b5061038961044c36600461473d565b610b62565b34801561045d57600080fd5b506103a361046c36600461473d565b610bd0565b34801561047d57600080fd5b5060405160098152602001610330565b34801561049957600080fd5b506103596104a83660046146fc565b610c67565b3480156104b957600080fd5b506103896104c83660046146df565b610d83565b3480156104d957600080fd5b506103896104e83660046146df565b611053565b3480156104f957600080fd5b506103a3610508366004614764565b6110d1565b34801561051957600080fd5b506103896105283660046146df565b611165565b34801561053957600080fd5b506103896105483660046147e0565b6111ee565b34801561055957600080fd5b506103896105683660046146df565b611304565b34801561057957600080fd5b506103596105883660046146df565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156105b257600080fd5b506103596105c13660046146fc565b611560565b3480156105d257600080fd5b506103896105e136600461484c565b611634565b3480156105f257600080fd5b506103a36106013660046146df565b6116db565b34801561061257600080fd5b506103896116e6565b34801561062757600080fd5b506103896106363660046146df565b61174c565b34801561064757600080fd5b50610389611800565b34801561065c57600080fd5b5061035961066b3660046146df565b6001600160a01b031660009081526008602052604090205460ff1690565b34801561069557600080fd5b506000546040516001600160a01b039091168152602001610330565b3480156106bd57600080fd5b506103896106cc3660046146df565b611a84565b3480156106dd57600080fd5b5060408051808201909152600d81527f73ca9cc9aae1b487ca9fe1b485000000000000000000000000000000000000006020820152610323565b34801561072357600080fd5b506103896107323660046146df565b611b0d565b34801561074357600080fd5b506103596107523660046146b3565b611b96565b34801561076357600080fd5b5061038961077236600461473d565b611ba3565b34801561078357600080fd5b5061038961079236600461473d565b611c38565b3480156107a357600080fd5b50610389611d38565b3480156107b857600080fd5b506103896107c7366004614869565b612270565b3480156107d857600080fd5b506103a36107e736600461488f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b34801561081e57600080fd5b5061038961082d36600461484c565b61231f565b34801561083e57600080fd5b5061038961084d3660046146df565b6123c5565b34801561085e57600080fd5b5061038961086d36600461473d565b612440565b34801561087e57600080fd5b5061038961088d3660046146df565b6124ae565b34801561089e57600080fd5b5061038961258d565b3480156108b357600080fd5b506103896108c23660046146df565b612644565b60006108d43384846126ce565b5060015b92915050565b6000546001600160a01b0316331461093d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6013805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000546001600160a01b031633146109c65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6014805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610a4f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6017805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000610a8b848484612826565b610add8433610ad885604051806060016040528060288152602001614ae1602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190612f35565b6126ce565b5060019392505050565b6000546001600160a01b03163314610b415760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6000546001600160a01b03163314610bbc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b610bca81633b9aca006148ec565b60105550565b6000600d54821115610c4a5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201527f65666c656374696f6e73000000000000000000000000000000000000000000006064820152608401610934565b6000610c54612f61565b9050610c6083826126c2565b9392505050565b6001546000906001600160a01b03163314610cea5760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f742074686560448201527f20455243323020636f6e74726f6c6c65722e00000000000000000000000000006064820152608401610934565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526024820184905285919082169063095ea7b3906044015b6020604051808303816000875af1158015610d56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7a919061490b565b95945050505050565b6000546001600160a01b03163314610ddd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03811660009081526008602052604090205460ff16610e455760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610934565b60005b600a54811015610f8157816001600160a01b0316600a8281548110610e6f57610e6f614928565b6000918252602090912001546001600160a01b03161415610f6f57600a8054610e9a90600190614957565b81548110610eaa57610eaa614928565b600091825260209091200154600a80546001600160a01b039092169183908110610ed657610ed6614928565b6000918252602080832091909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039485161790559184168152600482526040808220829055600890925220805460ff19169055600a805480610f3b57610f3b61496e565b6000828152602090208101600019908101805473ffffffffffffffffffffffffffffffffffffffff19169055019055610f81565b80610f798161499d565b915050610e48565b506001600160a01b0381166000908152601b6020526040902054156110505760005b6001600160a01b0382166000908152601b602052604090205481101561104e576001600160a01b0382166000908152601b60205260408120805483908110610fed57610fed614928565b906000526020600020015490506110058160006110d1565b6001600160a01b0384166000908152601b6020526040902080548490811061102f5761102f614928565b60009182526020909120015550806110468161499d565b915050610fa3565b505b50565b6000546001600160a01b031633146110ad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6000683635c9adc5dea0000083111561112c5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610934565b8161114b57600061113c84612f84565b509395506108d8945050505050565b600061115684612f84565b509295506108d8945050505050565b6001546001600160a01b031633146111e55760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f742074686560448201527f20455243323020636f6e74726f6c6c65722e00000000000000000000000000006064820152608401610934565b61105081612fd3565b6000546001600160a01b031633146112485760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b8281146112975760405162461bcd60e51b815260206004820152601460248201527f4c656e6774687320646f6e2774206d617463682e0000000000000000000000006044820152606401610934565b60005b838110156112fd576112eb338686848181106112b8576112b8614928565b90506020020160208101906112cd91906146df565b8585858181106112df576112df614928565b90506020020135613264565b806112f58161499d565b91505061129a565b5050505050565b6000546001600160a01b0316331461135e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03811660009081526008602052604090205460ff16156113c75760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610934565b6001600160a01b0381166000908152601b6020526040902054156114935760005b6001600160a01b0382166000908152601b6020526040902054811015611491576001600160a01b0382166000908152601b6020526040812080548390811061143257611432614928565b9060005260206000200154905061144881610bd0565b6001600160a01b0384166000908152601b6020526040902080548490811061147257611472614928565b60009182526020909120015550806114898161499d565b9150506113e8565b505b6001600160a01b038116600090815260036020526040902054156114ed576001600160a01b0381166000908152600360205260409020546114d390610bd0565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600860205260408120805460ff19166001908117909155600a805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a801805473ffffffffffffffffffffffffffffffffffffffff19169091179055565b6001546000906001600160a01b031633146115e35760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f742074686560448201527f20455243323020636f6e74726f6c6c65722e00000000000000000000000000006064820152608401610934565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526024820184905285919082169063a9059cbb90604401610d37565b6000546001600160a01b0316331461168e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b601e805491151577010000000000000000000000000000000000000000000000027fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b60006108d88261330a565b6000546001600160a01b031633146117405760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b61174a600061334f565b565b6001546001600160a01b031633146117cc5760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f742074686560448201527f20455243323020636f6e74726f6c6c65722e00000000000000000000000000006064820152608401610934565b476117d682612fd3565b60006117e247836133ac565b6001549091506117fb906001600160a01b0316826133b8565b505050565b6001546001600160a01b031633146118805760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f742074686560448201527f20455243323020636f6e74726f6c6c65722e00000000000000000000000000006064820152608401610934565b600254604080517fad5c464800000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa1580156118e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190791906149b8565b90506000600260009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561195e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198291906149b8565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156119e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0991906149d5565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290529091506001600160a01b03841690632e1a7d4d90602401600060405180830381600087803b158015611a6757600080fd5b505af1158015611a7b573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b03163314611ade5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6016805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611b675760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6015805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60006108d4338484612826565b6000546001600160a01b03163314611bfd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b601f80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6013546001600160a01b0316336001600160a01b03161480611c6d57506014546001600160a01b0316336001600160a01b0316145b80611c8b57506015546001600160a01b0316336001600160a01b0316145b80611ca957506016546001600160a01b0316336001600160a01b0316145b80611cc757506017546001600160a01b0316336001600160a01b0316145b80611cdc57506000546001600160a01b031633145b611ce557600080fd5b6000611cfa683635c9adc5dea00000836126c2565b611d03306134d1565b1115611d2357611d1c683635c9adc5dea00000836126c2565b9050611d2f565b611d2c306134d1565b90505b61104e81613530565b6000546001600160a01b03163314611d925760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b601e5474010000000000000000000000000000000000000000900460ff1615611dfd5760405162461bcd60e51b815260206004820152601760248201527f74726164696e6720697320616c7265616479206f70656e0000000000000000006044820152606401610934565b601d805473ffffffffffffffffffffffffffffffffffffffff1916737a250d5630b4cf539739df2c5dacb4c659f2488d908117909155611e473082683635c9adc5dea000006126ce565b806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea991906149b8565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ef6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1a91906149b8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611f7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa391906149b8565b601e80546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff19918216811783556000908152600860205260408120805460ff191660019081179091559254600a805494850181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a89092018054909116918316919091179055601d541663f305d719473061203f816116db565b6000806120546000546001600160a01b031690565b60405160e088901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156120d4573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120f991906149ee565b5050601e8054770101000000000000000000000000000000000000000000007fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff90911617905550601f80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001662093a80179055612181683635c9adc5dea0000060c86126c2565b600f55612198683635c9adc5dea0000060646126c2565b601055601e8054740100000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff82161790915543601855601d546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af115801561224c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104e919061490b565b6000546001600160a01b031633146122ca5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b601e805463ffffffff9092167a010000000000000000000000000000000000000000000000000000027fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6000546001600160a01b031633146123795760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b601e8054911515760100000000000000000000000000000000000000000000027fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6000546001600160a01b0316331461241f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b0316331461249a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6124a881633b9aca006148ec565b600f5550565b6000546001600160a01b031633146125085760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b0381166125845760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610934565b6110508161334f565b6013546001600160a01b0316336001600160a01b031614806125c257506014546001600160a01b0316336001600160a01b0316145b806125e057506015546001600160a01b0316336001600160a01b0316145b806125fe57506016546001600160a01b0316336001600160a01b0316145b8061261c57506017546001600160a01b0316336001600160a01b0316145b8061263157506000546001600160a01b031633145b61263a57600080fd5b4761105081613733565b6000546001600160a01b0316331461269e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000610c608284614a1c565b6001600160a01b0383166127495760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610934565b6001600160a01b0382166127c55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610934565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166128a25760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610934565b6001600160a01b03821661291e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610934565b600081116129945760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610934565b613200601155610c80601255601e80547fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff1690556000546001600160a01b038481169116148015906129f457506000546001600160a01b03838116911614155b8015612a0957506001600160a01b0383163014155b8015612a2e57506001600160a01b03821660009081526006602052604090205460ff16155b8015612a5357506001600160a01b03831660009081526006602052604090205460ff16155b15612f1f576001600160a01b03821660009081526007602052604090205460ff16158015612a9a57506001600160a01b03831660009081526007602052604090205460ff16155b612ae65760405162461bcd60e51b815260206004820152600860248201527f4e6f20626f74732e0000000000000000000000000000000000000000000000006044820152606401610934565b601e80547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff167901000000000000000000000000000000000000000000000000001790556001600160a01b0383166000908152601c6020526040902054612b4d90826137e3565b6001600160a01b038085166000818152601c6020526040902092909255601e5416148015612b895750601d546001600160a01b03838116911614155b8015612bb257506001600160a01b0382167368b3465833fb72a70ecdf485e0e4c7bd8665fc4514155b15612d1d57601e5477010000000000000000000000000000000000000000000000900460ff1615612c45576001600160a01b038216600090815260096020526040902054431415612c455760405162461bcd60e51b815260206004820152601160248201527f4f6e652074782070657220626c6f636b2e0000000000000000000000000000006044820152606401610934565b6001600160a01b03821660009081526009602052604090204390819055601854612c709060026137e3565b1115612cca57620186a06011556000601255601e80547fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000179055612f2a565b612cd482826137ef565b601e80547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff16790100000000000000000000000000000000000000000000000000179055612f2a565b601e546001600160a01b038381169116148015612d485750601d546001600160a01b03848116911614155b15612f0e57601e80547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff169081905577010000000000000000000000000000000000000000000000900460ff1615612e02576001600160a01b038316600090815260096020526040902054431415612e025760405162461bcd60e51b815260206004820152601160248201527f4f6e652074782070657220626c6f636b2e0000000000000000000000000000006044820152606401610934565b6001600160a01b0383166000526009602052600f54811115612e665760405162461bcd60e51b815260206004820152601c60248201527f4f766572206d6178207472616e73616374696f6e20616d6f756e742e000000006044820152606401610934565b6000612e71306134d1565b601954601e5491925082101590760100000000000000000000000000000000000000000000900460ff168015612ea45750805b8015612ecc5750601e547501000000000000000000000000000000000000000000900460ff16155b8015612edb5750612edb6138a6565b15612efd57612eeb601954613530565b478015612efb57612efb47613733565b505b5050612f0983826138d8565b612f2a565b613200601155610c80601255612f2a565b600060118190556012555b6117fb838383613264565b60008184841115612f595760405162461bcd60e51b8152600401610934919061462b565b505050900390565b6000806000612f6e613afe565b9092509050612f7d82826126c2565b9250505090565b6000806000806000806000806000612f9b8a613c9a565b9250925092506000806000612fb98d8686612fb4612f61565b613cdc565b919f909e50909c50959a5093985091965092945050505050565b60408051600280825260608201835283926000929190602083019080368337019050509050828160008151811061300c5761300c614928565b6001600160a01b03928316602091820292909201810191909152600254604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c46489260048083019391928290030181865afa15801561307e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130a291906149b8565b816001815181106130b5576130b5614928565b6001600160a01b0392831660209182029290920101526040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000918416906370a0823190602401602060405180830381865afa158015613123573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061314791906149d5565b6002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526024810183905291925084169063095ea7b3906044016020604051808303816000875af11580156131b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d9919061490b565b506002546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac9479061322c908490600090879030904290600401614a57565b600060405180830381600087803b15801561324657600080fd5b505af115801561325a573d6000803e3d6000fd5b5050505050505050565b6001600160a01b0380841660009081526008602052604080822054928516825290205460ff9182169116818015613299575080155b156132ae576132a9858585613d2c565b6112fd565b811580156132b95750805b156132c9576132a9858585613fd4565b811580156132d5575080155b156132e5576132a98585856141a3565b8180156132ef5750805b156132ff576132a98585856142bc565b6112fd8585856141a3565b6001600160a01b0381166000908152600b602052604081205443141561334657506001600160a01b03166000908152600c602052604090205490565b6108d8826134d1565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610c608284614957565b804710156134085760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610934565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613455576040519150601f19603f3d011682016040523d82523d6000602084013e61345a565b606091505b50509050806117fb5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610934565b6001600160a01b03811660009081526008602052604081205460ff161561350e57506001600160a01b031660009081526004602052604090205490565b6001600160a01b0382166000908152600360205260409020546108d890610bd0565b601e80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000017905560115460125460408051600280825260608201835260009260208301908036833701905050905030816000815181106135ab576135ab614928565b6001600160a01b03928316602091820292909201810191909152601d54604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c46489260048083019391928290030181865afa15801561361d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061364191906149b8565b8160018151811061365457613654614928565b6001600160a01b039283166020918202929092010152601d5461367a91309116866126ce565b601d546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac947906136cc908790600090869030904290600401614a57565b600060405180830381600087803b1580156136e657600080fd5b505af11580156136fa573d6000803e3d6000fd5b5050601e80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550505060119190915560125550565b60135461375f906001600160a01b031661375a6103206137548560f4614462565b906126c2565b6133b8565b601454613780906001600160a01b031661375a6103206137548560a6614462565b6015546137a1906001600160a01b031661375a6103206137548560c8614462565b6016546137c2906001600160a01b031661375a61032061375485605a614462565b601754611050906001600160a01b031661375a610320613754856064614462565b6000610c608284614ac8565b600f548111156138415760405162461bcd60e51b815260206004820152601c60248201527f4f766572206d6178207472616e73616374696f6e20616d6f756e742e000000006044820152606401610934565b6010548161384e846134d1565b6138589190614ac8565b111561104e5760405162461bcd60e51b815260206004820152601760248201527f4f766572206d61782077616c6c657420616d6f756e742e0000000000000000006044820152606401610934565b601e546000907a010000000000000000000000000000000000000000000000000000900463ffffffff165a1015905090565b6001600160a01b0382166000908152601c6020526040812054819081908190819061390390876133ac565b90506000805b6001600160a01b0389166000908152601a6020526040902054811015613acd576001600160a01b0389166000908152601a6020526040812080548390811061395357613953614928565b9060005260206000200154905060006139ac8b601b60008e6001600160a01b03166001600160a01b03168152602001908152602001600020858154811061399c5761399c614928565b906000526020600020015461446e565b90506000846139cf576139bf89836137e3565b98508589106139cf575060019350835b8415613ab75760008082156139f2576139e88b896133ac565b9150819b50613a02565b8391506139ff8c836137e3565b9b505b8c8c10613a2457613a1d613a168d8f6133ac565b83906133ac565b9150600190505b601f54600090613a5d90613a54906103e890613a4e9067ffffffffffffffff16613754428c6133ac565b90614462565b613e80906133ac565b9050612710811015613a6e57506127105b8a613a7e57809a50829950613aa2565b6000613a8a8b856137e3565b90506000613a9b8c8e8786866144a6565b9c50909a50505b8115613ab357505050505050613acd565b5050505b5050508080613ac59061499d565b915050613909565b50613ade600a613754866008614462565b601155613af1600a613754866002614462565b6012555050505050505050565b600d546000908190683635c9adc5dea00000825b600a54811015613c5d578260036000600a8481548110613b3457613b34614928565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180613b9f57508160046000600a8481548110613b7857613b78614928565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15613bbb575050600d5493683635c9adc5dea000009350915050565b613c0160036000600a8481548110613bd557613bd5614928565b60009182526020808320909101546001600160a01b0316835282019290925260400190205484906133ac565b9250613c4960046000600a8481548110613c1d57613c1d614928565b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906133ac565b915080613c558161499d565b915050613b12565b50600d54613c7490683635c9adc5dea000006126c2565b821015613c91575050600d5492683635c9adc5dea0000092509050565b90939092509050565b600080600080613ca9856144d3565b90506000613cb6866144f1565b90506000613cce82613cc889866133ac565b906133ac565b979296509094509092505050565b6000808080613ceb8886614462565b90506000613cf98887614462565b90506000613d078888614462565b90506000613d1982613cc886866133ac565b939b939a50919850919650505050505050565b601e547801000000000000000000000000000000000000000000000000900460ff1615613ea7576001816000613d6282846133ac565b6001600160a01b0386166000908152600b602090815260408083204390556003909152902054909150613d9590856137e3565b6001600160a01b038087166000908152600c6020908152604080832094909455918916815260039091522054613dcb90836133ac565b6001600160a01b038716600090815260036020908152604080832093909355600490522054613dfa90856133ac565b6001600160a01b03808816600090815260046020908152604080832094909455918816815260039091522054613e3090846137e3565b6001600160a01b038616600090815260036020526040902055613e528161450f565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613e9791815260200190565b60405180910390a3505050505050565b600080600080600080613eb987612f84565b955095509550955095509550613ecf8886614597565b6001600160a01b038916600090815260046020526040902054613ef290886133ac565b6001600160a01b038a16600090815260046020908152604080832093909355600390522054613f2190876133ac565b6001600160a01b03808b1660009081526003602052604080822093909355908a1681522054613f5090866137e3565b6001600160a01b038916600090815260036020526040902055613f728161450f565b613f7c8483614607565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613fc191815260200190565b60405180910390a3505050505050505050565b601e547801000000000000000000000000000000000000000000000000900460ff16156140f357600181600061400a82846133ac565b6001600160a01b0386166000908152600b60209081526040808320439055600490915290205490915061403d90856137e3565b6001600160a01b038087166000908152600c602090815260408083209490945591891681526003909152205461407390836133ac565b6001600160a01b0380881660009081526003602052604080822093909355908716815220546140a290846137e3565b6001600160a01b0386166000908152600360209081526040808320939093556004905220546140d190846137e3565b6001600160a01b038616600090815260046020526040902055613e528161450f565b60008060008060008061410587612f84565b95509550955095509550955061411b8884614597565b6001600160a01b03891660009081526003602052604090205461413e90876133ac565b6001600160a01b03808b16600090815260036020908152604080832094909455918b1681526004909152205461417490846137e3565b6001600160a01b038916600090815260046020908152604080832093909355600390522054613f5090866137e3565b601e547801000000000000000000000000000000000000000000000000900460ff16156142715760018160006141d982846133ac565b6001600160a01b0386166000908152600b60209081526040808320439055600390915290205490915061420c90856137e3565b6001600160a01b038087166000908152600c602090815260408083209490945591891681526003909152205461424290836133ac565b6001600160a01b038088166000908152600360205260408082209390935590871681522054613e3090846137e3565b60008060008060008061428387612f84565b9550955095509550955095506142998886614597565b6001600160a01b038916600090815260036020526040902054613f2190876133ac565b601e547801000000000000000000000000000000000000000000000000900460ff16156143e85760018160006142f282846133ac565b6001600160a01b0386166000908152600b60209081526040808320439055600490915290205490915061432590856137e3565b6001600160a01b038087166000908152600c602090815260408083209490945591891681526003909152205461435b90836133ac565b6001600160a01b03871660009081526003602090815260408083209390935560049052205461438a90856133ac565b6001600160a01b0380881660009081526004602052604080822093909355908716815220546143b990846137e3565b6001600160a01b038616600090815260046020908152604080832093909355600390522054613e3090846137e3565b6000806000806000806143fa87612f84565b9550955095509550955095506144108886614597565b6001600160a01b03891660009081526004602052604090205461443390886133ac565b6001600160a01b038a1660009081526004602090815260408083209390935560039052205461413e90876133ac565b6000610c6082846148ec565b6001600160a01b03821660009081526008602052604081205460ff16156144965750806108d8565b61449f82610bd0565b90506108d8565b60006144c9826137546144b98787614462565b6144c38a8a614462565b906137e3565b9695505050505050565b60006108d8620186a06137546012548561446290919063ffffffff16565b60006108d8620186a06137546011548561446290919063ffffffff16565b6000614519612f61565b905060006145278383614462565b3060009081526003602052604090205490915061454490826137e3565b3060009081526003602090815260408083209390935560089052205460ff16156117fb573060009081526004602052604090205461458290846137e3565b30600090815260046020526040902055505050565b601e54790100000000000000000000000000000000000000000000000000900460ff161561104e576001600160a01b03919091166000818152601a6020908152604080832080546001808201835591855283852042910155938352601b8252822080549384018155825290200155565b600d5461461490836133ac565b600d55600e5461462490826137e3565b600e555050565b600060208083528351808285015260005b818110156146585785810183015185820160400152820161463c565b8181111561466a576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6001600160a01b038116811461105057600080fd5b600080604083850312156146c657600080fd5b82356146d18161469e565b946020939093013593505050565b6000602082840312156146f157600080fd5b8135610c608161469e565b60008060006060848603121561471157600080fd5b833561471c8161469e565b9250602084013561472c8161469e565b929592945050506040919091013590565b60006020828403121561474f57600080fd5b5035919050565b801515811461105057600080fd5b6000806040838503121561477757600080fd5b82359150602083013561478981614756565b809150509250929050565b60008083601f8401126147a657600080fd5b50813567ffffffffffffffff8111156147be57600080fd5b6020830191508360208260051b85010111156147d957600080fd5b9250929050565b600080600080604085870312156147f657600080fd5b843567ffffffffffffffff8082111561480e57600080fd5b61481a88838901614794565b9096509450602087013591508082111561483357600080fd5b5061484087828801614794565b95989497509550505050565b60006020828403121561485e57600080fd5b8135610c6081614756565b60006020828403121561487b57600080fd5b813563ffffffff81168114610c6057600080fd5b600080604083850312156148a257600080fd5b82356148ad8161469e565b915060208301356147898161469e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000816000190483118215151615614906576149066148bd565b500290565b60006020828403121561491d57600080fd5b8151610c6081614756565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082821015614969576149696148bd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006000198214156149b1576149b16148bd565b5060010190565b6000602082840312156149ca57600080fd5b8151610c608161469e565b6000602082840312156149e757600080fd5b5051919050565b600080600060608486031215614a0357600080fd5b8351925060208401519150604084015190509250925092565b600082614a52577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015614aa75784516001600160a01b031683529383019391830191600101614a82565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115614adb57614adb6148bd565b50019056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220c802661d1657018414636466dc083c13ec2aabd0afaa0926787dd536a09b52b664736f6c634300080b0033
Deployed Bytecode
0x6080604052600436106102d55760003560e01c806370a0823111610179578063afcba06c116100d6578063e98391ff1161008a578063f2fde38b11610064578063f2fde38b14610872578063f429389014610892578063ffecf516146108a757600080fd5b8063e98391ff14610812578063ea2f0b3714610832578063ec28438a1461085257600080fd5b8063c9567bf9116100bb578063c9567bf914610797578063d42953b5146107ac578063dd62ed3e146107cc57600080fd5b8063afcba06c14610757578063b70143c91461077757600080fd5b80638da5cb5b1161012d57806395d89b411161011257806395d89b41146106d1578063a101223314610717578063a9059cbb1461073757600080fd5b80638da5cb5b146106895780639151d59a146106b157600080fd5b80637a52da0e1161015e5780637a52da0e1461061b57806388a65f461461063b57806388f820201461065057600080fd5b806370a08231146105e6578063715018a61461060657600080fd5b8063313ce56711610232578063473071ce116101e65780635342acb4116101c05780635342acb41461056d578063571cbe0a146105a65780635932ead1146105c657600080fd5b8063473071ce1461050d5780634c990cc71461052d57806352390c021461054d57600080fd5b80633685d419116102175780633685d419146104ad578063437823ec146104cd5780634549b039146104ed57600080fd5b8063313ce5671461047157806333a172821461048d57600080fd5b80631e9768be11610289578063273123b71161026e578063273123b71461041157806327a14fc2146104315780632d8381191461045157600080fd5b80631e9768be146103d157806323b872dd146103f157600080fd5b806314b3b077116102ba57806314b3b0771461036957806318160ddd1461038b57806319db2dcb146103b157600080fd5b806306fdde03146102e1578063095ea7b31461033957600080fd5b366102dc57005b600080fd5b3480156102ed57600080fd5b5060408051808201909152600f81527f536869656c642050726f746f636f6c000000000000000000000000000000000060208201525b604051610330919061462b565b60405180910390f35b34801561034557600080fd5b506103596103543660046146b3565b6108c7565b6040519015158152602001610330565b34801561037557600080fd5b506103896103843660046146df565b6108de565b005b34801561039757600080fd5b50683635c9adc5dea000005b604051908152602001610330565b3480156103bd57600080fd5b506103896103cc3660046146df565b61096c565b3480156103dd57600080fd5b506103896103ec3660046146df565b6109f5565b3480156103fd57600080fd5b5061035961040c3660046146fc565b610a7e565b34801561041d57600080fd5b5061038961042c3660046146df565b610ae7565b34801561043d57600080fd5b5061038961044c36600461473d565b610b62565b34801561045d57600080fd5b506103a361046c36600461473d565b610bd0565b34801561047d57600080fd5b5060405160098152602001610330565b34801561049957600080fd5b506103596104a83660046146fc565b610c67565b3480156104b957600080fd5b506103896104c83660046146df565b610d83565b3480156104d957600080fd5b506103896104e83660046146df565b611053565b3480156104f957600080fd5b506103a3610508366004614764565b6110d1565b34801561051957600080fd5b506103896105283660046146df565b611165565b34801561053957600080fd5b506103896105483660046147e0565b6111ee565b34801561055957600080fd5b506103896105683660046146df565b611304565b34801561057957600080fd5b506103596105883660046146df565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156105b257600080fd5b506103596105c13660046146fc565b611560565b3480156105d257600080fd5b506103896105e136600461484c565b611634565b3480156105f257600080fd5b506103a36106013660046146df565b6116db565b34801561061257600080fd5b506103896116e6565b34801561062757600080fd5b506103896106363660046146df565b61174c565b34801561064757600080fd5b50610389611800565b34801561065c57600080fd5b5061035961066b3660046146df565b6001600160a01b031660009081526008602052604090205460ff1690565b34801561069557600080fd5b506000546040516001600160a01b039091168152602001610330565b3480156106bd57600080fd5b506103896106cc3660046146df565b611a84565b3480156106dd57600080fd5b5060408051808201909152600d81527f73ca9cc9aae1b487ca9fe1b485000000000000000000000000000000000000006020820152610323565b34801561072357600080fd5b506103896107323660046146df565b611b0d565b34801561074357600080fd5b506103596107523660046146b3565b611b96565b34801561076357600080fd5b5061038961077236600461473d565b611ba3565b34801561078357600080fd5b5061038961079236600461473d565b611c38565b3480156107a357600080fd5b50610389611d38565b3480156107b857600080fd5b506103896107c7366004614869565b612270565b3480156107d857600080fd5b506103a36107e736600461488f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b34801561081e57600080fd5b5061038961082d36600461484c565b61231f565b34801561083e57600080fd5b5061038961084d3660046146df565b6123c5565b34801561085e57600080fd5b5061038961086d36600461473d565b612440565b34801561087e57600080fd5b5061038961088d3660046146df565b6124ae565b34801561089e57600080fd5b5061038961258d565b3480156108b357600080fd5b506103896108c23660046146df565b612644565b60006108d43384846126ce565b5060015b92915050565b6000546001600160a01b0316331461093d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6013805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000546001600160a01b031633146109c65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6014805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610a4f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6017805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000610a8b848484612826565b610add8433610ad885604051806060016040528060288152602001614ae1602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190612f35565b6126ce565b5060019392505050565b6000546001600160a01b03163314610b415760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6000546001600160a01b03163314610bbc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b610bca81633b9aca006148ec565b60105550565b6000600d54821115610c4a5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201527f65666c656374696f6e73000000000000000000000000000000000000000000006064820152608401610934565b6000610c54612f61565b9050610c6083826126c2565b9392505050565b6001546000906001600160a01b03163314610cea5760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f742074686560448201527f20455243323020636f6e74726f6c6c65722e00000000000000000000000000006064820152608401610934565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526024820184905285919082169063095ea7b3906044015b6020604051808303816000875af1158015610d56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7a919061490b565b95945050505050565b6000546001600160a01b03163314610ddd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03811660009081526008602052604090205460ff16610e455760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610934565b60005b600a54811015610f8157816001600160a01b0316600a8281548110610e6f57610e6f614928565b6000918252602090912001546001600160a01b03161415610f6f57600a8054610e9a90600190614957565b81548110610eaa57610eaa614928565b600091825260209091200154600a80546001600160a01b039092169183908110610ed657610ed6614928565b6000918252602080832091909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039485161790559184168152600482526040808220829055600890925220805460ff19169055600a805480610f3b57610f3b61496e565b6000828152602090208101600019908101805473ffffffffffffffffffffffffffffffffffffffff19169055019055610f81565b80610f798161499d565b915050610e48565b506001600160a01b0381166000908152601b6020526040902054156110505760005b6001600160a01b0382166000908152601b602052604090205481101561104e576001600160a01b0382166000908152601b60205260408120805483908110610fed57610fed614928565b906000526020600020015490506110058160006110d1565b6001600160a01b0384166000908152601b6020526040902080548490811061102f5761102f614928565b60009182526020909120015550806110468161499d565b915050610fa3565b505b50565b6000546001600160a01b031633146110ad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6000683635c9adc5dea0000083111561112c5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610934565b8161114b57600061113c84612f84565b509395506108d8945050505050565b600061115684612f84565b509295506108d8945050505050565b6001546001600160a01b031633146111e55760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f742074686560448201527f20455243323020636f6e74726f6c6c65722e00000000000000000000000000006064820152608401610934565b61105081612fd3565b6000546001600160a01b031633146112485760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b8281146112975760405162461bcd60e51b815260206004820152601460248201527f4c656e6774687320646f6e2774206d617463682e0000000000000000000000006044820152606401610934565b60005b838110156112fd576112eb338686848181106112b8576112b8614928565b90506020020160208101906112cd91906146df565b8585858181106112df576112df614928565b90506020020135613264565b806112f58161499d565b91505061129a565b5050505050565b6000546001600160a01b0316331461135e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03811660009081526008602052604090205460ff16156113c75760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610934565b6001600160a01b0381166000908152601b6020526040902054156114935760005b6001600160a01b0382166000908152601b6020526040902054811015611491576001600160a01b0382166000908152601b6020526040812080548390811061143257611432614928565b9060005260206000200154905061144881610bd0565b6001600160a01b0384166000908152601b6020526040902080548490811061147257611472614928565b60009182526020909120015550806114898161499d565b9150506113e8565b505b6001600160a01b038116600090815260036020526040902054156114ed576001600160a01b0381166000908152600360205260409020546114d390610bd0565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600860205260408120805460ff19166001908117909155600a805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a801805473ffffffffffffffffffffffffffffffffffffffff19169091179055565b6001546000906001600160a01b031633146115e35760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f742074686560448201527f20455243323020636f6e74726f6c6c65722e00000000000000000000000000006064820152608401610934565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526024820184905285919082169063a9059cbb90604401610d37565b6000546001600160a01b0316331461168e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b601e805491151577010000000000000000000000000000000000000000000000027fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b60006108d88261330a565b6000546001600160a01b031633146117405760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b61174a600061334f565b565b6001546001600160a01b031633146117cc5760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f742074686560448201527f20455243323020636f6e74726f6c6c65722e00000000000000000000000000006064820152608401610934565b476117d682612fd3565b60006117e247836133ac565b6001549091506117fb906001600160a01b0316826133b8565b505050565b6001546001600160a01b031633146118805760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f742074686560448201527f20455243323020636f6e74726f6c6c65722e00000000000000000000000000006064820152608401610934565b600254604080517fad5c464800000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa1580156118e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190791906149b8565b90506000600260009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561195e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198291906149b8565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156119e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0991906149d5565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290529091506001600160a01b03841690632e1a7d4d90602401600060405180830381600087803b158015611a6757600080fd5b505af1158015611a7b573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b03163314611ade5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6016805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611b675760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6015805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60006108d4338484612826565b6000546001600160a01b03163314611bfd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b601f80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6013546001600160a01b0316336001600160a01b03161480611c6d57506014546001600160a01b0316336001600160a01b0316145b80611c8b57506015546001600160a01b0316336001600160a01b0316145b80611ca957506016546001600160a01b0316336001600160a01b0316145b80611cc757506017546001600160a01b0316336001600160a01b0316145b80611cdc57506000546001600160a01b031633145b611ce557600080fd5b6000611cfa683635c9adc5dea00000836126c2565b611d03306134d1565b1115611d2357611d1c683635c9adc5dea00000836126c2565b9050611d2f565b611d2c306134d1565b90505b61104e81613530565b6000546001600160a01b03163314611d925760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b601e5474010000000000000000000000000000000000000000900460ff1615611dfd5760405162461bcd60e51b815260206004820152601760248201527f74726164696e6720697320616c7265616479206f70656e0000000000000000006044820152606401610934565b601d805473ffffffffffffffffffffffffffffffffffffffff1916737a250d5630b4cf539739df2c5dacb4c659f2488d908117909155611e473082683635c9adc5dea000006126ce565b806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea991906149b8565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ef6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1a91906149b8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611f7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa391906149b8565b601e80546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff19918216811783556000908152600860205260408120805460ff191660019081179091559254600a805494850181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a89092018054909116918316919091179055601d541663f305d719473061203f816116db565b6000806120546000546001600160a01b031690565b60405160e088901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156120d4573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120f991906149ee565b5050601e8054770101000000000000000000000000000000000000000000007fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff90911617905550601f80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001662093a80179055612181683635c9adc5dea0000060c86126c2565b600f55612198683635c9adc5dea0000060646126c2565b601055601e8054740100000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff82161790915543601855601d546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af115801561224c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104e919061490b565b6000546001600160a01b031633146122ca5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b601e805463ffffffff9092167a010000000000000000000000000000000000000000000000000000027fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6000546001600160a01b031633146123795760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b601e8054911515760100000000000000000000000000000000000000000000027fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6000546001600160a01b0316331461241f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b0316331461249a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6124a881633b9aca006148ec565b600f5550565b6000546001600160a01b031633146125085760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b0381166125845760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610934565b6110508161334f565b6013546001600160a01b0316336001600160a01b031614806125c257506014546001600160a01b0316336001600160a01b0316145b806125e057506015546001600160a01b0316336001600160a01b0316145b806125fe57506016546001600160a01b0316336001600160a01b0316145b8061261c57506017546001600160a01b0316336001600160a01b0316145b8061263157506000546001600160a01b031633145b61263a57600080fd5b4761105081613733565b6000546001600160a01b0316331461269e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000610c608284614a1c565b6001600160a01b0383166127495760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610934565b6001600160a01b0382166127c55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610934565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166128a25760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610934565b6001600160a01b03821661291e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610934565b600081116129945760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610934565b613200601155610c80601255601e80547fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff1690556000546001600160a01b038481169116148015906129f457506000546001600160a01b03838116911614155b8015612a0957506001600160a01b0383163014155b8015612a2e57506001600160a01b03821660009081526006602052604090205460ff16155b8015612a5357506001600160a01b03831660009081526006602052604090205460ff16155b15612f1f576001600160a01b03821660009081526007602052604090205460ff16158015612a9a57506001600160a01b03831660009081526007602052604090205460ff16155b612ae65760405162461bcd60e51b815260206004820152600860248201527f4e6f20626f74732e0000000000000000000000000000000000000000000000006044820152606401610934565b601e80547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff167901000000000000000000000000000000000000000000000000001790556001600160a01b0383166000908152601c6020526040902054612b4d90826137e3565b6001600160a01b038085166000818152601c6020526040902092909255601e5416148015612b895750601d546001600160a01b03838116911614155b8015612bb257506001600160a01b0382167368b3465833fb72a70ecdf485e0e4c7bd8665fc4514155b15612d1d57601e5477010000000000000000000000000000000000000000000000900460ff1615612c45576001600160a01b038216600090815260096020526040902054431415612c455760405162461bcd60e51b815260206004820152601160248201527f4f6e652074782070657220626c6f636b2e0000000000000000000000000000006044820152606401610934565b6001600160a01b03821660009081526009602052604090204390819055601854612c709060026137e3565b1115612cca57620186a06011556000601255601e80547fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000179055612f2a565b612cd482826137ef565b601e80547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff16790100000000000000000000000000000000000000000000000000179055612f2a565b601e546001600160a01b038381169116148015612d485750601d546001600160a01b03848116911614155b15612f0e57601e80547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff169081905577010000000000000000000000000000000000000000000000900460ff1615612e02576001600160a01b038316600090815260096020526040902054431415612e025760405162461bcd60e51b815260206004820152601160248201527f4f6e652074782070657220626c6f636b2e0000000000000000000000000000006044820152606401610934565b6001600160a01b0383166000526009602052600f54811115612e665760405162461bcd60e51b815260206004820152601c60248201527f4f766572206d6178207472616e73616374696f6e20616d6f756e742e000000006044820152606401610934565b6000612e71306134d1565b601954601e5491925082101590760100000000000000000000000000000000000000000000900460ff168015612ea45750805b8015612ecc5750601e547501000000000000000000000000000000000000000000900460ff16155b8015612edb5750612edb6138a6565b15612efd57612eeb601954613530565b478015612efb57612efb47613733565b505b5050612f0983826138d8565b612f2a565b613200601155610c80601255612f2a565b600060118190556012555b6117fb838383613264565b60008184841115612f595760405162461bcd60e51b8152600401610934919061462b565b505050900390565b6000806000612f6e613afe565b9092509050612f7d82826126c2565b9250505090565b6000806000806000806000806000612f9b8a613c9a565b9250925092506000806000612fb98d8686612fb4612f61565b613cdc565b919f909e50909c50959a5093985091965092945050505050565b60408051600280825260608201835283926000929190602083019080368337019050509050828160008151811061300c5761300c614928565b6001600160a01b03928316602091820292909201810191909152600254604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c46489260048083019391928290030181865afa15801561307e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130a291906149b8565b816001815181106130b5576130b5614928565b6001600160a01b0392831660209182029290920101526040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000918416906370a0823190602401602060405180830381865afa158015613123573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061314791906149d5565b6002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526024810183905291925084169063095ea7b3906044016020604051808303816000875af11580156131b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d9919061490b565b506002546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac9479061322c908490600090879030904290600401614a57565b600060405180830381600087803b15801561324657600080fd5b505af115801561325a573d6000803e3d6000fd5b5050505050505050565b6001600160a01b0380841660009081526008602052604080822054928516825290205460ff9182169116818015613299575080155b156132ae576132a9858585613d2c565b6112fd565b811580156132b95750805b156132c9576132a9858585613fd4565b811580156132d5575080155b156132e5576132a98585856141a3565b8180156132ef5750805b156132ff576132a98585856142bc565b6112fd8585856141a3565b6001600160a01b0381166000908152600b602052604081205443141561334657506001600160a01b03166000908152600c602052604090205490565b6108d8826134d1565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610c608284614957565b804710156134085760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610934565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613455576040519150601f19603f3d011682016040523d82523d6000602084013e61345a565b606091505b50509050806117fb5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610934565b6001600160a01b03811660009081526008602052604081205460ff161561350e57506001600160a01b031660009081526004602052604090205490565b6001600160a01b0382166000908152600360205260409020546108d890610bd0565b601e80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000017905560115460125460408051600280825260608201835260009260208301908036833701905050905030816000815181106135ab576135ab614928565b6001600160a01b03928316602091820292909201810191909152601d54604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c46489260048083019391928290030181865afa15801561361d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061364191906149b8565b8160018151811061365457613654614928565b6001600160a01b039283166020918202929092010152601d5461367a91309116866126ce565b601d546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac947906136cc908790600090869030904290600401614a57565b600060405180830381600087803b1580156136e657600080fd5b505af11580156136fa573d6000803e3d6000fd5b5050601e80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550505060119190915560125550565b60135461375f906001600160a01b031661375a6103206137548560f4614462565b906126c2565b6133b8565b601454613780906001600160a01b031661375a6103206137548560a6614462565b6015546137a1906001600160a01b031661375a6103206137548560c8614462565b6016546137c2906001600160a01b031661375a61032061375485605a614462565b601754611050906001600160a01b031661375a610320613754856064614462565b6000610c608284614ac8565b600f548111156138415760405162461bcd60e51b815260206004820152601c60248201527f4f766572206d6178207472616e73616374696f6e20616d6f756e742e000000006044820152606401610934565b6010548161384e846134d1565b6138589190614ac8565b111561104e5760405162461bcd60e51b815260206004820152601760248201527f4f766572206d61782077616c6c657420616d6f756e742e0000000000000000006044820152606401610934565b601e546000907a010000000000000000000000000000000000000000000000000000900463ffffffff165a1015905090565b6001600160a01b0382166000908152601c6020526040812054819081908190819061390390876133ac565b90506000805b6001600160a01b0389166000908152601a6020526040902054811015613acd576001600160a01b0389166000908152601a6020526040812080548390811061395357613953614928565b9060005260206000200154905060006139ac8b601b60008e6001600160a01b03166001600160a01b03168152602001908152602001600020858154811061399c5761399c614928565b906000526020600020015461446e565b90506000846139cf576139bf89836137e3565b98508589106139cf575060019350835b8415613ab75760008082156139f2576139e88b896133ac565b9150819b50613a02565b8391506139ff8c836137e3565b9b505b8c8c10613a2457613a1d613a168d8f6133ac565b83906133ac565b9150600190505b601f54600090613a5d90613a54906103e890613a4e9067ffffffffffffffff16613754428c6133ac565b90614462565b613e80906133ac565b9050612710811015613a6e57506127105b8a613a7e57809a50829950613aa2565b6000613a8a8b856137e3565b90506000613a9b8c8e8786866144a6565b9c50909a50505b8115613ab357505050505050613acd565b5050505b5050508080613ac59061499d565b915050613909565b50613ade600a613754866008614462565b601155613af1600a613754866002614462565b6012555050505050505050565b600d546000908190683635c9adc5dea00000825b600a54811015613c5d578260036000600a8481548110613b3457613b34614928565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180613b9f57508160046000600a8481548110613b7857613b78614928565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15613bbb575050600d5493683635c9adc5dea000009350915050565b613c0160036000600a8481548110613bd557613bd5614928565b60009182526020808320909101546001600160a01b0316835282019290925260400190205484906133ac565b9250613c4960046000600a8481548110613c1d57613c1d614928565b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906133ac565b915080613c558161499d565b915050613b12565b50600d54613c7490683635c9adc5dea000006126c2565b821015613c91575050600d5492683635c9adc5dea0000092509050565b90939092509050565b600080600080613ca9856144d3565b90506000613cb6866144f1565b90506000613cce82613cc889866133ac565b906133ac565b979296509094509092505050565b6000808080613ceb8886614462565b90506000613cf98887614462565b90506000613d078888614462565b90506000613d1982613cc886866133ac565b939b939a50919850919650505050505050565b601e547801000000000000000000000000000000000000000000000000900460ff1615613ea7576001816000613d6282846133ac565b6001600160a01b0386166000908152600b602090815260408083204390556003909152902054909150613d9590856137e3565b6001600160a01b038087166000908152600c6020908152604080832094909455918916815260039091522054613dcb90836133ac565b6001600160a01b038716600090815260036020908152604080832093909355600490522054613dfa90856133ac565b6001600160a01b03808816600090815260046020908152604080832094909455918816815260039091522054613e3090846137e3565b6001600160a01b038616600090815260036020526040902055613e528161450f565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613e9791815260200190565b60405180910390a3505050505050565b600080600080600080613eb987612f84565b955095509550955095509550613ecf8886614597565b6001600160a01b038916600090815260046020526040902054613ef290886133ac565b6001600160a01b038a16600090815260046020908152604080832093909355600390522054613f2190876133ac565b6001600160a01b03808b1660009081526003602052604080822093909355908a1681522054613f5090866137e3565b6001600160a01b038916600090815260036020526040902055613f728161450f565b613f7c8483614607565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613fc191815260200190565b60405180910390a3505050505050505050565b601e547801000000000000000000000000000000000000000000000000900460ff16156140f357600181600061400a82846133ac565b6001600160a01b0386166000908152600b60209081526040808320439055600490915290205490915061403d90856137e3565b6001600160a01b038087166000908152600c602090815260408083209490945591891681526003909152205461407390836133ac565b6001600160a01b0380881660009081526003602052604080822093909355908716815220546140a290846137e3565b6001600160a01b0386166000908152600360209081526040808320939093556004905220546140d190846137e3565b6001600160a01b038616600090815260046020526040902055613e528161450f565b60008060008060008061410587612f84565b95509550955095509550955061411b8884614597565b6001600160a01b03891660009081526003602052604090205461413e90876133ac565b6001600160a01b03808b16600090815260036020908152604080832094909455918b1681526004909152205461417490846137e3565b6001600160a01b038916600090815260046020908152604080832093909355600390522054613f5090866137e3565b601e547801000000000000000000000000000000000000000000000000900460ff16156142715760018160006141d982846133ac565b6001600160a01b0386166000908152600b60209081526040808320439055600390915290205490915061420c90856137e3565b6001600160a01b038087166000908152600c602090815260408083209490945591891681526003909152205461424290836133ac565b6001600160a01b038088166000908152600360205260408082209390935590871681522054613e3090846137e3565b60008060008060008061428387612f84565b9550955095509550955095506142998886614597565b6001600160a01b038916600090815260036020526040902054613f2190876133ac565b601e547801000000000000000000000000000000000000000000000000900460ff16156143e85760018160006142f282846133ac565b6001600160a01b0386166000908152600b60209081526040808320439055600490915290205490915061432590856137e3565b6001600160a01b038087166000908152600c602090815260408083209490945591891681526003909152205461435b90836133ac565b6001600160a01b03871660009081526003602090815260408083209390935560049052205461438a90856133ac565b6001600160a01b0380881660009081526004602052604080822093909355908716815220546143b990846137e3565b6001600160a01b038616600090815260046020908152604080832093909355600390522054613e3090846137e3565b6000806000806000806143fa87612f84565b9550955095509550955095506144108886614597565b6001600160a01b03891660009081526004602052604090205461443390886133ac565b6001600160a01b038a1660009081526004602090815260408083209390935560039052205461413e90876133ac565b6000610c6082846148ec565b6001600160a01b03821660009081526008602052604081205460ff16156144965750806108d8565b61449f82610bd0565b90506108d8565b60006144c9826137546144b98787614462565b6144c38a8a614462565b906137e3565b9695505050505050565b60006108d8620186a06137546012548561446290919063ffffffff16565b60006108d8620186a06137546011548561446290919063ffffffff16565b6000614519612f61565b905060006145278383614462565b3060009081526003602052604090205490915061454490826137e3565b3060009081526003602090815260408083209390935560089052205460ff16156117fb573060009081526004602052604090205461458290846137e3565b30600090815260046020526040902055505050565b601e54790100000000000000000000000000000000000000000000000000900460ff161561104e576001600160a01b03919091166000818152601a6020908152604080832080546001808201835591855283852042910155938352601b8252822080549384018155825290200155565b600d5461461490836133ac565b600d55600e5461462490826137e3565b600e555050565b600060208083528351808285015260005b818110156146585785810183015185820160400152820161463c565b8181111561466a576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6001600160a01b038116811461105057600080fd5b600080604083850312156146c657600080fd5b82356146d18161469e565b946020939093013593505050565b6000602082840312156146f157600080fd5b8135610c608161469e565b60008060006060848603121561471157600080fd5b833561471c8161469e565b9250602084013561472c8161469e565b929592945050506040919091013590565b60006020828403121561474f57600080fd5b5035919050565b801515811461105057600080fd5b6000806040838503121561477757600080fd5b82359150602083013561478981614756565b809150509250929050565b60008083601f8401126147a657600080fd5b50813567ffffffffffffffff8111156147be57600080fd5b6020830191508360208260051b85010111156147d957600080fd5b9250929050565b600080600080604085870312156147f657600080fd5b843567ffffffffffffffff8082111561480e57600080fd5b61481a88838901614794565b9096509450602087013591508082111561483357600080fd5b5061484087828801614794565b95989497509550505050565b60006020828403121561485e57600080fd5b8135610c6081614756565b60006020828403121561487b57600080fd5b813563ffffffff81168114610c6057600080fd5b600080604083850312156148a257600080fd5b82356148ad8161469e565b915060208301356147898161469e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000816000190483118215151615614906576149066148bd565b500290565b60006020828403121561491d57600080fd5b8151610c6081614756565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082821015614969576149696148bd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006000198214156149b1576149b16148bd565b5060010190565b6000602082840312156149ca57600080fd5b8151610c608161469e565b6000602082840312156149e757600080fd5b5051919050565b600080600060608486031215614a0357600080fd5b8351925060208401519150604084015190509250925092565b600082614a52577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015614aa75784516001600160a01b031683529383019391830191600101614a82565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115614adb57614adb6148bd565b50019056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220c802661d1657018414636466dc083c13ec2aabd0afaa0926787dd536a09b52b664736f6c634300080b0033
Deployed Bytecode Sourcemap
31609:35240:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36287:83;;;;;;;;;;-1:-1:-1;36357:5:0;;;;;;;;;;;;;;;;;36287:83;;;;;;;:::i;:::-;;;;;;;;37193:193;;;;;;;;;;-1:-1:-1;37193:193:0;;;;;:::i;:::-;;:::i;:::-;;;1319:14:1;;1312:22;1294:41;;1282:2;1267:18;37193:193:0;1154:187:1;44702:116:0;;;;;;;;;;-1:-1:-1;44702:116:0;;;;;:::i;:::-;;:::i;:::-;;36564:95;;;;;;;;;;-1:-1:-1;32342:21:0;36564:95;;;1744:25:1;;;1732:2;1717:18;36564:95:0;1598:177:1;44949:116:0;;;;;;;;;;-1:-1:-1;44949:116:0;;;;;:::i;:::-;;:::i;45690:::-;;;;;;;;;;-1:-1:-1;45690:116:0;;;;;:::i;:::-;;:::i;37394:446::-;;;;;;;;;;-1:-1:-1;37394:446:0;;;;;:::i;:::-;;:::i;47503:91::-;;;;;;;;;;-1:-1:-1;47503:91:0;;;;;:::i;:::-;;:::i;44119:115::-;;;;;;;;;;-1:-1:-1;44119:115:0;;;;;:::i;:::-;;:::i;50828:253::-;;;;;;;;;;-1:-1:-1;50828:253:0;;;;;:::i;:::-;;:::i;36473:83::-;;;;;;;;;;-1:-1:-1;36473:83:0;;34171:1;2568:36:1;;2556:2;2541:18;36473:83:0;2426:184:1;28849:273:0;;;;;;;;;;-1:-1:-1;28849:273:0;;;;;:::i;:::-;;:::i;64294:1085::-;;;;;;;;;;-1:-1:-1;64294:1085:0;;;;;:::i;:::-;;:::i;66316:111::-;;;;;;;;;;-1:-1:-1;66316:111:0;;;;;:::i;:::-;;:::i;50384:436::-;;;;;;;;;;-1:-1:-1;50384:436:0;;;;;:::i;:::-;;:::i;29513:112::-;;;;;;;;;;-1:-1:-1;29513:112:0;;;;;:::i;:::-;;:::i;66557:287::-;;;;;;;;;;-1:-1:-1;66557:287:0;;;;;:::i;:::-;;:::i;63572:714::-;;;;;;;;;;-1:-1:-1;63572:714:0;;;;;:::i;:::-;;:::i;65815:124::-;;;;;;;;;;-1:-1:-1;65815:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;65904:27:0;65880:4;65904:27;;;:18;:27;;;;;;;;;65815:124;29183:279;;;;;;;;;;-1:-1:-1;29183:279:0;;;;;:::i;:::-;;:::i;37951:101::-;;;;;;;;;;-1:-1:-1;37951:101:0;;;;;:::i;:::-;;:::i;36667:119::-;;;;;;;;;;-1:-1:-1;36667:119:0;;;;;:::i;:::-;;:::i;21158:103::-;;;;;;;;;;;;;:::i;30264:388::-;;;;;;;;;;-1:-1:-1;30264:388:0;;;;;:::i;:::-;;:::i;30724:249::-;;;;;;;;;;;;;:::i;49399:130::-;;;;;;;;;;-1:-1:-1;49399:130:0;;;;;:::i;:::-;-1:-1:-1;;;;;49491:30:0;49467:4;49491:30;;;:21;:30;;;;;;;;;49399:130;20507:87;;;;;;;;;;-1:-1:-1;20553:7:0;20580:6;20507:87;;-1:-1:-1;;;;;20580:6:0;;;4594:74:1;;4582:2;4567:18;20507:87:0;4448:226:1;45443:116:0;;;;;;;;;;-1:-1:-1;45443:116:0;;;;;:::i;:::-;;:::i;36378:87::-;;;;;;;;;;-1:-1:-1;36450:7:0;;;;;;;;;;;;;;;;;36378:87;;45196:116;;;;;;;;;;-1:-1:-1;45196:116:0;;;;;:::i;:::-;;:::i;36794:199::-;;;;;;;;;;-1:-1:-1;36794:199:0;;;;;:::i;:::-;;:::i;53336:110::-;;;;;;;;;;-1:-1:-1;53336:110:0;;;;;:::i;:::-;;:::i;48207:346::-;;;;;;;;;;-1:-1:-1;48207:346:0;;;;;:::i;:::-;;:::i;45869:1320::-;;;;;;;;;;;;;:::i;47883:96::-;;;;;;;;;;-1:-1:-1;47883:96:0;;;;;:::i;:::-;;:::i;37001:184::-;;;;;;;;;;-1:-1:-1;37001:184:0;;;;;:::i;:::-;-1:-1:-1;;;;;37150:18:0;;;37118:7;37150:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;37001:184;42394:104;;;;;;;;;;-1:-1:-1;42394:104:0;;;;;:::i;:::-;;:::i;66439:110::-;;;;;;;;;;-1:-1:-1;66439:110:0;;;;;:::i;:::-;;:::i;43878:107::-;;;;;;;;;;-1:-1:-1;43878:107:0;;;;;:::i;:::-;;:::i;21416:201::-;;;;;;;;;;-1:-1:-1;21416:201:0;;;;;:::i;:::-;;:::i;48657:157::-;;;;;;;;;;;;;:::i;47300:90::-;;;;;;;;;;-1:-1:-1;47300:90:0;;;;;:::i;:::-;;:::i;37193:193::-;37295:4;37317:39;9260:10;37340:7;37349:6;37317:8;:39::i;:::-;-1:-1:-1;37374:4:0;37193:193;;;;;:::o;44702:116::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;;;;;;;;;44774:15:::1;:36:::0;;-1:-1:-1;;44774:36:0::1;-1:-1:-1::0;;;;;44774:36:0;;;::::1;::::0;;;::::1;::::0;;44702:116::o;44949:::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;45021:15:::1;:36:::0;;-1:-1:-1;;45021:36:0::1;-1:-1:-1::0;;;;;45021:36:0;;;::::1;::::0;;;::::1;::::0;;44949:116::o;45690:::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;45762:15:::1;:36:::0;;-1:-1:-1;;45762:36:0::1;-1:-1:-1::0;;;;;45762:36:0;;;::::1;::::0;;;::::1;::::0;;45690:116::o;37394:446::-;37526:4;37543:36;37553:6;37561:9;37572:6;37543:9;:36::i;:::-;37590:220;37613:6;9260:10;37661:138;37717:6;37661:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37661:19:0;;;;;;:11;:19;;;;;;;;9260:10;37661:33;;;;;;;;;;:37;:138::i;:::-;37590:8;:220::i;:::-;-1:-1:-1;37828:4:0;37394:446;;;;;:::o;47503:91::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;-1:-1:-1;;;;;47565:13:0::1;47581:5;47565:13:::0;;;:5:::1;:13;::::0;;;;:21;;-1:-1:-1;;47565:21:0::1;::::0;;47503:91::o;44119:115::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;44212:14:::1;:6:::0;44221:5:::1;44212:14;:::i;:::-;44193:16;:33:::0;-1:-1:-1;44119:115:0:o;50828:253::-;50894:7;50933;;50922;:18;;50914:73;;;;-1:-1:-1;;;50914:73:0;;6338:2:1;50914:73:0;;;6320:21:1;6377:2;6357:18;;;6350:30;6416:34;6396:18;;;6389:62;6487:12;6467:18;;;6460:40;6517:19;;50914:73:0;6136:406:1;50914:73:0;50998:19;51021:10;:8;:10::i;:::-;50998:33;-1:-1:-1;51049:24:0;:7;50998:33;51049:11;:24::i;:::-;51042:31;50828:253;-1:-1:-1;;;50828:253:0:o;28849:273::-;28670:11;;29001:4;;-1:-1:-1;;;;;28670:11:0;9260:10;28670:27;28648:127;;;;-1:-1:-1;;;28648:127:0;;6749:2:1;28648:127:0;;;6731:21:1;6788:2;6768:18;;;6761:30;6827:34;6807:18;;;6800:62;6898:20;6878:18;;;6871:48;6936:19;;28648:127:0;6547:414:1;28648:127:0;29078:36:::1;::::0;;;;-1:-1:-1;;;;;7158:55:1;;;29078:36:0::1;::::0;::::1;7140:74:1::0;7230:18;;;7223:34;;;29046:13:0;;29078:19;;::::1;::::0;::::1;::::0;7113:18:1;;29078:36:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29071:43:::0;28849:273;-1:-1:-1;;;;;28849:273:0:o;64294:1085::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;-1:-1:-1;;;;;64376:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;64368:70;;;::::0;-1:-1:-1;;;64368:70:0;;7720:2:1;64368:70:0::1;::::0;::::1;7702:21:1::0;7759:2;7739:18;;;7732:30;7798:29;7778:18;;;7771:57;7845:18;;64368:70:0::1;7518:351:1::0;64368:70:0::1;64454:9;64449:337;64473:9;:16:::0;64469:20;::::1;64449:337;;;64531:7;-1:-1:-1::0;;;;;64515:23:0::1;:9;64525:1;64515:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;64515:12:0::1;:23;64511:264;;;64574:9;64584:16:::0;;:20:::1;::::0;64603:1:::1;::::0;64584:20:::1;:::i;:::-;64574:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;64559:9:::1;:12:::0;;-1:-1:-1;;;;;64574:31:0;;::::1;::::0;64569:1;;64559:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;64559:46:0::1;-1:-1:-1::0;;;;;64559:46:0;;::::1;;::::0;;64624:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;64663:21:::1;:30:::0;;;;:38;;-1:-1:-1;;64663:38:0::1;::::0;;64720:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;64720:15:0;;;;;-1:-1:-1;;64720:15:0::1;::::0;;;;;64754:5:::1;;64511:264;64491:3:::0;::::1;::::0;::::1;:::i;:::-;;;;64449:337;;;-1:-1:-1::0;;;;;;64901:16:0;::::1;64927:1;64901:16:::0;;;:7:::1;:16;::::0;;;;:23;:27;64898:474:::1;;64949:6;64945:416;-1:-1:-1::0;;;;;64965:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:23;64961:27;::::1;64945:416;;;-1:-1:-1::0;;;;;65028:16:0;::::1;65014:11;65028:16:::0;;;:7:::1;:16;::::0;;;;:19;;65045:1;;65028:19;::::1;;;;;:::i;:::-;;;;;;;;;65014:33;;65314:31;65334:3;65339:5;65314:19;:31::i;:::-;-1:-1:-1::0;;;;;65292:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:19;;65309:1;;65292:19;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:53:::0;-1:-1:-1;64990:3:0;::::1;::::0;::::1;:::i;:::-;;;;64945:416;;;;64898:474;64294:1085:::0;:::o;66316:111::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;-1:-1:-1;;;;;66385:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;66385:34:0::1;66415:4;66385:34;::::0;;66316:111::o;50384:436::-;50474:7;32342:21;50502:7;:18;;50494:62;;;;-1:-1:-1;;;50494:62:0;;8784:2:1;50494:62:0;;;8766:21:1;8823:2;8803:18;;;8796:30;8862:33;8842:18;;;8835:61;8913:18;;50494:62:0;8582:355:1;50494:62:0;50572:17;50567:246;;50607:15;50631:19;50642:7;50631:10;:19::i;:::-;-1:-1:-1;50606:44:0;;-1:-1:-1;50665:14:0;;-1:-1:-1;;;;;50665:14:0;50567:246;50714:23;50745:19;50756:7;50745:10;:19::i;:::-;-1:-1:-1;50712:52:0;;-1:-1:-1;50779:22:0;;-1:-1:-1;;;;;50779:22:0;29513:112;28670:11;;-1:-1:-1;;;;;28670:11:0;9260:10;28670:27;28648:127;;;;-1:-1:-1;;;28648:127:0;;6749:2:1;28648:127:0;;;6731:21:1;6788:2;6768:18;;;6761:30;6827:34;6807:18;;;6800:62;6898:20;6878:18;;;6871:48;6936:19;;28648:127:0;6547:414:1;28648:127:0;29597:20:::1;29603:13;29597:5;:20::i;66557:287::-:0;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;66666:25;;::::1;66658:58;;;::::0;-1:-1:-1;;;66658:58:0;;9144:2:1;66658:58:0::1;::::0;::::1;9126:21:1::0;9183:2;9163:18;;;9156:30;9222:22;9202:18;;;9195:50;9262:18;;66658:58:0::1;8942:344:1::0;66658:58:0::1;66731:6;66727:110;66743:15:::0;;::::1;66727:110;;;66780:45;9260:10:::0;66809:4:::1;;66814:1;66809:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;66818:3;;66822:1;66818:6;;;;;;;:::i;:::-;;;;;;;66780:14;:45::i;:::-;66760:3:::0;::::1;::::0;::::1;:::i;:::-;;;;66727:110;;;;66557:287:::0;;;;:::o;63572:714::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;-1:-1:-1;;;;;63655:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;63654:31;63646:71;;;::::0;-1:-1:-1;;;63646:71:0;;9493:2:1;63646:71:0::1;::::0;::::1;9475:21:1::0;9532:2;9512:18;;;9505:30;9571:29;9551:18;;;9544:57;9618:18;;63646:71:0::1;9291:351:1::0;63646:71:0::1;-1:-1:-1::0;;;;;63831:16:0;::::1;63857:1;63831:16:::0;;;:7:::1;:16;::::0;;;;:23;:27;63828:241:::1;;63879:6;63875:183;-1:-1:-1::0;;;;;63895:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:23;63891:27;::::1;63875:183;;;-1:-1:-1::0;;;;;63958:16:0;::::1;63944:11;63958:16:::0;;;:7:::1;:16;::::0;;;;:19;;63975:1;;63958:19;::::1;;;;;:::i;:::-;;;;;;;;;63944:33;;64018:24;64038:3;64018:19;:24::i;:::-;-1:-1:-1::0;;;;;63996:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:19;;64013:1;;63996:19;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:46:::0;-1:-1:-1;63920:3:0;::::1;::::0;::::1;:::i;:::-;;;;63875:183;;;;63828:241;-1:-1:-1::0;;;;;64092:16:0;::::1;64111:1;64092:16:::0;;;:7:::1;:16;::::0;;;;;:20;64089:108:::1;;-1:-1:-1::0;;;;;64168:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;64148:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;64129:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;64089:108:::1;-1:-1:-1::0;;;;;64207:30:0::1;;::::0;;;:21:::1;:30;::::0;;;;:37;;-1:-1:-1;;64207:37:0::1;64240:4;64207:37:::0;;::::1;::::0;;;64255:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;64255:23:0::1;::::0;;::::1;::::0;;63572:714::o;29183:279::-;28670:11;;29338:4;;-1:-1:-1;;;;;28670:11:0;9260:10;28670:27;28648:127;;;;-1:-1:-1;;;28648:127:0;;6749:2:1;28648:127:0;;;6731:21:1;6788:2;6768:18;;;6761:30;6827:34;6807:18;;;6800:62;6898:20;6878:18;;;6871:48;6936:19;;28648:127:0;6547:414:1;28648:127:0;29415:39:::1;::::0;;;;-1:-1:-1;;;;;7158:55:1;;;29415:39:0::1;::::0;::::1;7140:74:1::0;7230:18;;;7223:34;;;29383:13:0;;29415:20;;::::1;::::0;::::1;::::0;7113:18:1;;29415:39:0::1;6966:297:1::0;37951:101:0;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;38021:15:::1;:23:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;37951:101::o;36667:119::-;36733:7;36760:18;36770:7;36760:9;:18::i;21158:103::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;21223:30:::1;21250:1;21223:18;:30::i;:::-;21158:103::o:0;30264:388::-;28670:11;;-1:-1:-1;;;;;28670:11:0;9260:10;28670:27;28648:127;;;;-1:-1:-1;;;28648:127:0;;6749:2:1;28648:127:0;;;6731:21:1;6788:2;6768:18;;;6761:30;6827:34;6807:18;;;6800:62;6898:20;6878:18;;;6871:48;6936:19;;28648:127:0;6547:414:1;28648:127:0;30395:21:::1;30427:20;30433:13:::0;30427:5:::1;:20::i;:::-;30458:11;30472:33;:21;30498:6:::0;30472:25:::1;:33::i;:::-;30626:11;::::0;30458:47;;-1:-1:-1;30608:36:0::1;::::0;-1:-1:-1;;;;;30626:11:0::1;30458:47:::0;30608:9:::1;:36::i;:::-;30367:285;;30264:388:::0;:::o;30724:249::-;28670:11;;-1:-1:-1;;;;;28670:11:0;9260:10;28670:27;28648:127;;;;-1:-1:-1;;;28648:127:0;;6749:2:1;28648:127:0;;;6731:21:1;6788:2;6768:18;;;6761:30;6827:34;6807:18;;;6800:62;6898:20;6878:18;;;6871:48;6936:19;;28648:127:0;6547:414:1;28648:127:0;30814:7:::1;::::0;:14:::1;::::0;;;;;;;30795:10:::1;::::0;-1:-1:-1;;;;;30814:7:0::1;::::0;:12:::1;::::0;:14:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:7;:14:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30795:34;;30840:14;30864:7;;;;;;;;;-1:-1:-1::0;;;;;30864:7:0::1;-1:-1:-1::0;;;;;30864:12:0::1;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30904:32;::::0;;;;30930:4:::1;30904:32;::::0;::::1;4594:74:1::0;30840:39:0;;-1:-1:-1;30890:11:0::1;::::0;-1:-1:-1;;;;;30904:17:0;::::1;::::0;::::1;::::0;4567:18:1;;30904:32:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30947:18;::::0;;;;::::1;::::0;::::1;1744:25:1::0;;;30890:46:0;;-1:-1:-1;;;;;;30947:13:0;::::1;::::0;::::1;::::0;1717:18:1;;30947::0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30784:189;;;30724:249::o:0;45443:116::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;45515:15:::1;:36:::0;;-1:-1:-1;;45515:36:0::1;-1:-1:-1::0;;;;;45515:36:0;;;::::1;::::0;;;::::1;::::0;;45443:116::o;45196:::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;45268:15:::1;:36:::0;;-1:-1:-1;;45268:36:0::1;-1:-1:-1::0;;;;;45268:36:0;;;::::1;::::0;;;::::1;::::0;;45196:116::o;36794:199::-;36899:4;36921:42;9260:10;36945:9;36956:6;36921:9;:42::i;53336:110::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;53408:14:::1;:30:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;53336:110::o;48207:346::-;34908:15;;-1:-1:-1;;;;;34908:15:0;9260:10;-1:-1:-1;;;;;34892:31:0;;:83;;;-1:-1:-1;34960:15:0;;-1:-1:-1;;;;;34960:15:0;9260:10;-1:-1:-1;;;;;34944:31:0;;34892:83;:135;;;-1:-1:-1;35012:15:0;;-1:-1:-1;;;;;35012:15:0;9260:10;-1:-1:-1;;;;;34996:31:0;;34892:135;:187;;;-1:-1:-1;35064:15:0;;-1:-1:-1;;;;;35064:15:0;9260:10;-1:-1:-1;;;;;35048:31:0;;34892:187;:239;;;-1:-1:-1;35116:15:0;;-1:-1:-1;;;;;35116:15:0;9260:10;-1:-1:-1;;;;;35100:31:0;;34892:239;:283;;;-1:-1:-1;20553:7:0;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;35152:23;34892:283;34870:316;;;;;;48315:12:::1;48371:20;32342:21;48383:7:::0;48371:11:::1;:20::i;:::-;48342:26;48362:4;48342:11;:26::i;:::-;:49;48338:175;;;48415:20;32342:21;48427:7:::0;48415:11:::1;:20::i;:::-;48408:27;;48338:175;;;48475:26;48495:4;48475:11;:26::i;:::-;48468:33;;48338:175;48523:22;48540:4;48523:16;:22::i;45869:1320::-:0;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;45929:11:::1;::::0;;;::::1;;;45928:12;45920:48;;;::::0;-1:-1:-1;;;45920:48:0;;10294:2:1;45920:48:0::1;::::0;::::1;10276:21:1::0;10333:2;10313:18;;;10306:30;10372:25;10352:18;;;10345:53;10415:18;;45920:48:0::1;10092:347:1::0;45920:48:0::1;46114:15;:34:::0;;-1:-1:-1;;46114:34:0::1;46050:42;46114:34:::0;;::::1;::::0;;;46159:58:::1;46176:4;46050:42:::0;32342:21:::1;46159:8;:58::i;:::-;46262:16;-1:-1:-1::0;;;;;46262:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46244:70:0::1;;46323:4;46330:16;-1:-1:-1::0;;;;;46330:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46244:110;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;10697:15:1;;;46244:110:0::1;::::0;::::1;10679:34:1::0;10749:15;;10729:18;;;10722:43;10591:18;;46244:110:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46228:13;:126:::0;;-1:-1:-1;;;;;46228:126:0;;::::1;-1:-1:-1::0;;46228:126:0;;::::1;::::0;::::1;::::0;;:13:::1;46397:36:::0;;;:21:::1;:36;::::0;;;;:43;;-1:-1:-1;;46397:43:0::1;46228:126:::0;46397:43;;::::1;::::0;;;46466:13;;46451:9:::1;:29:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;::::1;46466:13:::0;;::::1;46451:29:::0;;;::::1;::::0;;46491:15:::1;::::0;::::1;:31;46530:21;46575:4;46595:24;46575:4:::0;46595:9:::1;:24::i;:::-;46634:1;46650::::0;46666:7:::1;20553::::0;20580:6;-1:-1:-1;;;;;20580:6:0;;20507:87;46666:7:::1;46491:223;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;11158:15:1;;;46491:223:0::1;::::0;::::1;11140:34:1::0;11190:18;;;11183:34;;;;11233:18;;;11226:34;;;;11276:18;;;11269:34;11340:15;;;11319:19;;;11312:44;46688:15:0::1;11372:19:1::0;;;11365:35;11051:19;;46491:223:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;46725:11:0::1;:18:::0;;46754:22;;;;;;;;-1:-1:-1;46831:14:0::1;:23:::0;;;::::1;46848:6;46831:23;::::0;;46896:16:::1;32342:21;46908:3;46896:11;:16::i;:::-;46881:12;:31:::0;46957:16:::1;32342:21;46969:3;46957:11;:16::i;:::-;46938;:35:::0;46984:11:::1;:18:::0;;;;;::::1;;::::0;;;47025:12:::1;47013:9;:24:::0;47100:15:::1;::::0;47048:111:::1;::::0;;;;-1:-1:-1;;;;;47100:15:0;;::::1;47048:111;::::0;::::1;7140:74:1::0;-1:-1:-1;;7230:18:1;;;7223:34;47055:13:0;;;47048:29:::1;::::0;7113:18:1;;47048:111:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;47883:96::-:0;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;47947:15:::1;:24:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;47883:96::o;42394:104::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;42469:11:::1;:21:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;42394:104::o;66439:110::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;-1:-1:-1;;;;;66506:27:0::1;66536:5;66506:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;66506:35:0::1;::::0;;66439:110::o;43878:107::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;43963:14:::1;:6:::0;43972:5:::1;43963:14;:::i;:::-;43948:12;:29:::0;-1:-1:-1;43878:107:0:o;21416:201::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;-1:-1:-1;;;;;21505:22:0;::::1;21497:73;;;::::0;-1:-1:-1;;;21497:73:0;;11924:2:1;21497:73:0::1;::::0;::::1;11906:21:1::0;11963:2;11943:18;;;11936:30;12002:34;11982:18;;;11975:62;12073:8;12053:18;;;12046:36;12099:19;;21497:73:0::1;11722:402:1::0;21497:73:0::1;21581:28;21600:8;21581:18;:28::i;48657:157::-:0;34908:15;;-1:-1:-1;;;;;34908:15:0;9260:10;-1:-1:-1;;;;;34892:31:0;;:83;;;-1:-1:-1;34960:15:0;;-1:-1:-1;;;;;34960:15:0;9260:10;-1:-1:-1;;;;;34944:31:0;;34892:83;:135;;;-1:-1:-1;35012:15:0;;-1:-1:-1;;;;;35012:15:0;9260:10;-1:-1:-1;;;;;34996:31:0;;34892:135;:187;;;-1:-1:-1;35064:15:0;;-1:-1:-1;;;;;35064:15:0;9260:10;-1:-1:-1;;;;;35048:31:0;;34892:187;:239;;;-1:-1:-1;35116:15:0;;-1:-1:-1;;;;;35116:15:0;9260:10;-1:-1:-1;;;;;35100:31:0;;34892:239;:283;;;-1:-1:-1;20553:7:0;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;35152:23;34892:283;34870:316;;;;;;48742:21:::1;48774:32;48742:21:::0;48774:12:::1;:32::i;47300:90::-:0;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;-1:-1:-1;;;;;47362:13:0::1;;::::0;;;:5:::1;:13;::::0;;;;:20;;-1:-1:-1;;47362:20:0::1;47378:4;47362:20;::::0;;47300:90::o;16419:98::-;16477:7;16504:5;16508:1;16504;:5;:::i;38060:369::-;-1:-1:-1;;;;;38187:19:0;;38179:68;;;;-1:-1:-1;;;38179:68:0;;12610:2:1;38179:68:0;;;12592:21:1;12649:2;12629:18;;;12622:30;12688:34;12668:18;;;12661:62;12759:6;12739:18;;;12732:34;12783:19;;38179:68:0;12408:400:1;38179:68:0;-1:-1:-1;;;;;38266:21:0;;38258:68;;;;-1:-1:-1;;;38258:68:0;;13015:2:1;38258:68:0;;;12997:21:1;13054:2;13034:18;;;13027:30;13093:34;13073:18;;;13066:62;13164:4;13144:18;;;13137:32;13186:19;;38258:68:0;12813:398:1;38258:68:0;-1:-1:-1;;;;;38337:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;38389:32;;1744:25:1;;;38389:32:0;;1717:18:1;38389:32:0;;;;;;;38060:369;;;:::o;38439:3835::-;-1:-1:-1;;;;;38561:18:0;;38553:68;;;;-1:-1:-1;;;38553:68:0;;13418:2:1;38553:68:0;;;13400:21:1;13457:2;13437:18;;;13430:30;13496:34;13476:18;;;13469:62;13567:7;13547:18;;;13540:35;13592:19;;38553:68:0;13216:401:1;38553:68:0;-1:-1:-1;;;;;38640:16:0;;38632:64;;;;-1:-1:-1;;;38632:64:0;;13824:2:1;38632:64:0;;;13806:21:1;13863:2;13843:18;;;13836:30;13902:34;13882:18;;;13875:62;13973:5;13953:18;;;13946:33;13996:19;;38632:64:0;13622:399:1;38632:64:0;38724:1;38715:6;:10;38707:64;;;;-1:-1:-1;;;38707:64:0;;14228:2:1;38707:64:0;;;14210:21:1;14267:2;14247:18;;;14240:30;14306:34;14286:18;;;14279:62;14377:11;14357:18;;;14350:39;14406:19;;38707:64:0;14026:405:1;38707:64:0;38863:5;38853:7;:15;38893:4;38879:11;:18;38908:5;:13;;;;;;-1:-1:-1;20580:6:0;-1:-1:-1;;;;;38952:15:0;;;20580:6;;38952:15;;;;:45;;-1:-1:-1;20553:7:0;20580:6;-1:-1:-1;;;;;38984:13:0;;;20580:6;;38984:13;;38952:45;:83;;;;-1:-1:-1;;;;;;39014:21:0;;39030:4;39014:21;;38952:83;:123;;;;-1:-1:-1;;;;;;39053:22:0;;;;;;:18;:22;;;;;;;;39052:23;38952:123;:165;;;;-1:-1:-1;;;;;;39093:24:0;;;;;;:18;:24;;;;;;;;39092:25;38952:165;38934:3288;;;-1:-1:-1;;;;;39153:9:0;;;;;;:5;:9;;;;;;;;39152:10;:26;;;;-1:-1:-1;;;;;;39167:11:0;;;;;;:5;:11;;;;;;;;39166:12;39152:26;39144:47;;;;-1:-1:-1;;;39144:47:0;;14638:2:1;39144:47:0;;;14620:21:1;14677:1;14657:18;;;14650:29;14715:10;14695:18;;;14688:38;14743:18;;39144:47:0;14436:331:1;39144:47:0;39351:5;:12;;;;;;;;-1:-1:-1;;;;;39490:12:0;;39351;39490;;;:6;:12;;;;;;:24;;39507:6;39490:16;:24::i;:::-;-1:-1:-1;;;;;39475:12:0;;;;;;;:6;:12;;;;;:39;;;;39599:13;;;39591:21;:55;;;;-1:-1:-1;39630:15:0;;-1:-1:-1;;;;;39616:30:0;;;39630:15;;39616:30;;39591:55;:116;;;;-1:-1:-1;;;;;;39650:57:0;;39664:42;39650:57;;39591:116;39587:2465;;;39816:15;;;;;;;39813:126;;;-1:-1:-1;;;;;39864:17:0;;;;;;:13;:17;;;;;;39885:12;39864:33;;39856:63;;;;-1:-1:-1;;;39856:63:0;;14974:2:1;39856:63:0;;;14956:21:1;15013:2;14993:18;;;14986:30;15052:19;15032:18;;;15025:47;15089:18;;39856:63:0;14772:341:1;39856:63:0;-1:-1:-1;;;;;39988:17:0;;;;;;:13;:17;;;;;40008:12;39988:32;;;;40042:9;;:18;;32906:1;40042:13;:18::i;:::-;:33;40039:396;;;40174:6;40164:7;:16;40217:1;40203:11;:15;40241:5;:12;;;;;;;;38934:3288;;40039:396;40358:22;40369:2;40373:6;40358:10;:22::i;:::-;40403:5;:12;;;;;;;;38934:3288;;39587:2465;40466:13;;-1:-1:-1;;;;;40460:19:0;;;40466:13;;40460:19;:55;;;;-1:-1:-1;40499:15:0;;-1:-1:-1;;;;;40483:32:0;;;40499:15;;40483:32;;40460:55;40456:1596;;;40562:5;:13;;;;;;;;40682:15;;;40562:13;40682:15;40679:128;;;-1:-1:-1;;;;;40730:19:0;;;;;;:13;:19;;;;;;40753:12;40730:35;;40722:65;;;;-1:-1:-1;;;40722:65:0;;14974:2:1;40722:65:0;;;14956:21:1;15013:2;14993:18;;;14986:30;15052:19;15032:18;;;15025:47;15089:18;;40722:65:0;14772:341:1;40722:65:0;-1:-1:-1;;;;;40856:19:0;;;;:13;:19;;40950:12;;40940:22;;;40932:63;;;;-1:-1:-1;;;40932:63:0;;15320:2:1;40932:63:0;;;15302:21:1;15359:2;15339:18;;;15332:30;15398;15378:18;;;15371:58;15446:18;;40932:63:0;15118:352:1;40932:63:0;41134:28;41165:26;41185:4;41165:11;:26::i;:::-;41253:16;;41296:11;;41134:57;;-1:-1:-1;41229:40:0;;;;41296:11;;;;;:22;;;;;41311:7;41296:22;:33;;;;-1:-1:-1;41323:6:0;;;;;;;41322:7;41296:33;:50;;;;;41333:13;:11;:13::i;:::-;41292:448;;;41457:34;41474:16;;41457;:34::i;:::-;41547:21;41599:22;;41595:122;;41654:35;41667:21;41654:12;:35::i;:::-;41348:392;41292:448;41111:648;;41832:26;41845:4;41851:6;41832:12;:26::i;:::-;38934:3288;;40456:1596;41994:5;41984:7;:15;42032:4;42018:11;:18;38934:3288;;;42179:1;42169:7;:11;;;42195;:15;38934:3288;42234:32;42249:4;42255:2;42259:6;42234:14;:32::i;17561:240::-;17681:7;17742:12;17734:6;;;;17726:29;;;;-1:-1:-1;;;17726:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;17777:5:0;;;17561:240::o;52448:163::-;52489:7;52510:15;52527;52546:19;:17;:19::i;:::-;52509:56;;-1:-1:-1;52509:56:0;-1:-1:-1;52583:20:0;52509:56;;52583:11;:20::i;:::-;52576:27;;;;52448:163;:::o;51246:419::-;51305:7;51314;51323;51332;51341;51350;51371:23;51396:12;51410:18;51432:20;51444:7;51432:11;:20::i;:::-;51370:82;;;;;;51464:15;51481:23;51506:12;51522:50;51534:7;51543:4;51549:10;51561;:8;:10::i;:::-;51522:11;:50::i;:::-;51463:109;;;;-1:-1:-1;51463:109:0;;-1:-1:-1;51623:15:0;;-1:-1:-1;51640:4:0;;-1:-1:-1;51646:10:0;;-1:-1:-1;51246:419:0;;-1:-1:-1;;;;;51246:419:0:o;29729:527::-;29844:16;;;29858:1;29844:16;;;;;;;;29805:3;;29777:18;;29844:16;29858:1;29844:16;;;;;;;;;;-1:-1:-1;29844:16:0;29820:40;;29881:3;29871:4;29876:1;29871:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29871:13:0;;;:7;;;;;;;;;;:13;;;;29905:7;;:14;;;;;;;;:7;;;;;:12;;:14;;;;;29871:7;;29905:14;;;;;:7;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29895:4;29900:1;29895:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29895:24:0;;;:7;;;;;;;;;:24;29952:36;;;;;29982:4;29952:36;;;4594:74:1;29930:19:0;;29952:21;;;;;4567:18:1;;29952:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30027:7;;29999:50;;;;;-1:-1:-1;;;;;30027:7:0;;;29999:50;;;7140:74:1;7230:18;;;7223:34;;;29930:58:0;;-1:-1:-1;29999:19:0;;;;;7113:18:1;;29999:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;30060:7:0;;:188;;;;;-1:-1:-1;;;;;30060:7:0;;;;:58;;:188;;30133:11;;30060:7;;30175:4;;30202;;30222:15;;30060:188;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29766:490;;;29729:527;:::o;49612:762::-;-1:-1:-1;;;;;49756:29:0;;;49740:13;49756:29;;;:21;:29;;;;;;;49815:32;;;;;;;;49756:29;;;;;49815:32;49756:29;49862:24;;;;;49875:11;49874:12;49862:24;49858:509;;;49903:48;49925:6;49933:9;49944:6;49903:21;:48::i;:::-;49858:509;;;49974:8;49973:9;:24;;;;;49986:11;49973:24;49969:398;;;50014:46;50034:6;50042:9;50053:6;50014:19;:46::i;49969:398::-;50083:8;50082:9;:25;;;;;50096:11;50095:12;50082:25;50078:289;;;50124:44;50142:6;50150:9;50161:6;50124:17;:44::i;50078:289::-;50190:8;:23;;;;;50202:11;50190:23;50186:181;;;50230:48;50252:6;50260:9;50271:6;50230:21;:48::i;50186:181::-;50311:44;50329:6;50337:9;50348:6;50311:17;:44::i;48822:221::-;-1:-1:-1;;;;;48900:13:0;;48876:7;48900:13;;;:8;:13;;;;;;48917:12;48900:29;48896:140;;;-1:-1:-1;;;;;;48953:15:0;;;;;:10;:15;;;;;;;48822:221::o;48896:140::-;49008:16;49020:3;49008:11;:16::i;21777:191::-;21851:16;21870:6;;-1:-1:-1;;;;;21887:17:0;;;-1:-1:-1;;21887:17:0;;;;;;21920:40;;21870:6;;;;;;;21920:40;;21851:16;21920:40;21840:128;21777:191;:::o;15663:98::-;15721:7;15748:5;15752:1;15748;:5;:::i;31094:391::-;31223:6;31198:21;:31;;31176:110;;;;-1:-1:-1;;;31176:110:0;;16897:2:1;31176:110:0;;;16879:21:1;16936:2;16916:18;;;16909:30;16975:31;16955:18;;;16948:59;17024:18;;31176:110:0;16695:353:1;31176:110:0;31300:12;31318:9;-1:-1:-1;;;;;31318:14:0;31340:6;31318:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31299:52;;;31384:7;31362:115;;;;-1:-1:-1;;;31362:115:0;;17465:2:1;31362:115:0;;;17447:21:1;17504:2;17484:18;;;17477:30;17543:34;17523:18;;;17516:62;17614:28;17594:18;;;17587:56;17660:19;;31362:115:0;17263:422:1;49051:186:0;-1:-1:-1;;;;;49131:26:0;;49107:7;49131:26;;;:21;:26;;;;;;;;49127:51;;;-1:-1:-1;;;;;;49166:12:0;;;;;:7;:12;;;;;;;49051:186::o;49127:51::-;-1:-1:-1;;;;;49216:12:0;;;;;;:7;:12;;;;;;49196:33;;:19;:33::i;42506:483::-;34636:6;:13;;;;;;;;34677:7;;34712:11;;42608:16:::1;::::0;;42622:1:::1;42608:16:::0;;;;;::::1;::::0;;-1:-1:-1;;42608:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;42608:16:0::1;42584:40;;42653:4;42635;42640:1;42635:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;42635:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;42679:15:::1;::::0;:22:::1;::::0;;;;;;;:15;;;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;42635:7;;42679:22;;;;;:15;:22:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42669:4;42674:1;42669:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;42669:32:0;;::::1;:7;::::0;;::::1;::::0;;;;;:32;42744:15:::1;::::0;42712:62:::1;::::0;42729:4:::1;::::0;42744:15:::1;42762:11:::0;42712:8:::1;:62::i;:::-;42785:15;::::0;:196:::1;::::0;;;;-1:-1:-1;;;;;42785:15:0;;::::1;::::0;:66:::1;::::0;:196:::1;::::0;42866:11;;42785:15:::1;::::0;42908:4;;42935::::1;::::0;42955:15:::1;::::0;42785:196:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;34746:6:0;:14;;;;;;-1:-1:-1;;;34771:7:0;:16;;;;34798:11;:20;-1:-1:-1;42506:483:0:o;42997:751::-;43194:15;;43176:79;;-1:-1:-1;;;;;43194:15:0;43211:43;33588:3;43211:21;:6;33262:3;43211:10;:21::i;:::-;:25;;:43::i;:::-;43176:17;:79::i;:::-;43304:15;;43286:82;;-1:-1:-1;;;;;43304:15:0;43321:46;33588:3;43321:24;:6;33312:3;43321:10;:24::i;43286:82::-;43426:15;;43408:85;;-1:-1:-1;;;;;43426:15:0;43443:49;33588:3;43443:27;:6;33365:3;43443:10;:27::i;43408:85::-;43554:15;;43536:85;;-1:-1:-1;;;;;43554:15:0;43571:49;33588:3;43571:27;:6;33418:2;43571:10;:27::i;43536:85::-;43672:15;;43654:84;;-1:-1:-1;;;;;43672:15:0;43689:48;33588:3;43689:26;:6;33469:3;43689:10;:26::i;15282:98::-;15340:7;15367:5;15371:1;15367;:5;:::i;44242:329::-;44367:12;;44357:6;:22;;44349:63;;;;-1:-1:-1;;;44349:63:0;;15320:2:1;44349:63:0;;;15302:21:1;15359:2;15339:18;;;15332:30;15398;15378:18;;;15371:58;15446:18;;44349:63:0;15118:352:1;44349:63:0;44496:16;;44486:6;44468:15;44480:2;44468:11;:15::i;:::-;:24;;;;:::i;:::-;:44;;44446:117;;;;-1:-1:-1;;;44446:117:0;;18025:2:1;44446:117:0;;;18007:21:1;18064:2;18044:18;;;18037:30;18103:25;18083:18;;;18076:53;18146:18;;44446:117:0;17823:347:1;47602:161:0;47740:15;;47647:4;;47740:15;;;;;47727:9;:28;;47720:35;;47602:161;:::o;53802:3082::-;-1:-1:-1;;;;;54284:14:0;;54028:18;54284:14;;;:6;:14;;;;;;54028:18;;;;;;;;54284:26;;54303:6;54284:18;:26::i;:::-;54266:44;;54321:9;54364:18;54359:2292;-1:-1:-1;;;;;54401:14:0;;;;;;:6;:14;;;;;:21;54388:34;;54359:2292;;;-1:-1:-1;;;;;54466:14:0;;54453:10;54466:14;;;:6;:14;;;;;:26;;54481:10;;54466:26;;;;;;:::i;:::-;;;;;;;;;54453:39;;54546:11;54560:46;54570:6;54578:7;:15;54586:6;-1:-1:-1;;;;;54578:15:0;-1:-1:-1;;;;;54578:15:0;;;;;;;;;;;;54594:10;54578:27;;;;;;;;:::i;:::-;;;;;;;;;54560:9;:46::i;:::-;54546:60;;54621:20;54668:4;54664:406;;54709:22;:13;54727:3;54709:17;:22::i;:::-;54693:38;;54808:7;54791:13;:24;54788:173;;-1:-1:-1;54892:4:0;;-1:-1:-1;54892:4:0;54788:173;55074:4;55071:1569;;;55099:14;;55168:256;;;;55220:26;:13;55238:7;55220:17;:26::i;:::-;55211:35;;55282:6;55269:19;;55168:256;;;55346:3;;-1:-1:-1;55385:19:0;:10;55346:3;55385:14;:19::i;:::-;55372:32;;55168:256;55536:6;55522:10;:20;55519:145;;55576:34;55587:22;:10;55602:6;55587:14;:22::i;:::-;55576:6;;:10;:34::i;:::-;55567:43;;55640:4;55633:11;;55519:145;55842:14;;55781:18;;55802:66;;55814:53;;55862:4;;55814:43;;55842:14;;55814:23;:15;55834:2;55814:19;:23::i;:43::-;:47;;:53::i;:::-;33722:5;;55802:11;:66::i;:::-;55781:87;;55942:5;55929:10;:18;55926:84;;;-1:-1:-1;55985:5:0;55926:84;56031:12;56028:453;;56078:10;56068:20;;56123:6;56111:18;;56028:453;;;56227:17;56247:21;:9;56261:6;56247:13;:21::i;:::-;56227:41;;56291:18;56312:62;56324:9;56335:7;56344:6;56352:10;56364:9;56312:11;:62::i;:::-;56291:83;-1:-1:-1;56409:9:0;;-1:-1:-1;;56028:453:0;56504:4;56501:124;;;56600:5;;;;;;;;56501:124;55080:1560;;;55071:1569;54438:2213;;;54424:12;;;;;:::i;:::-;;;;54359:2292;;;-1:-1:-1;56805:22:0;56824:2;56805:14;:7;56817:1;56805:11;:14::i;:22::-;56795:7;:32;56852:22;56871:2;56852:14;:7;56864:1;56852:11;:14::i;:22::-;56838:11;:36;-1:-1:-1;;;;;;;;53802:3082:0:o;52619:561::-;52716:7;;52669;;;;32342:21;52669:7;52776:289;52800:9;:16;52796:20;;52776:289;;;52866:7;52842;:21;52850:9;52860:1;52850:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;52850:12:0;52842:21;;;;;;;;;;;;;:31;;:66;;;52901:7;52877;:21;52885:9;52895:1;52885:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;52885:12:0;52877:21;;;;;;;;;;;;;:31;52842:66;52838:97;;;-1:-1:-1;;52918:7:0;;;32342:21;;-1:-1:-1;52619:561:0;-1:-1:-1;;52619:561:0:o;52838:97::-;52960:34;52972:7;:21;52980:9;52990:1;52980:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;52980:12:0;52972:21;;;;;;;;;;;;;52960:7;;:11;:34::i;:::-;52950:44;;53019:34;53031:7;:21;53039:9;53049:1;53039:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;53039:12:0;53031:21;;;;;;;;;;;;;53019:7;;:11;:34::i;:::-;53009:44;-1:-1:-1;52818:3:0;;;;:::i;:::-;;;;52776:289;;;-1:-1:-1;53089:7:0;;:20;;32342:21;53089:11;:20::i;:::-;53079:7;:30;53075:61;;;-1:-1:-1;;53119:7:0;;;32342:21;;-1:-1:-1;52619:561:0;-1:-1:-1;52619:561:0:o;53075:61::-;53155:7;;53164;;-1:-1:-1;52619:561:0;-1:-1:-1;52619:561:0:o;51673:330::-;51733:7;51742;51751;51771:12;51786:28;51806:7;51786:19;:28::i;:::-;51771:43;;51825:18;51846:26;51864:7;51846:17;:26::i;:::-;51825:47;-1:-1:-1;51883:23:0;51909:33;51825:47;51909:17;:7;51921:4;51909:11;:17::i;:::-;:21;;:33::i;:::-;51883:59;51978:4;;-1:-1:-1;51984:10:0;;-1:-1:-1;51673:330:0;;-1:-1:-1;;;51673:330:0:o;52011:429::-;52126:7;;;;52182:24;:7;52194:11;52182;:24::i;:::-;52164:42;-1:-1:-1;52217:12:0;52232:21;:4;52241:11;52232:8;:21::i;:::-;52217:36;-1:-1:-1;52264:18:0;52285:27;:10;52300:11;52285:14;:27::i;:::-;52264:48;-1:-1:-1;52323:23:0;52349:33;52264:48;52349:17;:7;52361:4;52349:11;:17::i;:33::-;52401:7;;;;-1:-1:-1;52427:4:0;;-1:-1:-1;52011:429:0;;-1:-1:-1;;;;;;;52011:429:0:o;60393:1518::-;60533:5;;;;;;;60529:1375;;;60631:1;60665:7;60605:23;60703:28;60665:7;60631:1;60703:11;:28::i;:::-;-1:-1:-1;;;;;60795:19:0;;;;;;:8;:19;;;;;;;;60817:12;60795:34;;60868:7;:18;;;;;;60687:44;;-1:-1:-1;60868:31:0;;60891:7;60868:22;:31::i;:::-;-1:-1:-1;;;;;60844:21:0;;;;;;;:10;:21;;;;;;;;:55;;;;60969:15;;;;;:7;:15;;;;;:28;;60989:7;60969:19;:28::i;:::-;-1:-1:-1;;;;;60951:15:0;;;;;;:7;:15;;;;;;;;:46;;;;61077:7;:15;;;;:28;;61097:7;61077:19;:28::i;:::-;-1:-1:-1;;;;;61059:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;61141:18;;;;;:7;:18;;;;;:39;;61164:15;61141:22;:39::i;:::-;-1:-1:-1;;;;;61120:18:0;;;;;;:7;:18;;;;;:60;61195:17;61206:5;61195:10;:17::i;:::-;61249:9;-1:-1:-1;;;;;61232:44:0;61241:6;-1:-1:-1;;;;;61232:44:0;;61260:15;61232:44;;;;1744:25:1;;1732:2;1717:18;;1598:177;61232:44:0;;;;;;;;60540:748;;;30367:285:::1;;30264:388:::0;:::o;60529:1375::-;61320:15;61350:23;61388:12;61415:23;61453:12;61480:18;61512:19;61523:7;61512:10;:19::i;:::-;61305:226;;;;;;;;;;;;61542:38;61553:9;61564:15;61542:10;:38::i;:::-;-1:-1:-1;;;;;61609:15:0;;;;;;:7;:15;;;;;;:28;;61629:7;61609:19;:28::i;:::-;-1:-1:-1;;;;;61591:15:0;;;;;;:7;:15;;;;;;;;:46;;;;61666:7;:15;;;;:28;;61686:7;61666:19;:28::i;:::-;-1:-1:-1;;;;;61648:15:0;;;;;;;:7;:15;;;;;;:46;;;;61726:18;;;;;;;:39;;61749:15;61726:22;:39::i;:::-;-1:-1:-1;;;;;61705:18:0;;;;;;:7;:18;;;;;:60;61776:22;61787:10;61776;:22::i;:::-;61809:23;61821:4;61827;61809:11;:23::i;:::-;61865:9;-1:-1:-1;;;;;61848:44:0;61857:6;-1:-1:-1;;;;;61848:44:0;;61876:15;61848:44;;;;1744:25:1;;1732:2;1717:18;;1598:177;61848:44:0;;;;;;;;61294:610;;;;;;60393:1518;;;:::o;58782:1603::-;58920:5;;;;;;;58916:1462;;;59014:1;59044:7;58988:23;59078:28;59044:7;59014:1;59078:11;:28::i;:::-;-1:-1:-1;;;;;59162:19:0;;;;;;:8;:19;;;;;;;;59184:12;59162:34;;59292:7;:18;;;;;;59062:44;;-1:-1:-1;59292:31:0;;59315:7;59292:22;:31::i;:::-;-1:-1:-1;;;;;59268:21:0;;;;;;;:10;:21;;;;;;;;:55;;;;59445:15;;;;;:7;:15;;;;;:28;;59465:7;59445:19;:28::i;:::-;-1:-1:-1;;;;;59427:15:0;;;;;;;:7;:15;;;;;;:46;;;;59505:18;;;;;;;:39;;59528:15;59505:22;:39::i;:::-;-1:-1:-1;;;;;59484:18:0;;;;;;:7;:18;;;;;;;;:60;;;;59609:7;:18;;;;:39;;59632:15;59609:22;:39::i;:::-;-1:-1:-1;;;;;59588:18:0;;;;;;:7;:18;;;;;:60;59659:17;59670:5;59659:10;:17::i;58916:1462::-;59780:15;59810:23;59848:12;59875:23;59913:12;59940:18;59972:19;59983:7;59972:10;:19::i;:::-;59765:226;;;;;;;;;;;;60002:38;60013:9;60024:15;60002:10;:38::i;:::-;-1:-1:-1;;;;;60069:15:0;;;;;;:7;:15;;;;;;:28;;60089:7;60069:19;:28::i;:::-;-1:-1:-1;;;;;60051:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;60129:18;;;;;:7;:18;;;;;:39;;60152:15;60129:22;:39::i;:::-;-1:-1:-1;;;;;60108:18:0;;;;;;:7;:18;;;;;;;;:60;;;;60200:7;:18;;;;:39;;60223:15;60200:22;:39::i;57376:1398::-;57547:5;;;;;;;57543:1214;;;57645:1;57679:7;57619:23;57717:28;57679:7;57645:1;57717:11;:28::i;:::-;-1:-1:-1;;;;;57809:19:0;;;;;;:8;:19;;;;;;;;57831:12;57809:34;;57882:7;:18;;;;;;57701:44;;-1:-1:-1;57882:31:0;;57905:7;57882:22;:31::i;:::-;-1:-1:-1;;;;;57858:21:0;;;;;;;:10;:21;;;;;;;;:55;;;;57983:15;;;;;:7;:15;;;;;:28;;58003:7;57983:19;:28::i;:::-;-1:-1:-1;;;;;57965:15:0;;;;;;;:7;:15;;;;;;:46;;;;58047:18;;;;;;;:39;;58070:15;58047:22;:39::i;57543:1214::-;58230:15;58260:23;58298:12;58325:23;58363:12;58390:18;58422:19;58433:7;58422:10;:19::i;:::-;58215:226;;;;;;;;;;;;58452:38;58463:9;58474:15;58452:10;:38::i;:::-;-1:-1:-1;;;;;58519:15:0;;;;;;:7;:15;;;;;;:28;;58539:7;58519:19;:28::i;61919:1640::-;62024:5;;;;;;;62021:1531;;;62122:1;62156:7;62096:23;62194:28;62156:7;62122:1;62194:11;:28::i;:::-;-1:-1:-1;;;;;62286:19:0;;;;;;:8;:19;;;;;;;;62308:12;62286:34;;62359:7;:18;;;;;;62178:44;;-1:-1:-1;62359:31:0;;62382:7;62359:22;:31::i;:::-;-1:-1:-1;;;;;62335:21:0;;;;;;;:10;:21;;;;;;;;:55;;;;62460:15;;;;;:7;:15;;;;;:28;;62480:7;62460:19;:28::i;:::-;-1:-1:-1;;;;;62442:15:0;;;;;;:7;:15;;;;;;;;:46;;;;62568:7;:15;;;;:28;;62588:7;62568:19;:28::i;:::-;-1:-1:-1;;;;;62550:15:0;;;;;;;:7;:15;;;;;;:46;;;;62688:18;;;;;;;:39;;62711:15;62688:22;:39::i;:::-;-1:-1:-1;;;;;62667:18:0;;;;;;:7;:18;;;;;;;;:60;;;;62763:7;:18;;;;:39;;62786:15;62763:22;:39::i;62021:1531::-;62932:15;62949:23;62974:12;62988:23;63013:12;63027:18;63049:19;63060:7;63049:10;:19::i;:::-;62931:137;;;;;;;;;;;;63083:38;63094:9;63105:15;63083:10;:38::i;:::-;-1:-1:-1;;;;;63154:15:0;;;;;;:7;:15;;;;;;:28;;63174:7;63154:19;:28::i;:::-;-1:-1:-1;;;;;63136:15:0;;;;;;:7;:15;;;;;;;;:46;;;;63215:7;:15;;;;:28;;63235:7;63215:19;:28::i;16020:98::-;16078:7;16105:5;16109:1;16105;:5;:::i;57134:232::-;-1:-1:-1;;;;;57227:29:0;;57204:7;57227:29;;;:21;:29;;;;;;;;57224:135;;;-1:-1:-1;57280:3:0;57273:10;;57224:135;57323:24;57343:3;57323:19;:24::i;:::-;57316:31;;;;56892:234;57026:7;57053:65;57108:9;57053:50;57080:22;:6;57091:10;57080;:22::i;:::-;57053;:9;57067:7;57053:13;:22::i;:::-;:26;;:50::i;:65::-;57046:72;56892:234;-1:-1:-1;;;;;;56892:234:0:o;65389:139::-;65457:7;65484:36;65513:6;65484:24;65496:11;;65484:7;:11;;:24;;;;:::i;65536:133::-;65602:7;65629:32;65654:6;65629:20;65641:7;;65629;:11;;:20;;;;:::i;65947:361::-;66006:19;66028:10;:8;:10::i;:::-;66006:32;-1:-1:-1;66049:18:0;66070:27;:10;66006:32;66070:14;:27::i;:::-;66149:4;66133:22;;;;:7;:22;;;;;;66049:48;;-1:-1:-1;66133:38:0;;66049:48;66133:26;:38::i;:::-;66124:4;66108:22;;;;:7;:22;;;;;;;;:63;;;;66186:21;:36;;;;;;66182:118;;;66278:4;66262:22;;;;:7;:22;;;;;;:38;;66289:10;66262:26;:38::i;:::-;66253:4;66237:22;;;;:7;:22;;;;;:63;65995:313;;65947:361;:::o;53454:336::-;53568:5;;;;;;;53564:219;;;-1:-1:-1;;;;;53677:17:0;;;;;;;;:6;:17;;;;;;;;:39;;;;;;;;;;;;;;53700:15;53677:39;;;53731:18;;;:7;:18;;;;:40;;;;;;;;;;;;;53454:336::o;51091:147::-;51169:7;;:17;;51181:4;51169:11;:17::i;:::-;51159:7;:27;51210:10;;:20;;51225:4;51210:14;:20::i;:::-;51197:10;:33;-1:-1:-1;;51091:147:0:o;14:656:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;586:2:1;574:15;591:66;570:88;555:104;;;;661:2;551:113;;14:656;-1:-1:-1;;;14:656:1:o;675:154::-;-1:-1:-1;;;;;754:5:1;750:54;743:5;740:65;730:93;;819:1;816;809:12;834:315;902:6;910;963:2;951:9;942:7;938:23;934:32;931:52;;;979:1;976;969:12;931:52;1018:9;1005:23;1037:31;1062:5;1037:31;:::i;:::-;1087:5;1139:2;1124:18;;;;1111:32;;-1:-1:-1;;;834:315:1:o;1346:247::-;1405:6;1458:2;1446:9;1437:7;1433:23;1429:32;1426:52;;;1474:1;1471;1464:12;1426:52;1513:9;1500:23;1532:31;1557:5;1532:31;:::i;1780:456::-;1857:6;1865;1873;1926:2;1914:9;1905:7;1901:23;1897:32;1894:52;;;1942:1;1939;1932:12;1894:52;1981:9;1968:23;2000:31;2025:5;2000:31;:::i;:::-;2050:5;-1:-1:-1;2107:2:1;2092:18;;2079:32;2120:33;2079:32;2120:33;:::i;:::-;1780:456;;2172:7;;-1:-1:-1;;;2226:2:1;2211:18;;;;2198:32;;1780:456::o;2241:180::-;2300:6;2353:2;2341:9;2332:7;2328:23;2324:32;2321:52;;;2369:1;2366;2359:12;2321:52;-1:-1:-1;2392:23:1;;2241:180;-1:-1:-1;2241:180:1:o;2615:118::-;2701:5;2694:13;2687:21;2680:5;2677:32;2667:60;;2723:1;2720;2713:12;2738:309;2803:6;2811;2864:2;2852:9;2843:7;2839:23;2835:32;2832:52;;;2880:1;2877;2870:12;2832:52;2916:9;2903:23;2893:33;;2976:2;2965:9;2961:18;2948:32;2989:28;3011:5;2989:28;:::i;:::-;3036:5;3026:15;;;2738:309;;;;;:::o;3052:367::-;3115:8;3125:6;3179:3;3172:4;3164:6;3160:17;3156:27;3146:55;;3197:1;3194;3187:12;3146:55;-1:-1:-1;3220:20:1;;3263:18;3252:30;;3249:50;;;3295:1;3292;3285:12;3249:50;3332:4;3324:6;3320:17;3308:29;;3392:3;3385:4;3375:6;3372:1;3368:14;3360:6;3356:27;3352:38;3349:47;3346:67;;;3409:1;3406;3399:12;3346:67;3052:367;;;;;:::o;3424:773::-;3546:6;3554;3562;3570;3623:2;3611:9;3602:7;3598:23;3594:32;3591:52;;;3639:1;3636;3629:12;3591:52;3679:9;3666:23;3708:18;3749:2;3741:6;3738:14;3735:34;;;3765:1;3762;3755:12;3735:34;3804:70;3866:7;3857:6;3846:9;3842:22;3804:70;:::i;:::-;3893:8;;-1:-1:-1;3778:96:1;-1:-1:-1;3981:2:1;3966:18;;3953:32;;-1:-1:-1;3997:16:1;;;3994:36;;;4026:1;4023;4016:12;3994:36;;4065:72;4129:7;4118:8;4107:9;4103:24;4065:72;:::i;:::-;3424:773;;;;-1:-1:-1;4156:8:1;-1:-1:-1;;;;3424:773:1:o;4202:241::-;4258:6;4311:2;4299:9;4290:7;4286:23;4282:32;4279:52;;;4327:1;4324;4317:12;4279:52;4366:9;4353:23;4385:28;4407:5;4385:28;:::i;4679:276::-;4737:6;4790:2;4778:9;4769:7;4765:23;4761:32;4758:52;;;4806:1;4803;4796:12;4758:52;4845:9;4832:23;4895:10;4888:5;4884:22;4877:5;4874:33;4864:61;;4921:1;4918;4911:12;4960:388;5028:6;5036;5089:2;5077:9;5068:7;5064:23;5060:32;5057:52;;;5105:1;5102;5095:12;5057:52;5144:9;5131:23;5163:31;5188:5;5163:31;:::i;:::-;5213:5;-1:-1:-1;5270:2:1;5255:18;;5242:32;5283:33;5242:32;5283:33;:::i;5714:184::-;5766:77;5763:1;5756:88;5863:4;5860:1;5853:15;5887:4;5884:1;5877:15;5903:228;5943:7;6069:1;-1:-1:-1;;5997:74:1;5994:1;5991:81;5986:1;5979:9;5972:17;5968:105;5965:131;;;6076:18;;:::i;:::-;-1:-1:-1;6116:9:1;;5903:228::o;7268:245::-;7335:6;7388:2;7376:9;7367:7;7363:23;7359:32;7356:52;;;7404:1;7401;7394:12;7356:52;7436:9;7430:16;7455:28;7477:5;7455:28;:::i;7874:184::-;7926:77;7923:1;7916:88;8023:4;8020:1;8013:15;8047:4;8044:1;8037:15;8063:125;8103:4;8131:1;8128;8125:8;8122:34;;;8136:18;;:::i;:::-;-1:-1:-1;8173:9:1;;8063:125::o;8193:184::-;8245:77;8242:1;8235:88;8342:4;8339:1;8332:15;8366:4;8363:1;8356:15;8382:195;8421:3;-1:-1:-1;;8445:5:1;8442:77;8439:103;;;8522:18;;:::i;:::-;-1:-1:-1;8569:1:1;8558:13;;8382:195::o;9647:251::-;9717:6;9770:2;9758:9;9749:7;9745:23;9741:32;9738:52;;;9786:1;9783;9776:12;9738:52;9818:9;9812:16;9837:31;9862:5;9837:31;:::i;9903:184::-;9973:6;10026:2;10014:9;10005:7;10001:23;9997:32;9994:52;;;10042:1;10039;10032:12;9994:52;-1:-1:-1;10065:16:1;;9903:184;-1:-1:-1;9903:184:1:o;11411:306::-;11499:6;11507;11515;11568:2;11556:9;11547:7;11543:23;11539:32;11536:52;;;11584:1;11581;11574:12;11536:52;11613:9;11607:16;11597:26;;11663:2;11652:9;11648:18;11642:25;11632:35;;11707:2;11696:9;11692:18;11686:25;11676:35;;11411:306;;;;;:::o;12129:274::-;12169:1;12195;12185:189;;12230:77;12227:1;12220:88;12331:4;12328:1;12321:15;12359:4;12356:1;12349:15;12185:189;-1:-1:-1;12388:9:1;;12129:274::o;15664:1026::-;15926:4;15974:3;15963:9;15959:19;16005:6;15994:9;15987:25;16031:2;16069:6;16064:2;16053:9;16049:18;16042:34;16112:3;16107:2;16096:9;16092:18;16085:31;16136:6;16171;16165:13;16202:6;16194;16187:22;16240:3;16229:9;16225:19;16218:26;;16279:2;16271:6;16267:15;16253:29;;16300:1;16310:218;16324:6;16321:1;16318:13;16310:218;;;16389:13;;-1:-1:-1;;;;;16385:62:1;16373:75;;16503:15;;;;16468:12;;;;16346:1;16339:9;16310:218;;;-1:-1:-1;;;;;;;16584:55:1;;;;16579:2;16564:18;;16557:83;-1:-1:-1;;;16671:3:1;16656:19;16649:35;16545:3;15664:1026;-1:-1:-1;;;15664:1026:1:o;17690:128::-;17730:3;17761:1;17757:6;17754:1;17751:13;17748:39;;;17767:18;;:::i;:::-;-1:-1:-1;17803:9:1;;17690:128::o
Swarm Source
ipfs://c802661d1657018414636466dc083c13ec2aabd0afaa0926787dd536a09b52b6
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.