ERC-20
Overview
Max Total Supply
420,690,000,000 DUCKY
Holders
548
Market
Price
$0.00 @ 0.000000 ETH (-10.35%)
Onchain Market Cap
$18,545.07
Circulating Supply Market Cap
$0.00
Other Info
Token Contract (WITH 18 Decimals)
Balance
0 DUCKYValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Ducky
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-07-10 */ /* * SPDX-License-Identifier: MIT * https://t.me/ducky0x71 * https://x.com/ducky0x71 * https://ducky0x71.com */ pragma solidity 0.8.19; 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; } } } interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer( address recipient, uint256 amount ) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance( address owner, address spender ) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); } interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf( address account ) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer( address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance( address owner, address spender ) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve( address spender, uint256 amount ) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the upd allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require( currentAllowance >= amount, "ERC20: transfer amount exceeds allowance" ); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the upd allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance( address spender, uint256 addedValue ) public virtual returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender] + addedValue ); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the upd allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance( address spender, uint256 subtractedValue ) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require( currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero" ); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require( senderBalance >= amount, "ERC20: transfer amount exceeds balance" ); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { 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); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } 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); } } interface IDexFactory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair( address tokenA, address tokenB ) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair( address tokenA, address tokenB ) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IDexRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } contract Ducky is ERC20, Ownable { using SafeMath for uint256; IDexRouter private immutable dexRouter; address public immutable dexPair; // Swapback bool private swapping; bool private swapbackEnabled = false; uint256 private swapBackValueMin; uint256 private swapBackValueMax; //Anti-whale bool private limitsEnabled = true; uint256 private maxWallet; uint256 private maxTx; mapping(address => uint256) private _holderLastTransferTimestamp; bool public tradingEnabled = false; // Fee receivers address private marketingWallet; address private projectWallet; uint256 private buyTaxTotal; uint256 private buyMarketingTax; uint256 private buyProjectTax; uint256 private sellTaxTotal; uint256 private sellMarketingTax; uint256 private sellProjectTax; uint256 private tokensForMarketing; uint256 private tokensForProject; /******************/ // exclude from fees and max transaction amount mapping(address => bool) private transferTaxExempt; mapping(address => bool) private transferLimitExempt; mapping(address => bool) private automatedMarketMakerPairs; // store addresses that a automatic market maker pairs. Any transfer *to* these addresses // could be subject to a maximum transfer amount event UpdateUniswapV2Router( address indexed newAddress, address indexed oldAddress ); event ExcludeFromFees(address indexed account, bool isExcluded); event ExcludeFromLimits(address indexed account, bool isExcluded); event SetDexPair(address indexed pair, bool indexed value); event TradingEnabled(uint256 indexed timestamp); event LimitsRemoved(uint256 indexed timestamp); event DisabledTransferDelay(uint256 indexed timestamp); event SwapbackSettingsUpdated( bool enabled, uint256 swapBackValueMin, uint256 swapBackValueMax ); event MaxTxUpdated(uint256 maxTx); event MaxWalletUpdated(uint256 maxWallet); event MarketingWalletUpdated( address indexed newWallet, address indexed oldWallet ); event ProjectWalletUpdated( address indexed newWallet, address indexed oldWallet ); event BuyFeeUpdated( uint256 buyTaxTotal, uint256 buyMarketingTax, uint256 buyProjectTax ); event SellFeeUpdated( uint256 sellTaxTotal, uint256 sellMarketingTax, uint256 sellProjectTax ); constructor() ERC20("Ducky", "DUCKY") { IDexRouter _dexRouter = IDexRouter( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); transactionLimitsExempt(address(_dexRouter), true); dexRouter = _dexRouter; dexPair = IDexFactory(_dexRouter.factory()).createPair( address(this), _dexRouter.WETH() ); transactionLimitsExempt(address(dexPair), true); _setDexPair(address(dexPair), true); uint256 _buyMarketingTax = 20; uint256 _buyProjectTax = 0; uint256 _sellMarketingTax = 20; uint256 _sellProjectTax = 0; uint256 _totalSupply = 420_690_000_000 * 10 ** decimals(); maxTx = (_totalSupply * 15) / 1000; maxWallet = (_totalSupply * 15) / 1000; swapBackValueMin = (_totalSupply * 1) / 1000; swapBackValueMax = (_totalSupply * 2) / 100; buyMarketingTax = _buyMarketingTax; buyProjectTax = _buyProjectTax; buyTaxTotal = buyMarketingTax + buyProjectTax; sellMarketingTax = _sellMarketingTax; sellProjectTax = _sellProjectTax; sellTaxTotal = sellMarketingTax + sellProjectTax; marketingWallet = address(0x32C1d30dEeC83663251B38DC4B72D2eAC9388F5f); projectWallet = address(msg.sender); // exclude from paying fees or having max transaction amount transactionTaxesExempt(msg.sender, true); transactionTaxesExempt(address(this), true); transactionTaxesExempt(address(0xdead), true); transactionTaxesExempt(marketingWallet, true); transactionLimitsExempt(msg.sender, true); transactionLimitsExempt(address(this), true); transactionLimitsExempt(address(0xdead), true); transactionLimitsExempt(marketingWallet, true); transferOwnership(msg.sender); /* _mint is an internal function in ERC20.sol that is only called here, and CANNOT be called ever again */ _mint(msg.sender, _totalSupply); } receive() external payable {} /** * @notice Opens public trading for the token * @dev onlyOwner. */ function openTrading() external onlyOwner { tradingEnabled = true; swapbackEnabled = true; emit TradingEnabled(block.timestamp); } /** * @notice Removes the max wallet and max transaction limits * @dev onlyOwner. * Emits an {LimitsRemoved} event */ function transactionLimitsRemove() external onlyOwner { limitsEnabled = false; emit LimitsRemoved(block.timestamp); } /** * @notice sets if swapback is enabled and sets the minimum and maximum amounts * @dev onlyOwner. * Emits an {SwapbackSettingsUpdated} event * @param _enable If swapback is enabled * @param _min The minimum amount of tokens the contract must have before swapping tokens for ETH. Base 10000, so 1% = 100. * @param _max The maximum amount of tokens the contract can swap for ETH. Base 10000, so 1% = 100. */ function swapBackMinMaxEnabledSet( bool _enable, uint256 _min, uint256 _max ) external onlyOwner { require( _min >= 1, "Swap amount cannot be lower than 0.01% total supply." ); require(_max >= _min, "maximum amount cant be higher than minimum"); swapbackEnabled = _enable; swapBackValueMin = (totalSupply() * _min) / 10000; swapBackValueMax = (totalSupply() * _max) / 10000; emit SwapbackSettingsUpdated(_enable, _min, _max); } /** * @notice Changes the maximum amount of tokens that can be bought or sold in a single transaction * @dev onlyOwner. * Emits an {MaxTxUpdated} event * @param newMaxTxLimit Base 1000, so 1% = 10 */ function maxTransactionLimitChange( uint256 newMaxTxLimit ) external onlyOwner { require(newMaxTxLimit >= 2, "Cannot set maxTx lower than 0.2%"); maxTx = (newMaxTxLimit * totalSupply()) / 1000; emit MaxTxUpdated(maxTx); } /** * @notice Changes the maximum amount of tokens a wallet can hold * @dev onlyOwner. * Emits an {MaxWalletUpdated} event * @param newMaxWalletLimit Base 1000, so 1% = 10 */ function maxWalletLimitChange( uint256 newMaxWalletLimit ) external onlyOwner { require(newMaxWalletLimit >= 5, "Cannot set maxWallet lower than 0.5%"); maxWallet = (newMaxWalletLimit * totalSupply()) / 1000; emit MaxWalletUpdated(maxWallet); } /** * @notice Sets if a wallet is excluded from the max wallet and tx limits * @dev onlyOwner. * Emits an {ExcludeFromLimits} event * @param updAds The wallet to update * @param isEx If the wallet is excluded or not */ function transactionLimitsExempt( address updAds, bool isEx ) public onlyOwner { transferLimitExempt[updAds] = isEx; emit ExcludeFromLimits(updAds, isEx); } /** * @notice Sets the fees for buys * @dev onlyOwner. * Emits a {BuyFeeUpdated} event * All fees added up must be less than 100 * @param _marketingFee The fee for the marketing wallet * @param _devFee The fee for the dev wallet */ function feesOnBuysSet( uint256 _marketingFee, uint256 _devFee ) external onlyOwner { buyMarketingTax = _marketingFee; buyProjectTax = _devFee; buyTaxTotal = buyMarketingTax + buyProjectTax; require(buyTaxTotal <= 100, "Total buy fee cannot be higher than 100%"); emit BuyFeeUpdated(buyTaxTotal, buyMarketingTax, buyProjectTax); } /** * @notice Sets the fees for sells * @dev onlyOwner. * Emits a {SellFeeUpdated} event * All fees added up must be less than 100 * @param _marketingFee The fee for the marketing wallet * @param _devFee The fee for the dev wallet */ function feesOnSellsChange( uint256 _marketingFee, uint256 _devFee ) external onlyOwner { sellMarketingTax = _marketingFee; sellProjectTax = _devFee; sellTaxTotal = sellMarketingTax + sellProjectTax; require( sellTaxTotal <= 100, "Total sell fee cannot be higher than 100%" ); emit SellFeeUpdated(sellTaxTotal, sellMarketingTax, sellProjectTax); } /** * @notice Sets if an address is excluded from fees * @dev onlyOwner. * Emits an {ExcludeFromFees} event * @param account The wallet to update * @param excluded If the wallet is excluded or not */ function transactionTaxesExempt( address account, bool excluded ) public onlyOwner { transferTaxExempt[account] = excluded; emit ExcludeFromFees(account, excluded); } /** * @notice Sets an address as a new liquidity pair. You probably dont want to do this. * @dev onlyOwner. * Emits a {SetDexPair} event * @param pair the address of the pair * @param value If the pair is a automated market maker pair or not */ function setDexPair(address pair, bool value) public onlyOwner { require( pair != dexPair, "The pair cannot be removed from automatedMarketMakerPairs" ); _setDexPair(pair, value); } function _setDexPair(address pair, bool value) private { automatedMarketMakerPairs[pair] = value; emit SetDexPair(pair, value); } /** * @notice Sets the marketing wallet * @dev onlyOwner. * Emits an {MarketingWalletUpdated} event * @param newMktWal The new marketing wallet */ function marketingWalletChange(address newMktWal) external onlyOwner { emit MarketingWalletUpdated(newMktWal, marketingWallet); marketingWallet = newMktWal; } /** * @notice Sets the project wallet * @dev onlyOwner. * Emits an {ProjectWalletUpdated} event * @param newDevWal The new dev wallet */ function developerWalletChange(address newDevWal) external onlyOwner { emit ProjectWalletUpdated(newDevWal, projectWallet); projectWallet = newDevWal; } /** * @notice Information about the swapback settings * @return _swapbackEnabled if swapback is enabled * @return _swapBackValueMin the minimum amount of tokens in the contract balance to trigger swapback * @return _swapBackValueMax the maximum amount of tokens in the contract balance to trigger swapback */ function valuesForSwapback() external view returns ( bool _swapbackEnabled, uint256 _swapBackValueMin, uint256 _swapBackValueMax ) { _swapbackEnabled = swapbackEnabled; _swapBackValueMin = swapBackValueMin; _swapBackValueMax = swapBackValueMax; } /** * @notice Information about the anti whale parameters * @return _limitsEnabled if the wallet limits are in effect * @return _maxWallet The maximum amount of tokens that can be held by a wallet * @return _maxTx The maximum amount of tokens that can be bought or sold in a single transaction */ function valuesForLimits() external view returns (bool _limitsEnabled, uint256 _maxWallet, uint256 _maxTx) { _limitsEnabled = limitsEnabled; _maxWallet = maxWallet; _maxTx = maxTx; } /** * @notice The wallets that receive the collected fees * @return _marketingWallet The wallet that receives the marketing fees * @return _projectWallet The wallet that receives the dev fees */ function valuesForReceivers() external view returns (address _marketingWallet, address _projectWallet) { return (marketingWallet, projectWallet); } /** * @notice Fees for buys, sells, and transfers * @return _buyTaxTotal The total fee for buys * @return _buyMarketingTax The fee for buys that gets sent to marketing * @return _buyProjectTax The fee for buys that gets sent to dev * @return _sellTaxTotal The total fee for sells * @return _sellMarketingTax The fee for sells that gets sent to marketing * @return _sellProjectTax The fee for sells that gets sent to dev */ function valuesForTaxes() external view returns ( uint256 _buyTaxTotal, uint256 _buyMarketingTax, uint256 _buyProjectTax, uint256 _sellTaxTotal, uint256 _sellMarketingTax, uint256 _sellProjectTax ) { _buyTaxTotal = buyTaxTotal; _buyMarketingTax = buyMarketingTax; _buyProjectTax = buyProjectTax; _sellTaxTotal = sellTaxTotal; _sellMarketingTax = sellMarketingTax; _sellProjectTax = sellProjectTax; } /** * @notice If the wallet is excluded from fees and max transaction amount and if the wallet is a automated market maker pair * @param _target The wallet to check * @return _transferTaxExempt If the wallet is excluded from fees * @return _transferLimitExempt If the wallet is excluded from max transaction amount * @return _automatedMarketMakerPairs If the wallet is a automated market maker pair */ function addressPermissions( address _target ) external view returns ( bool _transferTaxExempt, bool _transferLimitExempt, bool _automatedMarketMakerPairs ) { _transferTaxExempt = transferTaxExempt[_target]; _transferLimitExempt = transferLimitExempt[_target]; _automatedMarketMakerPairs = automatedMarketMakerPairs[_target]; } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); if (amount == 0) { super._transfer(from, to, 0); return; } if (limitsEnabled) { if ( from != owner() && to != owner() && to != address(0) && to != address(0xdead) && !swapping ) { if (!tradingEnabled) { require( transferTaxExempt[from] || transferTaxExempt[to], "_transfer:: Trading is not active." ); } //when buy if ( automatedMarketMakerPairs[from] && !transferLimitExempt[to] ) { require( amount <= maxTx, "Buy transfer amount exceeds the maxTx." ); require( amount + balanceOf(to) <= maxWallet, "Max wallet exceeded" ); } //when sell else if ( automatedMarketMakerPairs[to] && !transferLimitExempt[from] ) { require( amount <= maxTx, "Sell transfer amount exceeds the maxTx." ); } else if (!transferLimitExempt[to]) { require( amount + balanceOf(to) <= maxWallet, "Max wallet exceeded" ); } } } uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= swapBackValueMin; if ( canSwap && swapbackEnabled && !swapping && !automatedMarketMakerPairs[from] && !transferTaxExempt[from] && !transferTaxExempt[to] ) { swapping = true; swapBack(amount); swapping = false; } bool takeFee = !swapping; // if any account belongs to _isExcludedFromFee account then remove the fee if (transferTaxExempt[from] || transferTaxExempt[to]) { takeFee = false; } uint256 fees = 0; // only take fees on buys/sells, do not take on wallet transfers if (takeFee) { // on sell if (automatedMarketMakerPairs[to] && sellTaxTotal > 0) { fees = amount.mul(sellTaxTotal).div(100); tokensForProject += (fees * sellProjectTax) / sellTaxTotal; tokensForMarketing += (fees * sellMarketingTax) / sellTaxTotal; } // on buy else if (automatedMarketMakerPairs[from] && buyTaxTotal > 0) { fees = amount.mul(buyTaxTotal).div(100); tokensForProject += (fees * buyProjectTax) / buyTaxTotal; tokensForMarketing += (fees * buyMarketingTax) / buyTaxTotal; } if (fees > 0) { super._transfer(from, address(this), fees); } amount -= fees; } super._transfer(from, to, amount); } function swapTokensForEth(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = dexRouter.WETH(); _approve(address(this), address(dexRouter), tokenAmount); // make the swap dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } bool anti = true; function setAnti(bool _anti) external onlyOwner { anti = _anti; } function swapBack(uint256 amount) private { uint256 contractBalance = balanceOf(address(this)); uint256 totalTokensToSwap = contractBalance; bool success; if (contractBalance == 0) { return; } if (contractBalance > swapBackValueMax) { contractBalance = swapBackValueMax; } if (anti && contractBalance > amount * 5) { contractBalance = amount * 5; } uint256 amountToSwapForETH = contractBalance; uint256 initialETHBalance = address(this).balance; swapTokensForEth(amountToSwapForETH); uint256 ethBalance = address(this).balance.sub(initialETHBalance); uint256 ethForDev = ethBalance.mul(tokensForProject).div( totalTokensToSwap ); tokensForMarketing = 0; tokensForProject = 0; (success, ) = address(projectWallet).call{value: ethForDev}(""); (success, ) = address(marketingWallet).call{ value: address(this).balance }(""); } }
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":"buyTaxTotal","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyMarketingTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyProjectTax","type":"uint256"}],"name":"BuyFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DisabledTransferDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromLimits","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LimitsRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"MarketingWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxTx","type":"uint256"}],"name":"MaxTxUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxWallet","type":"uint256"}],"name":"MaxWalletUpdated","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":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"ProjectWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sellTaxTotal","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellMarketingTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellProjectTax","type":"uint256"}],"name":"SellFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetDexPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"},{"indexed":false,"internalType":"uint256","name":"swapBackValueMin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"swapBackValueMax","type":"uint256"}],"name":"SwapbackSettingsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TradingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[{"internalType":"address","name":"_target","type":"address"}],"name":"addressPermissions","outputs":[{"internalType":"bool","name":"_transferTaxExempt","type":"bool"},{"internalType":"bool","name":"_transferLimitExempt","type":"bool"},{"internalType":"bool","name":"_automatedMarketMakerPairs","type":"bool"}],"stateMutability":"view","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":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newDevWal","type":"address"}],"name":"developerWalletChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dexPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"feesOnBuysSet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"feesOnSellsChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMktWal","type":"address"}],"name":"marketingWalletChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxTxLimit","type":"uint256"}],"name":"maxTransactionLimitChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxWalletLimit","type":"uint256"}],"name":"maxWalletLimitChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_anti","type":"bool"}],"name":"setAnti","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setDexPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"},{"internalType":"uint256","name":"_min","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"swapBackMinMaxEnabledSet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"transactionLimitsExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transactionLimitsRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"transactionTaxesExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"valuesForLimits","outputs":[{"internalType":"bool","name":"_limitsEnabled","type":"bool"},{"internalType":"uint256","name":"_maxWallet","type":"uint256"},{"internalType":"uint256","name":"_maxTx","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"valuesForReceivers","outputs":[{"internalType":"address","name":"_marketingWallet","type":"address"},{"internalType":"address","name":"_projectWallet","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"valuesForSwapback","outputs":[{"internalType":"bool","name":"_swapbackEnabled","type":"bool"},{"internalType":"uint256","name":"_swapBackValueMin","type":"uint256"},{"internalType":"uint256","name":"_swapBackValueMax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"valuesForTaxes","outputs":[{"internalType":"uint256","name":"_buyTaxTotal","type":"uint256"},{"internalType":"uint256","name":"_buyMarketingTax","type":"uint256"},{"internalType":"uint256","name":"_buyProjectTax","type":"uint256"},{"internalType":"uint256","name":"_sellTaxTotal","type":"uint256"},{"internalType":"uint256","name":"_sellMarketingTax","type":"uint256"},{"internalType":"uint256","name":"_sellProjectTax","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c06040526000600560156101000a81548160ff0219169083151502179055506001600860006101000a81548160ff0219169083151502179055506000600c60006101000a81548160ff0219169083151502179055506001601960006101000a81548160ff0219169083151502179055503480156200007d57600080fd5b506040518060400160405280600581526020017f4475636b790000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4455434b590000000000000000000000000000000000000000000000000000008152508160039081620000fb919062000f3b565b5080600490816200010d919062000f3b565b50505062000130620001246200061460201b60201c565b6200061c60201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90506200015c816001620006e260201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020291906200108c565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200026a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029091906200108c565b6040518363ffffffff1660e01b8152600401620002af929190620010cf565b6020604051808303816000875af1158015620002cf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002f591906200108c565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506200033d60a0516001620006e260201b60201c565b6200035260a05160016200081c60201b60201c565b6000601490506000806014905060008062000372620008bd60201b60201c565b600a6200038091906200128c565b6461f313f880620003929190620012dd565b90506103e8600f82620003a69190620012dd565b620003b2919062001357565b600a819055506103e8600f82620003ca9190620012dd565b620003d6919062001357565b6009819055506103e8600182620003ee9190620012dd565b620003fa919062001357565b6006819055506064600282620004119190620012dd565b6200041d919062001357565b60078190555084600f8190555083601081905550601054600f546200044391906200138f565b600e8190555082601281905550816013819055506013546012546200046991906200138f565b6011819055507332c1d30deec83663251b38dc4b72d2eac9388f5f600c60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000518336001620008c660201b60201c565b6200052b306001620008c660201b60201c565b6200054061dead6001620008c660201b60201c565b62000575600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001620008c660201b60201c565b62000588336001620006e260201b60201c565b6200059b306001620006e260201b60201c565b620005b061dead6001620006e260201b60201c565b620005e5600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001620006e260201b60201c565b620005f63362000a0060201b60201c565b62000608338262000b1560201b60201c565b505050505050620015bf565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620006f26200061460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200071862000c8d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000768906200142b565b60405180910390fd5b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc92826040516200081091906200146a565b60405180910390a25050565b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167f02d59e6bf2c101e2d8367c2a27c51357eccfebcca0d09aa27c00e24e946c0d6a60405160405180910390a35050565b60006012905090565b620008d66200061460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620008fc62000c8d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000955576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200094c906200142b565b60405180910390fd5b80601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051620009f491906200146a565b60405180910390a25050565b62000a106200061460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000a3662000c8d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000a8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a86906200142b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000b01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000af890620014fd565b60405180910390fd5b62000b12816200061c60201b60201c565b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000b87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b7e906200156f565b60405180910390fd5b62000b9b6000838362000cb760201b60201c565b806002600082825462000baf91906200138f565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000c0691906200138f565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000c6d9190620015a2565b60405180910390a362000c896000838362000cbc60201b60201c565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000d4357607f821691505b60208210810362000d595762000d5862000cfb565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000dc37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000d84565b62000dcf868362000d84565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000e1c62000e1662000e108462000de7565b62000df1565b62000de7565b9050919050565b6000819050919050565b62000e388362000dfb565b62000e5062000e478262000e23565b84845462000d91565b825550505050565b600090565b62000e6762000e58565b62000e7481848462000e2d565b505050565b5b8181101562000e9c5762000e9060008262000e5d565b60018101905062000e7a565b5050565b601f82111562000eeb5762000eb58162000d5f565b62000ec08462000d74565b8101602085101562000ed0578190505b62000ee862000edf8562000d74565b83018262000e79565b50505b505050565b600082821c905092915050565b600062000f106000198460080262000ef0565b1980831691505092915050565b600062000f2b838362000efd565b9150826002028217905092915050565b62000f468262000cc1565b67ffffffffffffffff81111562000f625762000f6162000ccc565b5b62000f6e825462000d2a565b62000f7b82828562000ea0565b600060209050601f83116001811462000fb3576000841562000f9e578287015190505b62000faa858262000f1d565b8655506200101a565b601f19841662000fc38662000d5f565b60005b8281101562000fed5784890151825560018201915060208501945060208101905062000fc6565b868310156200100d578489015162001009601f89168262000efd565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620010548262001027565b9050919050565b620010668162001047565b81146200107257600080fd5b50565b60008151905062001086816200105b565b92915050565b600060208284031215620010a557620010a462001022565b5b6000620010b58482850162001075565b91505092915050565b620010c98162001047565b82525050565b6000604082019050620010e66000830185620010be565b620010f56020830184620010be565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b60018511156200118a57808604811115620011625762001161620010fc565b5b6001851615620011725780820291505b808102905062001182856200112b565b945062001142565b94509492505050565b600082620011a5576001905062001278565b81620011b5576000905062001278565b8160018114620011ce5760028114620011d9576200120f565b600191505062001278565b60ff841115620011ee57620011ed620010fc565b5b8360020a915084821115620012085762001207620010fc565b5b5062001278565b5060208310610133831016604e8410600b8410161715620012495782820a905083811115620012435762001242620010fc565b5b62001278565b62001258848484600162001138565b92509050818404811115620012725762001271620010fc565b5b81810290505b9392505050565b600060ff82169050919050565b6000620012998262000de7565b9150620012a6836200127f565b9250620012d57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462001193565b905092915050565b6000620012ea8262000de7565b9150620012f78362000de7565b9250828202620013078162000de7565b91508282048414831517620013215762001320620010fc565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620013648262000de7565b9150620013718362000de7565b92508262001384576200138362001328565b5b828204905092915050565b60006200139c8262000de7565b9150620013a98362000de7565b9250828201905080821115620013c457620013c3620010fc565b5b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062001413602083620013ca565b91506200142082620013db565b602082019050919050565b60006020820190508181036000830152620014468162001404565b9050919050565b60008115159050919050565b62001464816200144d565b82525050565b600060208201905062001481600083018462001459565b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000620014e5602683620013ca565b9150620014f28262001487565b604082019050919050565b600060208201905081810360008301526200151881620014d6565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062001557601f83620013ca565b915062001564826200151f565b602082019050919050565b600060208201905081810360008301526200158a8162001548565b9050919050565b6200159c8162000de7565b82525050565b6000602082019050620015b9600083018462001591565b92915050565b60805160a05161481b620015fa60003960008181611b3d0152611bd90152600081816131cb015281816132ac01526132d3015261481b6000f3fe6080604052600436106101fd5760003560e01c80637ff6f7b91161010d578063c9b6c1ce116100a0578063e55648f41161006f578063e55648f41461074a578063f242ab4114610773578063f2fde38b1461079e578063f3cfad94146107c7578063fb42948a146107f057610204565b8063c9b6c1ce1461068b578063ca3608c3146106b4578063d7ff53e5146106dd578063dd62ed3e1461070d57610204565b8063a9059cbb116100dc578063a9059cbb146105cf578063bb931db21461060c578063c40b793b14610635578063c9567bf91461067457610204565b80637ff6f7b9146105135780638da5cb5b1461053c57806395d89b4114610567578063a457c2d71461059257610204565b8063336ddc29116101905780634ada218b1161015f5780634ada218b1461043e57806351b8dc7b14610469578063622fa7721461049257806370a08231146104bf578063715018a6146104fc57610204565b8063336ddc2914610386578063391822af146103af57806339509351146103d85780634482eea81461041557610204565b806321108a52116101cc57806321108a52146102c857806323b872dd146102f1578063313ce5671461032e5780633308740b1461035957610204565b806306fdde0314610209578063088c9eb414610234578063095ea7b31461026057806318160ddd1461029d57610204565b3661020457005b600080fd5b34801561021557600080fd5b5061021e610807565b60405161022b919061340f565b60405180910390f35b34801561024057600080fd5b50610249610899565b604051610257929190613472565b60405180910390f35b34801561026c57600080fd5b5061028760048036038101906102829190613502565b6108ea565b604051610294919061355d565b60405180910390f35b3480156102a957600080fd5b506102b2610908565b6040516102bf9190613587565b60405180910390f35b3480156102d457600080fd5b506102ef60048036038101906102ea91906135a2565b610912565b005b3480156102fd57600080fd5b50610318600480360381019061031391906135e2565b610a3d565b604051610325919061355d565b60405180910390f35b34801561033a57600080fd5b50610343610b35565b6040516103509190613651565b60405180910390f35b34801561036557600080fd5b5061036e610b3e565b60405161037d9392919061366c565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a891906136a3565b610b64565b005b3480156103bb57600080fd5b506103d660048036038101906103d191906135a2565b610ca0565b005b3480156103e457600080fd5b506103ff60048036038101906103fa9190613502565b610dcb565b60405161040c919061355d565b60405180910390f35b34801561042157600080fd5b5061043c600480360381019061043791906136fc565b610e77565b005b34801561044a57600080fd5b50610453610f9c565b604051610460919061355d565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b91906136a3565b610faf565b005b34801561049e57600080fd5b506104a76110eb565b6040516104b69392919061366c565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e191906136a3565b611111565b6040516104f39190613587565b60405180910390f35b34801561050857600080fd5b50610511611159565b005b34801561051f57600080fd5b5061053a6004803603810190610535919061373c565b6111e1565b005b34801561054857600080fd5b5061055161127a565b60405161055e9190613769565b60405180910390f35b34801561057357600080fd5b5061057c6112a4565b604051610589919061340f565b60405180910390f35b34801561059e57600080fd5b506105b960048036038101906105b49190613502565b611336565b6040516105c6919061355d565b60405180910390f35b3480156105db57600080fd5b506105f660048036038101906105f19190613502565b611421565b604051610603919061355d565b60405180910390f35b34801561061857600080fd5b50610633600480360381019061062e9190613784565b61143f565b005b34801561064157600080fd5b5061065c600480360381019061065791906136a3565b611561565b60405161066b939291906137b1565b60405180910390f35b34801561068057600080fd5b5061068961165a565b005b34801561069757600080fd5b506106b260048036038101906106ad91906136fc565b61173b565b005b3480156106c057600080fd5b506106db60048036038101906106d691906137e8565b611860565b005b3480156106e957600080fd5b506106f2611a09565b6040516107049695949392919061383b565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f919061389c565b611a38565b6040516107419190613587565b60405180910390f35b34801561075657600080fd5b50610771600480360381019061076c91906136fc565b611abf565b005b34801561077f57600080fd5b50610788611bd7565b6040516107959190613769565b60405180910390f35b3480156107aa57600080fd5b506107c560048036038101906107c091906136a3565b611bfb565b005b3480156107d357600080fd5b506107ee60048036038101906107e99190613784565b611cf2565b005b3480156107fc57600080fd5b50610805611e14565b005b6060600380546108169061390b565b80601f01602080910402602001604051908101604052809291908181526020018280546108429061390b565b801561088f5780601f106108645761010080835404028352916020019161088f565b820191906000526020600020905b81548152906001019060200180831161087257829003601f168201915b5050505050905090565b600080600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915091509091565b60006108fe6108f7611eda565b8484611ee2565b6001905092915050565b6000600254905090565b61091a611eda565b73ffffffffffffffffffffffffffffffffffffffff1661093861127a565b73ffffffffffffffffffffffffffffffffffffffff161461098e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098590613988565b60405180910390fd5b81600f8190555080601081905550601054600f546109ac91906139d7565b600e819055506064600e5411156109f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ef90613a7d565b60405180910390fd5b7f38513c502b0ab4834ac1df9502b76f75dcf7092469782cfd0db7fe664388e25e600e54600f54601054604051610a3193929190613a9d565b60405180910390a15050565b6000610a4a8484846120ab565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610a95611eda565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0c90613b46565b60405180910390fd5b610b2985610b21611eda565b858403611ee2565b60019150509392505050565b60006012905090565b6000806000600860009054906101000a900460ff1692506009549150600a549050909192565b610b6c611eda565b73ffffffffffffffffffffffffffffffffffffffff16610b8a61127a565b73ffffffffffffffffffffffffffffffffffffffff1614610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd790613988565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fb91dbdeaf34f885ccae2d8abc3967cb03c079b6af2c7944e3893fd29427d75e760405160405180910390a380600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610ca8611eda565b73ffffffffffffffffffffffffffffffffffffffff16610cc661127a565b73ffffffffffffffffffffffffffffffffffffffff1614610d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1390613988565b60405180910390fd5b8160128190555080601381905550601354601254610d3a91906139d7565b60118190555060646011541115610d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7d90613bd8565b60405180910390fd5b7fcb5f36df892836a2eaedc349de29a7581176990398ee185d16eaa8f6c1abd8f1601154601254601354604051610dbf93929190613a9d565b60405180910390a15050565b6000610e6d610dd8611eda565b848460016000610de6611eda565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e6891906139d7565b611ee2565b6001905092915050565b610e7f611eda565b73ffffffffffffffffffffffffffffffffffffffff16610e9d61127a565b73ffffffffffffffffffffffffffffffffffffffff1614610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea90613988565b60405180910390fd5b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc9282604051610f90919061355d565b60405180910390a25050565b600c60009054906101000a900460ff1681565b610fb7611eda565b73ffffffffffffffffffffffffffffffffffffffff16610fd561127a565b73ffffffffffffffffffffffffffffffffffffffff161461102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102290613988565b60405180910390fd5b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6760405160405180910390a380600c60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000600560159054906101000a900460ff16925060065491506007549050909192565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611161611eda565b73ffffffffffffffffffffffffffffffffffffffff1661117f61127a565b73ffffffffffffffffffffffffffffffffffffffff16146111d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cc90613988565b60405180910390fd5b6111df6000612b15565b565b6111e9611eda565b73ffffffffffffffffffffffffffffffffffffffff1661120761127a565b73ffffffffffffffffffffffffffffffffffffffff161461125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125490613988565b60405180910390fd5b80601960006101000a81548160ff02191690831515021790555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546112b39061390b565b80601f01602080910402602001604051908101604052809291908181526020018280546112df9061390b565b801561132c5780601f106113015761010080835404028352916020019161132c565b820191906000526020600020905b81548152906001019060200180831161130f57829003601f168201915b5050505050905090565b60008060016000611345611eda565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990613c6a565b60405180910390fd5b61141661140d611eda565b85858403611ee2565b600191505092915050565b600061143561142e611eda565b84846120ab565b6001905092915050565b611447611eda565b73ffffffffffffffffffffffffffffffffffffffff1661146561127a565b73ffffffffffffffffffffffffffffffffffffffff16146114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b290613988565b60405180910390fd5b60058110156114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f690613cfc565b60405180910390fd5b6103e861150a610908565b826115159190613d1c565b61151f9190613d8d565b6009819055507f12528a3c61e0f3b2d6fc707a9fc58b1af86e252cad0d7f4c154ebeabb162dace6009546040516115569190613587565b60405180910390a150565b6000806000601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169250601760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169150601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690509193909250565b611662611eda565b73ffffffffffffffffffffffffffffffffffffffff1661168061127a565b73ffffffffffffffffffffffffffffffffffffffff16146116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd90613988565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055506001600560156101000a81548160ff021916908315150217905550427fb3da2db3dfc3778f99852546c6e9ab39ec253f9de7b0847afec61bd27878e92360405160405180910390a2565b611743611eda565b73ffffffffffffffffffffffffffffffffffffffff1661176161127a565b73ffffffffffffffffffffffffffffffffffffffff16146117b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ae90613988565b60405180910390fd5b80601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611854919061355d565b60405180910390a25050565b611868611eda565b73ffffffffffffffffffffffffffffffffffffffff1661188661127a565b73ffffffffffffffffffffffffffffffffffffffff16146118dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d390613988565b60405180910390fd5b6001821015611920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191790613e30565b60405180910390fd5b81811015611963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195a90613ec2565b60405180910390fd5b82600560156101000a81548160ff02191690831515021790555061271082611989610908565b6119939190613d1c565b61199d9190613d8d565b600681905550612710816119af610908565b6119b99190613d1c565b6119c39190613d8d565b6007819055507f52cd2cdb42ff0eeec9362d7ed5b04f64c8d022697128b5378fc51cea7e63c7798383836040516119fc9392919061366c565b60405180910390a1505050565b600080600080600080600e549550600f5494506010549350601154925060125491506013549050909192939495565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611ac7611eda565b73ffffffffffffffffffffffffffffffffffffffff16611ae561127a565b73ffffffffffffffffffffffffffffffffffffffff1614611b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3290613988565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc090613f54565b60405180910390fd5b611bd38282612bdb565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b611c03611eda565b73ffffffffffffffffffffffffffffffffffffffff16611c2161127a565b73ffffffffffffffffffffffffffffffffffffffff1614611c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6e90613988565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdd90613fe6565b60405180910390fd5b611cef81612b15565b50565b611cfa611eda565b73ffffffffffffffffffffffffffffffffffffffff16611d1861127a565b73ffffffffffffffffffffffffffffffffffffffff1614611d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6590613988565b60405180910390fd5b6002811015611db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da990614052565b60405180910390fd5b6103e8611dbd610908565b82611dc89190613d1c565b611dd29190613d8d565b600a819055507fff3dd5e80294197918c284bbfc3dadd97d0b40ce92106110946329088f80068a600a54604051611e099190613587565b60405180910390a150565b611e1c611eda565b73ffffffffffffffffffffffffffffffffffffffff16611e3a61127a565b73ffffffffffffffffffffffffffffffffffffffff1614611e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8790613988565b60405180910390fd5b6000600860006101000a81548160ff021916908315150217905550427ff4eaa75eae08ae80c3daf791438dac1cff2cfd3b0bad2304ec7bbb067e50261660405160405180910390a2565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f48906140e4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb790614176565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161209e9190613587565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361211a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211190614208565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612189576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121809061429a565b60405180910390fd5b600081036121a25761219d83836000612c7c565b612b10565b600860009054906101000a900460ff161561269d576121bf61127a565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561222d57506121fd61127a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156122665750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156122a0575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156122b95750600560149054906101000a900460ff16155b1561269c57600c60009054906101000a900460ff166123b357601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806123735750601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6123b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a99061432c565b60405180910390fd5b5b601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156124565750601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156124fd57600a548111156124a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612497906143be565b60405180910390fd5b6009546124ac83611111565b826124b791906139d7565b11156124f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ef9061442a565b60405180910390fd5b61269b565b601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156125a05750601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156125ef57600a548111156125ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e1906144bc565b60405180910390fd5b61269a565b601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166126995760095461264c83611111565b8261265791906139d7565b1115612698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268f9061442a565b60405180910390fd5b5b5b5b5b5b60006126a830611111565b9050600060065482101590508080156126cd5750600560159054906101000a900460ff165b80156126e65750600560149054906101000a900460ff16155b801561273c5750601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156127925750601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156127e85750601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561282d576001600560146101000a81548160ff02191690831515021790555061281183612efb565b6000600560146101000a81548160ff0219169083151502179055505b6000600560149054906101000a900460ff16159050601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806128e35750601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156128ed57600090505b60008115612b0057601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561295057506000601154115b156129ea5761297d606461296f601154886130f690919063ffffffff16565b61310c90919063ffffffff16565b9050601154601354826129909190613d1c565b61299a9190613d8d565b601560008282546129ab91906139d7565b92505081905550601154601254826129c39190613d1c565b6129cd9190613d8d565b601460008282546129de91906139d7565b92505081905550612adc565b601860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612a4557506000600e54115b15612adb57612a726064612a64600e54886130f690919063ffffffff16565b61310c90919063ffffffff16565b9050600e5460105482612a859190613d1c565b612a8f9190613d8d565b60156000828254612aa091906139d7565b92505081905550600e54600f5482612ab89190613d1c565b612ac29190613d8d565b60146000828254612ad391906139d7565b925050819055505b5b6000811115612af157612af0873083612c7c565b5b8085612afd91906144dc565b94505b612b0b878787612c7c565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167f02d59e6bf2c101e2d8367c2a27c51357eccfebcca0d09aa27c00e24e946c0d6a60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce290614208565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d519061429a565b60405180910390fd5b612d65838383613122565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de290614582565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e7e91906139d7565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612ee29190613587565b60405180910390a3612ef5848484613127565b50505050565b6000612f0630611111565b905060008190506000808303612f1e575050506130f3565b600754831115612f2e5760075492505b601960009054906101000a900460ff168015612f555750600584612f529190613d1c565b83115b15612f6a57600584612f679190613d1c565b92505b60008390506000479050612f7d8261312c565b6000612f92824761336990919063ffffffff16565b90506000612fbd86612faf601554856130f690919063ffffffff16565b61310c90919063ffffffff16565b905060006014819055506000601581905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051613015906145d3565b60006040518083038185875af1925050503d8060008114613052576040519150601f19603f3d011682016040523d82523d6000602084013e613057565b606091505b505080955050600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516130a3906145d3565b60006040518083038185875af1925050503d80600081146130e0576040519150601f19603f3d011682016040523d82523d6000602084013e6130e5565b606091505b505080955050505050505050505b50565b600081836131049190613d1c565b905092915050565b6000818361311a9190613d8d565b905092915050565b505050565b505050565b6000600267ffffffffffffffff811115613149576131486145e8565b5b6040519080825280602002602001820160405280156131775781602001602082028036833780820191505090505b509050308160008151811061318f5761318e614617565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613234573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613258919061465b565b8160018151811061326c5761326b614617565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506132d1307f000000000000000000000000000000000000000000000000000000000000000084611ee2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161333395949392919061478b565b600060405180830381600087803b15801561334d57600080fd5b505af1158015613361573d6000803e3d6000fd5b505050505050565b6000818361337791906144dc565b905092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133b957808201518184015260208101905061339e565b60008484015250505050565b6000601f19601f8301169050919050565b60006133e18261337f565b6133eb818561338a565b93506133fb81856020860161339b565b613404816133c5565b840191505092915050565b6000602082019050818103600083015261342981846133d6565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061345c82613431565b9050919050565b61346c81613451565b82525050565b60006040820190506134876000830185613463565b6134946020830184613463565b9392505050565b600080fd5b6134a981613451565b81146134b457600080fd5b50565b6000813590506134c6816134a0565b92915050565b6000819050919050565b6134df816134cc565b81146134ea57600080fd5b50565b6000813590506134fc816134d6565b92915050565b600080604083850312156135195761351861349b565b5b6000613527858286016134b7565b9250506020613538858286016134ed565b9150509250929050565b60008115159050919050565b61355781613542565b82525050565b6000602082019050613572600083018461354e565b92915050565b613581816134cc565b82525050565b600060208201905061359c6000830184613578565b92915050565b600080604083850312156135b9576135b861349b565b5b60006135c7858286016134ed565b92505060206135d8858286016134ed565b9150509250929050565b6000806000606084860312156135fb576135fa61349b565b5b6000613609868287016134b7565b935050602061361a868287016134b7565b925050604061362b868287016134ed565b9150509250925092565b600060ff82169050919050565b61364b81613635565b82525050565b60006020820190506136666000830184613642565b92915050565b6000606082019050613681600083018661354e565b61368e6020830185613578565b61369b6040830184613578565b949350505050565b6000602082840312156136b9576136b861349b565b5b60006136c7848285016134b7565b91505092915050565b6136d981613542565b81146136e457600080fd5b50565b6000813590506136f6816136d0565b92915050565b600080604083850312156137135761371261349b565b5b6000613721858286016134b7565b9250506020613732858286016136e7565b9150509250929050565b6000602082840312156137525761375161349b565b5b6000613760848285016136e7565b91505092915050565b600060208201905061377e6000830184613463565b92915050565b60006020828403121561379a5761379961349b565b5b60006137a8848285016134ed565b91505092915050565b60006060820190506137c6600083018661354e565b6137d3602083018561354e565b6137e0604083018461354e565b949350505050565b6000806000606084860312156138015761380061349b565b5b600061380f868287016136e7565b9350506020613820868287016134ed565b9250506040613831868287016134ed565b9150509250925092565b600060c0820190506138506000830189613578565b61385d6020830188613578565b61386a6040830187613578565b6138776060830186613578565b6138846080830185613578565b61389160a0830184613578565b979650505050505050565b600080604083850312156138b3576138b261349b565b5b60006138c1858286016134b7565b92505060206138d2858286016134b7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061392357607f821691505b602082108103613936576139356138dc565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061397260208361338a565b915061397d8261393c565b602082019050919050565b600060208201905081810360008301526139a181613965565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139e2826134cc565b91506139ed836134cc565b9250828201905080821115613a0557613a046139a8565b5b92915050565b7f546f74616c20627579206665652063616e6e6f7420626520686967686572207460008201527f68616e2031303025000000000000000000000000000000000000000000000000602082015250565b6000613a6760288361338a565b9150613a7282613a0b565b604082019050919050565b60006020820190508181036000830152613a9681613a5a565b9050919050565b6000606082019050613ab26000830186613578565b613abf6020830185613578565b613acc6040830184613578565b949350505050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000613b3060288361338a565b9150613b3b82613ad4565b604082019050919050565b60006020820190508181036000830152613b5f81613b23565b9050919050565b7f546f74616c2073656c6c206665652063616e6e6f74206265206869676865722060008201527f7468616e20313030250000000000000000000000000000000000000000000000602082015250565b6000613bc260298361338a565b9150613bcd82613b66565b604082019050919050565b60006020820190508181036000830152613bf181613bb5565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613c5460258361338a565b9150613c5f82613bf8565b604082019050919050565b60006020820190508181036000830152613c8381613c47565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b6000613ce660248361338a565b9150613cf182613c8a565b604082019050919050565b60006020820190508181036000830152613d1581613cd9565b9050919050565b6000613d27826134cc565b9150613d32836134cc565b9250828202613d40816134cc565b91508282048414831517613d5757613d566139a8565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613d98826134cc565b9150613da3836134cc565b925082613db357613db2613d5e565b5b828204905092915050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e30312520746f74616c20737570706c792e000000000000000000000000602082015250565b6000613e1a60348361338a565b9150613e2582613dbe565b604082019050919050565b60006020820190508181036000830152613e4981613e0d565b9050919050565b7f6d6178696d756d20616d6f756e742063616e742062652068696768657220746860008201527f616e206d696e696d756d00000000000000000000000000000000000000000000602082015250565b6000613eac602a8361338a565b9150613eb782613e50565b604082019050919050565b60006020820190508181036000830152613edb81613e9f565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b6000613f3e60398361338a565b9150613f4982613ee2565b604082019050919050565b60006020820190508181036000830152613f6d81613f31565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613fd060268361338a565b9150613fdb82613f74565b604082019050919050565b60006020820190508181036000830152613fff81613fc3565b9050919050565b7f43616e6e6f7420736574206d61785478206c6f776572207468616e20302e3225600082015250565b600061403c60208361338a565b915061404782614006565b602082019050919050565b6000602082019050818103600083015261406b8161402f565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006140ce60248361338a565b91506140d982614072565b604082019050919050565b600060208201905081810360008301526140fd816140c1565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061416060228361338a565b915061416b82614104565b604082019050919050565b6000602082019050818103600083015261418f81614153565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006141f260258361338a565b91506141fd82614196565b604082019050919050565b60006020820190508181036000830152614221816141e5565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061428460238361338a565b915061428f82614228565b604082019050919050565b600060208201905081810360008301526142b381614277565b9050919050565b7f5f7472616e736665723a3a2054726164696e67206973206e6f7420616374697660008201527f652e000000000000000000000000000000000000000000000000000000000000602082015250565b600061431660228361338a565b9150614321826142ba565b604082019050919050565b6000602082019050818103600083015261434581614309565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d617854782e0000000000000000000000000000000000000000000000000000602082015250565b60006143a860268361338a565b91506143b38261434c565b604082019050919050565b600060208201905081810360008301526143d78161439b565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b600061441460138361338a565b915061441f826143de565b602082019050919050565b6000602082019050818103600083015261444381614407565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d617854782e00000000000000000000000000000000000000000000000000602082015250565b60006144a660278361338a565b91506144b18261444a565b604082019050919050565b600060208201905081810360008301526144d581614499565b9050919050565b60006144e7826134cc565b91506144f2836134cc565b925082820390508181111561450a576145096139a8565b5b92915050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061456c60268361338a565b915061457782614510565b604082019050919050565b6000602082019050818103600083015261459b8161455f565b9050919050565b600081905092915050565b50565b60006145bd6000836145a2565b91506145c8826145ad565b600082019050919050565b60006145de826145b0565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050614655816134a0565b92915050565b6000602082840312156146715761467061349b565b5b600061467f84828501614646565b91505092915050565b6000819050919050565b6000819050919050565b60006146b76146b26146ad84614688565b614692565b6134cc565b9050919050565b6146c78161469c565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61470281613451565b82525050565b600061471483836146f9565b60208301905092915050565b6000602082019050919050565b6000614738826146cd565b61474281856146d8565b935061474d836146e9565b8060005b8381101561477e5781516147658882614708565b975061477083614720565b925050600181019050614751565b5085935050505092915050565b600060a0820190506147a06000830188613578565b6147ad60208301876146be565b81810360408301526147bf818661472d565b90506147ce6060830185613463565b6147db6080830184613578565b969550505050505056fea2646970667358221220b329841eaaecf52096ddb96f0a9e3588a31bc86326245cd9b1e149e53d899e0564736f6c63430008130033
Deployed Bytecode
0x6080604052600436106101fd5760003560e01c80637ff6f7b91161010d578063c9b6c1ce116100a0578063e55648f41161006f578063e55648f41461074a578063f242ab4114610773578063f2fde38b1461079e578063f3cfad94146107c7578063fb42948a146107f057610204565b8063c9b6c1ce1461068b578063ca3608c3146106b4578063d7ff53e5146106dd578063dd62ed3e1461070d57610204565b8063a9059cbb116100dc578063a9059cbb146105cf578063bb931db21461060c578063c40b793b14610635578063c9567bf91461067457610204565b80637ff6f7b9146105135780638da5cb5b1461053c57806395d89b4114610567578063a457c2d71461059257610204565b8063336ddc29116101905780634ada218b1161015f5780634ada218b1461043e57806351b8dc7b14610469578063622fa7721461049257806370a08231146104bf578063715018a6146104fc57610204565b8063336ddc2914610386578063391822af146103af57806339509351146103d85780634482eea81461041557610204565b806321108a52116101cc57806321108a52146102c857806323b872dd146102f1578063313ce5671461032e5780633308740b1461035957610204565b806306fdde0314610209578063088c9eb414610234578063095ea7b31461026057806318160ddd1461029d57610204565b3661020457005b600080fd5b34801561021557600080fd5b5061021e610807565b60405161022b919061340f565b60405180910390f35b34801561024057600080fd5b50610249610899565b604051610257929190613472565b60405180910390f35b34801561026c57600080fd5b5061028760048036038101906102829190613502565b6108ea565b604051610294919061355d565b60405180910390f35b3480156102a957600080fd5b506102b2610908565b6040516102bf9190613587565b60405180910390f35b3480156102d457600080fd5b506102ef60048036038101906102ea91906135a2565b610912565b005b3480156102fd57600080fd5b50610318600480360381019061031391906135e2565b610a3d565b604051610325919061355d565b60405180910390f35b34801561033a57600080fd5b50610343610b35565b6040516103509190613651565b60405180910390f35b34801561036557600080fd5b5061036e610b3e565b60405161037d9392919061366c565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a891906136a3565b610b64565b005b3480156103bb57600080fd5b506103d660048036038101906103d191906135a2565b610ca0565b005b3480156103e457600080fd5b506103ff60048036038101906103fa9190613502565b610dcb565b60405161040c919061355d565b60405180910390f35b34801561042157600080fd5b5061043c600480360381019061043791906136fc565b610e77565b005b34801561044a57600080fd5b50610453610f9c565b604051610460919061355d565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b91906136a3565b610faf565b005b34801561049e57600080fd5b506104a76110eb565b6040516104b69392919061366c565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e191906136a3565b611111565b6040516104f39190613587565b60405180910390f35b34801561050857600080fd5b50610511611159565b005b34801561051f57600080fd5b5061053a6004803603810190610535919061373c565b6111e1565b005b34801561054857600080fd5b5061055161127a565b60405161055e9190613769565b60405180910390f35b34801561057357600080fd5b5061057c6112a4565b604051610589919061340f565b60405180910390f35b34801561059e57600080fd5b506105b960048036038101906105b49190613502565b611336565b6040516105c6919061355d565b60405180910390f35b3480156105db57600080fd5b506105f660048036038101906105f19190613502565b611421565b604051610603919061355d565b60405180910390f35b34801561061857600080fd5b50610633600480360381019061062e9190613784565b61143f565b005b34801561064157600080fd5b5061065c600480360381019061065791906136a3565b611561565b60405161066b939291906137b1565b60405180910390f35b34801561068057600080fd5b5061068961165a565b005b34801561069757600080fd5b506106b260048036038101906106ad91906136fc565b61173b565b005b3480156106c057600080fd5b506106db60048036038101906106d691906137e8565b611860565b005b3480156106e957600080fd5b506106f2611a09565b6040516107049695949392919061383b565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f919061389c565b611a38565b6040516107419190613587565b60405180910390f35b34801561075657600080fd5b50610771600480360381019061076c91906136fc565b611abf565b005b34801561077f57600080fd5b50610788611bd7565b6040516107959190613769565b60405180910390f35b3480156107aa57600080fd5b506107c560048036038101906107c091906136a3565b611bfb565b005b3480156107d357600080fd5b506107ee60048036038101906107e99190613784565b611cf2565b005b3480156107fc57600080fd5b50610805611e14565b005b6060600380546108169061390b565b80601f01602080910402602001604051908101604052809291908181526020018280546108429061390b565b801561088f5780601f106108645761010080835404028352916020019161088f565b820191906000526020600020905b81548152906001019060200180831161087257829003601f168201915b5050505050905090565b600080600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915091509091565b60006108fe6108f7611eda565b8484611ee2565b6001905092915050565b6000600254905090565b61091a611eda565b73ffffffffffffffffffffffffffffffffffffffff1661093861127a565b73ffffffffffffffffffffffffffffffffffffffff161461098e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098590613988565b60405180910390fd5b81600f8190555080601081905550601054600f546109ac91906139d7565b600e819055506064600e5411156109f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ef90613a7d565b60405180910390fd5b7f38513c502b0ab4834ac1df9502b76f75dcf7092469782cfd0db7fe664388e25e600e54600f54601054604051610a3193929190613a9d565b60405180910390a15050565b6000610a4a8484846120ab565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610a95611eda565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0c90613b46565b60405180910390fd5b610b2985610b21611eda565b858403611ee2565b60019150509392505050565b60006012905090565b6000806000600860009054906101000a900460ff1692506009549150600a549050909192565b610b6c611eda565b73ffffffffffffffffffffffffffffffffffffffff16610b8a61127a565b73ffffffffffffffffffffffffffffffffffffffff1614610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd790613988565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fb91dbdeaf34f885ccae2d8abc3967cb03c079b6af2c7944e3893fd29427d75e760405160405180910390a380600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610ca8611eda565b73ffffffffffffffffffffffffffffffffffffffff16610cc661127a565b73ffffffffffffffffffffffffffffffffffffffff1614610d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1390613988565b60405180910390fd5b8160128190555080601381905550601354601254610d3a91906139d7565b60118190555060646011541115610d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7d90613bd8565b60405180910390fd5b7fcb5f36df892836a2eaedc349de29a7581176990398ee185d16eaa8f6c1abd8f1601154601254601354604051610dbf93929190613a9d565b60405180910390a15050565b6000610e6d610dd8611eda565b848460016000610de6611eda565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e6891906139d7565b611ee2565b6001905092915050565b610e7f611eda565b73ffffffffffffffffffffffffffffffffffffffff16610e9d61127a565b73ffffffffffffffffffffffffffffffffffffffff1614610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea90613988565b60405180910390fd5b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc9282604051610f90919061355d565b60405180910390a25050565b600c60009054906101000a900460ff1681565b610fb7611eda565b73ffffffffffffffffffffffffffffffffffffffff16610fd561127a565b73ffffffffffffffffffffffffffffffffffffffff161461102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102290613988565b60405180910390fd5b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6760405160405180910390a380600c60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000600560159054906101000a900460ff16925060065491506007549050909192565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611161611eda565b73ffffffffffffffffffffffffffffffffffffffff1661117f61127a565b73ffffffffffffffffffffffffffffffffffffffff16146111d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cc90613988565b60405180910390fd5b6111df6000612b15565b565b6111e9611eda565b73ffffffffffffffffffffffffffffffffffffffff1661120761127a565b73ffffffffffffffffffffffffffffffffffffffff161461125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125490613988565b60405180910390fd5b80601960006101000a81548160ff02191690831515021790555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546112b39061390b565b80601f01602080910402602001604051908101604052809291908181526020018280546112df9061390b565b801561132c5780601f106113015761010080835404028352916020019161132c565b820191906000526020600020905b81548152906001019060200180831161130f57829003601f168201915b5050505050905090565b60008060016000611345611eda565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990613c6a565b60405180910390fd5b61141661140d611eda565b85858403611ee2565b600191505092915050565b600061143561142e611eda565b84846120ab565b6001905092915050565b611447611eda565b73ffffffffffffffffffffffffffffffffffffffff1661146561127a565b73ffffffffffffffffffffffffffffffffffffffff16146114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b290613988565b60405180910390fd5b60058110156114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f690613cfc565b60405180910390fd5b6103e861150a610908565b826115159190613d1c565b61151f9190613d8d565b6009819055507f12528a3c61e0f3b2d6fc707a9fc58b1af86e252cad0d7f4c154ebeabb162dace6009546040516115569190613587565b60405180910390a150565b6000806000601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169250601760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169150601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690509193909250565b611662611eda565b73ffffffffffffffffffffffffffffffffffffffff1661168061127a565b73ffffffffffffffffffffffffffffffffffffffff16146116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd90613988565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055506001600560156101000a81548160ff021916908315150217905550427fb3da2db3dfc3778f99852546c6e9ab39ec253f9de7b0847afec61bd27878e92360405160405180910390a2565b611743611eda565b73ffffffffffffffffffffffffffffffffffffffff1661176161127a565b73ffffffffffffffffffffffffffffffffffffffff16146117b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ae90613988565b60405180910390fd5b80601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611854919061355d565b60405180910390a25050565b611868611eda565b73ffffffffffffffffffffffffffffffffffffffff1661188661127a565b73ffffffffffffffffffffffffffffffffffffffff16146118dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d390613988565b60405180910390fd5b6001821015611920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191790613e30565b60405180910390fd5b81811015611963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195a90613ec2565b60405180910390fd5b82600560156101000a81548160ff02191690831515021790555061271082611989610908565b6119939190613d1c565b61199d9190613d8d565b600681905550612710816119af610908565b6119b99190613d1c565b6119c39190613d8d565b6007819055507f52cd2cdb42ff0eeec9362d7ed5b04f64c8d022697128b5378fc51cea7e63c7798383836040516119fc9392919061366c565b60405180910390a1505050565b600080600080600080600e549550600f5494506010549350601154925060125491506013549050909192939495565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611ac7611eda565b73ffffffffffffffffffffffffffffffffffffffff16611ae561127a565b73ffffffffffffffffffffffffffffffffffffffff1614611b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3290613988565b60405180910390fd5b7f0000000000000000000000002ba1bdcd9303a0d5ed0a7a3bbe64bc5a0f33270473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc090613f54565b60405180910390fd5b611bd38282612bdb565b5050565b7f0000000000000000000000002ba1bdcd9303a0d5ed0a7a3bbe64bc5a0f33270481565b611c03611eda565b73ffffffffffffffffffffffffffffffffffffffff16611c2161127a565b73ffffffffffffffffffffffffffffffffffffffff1614611c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6e90613988565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdd90613fe6565b60405180910390fd5b611cef81612b15565b50565b611cfa611eda565b73ffffffffffffffffffffffffffffffffffffffff16611d1861127a565b73ffffffffffffffffffffffffffffffffffffffff1614611d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6590613988565b60405180910390fd5b6002811015611db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da990614052565b60405180910390fd5b6103e8611dbd610908565b82611dc89190613d1c565b611dd29190613d8d565b600a819055507fff3dd5e80294197918c284bbfc3dadd97d0b40ce92106110946329088f80068a600a54604051611e099190613587565b60405180910390a150565b611e1c611eda565b73ffffffffffffffffffffffffffffffffffffffff16611e3a61127a565b73ffffffffffffffffffffffffffffffffffffffff1614611e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8790613988565b60405180910390fd5b6000600860006101000a81548160ff021916908315150217905550427ff4eaa75eae08ae80c3daf791438dac1cff2cfd3b0bad2304ec7bbb067e50261660405160405180910390a2565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f48906140e4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb790614176565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161209e9190613587565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361211a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211190614208565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612189576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121809061429a565b60405180910390fd5b600081036121a25761219d83836000612c7c565b612b10565b600860009054906101000a900460ff161561269d576121bf61127a565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561222d57506121fd61127a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156122665750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156122a0575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156122b95750600560149054906101000a900460ff16155b1561269c57600c60009054906101000a900460ff166123b357601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806123735750601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6123b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a99061432c565b60405180910390fd5b5b601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156124565750601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156124fd57600a548111156124a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612497906143be565b60405180910390fd5b6009546124ac83611111565b826124b791906139d7565b11156124f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ef9061442a565b60405180910390fd5b61269b565b601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156125a05750601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156125ef57600a548111156125ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e1906144bc565b60405180910390fd5b61269a565b601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166126995760095461264c83611111565b8261265791906139d7565b1115612698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268f9061442a565b60405180910390fd5b5b5b5b5b5b60006126a830611111565b9050600060065482101590508080156126cd5750600560159054906101000a900460ff165b80156126e65750600560149054906101000a900460ff16155b801561273c5750601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156127925750601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156127e85750601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561282d576001600560146101000a81548160ff02191690831515021790555061281183612efb565b6000600560146101000a81548160ff0219169083151502179055505b6000600560149054906101000a900460ff16159050601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806128e35750601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156128ed57600090505b60008115612b0057601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561295057506000601154115b156129ea5761297d606461296f601154886130f690919063ffffffff16565b61310c90919063ffffffff16565b9050601154601354826129909190613d1c565b61299a9190613d8d565b601560008282546129ab91906139d7565b92505081905550601154601254826129c39190613d1c565b6129cd9190613d8d565b601460008282546129de91906139d7565b92505081905550612adc565b601860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612a4557506000600e54115b15612adb57612a726064612a64600e54886130f690919063ffffffff16565b61310c90919063ffffffff16565b9050600e5460105482612a859190613d1c565b612a8f9190613d8d565b60156000828254612aa091906139d7565b92505081905550600e54600f5482612ab89190613d1c565b612ac29190613d8d565b60146000828254612ad391906139d7565b925050819055505b5b6000811115612af157612af0873083612c7c565b5b8085612afd91906144dc565b94505b612b0b878787612c7c565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167f02d59e6bf2c101e2d8367c2a27c51357eccfebcca0d09aa27c00e24e946c0d6a60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce290614208565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d519061429a565b60405180910390fd5b612d65838383613122565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de290614582565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e7e91906139d7565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612ee29190613587565b60405180910390a3612ef5848484613127565b50505050565b6000612f0630611111565b905060008190506000808303612f1e575050506130f3565b600754831115612f2e5760075492505b601960009054906101000a900460ff168015612f555750600584612f529190613d1c565b83115b15612f6a57600584612f679190613d1c565b92505b60008390506000479050612f7d8261312c565b6000612f92824761336990919063ffffffff16565b90506000612fbd86612faf601554856130f690919063ffffffff16565b61310c90919063ffffffff16565b905060006014819055506000601581905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051613015906145d3565b60006040518083038185875af1925050503d8060008114613052576040519150601f19603f3d011682016040523d82523d6000602084013e613057565b606091505b505080955050600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516130a3906145d3565b60006040518083038185875af1925050503d80600081146130e0576040519150601f19603f3d011682016040523d82523d6000602084013e6130e5565b606091505b505080955050505050505050505b50565b600081836131049190613d1c565b905092915050565b6000818361311a9190613d8d565b905092915050565b505050565b505050565b6000600267ffffffffffffffff811115613149576131486145e8565b5b6040519080825280602002602001820160405280156131775781602001602082028036833780820191505090505b509050308160008151811061318f5761318e614617565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613234573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613258919061465b565b8160018151811061326c5761326b614617565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506132d1307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611ee2565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161333395949392919061478b565b600060405180830381600087803b15801561334d57600080fd5b505af1158015613361573d6000803e3d6000fd5b505050505050565b6000818361337791906144dc565b905092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133b957808201518184015260208101905061339e565b60008484015250505050565b6000601f19601f8301169050919050565b60006133e18261337f565b6133eb818561338a565b93506133fb81856020860161339b565b613404816133c5565b840191505092915050565b6000602082019050818103600083015261342981846133d6565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061345c82613431565b9050919050565b61346c81613451565b82525050565b60006040820190506134876000830185613463565b6134946020830184613463565b9392505050565b600080fd5b6134a981613451565b81146134b457600080fd5b50565b6000813590506134c6816134a0565b92915050565b6000819050919050565b6134df816134cc565b81146134ea57600080fd5b50565b6000813590506134fc816134d6565b92915050565b600080604083850312156135195761351861349b565b5b6000613527858286016134b7565b9250506020613538858286016134ed565b9150509250929050565b60008115159050919050565b61355781613542565b82525050565b6000602082019050613572600083018461354e565b92915050565b613581816134cc565b82525050565b600060208201905061359c6000830184613578565b92915050565b600080604083850312156135b9576135b861349b565b5b60006135c7858286016134ed565b92505060206135d8858286016134ed565b9150509250929050565b6000806000606084860312156135fb576135fa61349b565b5b6000613609868287016134b7565b935050602061361a868287016134b7565b925050604061362b868287016134ed565b9150509250925092565b600060ff82169050919050565b61364b81613635565b82525050565b60006020820190506136666000830184613642565b92915050565b6000606082019050613681600083018661354e565b61368e6020830185613578565b61369b6040830184613578565b949350505050565b6000602082840312156136b9576136b861349b565b5b60006136c7848285016134b7565b91505092915050565b6136d981613542565b81146136e457600080fd5b50565b6000813590506136f6816136d0565b92915050565b600080604083850312156137135761371261349b565b5b6000613721858286016134b7565b9250506020613732858286016136e7565b9150509250929050565b6000602082840312156137525761375161349b565b5b6000613760848285016136e7565b91505092915050565b600060208201905061377e6000830184613463565b92915050565b60006020828403121561379a5761379961349b565b5b60006137a8848285016134ed565b91505092915050565b60006060820190506137c6600083018661354e565b6137d3602083018561354e565b6137e0604083018461354e565b949350505050565b6000806000606084860312156138015761380061349b565b5b600061380f868287016136e7565b9350506020613820868287016134ed565b9250506040613831868287016134ed565b9150509250925092565b600060c0820190506138506000830189613578565b61385d6020830188613578565b61386a6040830187613578565b6138776060830186613578565b6138846080830185613578565b61389160a0830184613578565b979650505050505050565b600080604083850312156138b3576138b261349b565b5b60006138c1858286016134b7565b92505060206138d2858286016134b7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061392357607f821691505b602082108103613936576139356138dc565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061397260208361338a565b915061397d8261393c565b602082019050919050565b600060208201905081810360008301526139a181613965565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139e2826134cc565b91506139ed836134cc565b9250828201905080821115613a0557613a046139a8565b5b92915050565b7f546f74616c20627579206665652063616e6e6f7420626520686967686572207460008201527f68616e2031303025000000000000000000000000000000000000000000000000602082015250565b6000613a6760288361338a565b9150613a7282613a0b565b604082019050919050565b60006020820190508181036000830152613a9681613a5a565b9050919050565b6000606082019050613ab26000830186613578565b613abf6020830185613578565b613acc6040830184613578565b949350505050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000613b3060288361338a565b9150613b3b82613ad4565b604082019050919050565b60006020820190508181036000830152613b5f81613b23565b9050919050565b7f546f74616c2073656c6c206665652063616e6e6f74206265206869676865722060008201527f7468616e20313030250000000000000000000000000000000000000000000000602082015250565b6000613bc260298361338a565b9150613bcd82613b66565b604082019050919050565b60006020820190508181036000830152613bf181613bb5565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613c5460258361338a565b9150613c5f82613bf8565b604082019050919050565b60006020820190508181036000830152613c8381613c47565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b6000613ce660248361338a565b9150613cf182613c8a565b604082019050919050565b60006020820190508181036000830152613d1581613cd9565b9050919050565b6000613d27826134cc565b9150613d32836134cc565b9250828202613d40816134cc565b91508282048414831517613d5757613d566139a8565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613d98826134cc565b9150613da3836134cc565b925082613db357613db2613d5e565b5b828204905092915050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e30312520746f74616c20737570706c792e000000000000000000000000602082015250565b6000613e1a60348361338a565b9150613e2582613dbe565b604082019050919050565b60006020820190508181036000830152613e4981613e0d565b9050919050565b7f6d6178696d756d20616d6f756e742063616e742062652068696768657220746860008201527f616e206d696e696d756d00000000000000000000000000000000000000000000602082015250565b6000613eac602a8361338a565b9150613eb782613e50565b604082019050919050565b60006020820190508181036000830152613edb81613e9f565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b6000613f3e60398361338a565b9150613f4982613ee2565b604082019050919050565b60006020820190508181036000830152613f6d81613f31565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613fd060268361338a565b9150613fdb82613f74565b604082019050919050565b60006020820190508181036000830152613fff81613fc3565b9050919050565b7f43616e6e6f7420736574206d61785478206c6f776572207468616e20302e3225600082015250565b600061403c60208361338a565b915061404782614006565b602082019050919050565b6000602082019050818103600083015261406b8161402f565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006140ce60248361338a565b91506140d982614072565b604082019050919050565b600060208201905081810360008301526140fd816140c1565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061416060228361338a565b915061416b82614104565b604082019050919050565b6000602082019050818103600083015261418f81614153565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006141f260258361338a565b91506141fd82614196565b604082019050919050565b60006020820190508181036000830152614221816141e5565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061428460238361338a565b915061428f82614228565b604082019050919050565b600060208201905081810360008301526142b381614277565b9050919050565b7f5f7472616e736665723a3a2054726164696e67206973206e6f7420616374697660008201527f652e000000000000000000000000000000000000000000000000000000000000602082015250565b600061431660228361338a565b9150614321826142ba565b604082019050919050565b6000602082019050818103600083015261434581614309565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d617854782e0000000000000000000000000000000000000000000000000000602082015250565b60006143a860268361338a565b91506143b38261434c565b604082019050919050565b600060208201905081810360008301526143d78161439b565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b600061441460138361338a565b915061441f826143de565b602082019050919050565b6000602082019050818103600083015261444381614407565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d617854782e00000000000000000000000000000000000000000000000000602082015250565b60006144a660278361338a565b91506144b18261444a565b604082019050919050565b600060208201905081810360008301526144d581614499565b9050919050565b60006144e7826134cc565b91506144f2836134cc565b925082820390508181111561450a576145096139a8565b5b92915050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061456c60268361338a565b915061457782614510565b604082019050919050565b6000602082019050818103600083015261459b8161455f565b9050919050565b600081905092915050565b50565b60006145bd6000836145a2565b91506145c8826145ad565b600082019050919050565b60006145de826145b0565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050614655816134a0565b92915050565b6000602082840312156146715761467061349b565b5b600061467f84828501614646565b91505092915050565b6000819050919050565b6000819050919050565b60006146b76146b26146ad84614688565b614692565b6134cc565b9050919050565b6146c78161469c565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61470281613451565b82525050565b600061471483836146f9565b60208301905092915050565b6000602082019050919050565b6000614738826146cd565b61474281856146d8565b935061474d836146e9565b8060005b8381101561477e5781516147658882614708565b975061477083614720565b925050600181019050614751565b5085935050505092915050565b600060a0820190506147a06000830188613578565b6147ad60208301876146be565b81810360408301526147bf818661472d565b90506147ce6060830185613463565b6147db6080830184613578565b969550505050505056fea2646970667358221220b329841eaaecf52096ddb96f0a9e3588a31bc86326245cd9b1e149e53d899e0564736f6c63430008130033
Deployed Bytecode Sourcemap
25401:20285:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10999:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38074:193;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;13232:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12119:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33501:403;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13904:529;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11961:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37596:246;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;36357:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34193:455;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14838:290;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33012:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25924:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35996:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36891:358;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;12290:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22338:103;;;;;;;;;;;;;:::i;:::-;;44501:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21687:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11218:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15627:475;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12646:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32454:290;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39788:453;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;30250:162;;;;;;;;;;;;;:::i;:::-;;34897:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31171:555;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38751:577;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;12909:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35403:241;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25521:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22596:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31969:267;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30567:140;;;;;;;;;;;;;:::i;:::-;;10999:100;11053:13;11086:5;11079:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10999:100;:::o;38074:193::-;38154:24;38180:22;38228:15;;;;;;;;;;;38245:13;;;;;;;;;;;38220:39;;;;38074:193;;:::o;13232:194::-;13340:4;13357:39;13366:12;:10;:12::i;:::-;13380:7;13389:6;13357:8;:39::i;:::-;13414:4;13407:11;;13232:194;;;;:::o;12119:108::-;12180:7;12207:12;;12200:19;;12119:108;:::o;33501:403::-;21918:12;:10;:12::i;:::-;21907:23;;:7;:5;:7::i;:::-;:23;;;21899:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33637:13:::1;33619:15;:31;;;;33677:7;33661:13;:23;;;;33727:13;;33709:15;;:31;;;;:::i;:::-;33695:11;:45;;;;33774:3;33759:11;;:18;;33751:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;33838:58;33852:11;;33865:15;;33882:13;;33838:58;;;;;;;;:::i;:::-;;;;;;;;33501:403:::0;;:::o;13904:529::-;14044:4;14061:36;14071:6;14079:9;14090:6;14061:9;:36::i;:::-;14110:24;14137:11;:19;14149:6;14137:19;;;;;;;;;;;;;;;:33;14157:12;:10;:12::i;:::-;14137:33;;;;;;;;;;;;;;;;14110:60;;14223:6;14203:16;:26;;14181:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;14333:57;14342:6;14350:12;:10;:12::i;:::-;14383:6;14364:16;:25;14333:8;:57::i;:::-;14421:4;14414:11;;;13904:529;;;;;:::o;11961:93::-;12019:5;12044:2;12037:9;;11961:93;:::o;37596:246::-;37673:19;37694:18;37714:14;37763:13;;;;;;;;;;;37746:30;;37800:9;;37787:22;;37829:5;;37820:14;;37596:246;;;:::o;36357:175::-;21918:12;:10;:12::i;:::-;21907:23;;:7;:5;:7::i;:::-;:23;;;21899:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36474:13:::1;;;;;;;;;;;36442:46;;36463:9;36442:46;;;;;;;;;;;;36515:9;36499:13;;:25;;;;;;;;;;;;;;;;;;36357:175:::0;:::o;34193:455::-;21918:12;:10;:12::i;:::-;21907:23;;:7;:5;:7::i;:::-;:23;;;21899:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34334:13:::1;34315:16;:32;;;;34375:7;34358:14;:24;;;;34427:14;;34408:16;;:33;;;;:::i;:::-;34393:12;:48;;;;34490:3;34474:12;;:19;;34452:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;34578:62;34593:12;;34607:16;;34625:14;;34578:62;;;;;;;;:::i;:::-;;;;;;;;34193:455:::0;;:::o;14838:290::-;14951:4;14968:130;14991:12;:10;:12::i;:::-;15018:7;15077:10;15040:11;:25;15052:12;:10;:12::i;:::-;15040:25;;;;;;;;;;;;;;;:34;15066:7;15040:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;14968:8;:130::i;:::-;15116:4;15109:11;;14838:290;;;;:::o;33012:202::-;21918:12;:10;:12::i;:::-;21907:23;;:7;:5;:7::i;:::-;:23;;;21899:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33155:4:::1;33125:19;:27;33145:6;33125:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;33193:6;33175:31;;;33201:4;33175:31;;;;;;:::i;:::-;;;;;;;;33012:202:::0;;:::o;25924:34::-;;;;;;;;;;;;;:::o;35996:181::-;21918:12;:10;:12::i;:::-;21907:23;;:7;:5;:7::i;:::-;:23;;;21899:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36115:15:::1;;;;;;;;;;;36081:50;;36104:9;36081:50;;;;;;;;;;;;36160:9;36142:15;;:27;;;;;;;;;;;;;;;;;;35996:181:::0;:::o;36891:358::-;36984:21;37020:25;37060;37132:15;;;;;;;;;;;37113:34;;37178:16;;37158:36;;37225:16;;37205:36;;36891:358;;;:::o;12290:143::-;12380:7;12407:9;:18;12417:7;12407:18;;;;;;;;;;;;;;;;12400:25;;12290:143;;;:::o;22338:103::-;21918:12;:10;:12::i;:::-;21907:23;;:7;:5;:7::i;:::-;:23;;;21899:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22403:30:::1;22430:1;22403:18;:30::i;:::-;22338:103::o:0;44501:79::-;21918:12;:10;:12::i;:::-;21907:23;;:7;:5;:7::i;:::-;:23;;;21899:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44567:5:::1;44560:4;;:12;;;;;;;;;;;;;;;;;;44501:79:::0;:::o;21687:87::-;21733:7;21760:6;;;;;;;;;;;21753:13;;21687:87;:::o;11218:104::-;11274:13;11307:7;11300:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11218:104;:::o;15627:475::-;15745:4;15762:24;15789:11;:25;15801:12;:10;:12::i;:::-;15789:25;;;;;;;;;;;;;;;:34;15815:7;15789:34;;;;;;;;;;;;;;;;15762:61;;15876:15;15856:16;:35;;15834:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;15992:67;16001:12;:10;:12::i;:::-;16015:7;16043:15;16024:16;:34;15992:8;:67::i;:::-;16090:4;16083:11;;;15627:475;;;;:::o;12646:200::-;12757:4;12774:42;12784:12;:10;:12::i;:::-;12798:9;12809:6;12774:9;:42::i;:::-;12834:4;12827:11;;12646:200;;;;:::o;32454:290::-;21918:12;:10;:12::i;:::-;21907:23;;:7;:5;:7::i;:::-;:23;;;21899:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32586:1:::1;32565:17;:22;;32557:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;32689:4;32672:13;:11;:13::i;:::-;32652:17;:33;;;;:::i;:::-;32651:42;;;;:::i;:::-;32639:9;:54;;;;32709:27;32726:9;;32709:27;;;;;;:::i;:::-;;;;;;;;32454:290:::0;:::o;39788:453::-;39913:23;39951:25;39991:31;40071:17;:26;40089:7;40071:26;;;;;;;;;;;;;;;;;;;;;;;;;40050:47;;40131:19;:28;40151:7;40131:28;;;;;;;;;;;;;;;;;;;;;;;;;40108:51;;40199:25;:34;40225:7;40199:34;;;;;;;;;;;;;;;;;;;;;;;;;40170:63;;39788:453;;;;;:::o;30250:162::-;21918:12;:10;:12::i;:::-;21907:23;;:7;:5;:7::i;:::-;:23;;;21899:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30320:4:::1;30303:14;;:21;;;;;;;;;;;;;;;;;;30353:4;30335:15;;:22;;;;;;;;;;;;;;;;;;30388:15;30373:31;;;;;;;;;;30250:162::o:0;34897:212::-;21918:12;:10;:12::i;:::-;21907:23;;:7;:5;:7::i;:::-;:23;;;21899:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35043:8:::1;35014:17;:26;35032:7;35014:26;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;35083:7;35067:34;;;35092:8;35067:34;;;;;;:::i;:::-;;;;;;;;34897:212:::0;;:::o;31171:555::-;21918:12;:10;:12::i;:::-;21907:23;;:7;:5;:7::i;:::-;:23;;;21899:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31341:1:::1;31333:4;:9;;31311:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;31449:4;31441;:12;;31433:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;31531:7;31513:15;;:25;;;;;;;;;;;;;;;;;;31593:5;31585:4;31569:13;:11;:13::i;:::-;:20;;;;:::i;:::-;31568:30;;;;:::i;:::-;31549:16;:49;;;;31653:5;31645:4;31629:13;:11;:13::i;:::-;:20;;;;:::i;:::-;31628:30;;;;:::i;:::-;31609:16;:49;;;;31674:44;31698:7;31707:4;31713;31674:44;;;;;;;;:::i;:::-;;;;;;;;31171:555:::0;;;:::o;38751:577::-;38841:20;38876:24;38915:22;38952:21;38988:25;39028:23;39094:11;;39079:26;;39135:15;;39116:34;;39178:13;;39161:30;;39218:12;;39202:28;;39261:16;;39241:36;;39306:14;;39288:32;;38751:577;;;;;;:::o;12909:176::-;13023:7;13050:11;:18;13062:5;13050:18;;;;;;;;;;;;;;;:27;13069:7;13050:27;;;;;;;;;;;;;;;;13043:34;;12909:176;;;;:::o;35403:241::-;21918:12;:10;:12::i;:::-;21907:23;;:7;:5;:7::i;:::-;:23;;;21899:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35507:7:::1;35499:15;;:4;:15;;::::0;35477:122:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;35612:24;35624:4;35630:5;35612:11;:24::i;:::-;35403:241:::0;;:::o;25521:32::-;;;:::o;22596:238::-;21918:12;:10;:12::i;:::-;21907:23;;:7;:5;:7::i;:::-;:23;;;21899:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22719:1:::1;22699:22;;:8;:22;;::::0;22677:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22798:28;22817:8;22798:18;:28::i;:::-;22596:238:::0;:::o;31969:267::-;21918:12;:10;:12::i;:::-;21907:23;;:7;:5;:7::i;:::-;:23;;;21899:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32098:1:::1;32081:13;:18;;32073:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;32189:4;32172:13;:11;:13::i;:::-;32156;:29;;;;:::i;:::-;32155:38;;;;:::i;:::-;32147:5;:46;;;;32209:19;32222:5;;32209:19;;;;;;:::i;:::-;;;;;;;;31969:267:::0;:::o;30567:140::-;21918:12;:10;:12::i;:::-;21907:23;;:7;:5;:7::i;:::-;:23;;;21899:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30648:5:::1;30632:13;;:21;;;;;;;;;;;;;;;;;;30683:15;30669:30;;;;;;;;;;30567:140::o:0;10005:98::-;10058:7;10085:10;10078:17;;10005:98;:::o;19410:380::-;19563:1;19546:19;;:5;:19;;;19538:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19644:1;19625:21;;:7;:21;;;19617:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19728:6;19698:11;:18;19710:5;19698:18;;;;;;;;;;;;;;;:27;19717:7;19698:27;;;;;;;;;;;;;;;:36;;;;19766:7;19750:32;;19759:5;19750:32;;;19775:6;19750:32;;;;;;:::i;:::-;;;;;;;;19410:380;;;:::o;40249:3640::-;40397:1;40381:18;;:4;:18;;;40373:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40474:1;40460:16;;:2;:16;;;40452:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;40543:1;40533:6;:11;40529:93;;40561:28;40577:4;40583:2;40587:1;40561:15;:28::i;:::-;40604:7;;40529:93;40638:13;;;;;;;;;;;40634:1564;;;40698:7;:5;:7::i;:::-;40690:15;;:4;:15;;;;:49;;;;;40732:7;:5;:7::i;:::-;40726:13;;:2;:13;;;;40690:49;:86;;;;;40774:1;40760:16;;:2;:16;;;;40690:86;:128;;;;;40811:6;40797:21;;:2;:21;;;;40690:128;:158;;;;;40840:8;;;;;;;;;;;40839:9;40690:158;40668:1519;;;40888:14;;;;;;;;;;;40883:232;;40961:17;:23;40979:4;40961:23;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;;40988:17;:21;41006:2;40988:21;;;;;;;;;;;;;;;;;;;;;;;;;40961:48;40927:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;40883:232;41189:25;:31;41215:4;41189:31;;;;;;;;;;;;;;;;;;;;;;;;;:59;;;;;41225:19;:23;41245:2;41225:23;;;;;;;;;;;;;;;;;;;;;;;;;41224:24;41189:59;41163:1009;;;41335:5;;41325:6;:15;;41291:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;41513:9;;41496:13;41506:2;41496:9;:13::i;:::-;41487:6;:22;;;;:::i;:::-;:35;;41453:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;41163:1009;;;41691:25;:29;41717:2;41691:29;;;;;;;;;;;;;;;;;;;;;;;;;:59;;;;;41725:19;:25;41745:4;41725:25;;;;;;;;;;;;;;;;;;;;;;;;;41724:26;41691:59;41665:507;;;41837:5;;41827:6;:15;;41793:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;41665:507;;;41964:19;:23;41984:2;41964:23;;;;;;;;;;;;;;;;;;;;;;;;;41959:213;;42072:9;;42055:13;42065:2;42055:9;:13::i;:::-;42046:6;:22;;;;:::i;:::-;:35;;42012:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;41959:213;41665:507;41163:1009;40668:1519;40634:1564;42210:28;42241:24;42259:4;42241:9;:24::i;:::-;42210:55;;42278:12;42317:16;;42293:20;:40;;42278:55;;42364:7;:39;;;;;42388:15;;;;;;;;;;;42364:39;:65;;;;;42421:8;;;;;;;;;;;42420:9;42364:65;:114;;;;;42447:25;:31;42473:4;42447:31;;;;;;;;;;;;;;;;;;;;;;;;;42446:32;42364:114;:155;;;;;42496:17;:23;42514:4;42496:23;;;;;;;;;;;;;;;;;;;;;;;;;42495:24;42364:155;:194;;;;;42537:17;:21;42555:2;42537:21;;;;;;;;;;;;;;;;;;;;;;;;;42536:22;42364:194;42346:332;;;42596:4;42585:8;;:15;;;;;;;;;;;;;;;;;;42617:16;42626:6;42617:8;:16::i;:::-;42661:5;42650:8;;:16;;;;;;;;;;;;;;;;;;42346:332;42690:12;42706:8;;;;;;;;;;;42705:9;42690:24;;42816:17;:23;42834:4;42816:23;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;;42843:17;:21;42861:2;42843:21;;;;;;;;;;;;;;;;;;;;;;;;;42816:48;42812:96;;;42891:5;42881:15;;42812:96;42920:12;43025:7;43021:815;;;43077:25;:29;43103:2;43077:29;;;;;;;;;;;;;;;;;;;;;;;;;:49;;;;;43125:1;43110:12;;:16;43077:49;43073:614;;;43154:33;43183:3;43154:24;43165:12;;43154:6;:10;;:24;;;;:::i;:::-;:28;;:33;;;;:::i;:::-;43147:40;;43252:12;;43234:14;;43227:4;:21;;;;:::i;:::-;43226:38;;;;:::i;:::-;43206:16;;:58;;;;;;;:::i;:::-;;;;;;;;43333:12;;43313:16;;43306:4;:23;;;;:::i;:::-;43305:40;;;;:::i;:::-;43283:18;;:62;;;;;;;:::i;:::-;;;;;;;;43073:614;;;43407:25;:31;43433:4;43407:31;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;;43456:1;43442:11;;:15;43407:50;43403:284;;;43485:32;43513:3;43485:23;43496:11;;43485:6;:10;;:23;;;;:::i;:::-;:27;;:32;;;;:::i;:::-;43478:39;;43581:11;;43564:13;;43557:4;:20;;;;:::i;:::-;43556:36;;;;:::i;:::-;43536:16;;:56;;;;;;;:::i;:::-;;;;;;;;43660:11;;43641:15;;43634:4;:22;;;;:::i;:::-;43633:38;;;;:::i;:::-;43611:18;;:60;;;;;;;:::i;:::-;;;;;;;;43403:284;43073:614;43714:1;43707:4;:8;43703:91;;;43736:42;43752:4;43766;43773;43736:15;:42::i;:::-;43703:91;43820:4;43810:14;;;;;:::i;:::-;;;43021:815;43848:33;43864:4;43870:2;43874:6;43848:15;:33::i;:::-;40362:3527;;;;40249:3640;;;;:::o;22994:191::-;23068:16;23087:6;;;;;;;;;;;23068:25;;23113:8;23104:6;;:17;;;;;;;;;;;;;;;;;;23168:8;23137:40;;23158:8;23137:40;;;;;;;;;;;;23057:128;22994:191;:::o;35652:154::-;35752:5;35718:25;:31;35744:4;35718:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;35792:5;35775:23;;35786:4;35775:23;;;;;;;;;;;;35652:154;;:::o;16592:770::-;16750:1;16732:20;;:6;:20;;;16724:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;16834:1;16813:23;;:9;:23;;;16805:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;16889:47;16910:6;16918:9;16929:6;16889:20;:47::i;:::-;16949:21;16973:9;:17;16983:6;16973:17;;;;;;;;;;;;;;;;16949:41;;17040:6;17023:13;:23;;17001:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;17184:6;17168:13;:22;17148:9;:17;17158:6;17148:17;;;;;;;;;;;;;;;:42;;;;17236:6;17212:9;:20;17222:9;17212:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;17277:9;17260:35;;17269:6;17260:35;;;17288:6;17260:35;;;;;;:::i;:::-;;;;;;;;17308:46;17328:6;17336:9;17347:6;17308:19;:46::i;:::-;16713:649;16592:770;;;:::o;44588:1095::-;44641:23;44667:24;44685:4;44667:9;:24::i;:::-;44641:50;;44702:25;44730:15;44702:43;;44756:12;44804:1;44785:15;:20;44781:59;;44822:7;;;;;44781:59;44874:16;;44856:15;:34;44852:101;;;44925:16;;44907:34;;44852:101;44969:4;;;;;;;;;;;:36;;;;;45004:1;44995:6;:10;;;;:::i;:::-;44977:15;:28;44969:36;44965:97;;;45049:1;45040:6;:10;;;;:::i;:::-;45022:28;;44965:97;45074:26;45103:15;45074:44;;45131:25;45159:21;45131:49;;45193:36;45210:18;45193:16;:36::i;:::-;45242:18;45263:44;45289:17;45263:21;:25;;:44;;;;:::i;:::-;45242:65;;45320:17;45340:79;45391:17;45340:32;45355:16;;45340:10;:14;;:32;;;;:::i;:::-;:36;;:79;;;;:::i;:::-;45320:99;;45453:1;45432:18;:22;;;;45484:1;45465:16;:20;;;;45520:13;;;;;;;;;;;45512:27;;45547:9;45512:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45498:63;;;;;45596:15;;;;;;;;;;;45588:29;;45639:21;45588:87;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45574:101;;;;;44630:1053;;;;;;;44588:1095;;:::o;3364:98::-;3422:7;3453:1;3449;:5;;;;:::i;:::-;3442:12;;3364:98;;;;:::o;3763:::-;3821:7;3852:1;3848;:5;;;;:::i;:::-;3841:12;;3763:98;;;;:::o;20390:125::-;;;;:::o;21119:124::-;;;;:::o;43897:571::-;44023:21;44061:1;44047:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44023:40;;44092:4;44074;44079:1;44074:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;44118:9;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44108:4;44113:1;44108:7;;;;;;;;:::i;:::-;;;;;;;:26;;;;;;;;;;;44147:56;44164:4;44179:9;44191:11;44147:8;:56::i;:::-;44242:9;:60;;;44317:11;44343:1;44387:4;44414;44434:15;44242:218;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43952:516;43897:571;:::o;3007:98::-;3065:7;3096:1;3092;:5;;;;:::i;:::-;3085:12;;3007:98;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:126::-;1386:7;1426:42;1419:5;1415:54;1404:65;;1349:126;;;:::o;1481:96::-;1518:7;1547:24;1565:5;1547:24;:::i;:::-;1536:35;;1481:96;;;:::o;1583:118::-;1670:24;1688:5;1670:24;:::i;:::-;1665:3;1658:37;1583:118;;:::o;1707:332::-;1828:4;1866:2;1855:9;1851:18;1843:26;;1879:71;1947:1;1936:9;1932:17;1923:6;1879:71;:::i;:::-;1960:72;2028:2;2017:9;2013:18;2004:6;1960:72;:::i;:::-;1707:332;;;;;:::o;2126:117::-;2235:1;2232;2225:12;2372:122;2445:24;2463:5;2445:24;:::i;:::-;2438:5;2435:35;2425:63;;2484:1;2481;2474:12;2425:63;2372:122;:::o;2500:139::-;2546:5;2584:6;2571:20;2562:29;;2600:33;2627:5;2600:33;:::i;:::-;2500:139;;;;:::o;2645:77::-;2682:7;2711:5;2700:16;;2645:77;;;:::o;2728:122::-;2801:24;2819:5;2801:24;:::i;:::-;2794:5;2791:35;2781:63;;2840:1;2837;2830:12;2781:63;2728:122;:::o;2856:139::-;2902:5;2940:6;2927:20;2918:29;;2956:33;2983:5;2956:33;:::i;:::-;2856:139;;;;:::o;3001:474::-;3069:6;3077;3126:2;3114:9;3105:7;3101:23;3097:32;3094:119;;;3132:79;;:::i;:::-;3094:119;3252:1;3277:53;3322:7;3313:6;3302:9;3298:22;3277:53;:::i;:::-;3267:63;;3223:117;3379:2;3405:53;3450:7;3441:6;3430:9;3426:22;3405:53;:::i;:::-;3395:63;;3350:118;3001:474;;;;;:::o;3481:90::-;3515:7;3558:5;3551:13;3544:21;3533:32;;3481:90;;;:::o;3577:109::-;3658:21;3673:5;3658:21;:::i;:::-;3653:3;3646:34;3577:109;;:::o;3692:210::-;3779:4;3817:2;3806:9;3802:18;3794:26;;3830:65;3892:1;3881:9;3877:17;3868:6;3830:65;:::i;:::-;3692:210;;;;:::o;3908:118::-;3995:24;4013:5;3995:24;:::i;:::-;3990:3;3983:37;3908:118;;:::o;4032:222::-;4125:4;4163:2;4152:9;4148:18;4140:26;;4176:71;4244:1;4233:9;4229:17;4220:6;4176:71;:::i;:::-;4032:222;;;;:::o;4260:474::-;4328:6;4336;4385:2;4373:9;4364:7;4360:23;4356:32;4353:119;;;4391:79;;:::i;:::-;4353:119;4511:1;4536:53;4581:7;4572:6;4561:9;4557:22;4536:53;:::i;:::-;4526:63;;4482:117;4638:2;4664:53;4709:7;4700:6;4689:9;4685:22;4664:53;:::i;:::-;4654:63;;4609:118;4260:474;;;;;:::o;4740:619::-;4817:6;4825;4833;4882:2;4870:9;4861:7;4857:23;4853:32;4850:119;;;4888:79;;:::i;:::-;4850:119;5008:1;5033:53;5078:7;5069:6;5058:9;5054:22;5033:53;:::i;:::-;5023:63;;4979:117;5135:2;5161:53;5206:7;5197:6;5186:9;5182:22;5161:53;:::i;:::-;5151:63;;5106:118;5263:2;5289:53;5334:7;5325:6;5314:9;5310:22;5289:53;:::i;:::-;5279:63;;5234:118;4740:619;;;;;:::o;5365:86::-;5400:7;5440:4;5433:5;5429:16;5418:27;;5365:86;;;:::o;5457:112::-;5540:22;5556:5;5540:22;:::i;:::-;5535:3;5528:35;5457:112;;:::o;5575:214::-;5664:4;5702:2;5691:9;5687:18;5679:26;;5715:67;5779:1;5768:9;5764:17;5755:6;5715:67;:::i;:::-;5575:214;;;;:::o;5795:430::-;5938:4;5976:2;5965:9;5961:18;5953:26;;5989:65;6051:1;6040:9;6036:17;6027:6;5989:65;:::i;:::-;6064:72;6132:2;6121:9;6117:18;6108:6;6064:72;:::i;:::-;6146;6214:2;6203:9;6199:18;6190:6;6146:72;:::i;:::-;5795:430;;;;;;:::o;6231:329::-;6290:6;6339:2;6327:9;6318:7;6314:23;6310:32;6307:119;;;6345:79;;:::i;:::-;6307:119;6465:1;6490:53;6535:7;6526:6;6515:9;6511:22;6490:53;:::i;:::-;6480:63;;6436:117;6231:329;;;;:::o;6566:116::-;6636:21;6651:5;6636:21;:::i;:::-;6629:5;6626:32;6616:60;;6672:1;6669;6662:12;6616:60;6566:116;:::o;6688:133::-;6731:5;6769:6;6756:20;6747:29;;6785:30;6809:5;6785:30;:::i;:::-;6688:133;;;;:::o;6827:468::-;6892:6;6900;6949:2;6937:9;6928:7;6924:23;6920:32;6917:119;;;6955:79;;:::i;:::-;6917:119;7075:1;7100:53;7145:7;7136:6;7125:9;7121:22;7100:53;:::i;:::-;7090:63;;7046:117;7202:2;7228:50;7270:7;7261:6;7250:9;7246:22;7228:50;:::i;:::-;7218:60;;7173:115;6827:468;;;;;:::o;7301:323::-;7357:6;7406:2;7394:9;7385:7;7381:23;7377:32;7374:119;;;7412:79;;:::i;:::-;7374:119;7532:1;7557:50;7599:7;7590:6;7579:9;7575:22;7557:50;:::i;:::-;7547:60;;7503:114;7301:323;;;;:::o;7630:222::-;7723:4;7761:2;7750:9;7746:18;7738:26;;7774:71;7842:1;7831:9;7827:17;7818:6;7774:71;:::i;:::-;7630:222;;;;:::o;7858:329::-;7917:6;7966:2;7954:9;7945:7;7941:23;7937:32;7934:119;;;7972:79;;:::i;:::-;7934:119;8092:1;8117:53;8162:7;8153:6;8142:9;8138:22;8117:53;:::i;:::-;8107:63;;8063:117;7858:329;;;;:::o;8193:406::-;8324:4;8362:2;8351:9;8347:18;8339:26;;8375:65;8437:1;8426:9;8422:17;8413:6;8375:65;:::i;:::-;8450:66;8512:2;8501:9;8497:18;8488:6;8450:66;:::i;:::-;8526;8588:2;8577:9;8573:18;8564:6;8526:66;:::i;:::-;8193:406;;;;;;:::o;8605:613::-;8679:6;8687;8695;8744:2;8732:9;8723:7;8719:23;8715:32;8712:119;;;8750:79;;:::i;:::-;8712:119;8870:1;8895:50;8937:7;8928:6;8917:9;8913:22;8895:50;:::i;:::-;8885:60;;8841:114;8994:2;9020:53;9065:7;9056:6;9045:9;9041:22;9020:53;:::i;:::-;9010:63;;8965:118;9122:2;9148:53;9193:7;9184:6;9173:9;9169:22;9148:53;:::i;:::-;9138:63;;9093:118;8605:613;;;;;:::o;9224:775::-;9457:4;9495:3;9484:9;9480:19;9472:27;;9509:71;9577:1;9566:9;9562:17;9553:6;9509:71;:::i;:::-;9590:72;9658:2;9647:9;9643:18;9634:6;9590:72;:::i;:::-;9672;9740:2;9729:9;9725:18;9716:6;9672:72;:::i;:::-;9754;9822:2;9811:9;9807:18;9798:6;9754:72;:::i;:::-;9836:73;9904:3;9893:9;9889:19;9880:6;9836:73;:::i;:::-;9919;9987:3;9976:9;9972:19;9963:6;9919:73;:::i;:::-;9224:775;;;;;;;;;:::o;10005:474::-;10073:6;10081;10130:2;10118:9;10109:7;10105:23;10101:32;10098:119;;;10136:79;;:::i;:::-;10098:119;10256:1;10281:53;10326:7;10317:6;10306:9;10302:22;10281:53;:::i;:::-;10271:63;;10227:117;10383:2;10409:53;10454:7;10445:6;10434:9;10430:22;10409:53;:::i;:::-;10399:63;;10354:118;10005:474;;;;;:::o;10485:180::-;10533:77;10530:1;10523:88;10630:4;10627:1;10620:15;10654:4;10651:1;10644:15;10671:320;10715:6;10752:1;10746:4;10742:12;10732:22;;10799:1;10793:4;10789:12;10820:18;10810:81;;10876:4;10868:6;10864:17;10854:27;;10810:81;10938:2;10930:6;10927:14;10907:18;10904:38;10901:84;;10957:18;;:::i;:::-;10901:84;10722:269;10671:320;;;:::o;10997:182::-;11137:34;11133:1;11125:6;11121:14;11114:58;10997:182;:::o;11185:366::-;11327:3;11348:67;11412:2;11407:3;11348:67;:::i;:::-;11341:74;;11424:93;11513:3;11424:93;:::i;:::-;11542:2;11537:3;11533:12;11526:19;;11185:366;;;:::o;11557:419::-;11723:4;11761:2;11750:9;11746:18;11738:26;;11810:9;11804:4;11800:20;11796:1;11785:9;11781:17;11774:47;11838:131;11964:4;11838:131;:::i;:::-;11830:139;;11557:419;;;:::o;11982:180::-;12030:77;12027:1;12020:88;12127:4;12124:1;12117:15;12151:4;12148:1;12141:15;12168:191;12208:3;12227:20;12245:1;12227:20;:::i;:::-;12222:25;;12261:20;12279:1;12261:20;:::i;:::-;12256:25;;12304:1;12301;12297:9;12290:16;;12325:3;12322:1;12319:10;12316:36;;;12332:18;;:::i;:::-;12316:36;12168:191;;;;:::o;12365:227::-;12505:34;12501:1;12493:6;12489:14;12482:58;12574:10;12569:2;12561:6;12557:15;12550:35;12365:227;:::o;12598:366::-;12740:3;12761:67;12825:2;12820:3;12761:67;:::i;:::-;12754:74;;12837:93;12926:3;12837:93;:::i;:::-;12955:2;12950:3;12946:12;12939:19;;12598:366;;;:::o;12970:419::-;13136:4;13174:2;13163:9;13159:18;13151:26;;13223:9;13217:4;13213:20;13209:1;13198:9;13194:17;13187:47;13251:131;13377:4;13251:131;:::i;:::-;13243:139;;12970:419;;;:::o;13395:442::-;13544:4;13582:2;13571:9;13567:18;13559:26;;13595:71;13663:1;13652:9;13648:17;13639:6;13595:71;:::i;:::-;13676:72;13744:2;13733:9;13729:18;13720:6;13676:72;:::i;:::-;13758;13826:2;13815:9;13811:18;13802:6;13758:72;:::i;:::-;13395:442;;;;;;:::o;13843:227::-;13983:34;13979:1;13971:6;13967:14;13960:58;14052:10;14047:2;14039:6;14035:15;14028:35;13843:227;:::o;14076:366::-;14218:3;14239:67;14303:2;14298:3;14239:67;:::i;:::-;14232:74;;14315:93;14404:3;14315:93;:::i;:::-;14433:2;14428:3;14424:12;14417:19;;14076:366;;;:::o;14448:419::-;14614:4;14652:2;14641:9;14637:18;14629:26;;14701:9;14695:4;14691:20;14687:1;14676:9;14672:17;14665:47;14729:131;14855:4;14729:131;:::i;:::-;14721:139;;14448:419;;;:::o;14873:228::-;15013:34;15009:1;15001:6;14997:14;14990:58;15082:11;15077:2;15069:6;15065:15;15058:36;14873:228;:::o;15107:366::-;15249:3;15270:67;15334:2;15329:3;15270:67;:::i;:::-;15263:74;;15346:93;15435:3;15346:93;:::i;:::-;15464:2;15459:3;15455:12;15448:19;;15107:366;;;:::o;15479:419::-;15645:4;15683:2;15672:9;15668:18;15660:26;;15732:9;15726:4;15722:20;15718:1;15707:9;15703:17;15696:47;15760:131;15886:4;15760:131;:::i;:::-;15752:139;;15479:419;;;:::o;15904:224::-;16044:34;16040:1;16032:6;16028:14;16021:58;16113:7;16108:2;16100:6;16096:15;16089:32;15904:224;:::o;16134:366::-;16276:3;16297:67;16361:2;16356:3;16297:67;:::i;:::-;16290:74;;16373:93;16462:3;16373:93;:::i;:::-;16491:2;16486:3;16482:12;16475:19;;16134:366;;;:::o;16506:419::-;16672:4;16710:2;16699:9;16695:18;16687:26;;16759:9;16753:4;16749:20;16745:1;16734:9;16730:17;16723:47;16787:131;16913:4;16787:131;:::i;:::-;16779:139;;16506:419;;;:::o;16931:223::-;17071:34;17067:1;17059:6;17055:14;17048:58;17140:6;17135:2;17127:6;17123:15;17116:31;16931:223;:::o;17160:366::-;17302:3;17323:67;17387:2;17382:3;17323:67;:::i;:::-;17316:74;;17399:93;17488:3;17399:93;:::i;:::-;17517:2;17512:3;17508:12;17501:19;;17160:366;;;:::o;17532:419::-;17698:4;17736:2;17725:9;17721:18;17713:26;;17785:9;17779:4;17775:20;17771:1;17760:9;17756:17;17749:47;17813:131;17939:4;17813:131;:::i;:::-;17805:139;;17532:419;;;:::o;17957:410::-;17997:7;18020:20;18038:1;18020:20;:::i;:::-;18015:25;;18054:20;18072:1;18054:20;:::i;:::-;18049:25;;18109:1;18106;18102:9;18131:30;18149:11;18131:30;:::i;:::-;18120:41;;18310:1;18301:7;18297:15;18294:1;18291:22;18271:1;18264:9;18244:83;18221:139;;18340:18;;:::i;:::-;18221:139;18005:362;17957:410;;;;:::o;18373:180::-;18421:77;18418:1;18411:88;18518:4;18515:1;18508:15;18542:4;18539:1;18532:15;18559:185;18599:1;18616:20;18634:1;18616:20;:::i;:::-;18611:25;;18650:20;18668:1;18650:20;:::i;:::-;18645:25;;18689:1;18679:35;;18694:18;;:::i;:::-;18679:35;18736:1;18733;18729:9;18724:14;;18559:185;;;;:::o;18750:239::-;18890:34;18886:1;18878:6;18874:14;18867:58;18959:22;18954:2;18946:6;18942:15;18935:47;18750:239;:::o;18995:366::-;19137:3;19158:67;19222:2;19217:3;19158:67;:::i;:::-;19151:74;;19234:93;19323:3;19234:93;:::i;:::-;19352:2;19347:3;19343:12;19336:19;;18995:366;;;:::o;19367:419::-;19533:4;19571:2;19560:9;19556:18;19548:26;;19620:9;19614:4;19610:20;19606:1;19595:9;19591:17;19584:47;19648:131;19774:4;19648:131;:::i;:::-;19640:139;;19367:419;;;:::o;19792:229::-;19932:34;19928:1;19920:6;19916:14;19909:58;20001:12;19996:2;19988:6;19984:15;19977:37;19792:229;:::o;20027:366::-;20169:3;20190:67;20254:2;20249:3;20190:67;:::i;:::-;20183:74;;20266:93;20355:3;20266:93;:::i;:::-;20384:2;20379:3;20375:12;20368:19;;20027:366;;;:::o;20399:419::-;20565:4;20603:2;20592:9;20588:18;20580:26;;20652:9;20646:4;20642:20;20638:1;20627:9;20623:17;20616:47;20680:131;20806:4;20680:131;:::i;:::-;20672:139;;20399:419;;;:::o;20824:244::-;20964:34;20960:1;20952:6;20948:14;20941:58;21033:27;21028:2;21020:6;21016:15;21009:52;20824:244;:::o;21074:366::-;21216:3;21237:67;21301:2;21296:3;21237:67;:::i;:::-;21230:74;;21313:93;21402:3;21313:93;:::i;:::-;21431:2;21426:3;21422:12;21415:19;;21074:366;;;:::o;21446:419::-;21612:4;21650:2;21639:9;21635:18;21627:26;;21699:9;21693:4;21689:20;21685:1;21674:9;21670:17;21663:47;21727:131;21853:4;21727:131;:::i;:::-;21719:139;;21446:419;;;:::o;21871:225::-;22011:34;22007:1;21999:6;21995:14;21988:58;22080:8;22075:2;22067:6;22063:15;22056:33;21871:225;:::o;22102:366::-;22244:3;22265:67;22329:2;22324:3;22265:67;:::i;:::-;22258:74;;22341:93;22430:3;22341:93;:::i;:::-;22459:2;22454:3;22450:12;22443:19;;22102:366;;;:::o;22474:419::-;22640:4;22678:2;22667:9;22663:18;22655:26;;22727:9;22721:4;22717:20;22713:1;22702:9;22698:17;22691:47;22755:131;22881:4;22755:131;:::i;:::-;22747:139;;22474:419;;;:::o;22899:182::-;23039:34;23035:1;23027:6;23023:14;23016:58;22899:182;:::o;23087:366::-;23229:3;23250:67;23314:2;23309:3;23250:67;:::i;:::-;23243:74;;23326:93;23415:3;23326:93;:::i;:::-;23444:2;23439:3;23435:12;23428:19;;23087:366;;;:::o;23459:419::-;23625:4;23663:2;23652:9;23648:18;23640:26;;23712:9;23706:4;23702:20;23698:1;23687:9;23683:17;23676:47;23740:131;23866:4;23740:131;:::i;:::-;23732:139;;23459:419;;;:::o;23884:223::-;24024:34;24020:1;24012:6;24008:14;24001:58;24093:6;24088:2;24080:6;24076:15;24069:31;23884:223;:::o;24113:366::-;24255:3;24276:67;24340:2;24335:3;24276:67;:::i;:::-;24269:74;;24352:93;24441:3;24352:93;:::i;:::-;24470:2;24465:3;24461:12;24454:19;;24113:366;;;:::o;24485:419::-;24651:4;24689:2;24678:9;24674:18;24666:26;;24738:9;24732:4;24728:20;24724:1;24713:9;24709:17;24702:47;24766:131;24892:4;24766:131;:::i;:::-;24758:139;;24485:419;;;:::o;24910:221::-;25050:34;25046:1;25038:6;25034:14;25027:58;25119:4;25114:2;25106:6;25102:15;25095:29;24910:221;:::o;25137:366::-;25279:3;25300:67;25364:2;25359:3;25300:67;:::i;:::-;25293:74;;25376:93;25465:3;25376:93;:::i;:::-;25494:2;25489:3;25485:12;25478:19;;25137:366;;;:::o;25509:419::-;25675:4;25713:2;25702:9;25698:18;25690:26;;25762:9;25756:4;25752:20;25748:1;25737:9;25733:17;25726:47;25790:131;25916:4;25790:131;:::i;:::-;25782:139;;25509:419;;;:::o;25934:224::-;26074:34;26070:1;26062:6;26058:14;26051:58;26143:7;26138:2;26130:6;26126:15;26119:32;25934:224;:::o;26164:366::-;26306:3;26327:67;26391:2;26386:3;26327:67;:::i;:::-;26320:74;;26403:93;26492:3;26403:93;:::i;:::-;26521:2;26516:3;26512:12;26505:19;;26164:366;;;:::o;26536:419::-;26702:4;26740:2;26729:9;26725:18;26717:26;;26789:9;26783:4;26779:20;26775:1;26764:9;26760:17;26753:47;26817:131;26943:4;26817:131;:::i;:::-;26809:139;;26536:419;;;:::o;26961:222::-;27101:34;27097:1;27089:6;27085:14;27078:58;27170:5;27165:2;27157:6;27153:15;27146:30;26961:222;:::o;27189:366::-;27331:3;27352:67;27416:2;27411:3;27352:67;:::i;:::-;27345:74;;27428:93;27517:3;27428:93;:::i;:::-;27546:2;27541:3;27537:12;27530:19;;27189:366;;;:::o;27561:419::-;27727:4;27765:2;27754:9;27750:18;27742:26;;27814:9;27808:4;27804:20;27800:1;27789:9;27785:17;27778:47;27842:131;27968:4;27842:131;:::i;:::-;27834:139;;27561:419;;;:::o;27986:221::-;28126:34;28122:1;28114:6;28110:14;28103:58;28195:4;28190:2;28182:6;28178:15;28171:29;27986:221;:::o;28213:366::-;28355:3;28376:67;28440:2;28435:3;28376:67;:::i;:::-;28369:74;;28452:93;28541:3;28452:93;:::i;:::-;28570:2;28565:3;28561:12;28554:19;;28213:366;;;:::o;28585:419::-;28751:4;28789:2;28778:9;28774:18;28766:26;;28838:9;28832:4;28828:20;28824:1;28813:9;28809:17;28802:47;28866:131;28992:4;28866:131;:::i;:::-;28858:139;;28585:419;;;:::o;29010:225::-;29150:34;29146:1;29138:6;29134:14;29127:58;29219:8;29214:2;29206:6;29202:15;29195:33;29010:225;:::o;29241:366::-;29383:3;29404:67;29468:2;29463:3;29404:67;:::i;:::-;29397:74;;29480:93;29569:3;29480:93;:::i;:::-;29598:2;29593:3;29589:12;29582:19;;29241:366;;;:::o;29613:419::-;29779:4;29817:2;29806:9;29802:18;29794:26;;29866:9;29860:4;29856:20;29852:1;29841:9;29837:17;29830:47;29894:131;30020:4;29894:131;:::i;:::-;29886:139;;29613:419;;;:::o;30038:169::-;30178:21;30174:1;30166:6;30162:14;30155:45;30038:169;:::o;30213:366::-;30355:3;30376:67;30440:2;30435:3;30376:67;:::i;:::-;30369:74;;30452:93;30541:3;30452:93;:::i;:::-;30570:2;30565:3;30561:12;30554:19;;30213:366;;;:::o;30585:419::-;30751:4;30789:2;30778:9;30774:18;30766:26;;30838:9;30832:4;30828:20;30824:1;30813:9;30809:17;30802:47;30866:131;30992:4;30866:131;:::i;:::-;30858:139;;30585:419;;;:::o;31010:226::-;31150:34;31146:1;31138:6;31134:14;31127:58;31219:9;31214:2;31206:6;31202:15;31195:34;31010:226;:::o;31242:366::-;31384:3;31405:67;31469:2;31464:3;31405:67;:::i;:::-;31398:74;;31481:93;31570:3;31481:93;:::i;:::-;31599:2;31594:3;31590:12;31583:19;;31242:366;;;:::o;31614:419::-;31780:4;31818:2;31807:9;31803:18;31795:26;;31867:9;31861:4;31857:20;31853:1;31842:9;31838:17;31831:47;31895:131;32021:4;31895:131;:::i;:::-;31887:139;;31614:419;;;:::o;32039:194::-;32079:4;32099:20;32117:1;32099:20;:::i;:::-;32094:25;;32133:20;32151:1;32133:20;:::i;:::-;32128:25;;32177:1;32174;32170:9;32162:17;;32201:1;32195:4;32192:11;32189:37;;;32206:18;;:::i;:::-;32189:37;32039:194;;;;:::o;32239:225::-;32379:34;32375:1;32367:6;32363:14;32356:58;32448:8;32443:2;32435:6;32431:15;32424:33;32239:225;:::o;32470:366::-;32612:3;32633:67;32697:2;32692:3;32633:67;:::i;:::-;32626:74;;32709:93;32798:3;32709:93;:::i;:::-;32827:2;32822:3;32818:12;32811:19;;32470:366;;;:::o;32842:419::-;33008:4;33046:2;33035:9;33031:18;33023:26;;33095:9;33089:4;33085:20;33081:1;33070:9;33066:17;33059:47;33123:131;33249:4;33123:131;:::i;:::-;33115:139;;32842:419;;;:::o;33267:147::-;33368:11;33405:3;33390:18;;33267:147;;;;:::o;33420:114::-;;:::o;33540:398::-;33699:3;33720:83;33801:1;33796:3;33720:83;:::i;:::-;33713:90;;33812:93;33901:3;33812:93;:::i;:::-;33930:1;33925:3;33921:11;33914:18;;33540:398;;;:::o;33944:379::-;34128:3;34150:147;34293:3;34150:147;:::i;:::-;34143:154;;34314:3;34307:10;;33944:379;;;:::o;34329:180::-;34377:77;34374:1;34367:88;34474:4;34471:1;34464:15;34498:4;34495:1;34488:15;34515:180;34563:77;34560:1;34553:88;34660:4;34657:1;34650:15;34684:4;34681:1;34674:15;34701:143;34758:5;34789:6;34783:13;34774:22;;34805:33;34832:5;34805:33;:::i;:::-;34701:143;;;;:::o;34850:351::-;34920:6;34969:2;34957:9;34948:7;34944:23;34940:32;34937:119;;;34975:79;;:::i;:::-;34937:119;35095:1;35120:64;35176:7;35167:6;35156:9;35152:22;35120:64;:::i;:::-;35110:74;;35066:128;34850:351;;;;:::o;35207:85::-;35252:7;35281:5;35270:16;;35207:85;;;:::o;35298:60::-;35326:3;35347:5;35340:12;;35298:60;;;:::o;35364:158::-;35422:9;35455:61;35473:42;35482:32;35508:5;35482:32;:::i;:::-;35473:42;:::i;:::-;35455:61;:::i;:::-;35442:74;;35364:158;;;:::o;35528:147::-;35623:45;35662:5;35623:45;:::i;:::-;35618:3;35611:58;35528:147;;:::o;35681:114::-;35748:6;35782:5;35776:12;35766:22;;35681:114;;;:::o;35801:184::-;35900:11;35934:6;35929:3;35922:19;35974:4;35969:3;35965:14;35950:29;;35801:184;;;;:::o;35991:132::-;36058:4;36081:3;36073:11;;36111:4;36106:3;36102:14;36094:22;;35991:132;;;:::o;36129:108::-;36206:24;36224:5;36206:24;:::i;:::-;36201:3;36194:37;36129:108;;:::o;36243:179::-;36312:10;36333:46;36375:3;36367:6;36333:46;:::i;:::-;36411:4;36406:3;36402:14;36388:28;;36243:179;;;;:::o;36428:113::-;36498:4;36530;36525:3;36521:14;36513:22;;36428:113;;;:::o;36577:732::-;36696:3;36725:54;36773:5;36725:54;:::i;:::-;36795:86;36874:6;36869:3;36795:86;:::i;:::-;36788:93;;36905:56;36955:5;36905:56;:::i;:::-;36984:7;37015:1;37000:284;37025:6;37022:1;37019:13;37000:284;;;37101:6;37095:13;37128:63;37187:3;37172:13;37128:63;:::i;:::-;37121:70;;37214:60;37267:6;37214:60;:::i;:::-;37204:70;;37060:224;37047:1;37044;37040:9;37035:14;;37000:284;;;37004:14;37300:3;37293:10;;36701:608;;;36577:732;;;;:::o;37315:831::-;37578:4;37616:3;37605:9;37601:19;37593:27;;37630:71;37698:1;37687:9;37683:17;37674:6;37630:71;:::i;:::-;37711:80;37787:2;37776:9;37772:18;37763:6;37711:80;:::i;:::-;37838:9;37832:4;37828:20;37823:2;37812:9;37808:18;37801:48;37866:108;37969:4;37960:6;37866:108;:::i;:::-;37858:116;;37984:72;38052:2;38041:9;38037:18;38028:6;37984:72;:::i;:::-;38066:73;38134:3;38123:9;38119:19;38110:6;38066:73;:::i;:::-;37315:831;;;;;;;;:::o
Swarm Source
ipfs://b329841eaaecf52096ddb96f0a9e3588a31bc86326245cd9b1e149e53d899e05
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.