Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
1,000,000,000 CHEEMS
Holders
227
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CheemsCoin
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-08-18 */ // SPDX-License-Identifier: MIT /* Telegram : https://t.me/cheemstokeneth Twitter : https://x.com/CheemsTokenEth Website : https://cheemseth.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 CheemsCoin 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("Cheems", "CHEEMS") { 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 = 15; uint256 _buyProjectTax = 0; uint256 _sellMarketingTax = 15; uint256 _sellProjectTax = 0; uint256 _totalSupply = 1000000000 * 10 ** decimals(); maxTx = (_totalSupply * 10) / 100; maxWallet = (_totalSupply * 10) / 100; swapBackValueMin = (_totalSupply * 1) / 1000; swapBackValueMax = (_totalSupply * 2) / 1000; buyMarketingTax = _buyMarketingTax; buyProjectTax = _buyProjectTax; buyTaxTotal = buyMarketingTax + buyProjectTax; sellMarketingTax = _sellMarketingTax; sellProjectTax = _sellProjectTax; sellTaxTotal = sellMarketingTax + sellProjectTax; marketingWallet = address(0xF9CC2f7c49D00732a35a557Ae325095308716254); 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
60c06040526000600560156101000a81548160ff0219169083151502179055506001600860006101000a81548160ff0219169083151502179055506000600c60006101000a81548160ff0219169083151502179055506001601960006101000a81548160ff0219169083151502179055503480156200007d57600080fd5b506040518060400160405280600681526020017f436865656d7300000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f434845454d5300000000000000000000000000000000000000000000000000008152508160039081620000fb919062000f39565b5080600490816200010d919062000f39565b50505062000130620001246200061260201b60201c565b6200061a60201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90506200015c816001620006e060201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020291906200108a565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200026a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029091906200108a565b6040518363ffffffff1660e01b8152600401620002af929190620010cd565b6020604051808303816000875af1158015620002cf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002f591906200108a565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506200033d60a0516001620006e060201b60201c565b6200035260a05160016200081a60201b60201c565b6000600f9050600080600f905060008062000372620008bb60201b60201c565b600a6200038091906200128a565b633b9aca00620003919190620012db565b90506064600a82620003a49190620012db565b620003b0919062001355565b600a819055506064600a82620003c79190620012db565b620003d3919062001355565b6009819055506103e8600182620003eb9190620012db565b620003f7919062001355565b6006819055506103e86002826200040f9190620012db565b6200041b919062001355565b60078190555084600f8190555083601081905550601054600f546200044191906200138d565b600e8190555082601281905550816013819055506013546012546200046791906200138d565b60118190555073f9cc2f7c49d00732a35a557ae325095308716254600c60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000516336001620008c460201b60201c565b62000529306001620008c460201b60201c565b6200053e61dead6001620008c460201b60201c565b62000573600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001620008c460201b60201c565b62000586336001620006e060201b60201c565b62000599306001620006e060201b60201c565b620005ae61dead6001620006e060201b60201c565b620005e3600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001620006e060201b60201c565b620005f433620009fe60201b60201c565b62000606338262000b1360201b60201c565b505050505050620015bd565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620006f06200061260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200071662000c8b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200076f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007669062001429565b60405180910390fd5b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc92826040516200080e919062001468565b60405180910390a25050565b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167f02d59e6bf2c101e2d8367c2a27c51357eccfebcca0d09aa27c00e24e946c0d6a60405160405180910390a35050565b60006012905090565b620008d46200061260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620008fa62000c8b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000953576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200094a9062001429565b60405180910390fd5b80601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051620009f2919062001468565b60405180910390a25050565b62000a0e6200061260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000a3462000c8b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000a8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a849062001429565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000aff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000af690620014fb565b60405180910390fd5b62000b10816200061a60201b60201c565b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000b85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b7c906200156d565b60405180910390fd5b62000b996000838362000cb560201b60201c565b806002600082825462000bad91906200138d565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000c0491906200138d565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000c6b9190620015a0565b60405180910390a362000c876000838362000cba60201b60201c565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000d4157607f821691505b60208210810362000d575762000d5662000cf9565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000dc17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000d82565b62000dcd868362000d82565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000e1a62000e1462000e0e8462000de5565b62000def565b62000de5565b9050919050565b6000819050919050565b62000e368362000df9565b62000e4e62000e458262000e21565b84845462000d8f565b825550505050565b600090565b62000e6562000e56565b62000e7281848462000e2b565b505050565b5b8181101562000e9a5762000e8e60008262000e5b565b60018101905062000e78565b5050565b601f82111562000ee95762000eb38162000d5d565b62000ebe8462000d72565b8101602085101562000ece578190505b62000ee662000edd8562000d72565b83018262000e77565b50505b505050565b600082821c905092915050565b600062000f0e6000198460080262000eee565b1980831691505092915050565b600062000f29838362000efb565b9150826002028217905092915050565b62000f448262000cbf565b67ffffffffffffffff81111562000f605762000f5f62000cca565b5b62000f6c825462000d28565b62000f7982828562000e9e565b600060209050601f83116001811462000fb1576000841562000f9c578287015190505b62000fa8858262000f1b565b86555062001018565b601f19841662000fc18662000d5d565b60005b8281101562000feb5784890151825560018201915060208501945060208101905062000fc4565b868310156200100b578489015162001007601f89168262000efb565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620010528262001025565b9050919050565b620010648162001045565b81146200107057600080fd5b50565b600081519050620010848162001059565b92915050565b600060208284031215620010a357620010a262001020565b5b6000620010b38482850162001073565b91505092915050565b620010c78162001045565b82525050565b6000604082019050620010e46000830185620010bc565b620010f36020830184620010bc565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b6001851115620011885780860481111562001160576200115f620010fa565b5b6001851615620011705780820291505b8081029050620011808562001129565b945062001140565b94509492505050565b600082620011a3576001905062001276565b81620011b3576000905062001276565b8160018114620011cc5760028114620011d7576200120d565b600191505062001276565b60ff841115620011ec57620011eb620010fa565b5b8360020a915084821115620012065762001205620010fa565b5b5062001276565b5060208310610133831016604e8410600b8410161715620012475782820a905083811115620012415762001240620010fa565b5b62001276565b62001256848484600162001136565b9250905081840481111562001270576200126f620010fa565b5b81810290505b9392505050565b600060ff82169050919050565b6000620012978262000de5565b9150620012a4836200127d565b9250620012d37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462001191565b905092915050565b6000620012e88262000de5565b9150620012f58362000de5565b9250828202620013058162000de5565b915082820484148315176200131f576200131e620010fa565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620013628262000de5565b91506200136f8362000de5565b92508262001382576200138162001326565b5b828204905092915050565b60006200139a8262000de5565b9150620013a78362000de5565b9250828201905080821115620013c257620013c1620010fa565b5b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062001411602083620013c8565b91506200141e82620013d9565b602082019050919050565b60006020820190508181036000830152620014448162001402565b9050919050565b60008115159050919050565b62001462816200144b565b82525050565b60006020820190506200147f600083018462001457565b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000620014e3602683620013c8565b9150620014f08262001485565b604082019050919050565b600060208201905081810360008301526200151681620014d4565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062001555601f83620013c8565b915062001562826200151d565b602082019050919050565b60006020820190508181036000830152620015888162001546565b9050919050565b6200159a8162000de5565b82525050565b6000602082019050620015b760008301846200158f565b92915050565b60805160a05161481b620015f860003960008181611b3d0152611bd90152600081816131cb015281816132ac01526132d3015261481b6000f3fe6080604052600436106101fd5760003560e01c80637ff6f7b91161010d578063c9b6c1ce116100a0578063e55648f41161006f578063e55648f41461074a578063f242ab4114610773578063f2fde38b1461079e578063f3cfad94146107c7578063fb42948a146107f057610204565b8063c9b6c1ce1461068b578063ca3608c3146106b4578063d7ff53e5146106dd578063dd62ed3e1461070d57610204565b8063a9059cbb116100dc578063a9059cbb146105cf578063bb931db21461060c578063c40b793b14610635578063c9567bf91461067457610204565b80637ff6f7b9146105135780638da5cb5b1461053c57806395d89b4114610567578063a457c2d71461059257610204565b8063336ddc29116101905780634ada218b1161015f5780634ada218b1461043e57806351b8dc7b14610469578063622fa7721461049257806370a08231146104bf578063715018a6146104fc57610204565b8063336ddc2914610386578063391822af146103af57806339509351146103d85780634482eea81461041557610204565b806321108a52116101cc57806321108a52146102c857806323b872dd146102f1578063313ce5671461032e5780633308740b1461035957610204565b806306fdde0314610209578063088c9eb414610234578063095ea7b31461026057806318160ddd1461029d57610204565b3661020457005b600080fd5b34801561021557600080fd5b5061021e610807565b60405161022b919061340f565b60405180910390f35b34801561024057600080fd5b50610249610899565b604051610257929190613472565b60405180910390f35b34801561026c57600080fd5b5061028760048036038101906102829190613502565b6108ea565b604051610294919061355d565b60405180910390f35b3480156102a957600080fd5b506102b2610908565b6040516102bf9190613587565b60405180910390f35b3480156102d457600080fd5b506102ef60048036038101906102ea91906135a2565b610912565b005b3480156102fd57600080fd5b50610318600480360381019061031391906135e2565b610a3d565b604051610325919061355d565b60405180910390f35b34801561033a57600080fd5b50610343610b35565b6040516103509190613651565b60405180910390f35b34801561036557600080fd5b5061036e610b3e565b60405161037d9392919061366c565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a891906136a3565b610b64565b005b3480156103bb57600080fd5b506103d660048036038101906103d191906135a2565b610ca0565b005b3480156103e457600080fd5b506103ff60048036038101906103fa9190613502565b610dcb565b60405161040c919061355d565b60405180910390f35b34801561042157600080fd5b5061043c600480360381019061043791906136fc565b610e77565b005b34801561044a57600080fd5b50610453610f9c565b604051610460919061355d565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b91906136a3565b610faf565b005b34801561049e57600080fd5b506104a76110eb565b6040516104b69392919061366c565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e191906136a3565b611111565b6040516104f39190613587565b60405180910390f35b34801561050857600080fd5b50610511611159565b005b34801561051f57600080fd5b5061053a6004803603810190610535919061373c565b6111e1565b005b34801561054857600080fd5b5061055161127a565b60405161055e9190613769565b60405180910390f35b34801561057357600080fd5b5061057c6112a4565b604051610589919061340f565b60405180910390f35b34801561059e57600080fd5b506105b960048036038101906105b49190613502565b611336565b6040516105c6919061355d565b60405180910390f35b3480156105db57600080fd5b506105f660048036038101906105f19190613502565b611421565b604051610603919061355d565b60405180910390f35b34801561061857600080fd5b50610633600480360381019061062e9190613784565b61143f565b005b34801561064157600080fd5b5061065c600480360381019061065791906136a3565b611561565b60405161066b939291906137b1565b60405180910390f35b34801561068057600080fd5b5061068961165a565b005b34801561069757600080fd5b506106b260048036038101906106ad91906136fc565b61173b565b005b3480156106c057600080fd5b506106db60048036038101906106d691906137e8565b611860565b005b3480156106e957600080fd5b506106f2611a09565b6040516107049695949392919061383b565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f919061389c565b611a38565b6040516107419190613587565b60405180910390f35b34801561075657600080fd5b50610771600480360381019061076c91906136fc565b611abf565b005b34801561077f57600080fd5b50610788611bd7565b6040516107959190613769565b60405180910390f35b3480156107aa57600080fd5b506107c560048036038101906107c091906136a3565b611bfb565b005b3480156107d357600080fd5b506107ee60048036038101906107e99190613784565b611cf2565b005b3480156107fc57600080fd5b50610805611e14565b005b6060600380546108169061390b565b80601f01602080910402602001604051908101604052809291908181526020018280546108429061390b565b801561088f5780601f106108645761010080835404028352916020019161088f565b820191906000526020600020905b81548152906001019060200180831161087257829003601f168201915b5050505050905090565b600080600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915091509091565b60006108fe6108f7611eda565b8484611ee2565b6001905092915050565b6000600254905090565b61091a611eda565b73ffffffffffffffffffffffffffffffffffffffff1661093861127a565b73ffffffffffffffffffffffffffffffffffffffff161461098e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098590613988565b60405180910390fd5b81600f8190555080601081905550601054600f546109ac91906139d7565b600e819055506064600e5411156109f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ef90613a7d565b60405180910390fd5b7f38513c502b0ab4834ac1df9502b76f75dcf7092469782cfd0db7fe664388e25e600e54600f54601054604051610a3193929190613a9d565b60405180910390a15050565b6000610a4a8484846120ab565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610a95611eda565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0c90613b46565b60405180910390fd5b610b2985610b21611eda565b858403611ee2565b60019150509392505050565b60006012905090565b6000806000600860009054906101000a900460ff1692506009549150600a549050909192565b610b6c611eda565b73ffffffffffffffffffffffffffffffffffffffff16610b8a61127a565b73ffffffffffffffffffffffffffffffffffffffff1614610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd790613988565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fb91dbdeaf34f885ccae2d8abc3967cb03c079b6af2c7944e3893fd29427d75e760405160405180910390a380600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610ca8611eda565b73ffffffffffffffffffffffffffffffffffffffff16610cc661127a565b73ffffffffffffffffffffffffffffffffffffffff1614610d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1390613988565b60405180910390fd5b8160128190555080601381905550601354601254610d3a91906139d7565b60118190555060646011541115610d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7d90613bd8565b60405180910390fd5b7fcb5f36df892836a2eaedc349de29a7581176990398ee185d16eaa8f6c1abd8f1601154601254601354604051610dbf93929190613a9d565b60405180910390a15050565b6000610e6d610dd8611eda565b848460016000610de6611eda565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e6891906139d7565b611ee2565b6001905092915050565b610e7f611eda565b73ffffffffffffffffffffffffffffffffffffffff16610e9d61127a565b73ffffffffffffffffffffffffffffffffffffffff1614610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea90613988565b60405180910390fd5b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc9282604051610f90919061355d565b60405180910390a25050565b600c60009054906101000a900460ff1681565b610fb7611eda565b73ffffffffffffffffffffffffffffffffffffffff16610fd561127a565b73ffffffffffffffffffffffffffffffffffffffff161461102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102290613988565b60405180910390fd5b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6760405160405180910390a380600c60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000600560159054906101000a900460ff16925060065491506007549050909192565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611161611eda565b73ffffffffffffffffffffffffffffffffffffffff1661117f61127a565b73ffffffffffffffffffffffffffffffffffffffff16146111d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cc90613988565b60405180910390fd5b6111df6000612b15565b565b6111e9611eda565b73ffffffffffffffffffffffffffffffffffffffff1661120761127a565b73ffffffffffffffffffffffffffffffffffffffff161461125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125490613988565b60405180910390fd5b80601960006101000a81548160ff02191690831515021790555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546112b39061390b565b80601f01602080910402602001604051908101604052809291908181526020018280546112df9061390b565b801561132c5780601f106113015761010080835404028352916020019161132c565b820191906000526020600020905b81548152906001019060200180831161130f57829003601f168201915b5050505050905090565b60008060016000611345611eda565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990613c6a565b60405180910390fd5b61141661140d611eda565b85858403611ee2565b600191505092915050565b600061143561142e611eda565b84846120ab565b6001905092915050565b611447611eda565b73ffffffffffffffffffffffffffffffffffffffff1661146561127a565b73ffffffffffffffffffffffffffffffffffffffff16146114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b290613988565b60405180910390fd5b60058110156114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f690613cfc565b60405180910390fd5b6103e861150a610908565b826115159190613d1c565b61151f9190613d8d565b6009819055507f12528a3c61e0f3b2d6fc707a9fc58b1af86e252cad0d7f4c154ebeabb162dace6009546040516115569190613587565b60405180910390a150565b6000806000601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169250601760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169150601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690509193909250565b611662611eda565b73ffffffffffffffffffffffffffffffffffffffff1661168061127a565b73ffffffffffffffffffffffffffffffffffffffff16146116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd90613988565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055506001600560156101000a81548160ff021916908315150217905550427fb3da2db3dfc3778f99852546c6e9ab39ec253f9de7b0847afec61bd27878e92360405160405180910390a2565b611743611eda565b73ffffffffffffffffffffffffffffffffffffffff1661176161127a565b73ffffffffffffffffffffffffffffffffffffffff16146117b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ae90613988565b60405180910390fd5b80601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611854919061355d565b60405180910390a25050565b611868611eda565b73ffffffffffffffffffffffffffffffffffffffff1661188661127a565b73ffffffffffffffffffffffffffffffffffffffff16146118dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d390613988565b60405180910390fd5b6001821015611920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191790613e30565b60405180910390fd5b81811015611963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195a90613ec2565b60405180910390fd5b82600560156101000a81548160ff02191690831515021790555061271082611989610908565b6119939190613d1c565b61199d9190613d8d565b600681905550612710816119af610908565b6119b99190613d1c565b6119c39190613d8d565b6007819055507f52cd2cdb42ff0eeec9362d7ed5b04f64c8d022697128b5378fc51cea7e63c7798383836040516119fc9392919061366c565b60405180910390a1505050565b600080600080600080600e549550600f5494506010549350601154925060125491506013549050909192939495565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611ac7611eda565b73ffffffffffffffffffffffffffffffffffffffff16611ae561127a565b73ffffffffffffffffffffffffffffffffffffffff1614611b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3290613988565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc090613f54565b60405180910390fd5b611bd38282612bdb565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b611c03611eda565b73ffffffffffffffffffffffffffffffffffffffff16611c2161127a565b73ffffffffffffffffffffffffffffffffffffffff1614611c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6e90613988565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdd90613fe6565b60405180910390fd5b611cef81612b15565b50565b611cfa611eda565b73ffffffffffffffffffffffffffffffffffffffff16611d1861127a565b73ffffffffffffffffffffffffffffffffffffffff1614611d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6590613988565b60405180910390fd5b6002811015611db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da990614052565b60405180910390fd5b6103e8611dbd610908565b82611dc89190613d1c565b611dd29190613d8d565b600a819055507fff3dd5e80294197918c284bbfc3dadd97d0b40ce92106110946329088f80068a600a54604051611e099190613587565b60405180910390a150565b611e1c611eda565b73ffffffffffffffffffffffffffffffffffffffff16611e3a61127a565b73ffffffffffffffffffffffffffffffffffffffff1614611e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8790613988565b60405180910390fd5b6000600860006101000a81548160ff021916908315150217905550427ff4eaa75eae08ae80c3daf791438dac1cff2cfd3b0bad2304ec7bbb067e50261660405160405180910390a2565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f48906140e4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb790614176565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161209e9190613587565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361211a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211190614208565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612189576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121809061429a565b60405180910390fd5b600081036121a25761219d83836000612c7c565b612b10565b600860009054906101000a900460ff161561269d576121bf61127a565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561222d57506121fd61127a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156122665750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156122a0575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156122b95750600560149054906101000a900460ff16155b1561269c57600c60009054906101000a900460ff166123b357601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806123735750601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6123b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a99061432c565b60405180910390fd5b5b601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156124565750601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156124fd57600a548111156124a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612497906143be565b60405180910390fd5b6009546124ac83611111565b826124b791906139d7565b11156124f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ef9061442a565b60405180910390fd5b61269b565b601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156125a05750601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156125ef57600a548111156125ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e1906144bc565b60405180910390fd5b61269a565b601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166126995760095461264c83611111565b8261265791906139d7565b1115612698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268f9061442a565b60405180910390fd5b5b5b5b5b5b60006126a830611111565b9050600060065482101590508080156126cd5750600560159054906101000a900460ff165b80156126e65750600560149054906101000a900460ff16155b801561273c5750601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156127925750601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156127e85750601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561282d576001600560146101000a81548160ff02191690831515021790555061281183612efb565b6000600560146101000a81548160ff0219169083151502179055505b6000600560149054906101000a900460ff16159050601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806128e35750601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156128ed57600090505b60008115612b0057601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561295057506000601154115b156129ea5761297d606461296f601154886130f690919063ffffffff16565b61310c90919063ffffffff16565b9050601154601354826129909190613d1c565b61299a9190613d8d565b601560008282546129ab91906139d7565b92505081905550601154601254826129c39190613d1c565b6129cd9190613d8d565b601460008282546129de91906139d7565b92505081905550612adc565b601860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612a4557506000600e54115b15612adb57612a726064612a64600e54886130f690919063ffffffff16565b61310c90919063ffffffff16565b9050600e5460105482612a859190613d1c565b612a8f9190613d8d565b60156000828254612aa091906139d7565b92505081905550600e54600f5482612ab89190613d1c565b612ac29190613d8d565b60146000828254612ad391906139d7565b925050819055505b5b6000811115612af157612af0873083612c7c565b5b8085612afd91906144dc565b94505b612b0b878787612c7c565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167f02d59e6bf2c101e2d8367c2a27c51357eccfebcca0d09aa27c00e24e946c0d6a60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce290614208565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d519061429a565b60405180910390fd5b612d65838383613122565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de290614582565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e7e91906139d7565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612ee29190613587565b60405180910390a3612ef5848484613127565b50505050565b6000612f0630611111565b905060008190506000808303612f1e575050506130f3565b600754831115612f2e5760075492505b601960009054906101000a900460ff168015612f555750600584612f529190613d1c565b83115b15612f6a57600584612f679190613d1c565b92505b60008390506000479050612f7d8261312c565b6000612f92824761336990919063ffffffff16565b90506000612fbd86612faf601554856130f690919063ffffffff16565b61310c90919063ffffffff16565b905060006014819055506000601581905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051613015906145d3565b60006040518083038185875af1925050503d8060008114613052576040519150601f19603f3d011682016040523d82523d6000602084013e613057565b606091505b505080955050600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516130a3906145d3565b60006040518083038185875af1925050503d80600081146130e0576040519150601f19603f3d011682016040523d82523d6000602084013e6130e5565b606091505b505080955050505050505050505b50565b600081836131049190613d1c565b905092915050565b6000818361311a9190613d8d565b905092915050565b505050565b505050565b6000600267ffffffffffffffff811115613149576131486145e8565b5b6040519080825280602002602001820160405280156131775781602001602082028036833780820191505090505b509050308160008151811061318f5761318e614617565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613234573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613258919061465b565b8160018151811061326c5761326b614617565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506132d1307f000000000000000000000000000000000000000000000000000000000000000084611ee2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161333395949392919061478b565b600060405180830381600087803b15801561334d57600080fd5b505af1158015613361573d6000803e3d6000fd5b505050505050565b6000818361337791906144dc565b905092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133b957808201518184015260208101905061339e565b60008484015250505050565b6000601f19601f8301169050919050565b60006133e18261337f565b6133eb818561338a565b93506133fb81856020860161339b565b613404816133c5565b840191505092915050565b6000602082019050818103600083015261342981846133d6565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061345c82613431565b9050919050565b61346c81613451565b82525050565b60006040820190506134876000830185613463565b6134946020830184613463565b9392505050565b600080fd5b6134a981613451565b81146134b457600080fd5b50565b6000813590506134c6816134a0565b92915050565b6000819050919050565b6134df816134cc565b81146134ea57600080fd5b50565b6000813590506134fc816134d6565b92915050565b600080604083850312156135195761351861349b565b5b6000613527858286016134b7565b9250506020613538858286016134ed565b9150509250929050565b60008115159050919050565b61355781613542565b82525050565b6000602082019050613572600083018461354e565b92915050565b613581816134cc565b82525050565b600060208201905061359c6000830184613578565b92915050565b600080604083850312156135b9576135b861349b565b5b60006135c7858286016134ed565b92505060206135d8858286016134ed565b9150509250929050565b6000806000606084860312156135fb576135fa61349b565b5b6000613609868287016134b7565b935050602061361a868287016134b7565b925050604061362b868287016134ed565b9150509250925092565b600060ff82169050919050565b61364b81613635565b82525050565b60006020820190506136666000830184613642565b92915050565b6000606082019050613681600083018661354e565b61368e6020830185613578565b61369b6040830184613578565b949350505050565b6000602082840312156136b9576136b861349b565b5b60006136c7848285016134b7565b91505092915050565b6136d981613542565b81146136e457600080fd5b50565b6000813590506136f6816136d0565b92915050565b600080604083850312156137135761371261349b565b5b6000613721858286016134b7565b9250506020613732858286016136e7565b9150509250929050565b6000602082840312156137525761375161349b565b5b6000613760848285016136e7565b91505092915050565b600060208201905061377e6000830184613463565b92915050565b60006020828403121561379a5761379961349b565b5b60006137a8848285016134ed565b91505092915050565b60006060820190506137c6600083018661354e565b6137d3602083018561354e565b6137e0604083018461354e565b949350505050565b6000806000606084860312156138015761380061349b565b5b600061380f868287016136e7565b9350506020613820868287016134ed565b9250506040613831868287016134ed565b9150509250925092565b600060c0820190506138506000830189613578565b61385d6020830188613578565b61386a6040830187613578565b6138776060830186613578565b6138846080830185613578565b61389160a0830184613578565b979650505050505050565b600080604083850312156138b3576138b261349b565b5b60006138c1858286016134b7565b92505060206138d2858286016134b7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061392357607f821691505b602082108103613936576139356138dc565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061397260208361338a565b915061397d8261393c565b602082019050919050565b600060208201905081810360008301526139a181613965565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139e2826134cc565b91506139ed836134cc565b9250828201905080821115613a0557613a046139a8565b5b92915050565b7f546f74616c20627579206665652063616e6e6f7420626520686967686572207460008201527f68616e2031303025000000000000000000000000000000000000000000000000602082015250565b6000613a6760288361338a565b9150613a7282613a0b565b604082019050919050565b60006020820190508181036000830152613a9681613a5a565b9050919050565b6000606082019050613ab26000830186613578565b613abf6020830185613578565b613acc6040830184613578565b949350505050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000613b3060288361338a565b9150613b3b82613ad4565b604082019050919050565b60006020820190508181036000830152613b5f81613b23565b9050919050565b7f546f74616c2073656c6c206665652063616e6e6f74206265206869676865722060008201527f7468616e20313030250000000000000000000000000000000000000000000000602082015250565b6000613bc260298361338a565b9150613bcd82613b66565b604082019050919050565b60006020820190508181036000830152613bf181613bb5565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613c5460258361338a565b9150613c5f82613bf8565b604082019050919050565b60006020820190508181036000830152613c8381613c47565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b6000613ce660248361338a565b9150613cf182613c8a565b604082019050919050565b60006020820190508181036000830152613d1581613cd9565b9050919050565b6000613d27826134cc565b9150613d32836134cc565b9250828202613d40816134cc565b91508282048414831517613d5757613d566139a8565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613d98826134cc565b9150613da3836134cc565b925082613db357613db2613d5e565b5b828204905092915050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e30312520746f74616c20737570706c792e000000000000000000000000602082015250565b6000613e1a60348361338a565b9150613e2582613dbe565b604082019050919050565b60006020820190508181036000830152613e4981613e0d565b9050919050565b7f6d6178696d756d20616d6f756e742063616e742062652068696768657220746860008201527f616e206d696e696d756d00000000000000000000000000000000000000000000602082015250565b6000613eac602a8361338a565b9150613eb782613e50565b604082019050919050565b60006020820190508181036000830152613edb81613e9f565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b6000613f3e60398361338a565b9150613f4982613ee2565b604082019050919050565b60006020820190508181036000830152613f6d81613f31565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613fd060268361338a565b9150613fdb82613f74565b604082019050919050565b60006020820190508181036000830152613fff81613fc3565b9050919050565b7f43616e6e6f7420736574206d61785478206c6f776572207468616e20302e3225600082015250565b600061403c60208361338a565b915061404782614006565b602082019050919050565b6000602082019050818103600083015261406b8161402f565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006140ce60248361338a565b91506140d982614072565b604082019050919050565b600060208201905081810360008301526140fd816140c1565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061416060228361338a565b915061416b82614104565b604082019050919050565b6000602082019050818103600083015261418f81614153565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006141f260258361338a565b91506141fd82614196565b604082019050919050565b60006020820190508181036000830152614221816141e5565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061428460238361338a565b915061428f82614228565b604082019050919050565b600060208201905081810360008301526142b381614277565b9050919050565b7f5f7472616e736665723a3a2054726164696e67206973206e6f7420616374697660008201527f652e000000000000000000000000000000000000000000000000000000000000602082015250565b600061431660228361338a565b9150614321826142ba565b604082019050919050565b6000602082019050818103600083015261434581614309565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d617854782e0000000000000000000000000000000000000000000000000000602082015250565b60006143a860268361338a565b91506143b38261434c565b604082019050919050565b600060208201905081810360008301526143d78161439b565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b600061441460138361338a565b915061441f826143de565b602082019050919050565b6000602082019050818103600083015261444381614407565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d617854782e00000000000000000000000000000000000000000000000000602082015250565b60006144a660278361338a565b91506144b18261444a565b604082019050919050565b600060208201905081810360008301526144d581614499565b9050919050565b60006144e7826134cc565b91506144f2836134cc565b925082820390508181111561450a576145096139a8565b5b92915050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061456c60268361338a565b915061457782614510565b604082019050919050565b6000602082019050818103600083015261459b8161455f565b9050919050565b600081905092915050565b50565b60006145bd6000836145a2565b91506145c8826145ad565b600082019050919050565b60006145de826145b0565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050614655816134a0565b92915050565b6000602082840312156146715761467061349b565b5b600061467f84828501614646565b91505092915050565b6000819050919050565b6000819050919050565b60006146b76146b26146ad84614688565b614692565b6134cc565b9050919050565b6146c78161469c565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61470281613451565b82525050565b600061471483836146f9565b60208301905092915050565b6000602082019050919050565b6000614738826146cd565b61474281856146d8565b935061474d836146e9565b8060005b8381101561477e5781516147658882614708565b975061477083614720565b925050600181019050614751565b5085935050505092915050565b600060a0820190506147a06000830188613578565b6147ad60208301876146be565b81810360408301526147bf818661472d565b90506147ce6060830185613463565b6147db6080830184613578565b969550505050505056fea26469706673582212203b17342367e68bb9b74e9ae48e8721f339b8d8f8f3e0421104fa05c34833dbca64736f6c63430008130033
Deployed Bytecode
0x6080604052600436106101fd5760003560e01c80637ff6f7b91161010d578063c9b6c1ce116100a0578063e55648f41161006f578063e55648f41461074a578063f242ab4114610773578063f2fde38b1461079e578063f3cfad94146107c7578063fb42948a146107f057610204565b8063c9b6c1ce1461068b578063ca3608c3146106b4578063d7ff53e5146106dd578063dd62ed3e1461070d57610204565b8063a9059cbb116100dc578063a9059cbb146105cf578063bb931db21461060c578063c40b793b14610635578063c9567bf91461067457610204565b80637ff6f7b9146105135780638da5cb5b1461053c57806395d89b4114610567578063a457c2d71461059257610204565b8063336ddc29116101905780634ada218b1161015f5780634ada218b1461043e57806351b8dc7b14610469578063622fa7721461049257806370a08231146104bf578063715018a6146104fc57610204565b8063336ddc2914610386578063391822af146103af57806339509351146103d85780634482eea81461041557610204565b806321108a52116101cc57806321108a52146102c857806323b872dd146102f1578063313ce5671461032e5780633308740b1461035957610204565b806306fdde0314610209578063088c9eb414610234578063095ea7b31461026057806318160ddd1461029d57610204565b3661020457005b600080fd5b34801561021557600080fd5b5061021e610807565b60405161022b919061340f565b60405180910390f35b34801561024057600080fd5b50610249610899565b604051610257929190613472565b60405180910390f35b34801561026c57600080fd5b5061028760048036038101906102829190613502565b6108ea565b604051610294919061355d565b60405180910390f35b3480156102a957600080fd5b506102b2610908565b6040516102bf9190613587565b60405180910390f35b3480156102d457600080fd5b506102ef60048036038101906102ea91906135a2565b610912565b005b3480156102fd57600080fd5b50610318600480360381019061031391906135e2565b610a3d565b604051610325919061355d565b60405180910390f35b34801561033a57600080fd5b50610343610b35565b6040516103509190613651565b60405180910390f35b34801561036557600080fd5b5061036e610b3e565b60405161037d9392919061366c565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a891906136a3565b610b64565b005b3480156103bb57600080fd5b506103d660048036038101906103d191906135a2565b610ca0565b005b3480156103e457600080fd5b506103ff60048036038101906103fa9190613502565b610dcb565b60405161040c919061355d565b60405180910390f35b34801561042157600080fd5b5061043c600480360381019061043791906136fc565b610e77565b005b34801561044a57600080fd5b50610453610f9c565b604051610460919061355d565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b91906136a3565b610faf565b005b34801561049e57600080fd5b506104a76110eb565b6040516104b69392919061366c565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e191906136a3565b611111565b6040516104f39190613587565b60405180910390f35b34801561050857600080fd5b50610511611159565b005b34801561051f57600080fd5b5061053a6004803603810190610535919061373c565b6111e1565b005b34801561054857600080fd5b5061055161127a565b60405161055e9190613769565b60405180910390f35b34801561057357600080fd5b5061057c6112a4565b604051610589919061340f565b60405180910390f35b34801561059e57600080fd5b506105b960048036038101906105b49190613502565b611336565b6040516105c6919061355d565b60405180910390f35b3480156105db57600080fd5b506105f660048036038101906105f19190613502565b611421565b604051610603919061355d565b60405180910390f35b34801561061857600080fd5b50610633600480360381019061062e9190613784565b61143f565b005b34801561064157600080fd5b5061065c600480360381019061065791906136a3565b611561565b60405161066b939291906137b1565b60405180910390f35b34801561068057600080fd5b5061068961165a565b005b34801561069757600080fd5b506106b260048036038101906106ad91906136fc565b61173b565b005b3480156106c057600080fd5b506106db60048036038101906106d691906137e8565b611860565b005b3480156106e957600080fd5b506106f2611a09565b6040516107049695949392919061383b565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f919061389c565b611a38565b6040516107419190613587565b60405180910390f35b34801561075657600080fd5b50610771600480360381019061076c91906136fc565b611abf565b005b34801561077f57600080fd5b50610788611bd7565b6040516107959190613769565b60405180910390f35b3480156107aa57600080fd5b506107c560048036038101906107c091906136a3565b611bfb565b005b3480156107d357600080fd5b506107ee60048036038101906107e99190613784565b611cf2565b005b3480156107fc57600080fd5b50610805611e14565b005b6060600380546108169061390b565b80601f01602080910402602001604051908101604052809291908181526020018280546108429061390b565b801561088f5780601f106108645761010080835404028352916020019161088f565b820191906000526020600020905b81548152906001019060200180831161087257829003601f168201915b5050505050905090565b600080600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915091509091565b60006108fe6108f7611eda565b8484611ee2565b6001905092915050565b6000600254905090565b61091a611eda565b73ffffffffffffffffffffffffffffffffffffffff1661093861127a565b73ffffffffffffffffffffffffffffffffffffffff161461098e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098590613988565b60405180910390fd5b81600f8190555080601081905550601054600f546109ac91906139d7565b600e819055506064600e5411156109f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ef90613a7d565b60405180910390fd5b7f38513c502b0ab4834ac1df9502b76f75dcf7092469782cfd0db7fe664388e25e600e54600f54601054604051610a3193929190613a9d565b60405180910390a15050565b6000610a4a8484846120ab565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610a95611eda565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0c90613b46565b60405180910390fd5b610b2985610b21611eda565b858403611ee2565b60019150509392505050565b60006012905090565b6000806000600860009054906101000a900460ff1692506009549150600a549050909192565b610b6c611eda565b73ffffffffffffffffffffffffffffffffffffffff16610b8a61127a565b73ffffffffffffffffffffffffffffffffffffffff1614610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd790613988565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fb91dbdeaf34f885ccae2d8abc3967cb03c079b6af2c7944e3893fd29427d75e760405160405180910390a380600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610ca8611eda565b73ffffffffffffffffffffffffffffffffffffffff16610cc661127a565b73ffffffffffffffffffffffffffffffffffffffff1614610d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1390613988565b60405180910390fd5b8160128190555080601381905550601354601254610d3a91906139d7565b60118190555060646011541115610d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7d90613bd8565b60405180910390fd5b7fcb5f36df892836a2eaedc349de29a7581176990398ee185d16eaa8f6c1abd8f1601154601254601354604051610dbf93929190613a9d565b60405180910390a15050565b6000610e6d610dd8611eda565b848460016000610de6611eda565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e6891906139d7565b611ee2565b6001905092915050565b610e7f611eda565b73ffffffffffffffffffffffffffffffffffffffff16610e9d61127a565b73ffffffffffffffffffffffffffffffffffffffff1614610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea90613988565b60405180910390fd5b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc9282604051610f90919061355d565b60405180910390a25050565b600c60009054906101000a900460ff1681565b610fb7611eda565b73ffffffffffffffffffffffffffffffffffffffff16610fd561127a565b73ffffffffffffffffffffffffffffffffffffffff161461102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102290613988565b60405180910390fd5b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6760405160405180910390a380600c60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000600560159054906101000a900460ff16925060065491506007549050909192565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611161611eda565b73ffffffffffffffffffffffffffffffffffffffff1661117f61127a565b73ffffffffffffffffffffffffffffffffffffffff16146111d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cc90613988565b60405180910390fd5b6111df6000612b15565b565b6111e9611eda565b73ffffffffffffffffffffffffffffffffffffffff1661120761127a565b73ffffffffffffffffffffffffffffffffffffffff161461125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125490613988565b60405180910390fd5b80601960006101000a81548160ff02191690831515021790555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546112b39061390b565b80601f01602080910402602001604051908101604052809291908181526020018280546112df9061390b565b801561132c5780601f106113015761010080835404028352916020019161132c565b820191906000526020600020905b81548152906001019060200180831161130f57829003601f168201915b5050505050905090565b60008060016000611345611eda565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990613c6a565b60405180910390fd5b61141661140d611eda565b85858403611ee2565b600191505092915050565b600061143561142e611eda565b84846120ab565b6001905092915050565b611447611eda565b73ffffffffffffffffffffffffffffffffffffffff1661146561127a565b73ffffffffffffffffffffffffffffffffffffffff16146114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b290613988565b60405180910390fd5b60058110156114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f690613cfc565b60405180910390fd5b6103e861150a610908565b826115159190613d1c565b61151f9190613d8d565b6009819055507f12528a3c61e0f3b2d6fc707a9fc58b1af86e252cad0d7f4c154ebeabb162dace6009546040516115569190613587565b60405180910390a150565b6000806000601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169250601760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169150601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690509193909250565b611662611eda565b73ffffffffffffffffffffffffffffffffffffffff1661168061127a565b73ffffffffffffffffffffffffffffffffffffffff16146116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd90613988565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055506001600560156101000a81548160ff021916908315150217905550427fb3da2db3dfc3778f99852546c6e9ab39ec253f9de7b0847afec61bd27878e92360405160405180910390a2565b611743611eda565b73ffffffffffffffffffffffffffffffffffffffff1661176161127a565b73ffffffffffffffffffffffffffffffffffffffff16146117b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ae90613988565b60405180910390fd5b80601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611854919061355d565b60405180910390a25050565b611868611eda565b73ffffffffffffffffffffffffffffffffffffffff1661188661127a565b73ffffffffffffffffffffffffffffffffffffffff16146118dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d390613988565b60405180910390fd5b6001821015611920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191790613e30565b60405180910390fd5b81811015611963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195a90613ec2565b60405180910390fd5b82600560156101000a81548160ff02191690831515021790555061271082611989610908565b6119939190613d1c565b61199d9190613d8d565b600681905550612710816119af610908565b6119b99190613d1c565b6119c39190613d8d565b6007819055507f52cd2cdb42ff0eeec9362d7ed5b04f64c8d022697128b5378fc51cea7e63c7798383836040516119fc9392919061366c565b60405180910390a1505050565b600080600080600080600e549550600f5494506010549350601154925060125491506013549050909192939495565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611ac7611eda565b73ffffffffffffffffffffffffffffffffffffffff16611ae561127a565b73ffffffffffffffffffffffffffffffffffffffff1614611b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3290613988565b60405180910390fd5b7f0000000000000000000000002f9cc7319f542ee08406264056e31c1a2aa3619773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc090613f54565b60405180910390fd5b611bd38282612bdb565b5050565b7f0000000000000000000000002f9cc7319f542ee08406264056e31c1a2aa3619781565b611c03611eda565b73ffffffffffffffffffffffffffffffffffffffff16611c2161127a565b73ffffffffffffffffffffffffffffffffffffffff1614611c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6e90613988565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdd90613fe6565b60405180910390fd5b611cef81612b15565b50565b611cfa611eda565b73ffffffffffffffffffffffffffffffffffffffff16611d1861127a565b73ffffffffffffffffffffffffffffffffffffffff1614611d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6590613988565b60405180910390fd5b6002811015611db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da990614052565b60405180910390fd5b6103e8611dbd610908565b82611dc89190613d1c565b611dd29190613d8d565b600a819055507fff3dd5e80294197918c284bbfc3dadd97d0b40ce92106110946329088f80068a600a54604051611e099190613587565b60405180910390a150565b611e1c611eda565b73ffffffffffffffffffffffffffffffffffffffff16611e3a61127a565b73ffffffffffffffffffffffffffffffffffffffff1614611e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8790613988565b60405180910390fd5b6000600860006101000a81548160ff021916908315150217905550427ff4eaa75eae08ae80c3daf791438dac1cff2cfd3b0bad2304ec7bbb067e50261660405160405180910390a2565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f48906140e4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb790614176565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161209e9190613587565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361211a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211190614208565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612189576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121809061429a565b60405180910390fd5b600081036121a25761219d83836000612c7c565b612b10565b600860009054906101000a900460ff161561269d576121bf61127a565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561222d57506121fd61127a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156122665750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156122a0575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156122b95750600560149054906101000a900460ff16155b1561269c57600c60009054906101000a900460ff166123b357601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806123735750601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6123b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a99061432c565b60405180910390fd5b5b601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156124565750601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156124fd57600a548111156124a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612497906143be565b60405180910390fd5b6009546124ac83611111565b826124b791906139d7565b11156124f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ef9061442a565b60405180910390fd5b61269b565b601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156125a05750601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156125ef57600a548111156125ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e1906144bc565b60405180910390fd5b61269a565b601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166126995760095461264c83611111565b8261265791906139d7565b1115612698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268f9061442a565b60405180910390fd5b5b5b5b5b5b60006126a830611111565b9050600060065482101590508080156126cd5750600560159054906101000a900460ff165b80156126e65750600560149054906101000a900460ff16155b801561273c5750601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156127925750601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156127e85750601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561282d576001600560146101000a81548160ff02191690831515021790555061281183612efb565b6000600560146101000a81548160ff0219169083151502179055505b6000600560149054906101000a900460ff16159050601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806128e35750601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156128ed57600090505b60008115612b0057601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561295057506000601154115b156129ea5761297d606461296f601154886130f690919063ffffffff16565b61310c90919063ffffffff16565b9050601154601354826129909190613d1c565b61299a9190613d8d565b601560008282546129ab91906139d7565b92505081905550601154601254826129c39190613d1c565b6129cd9190613d8d565b601460008282546129de91906139d7565b92505081905550612adc565b601860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612a4557506000600e54115b15612adb57612a726064612a64600e54886130f690919063ffffffff16565b61310c90919063ffffffff16565b9050600e5460105482612a859190613d1c565b612a8f9190613d8d565b60156000828254612aa091906139d7565b92505081905550600e54600f5482612ab89190613d1c565b612ac29190613d8d565b60146000828254612ad391906139d7565b925050819055505b5b6000811115612af157612af0873083612c7c565b5b8085612afd91906144dc565b94505b612b0b878787612c7c565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167f02d59e6bf2c101e2d8367c2a27c51357eccfebcca0d09aa27c00e24e946c0d6a60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce290614208565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d519061429a565b60405180910390fd5b612d65838383613122565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de290614582565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e7e91906139d7565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612ee29190613587565b60405180910390a3612ef5848484613127565b50505050565b6000612f0630611111565b905060008190506000808303612f1e575050506130f3565b600754831115612f2e5760075492505b601960009054906101000a900460ff168015612f555750600584612f529190613d1c565b83115b15612f6a57600584612f679190613d1c565b92505b60008390506000479050612f7d8261312c565b6000612f92824761336990919063ffffffff16565b90506000612fbd86612faf601554856130f690919063ffffffff16565b61310c90919063ffffffff16565b905060006014819055506000601581905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051613015906145d3565b60006040518083038185875af1925050503d8060008114613052576040519150601f19603f3d011682016040523d82523d6000602084013e613057565b606091505b505080955050600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516130a3906145d3565b60006040518083038185875af1925050503d80600081146130e0576040519150601f19603f3d011682016040523d82523d6000602084013e6130e5565b606091505b505080955050505050505050505b50565b600081836131049190613d1c565b905092915050565b6000818361311a9190613d8d565b905092915050565b505050565b505050565b6000600267ffffffffffffffff811115613149576131486145e8565b5b6040519080825280602002602001820160405280156131775781602001602082028036833780820191505090505b509050308160008151811061318f5761318e614617565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613234573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613258919061465b565b8160018151811061326c5761326b614617565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506132d1307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611ee2565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161333395949392919061478b565b600060405180830381600087803b15801561334d57600080fd5b505af1158015613361573d6000803e3d6000fd5b505050505050565b6000818361337791906144dc565b905092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133b957808201518184015260208101905061339e565b60008484015250505050565b6000601f19601f8301169050919050565b60006133e18261337f565b6133eb818561338a565b93506133fb81856020860161339b565b613404816133c5565b840191505092915050565b6000602082019050818103600083015261342981846133d6565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061345c82613431565b9050919050565b61346c81613451565b82525050565b60006040820190506134876000830185613463565b6134946020830184613463565b9392505050565b600080fd5b6134a981613451565b81146134b457600080fd5b50565b6000813590506134c6816134a0565b92915050565b6000819050919050565b6134df816134cc565b81146134ea57600080fd5b50565b6000813590506134fc816134d6565b92915050565b600080604083850312156135195761351861349b565b5b6000613527858286016134b7565b9250506020613538858286016134ed565b9150509250929050565b60008115159050919050565b61355781613542565b82525050565b6000602082019050613572600083018461354e565b92915050565b613581816134cc565b82525050565b600060208201905061359c6000830184613578565b92915050565b600080604083850312156135b9576135b861349b565b5b60006135c7858286016134ed565b92505060206135d8858286016134ed565b9150509250929050565b6000806000606084860312156135fb576135fa61349b565b5b6000613609868287016134b7565b935050602061361a868287016134b7565b925050604061362b868287016134ed565b9150509250925092565b600060ff82169050919050565b61364b81613635565b82525050565b60006020820190506136666000830184613642565b92915050565b6000606082019050613681600083018661354e565b61368e6020830185613578565b61369b6040830184613578565b949350505050565b6000602082840312156136b9576136b861349b565b5b60006136c7848285016134b7565b91505092915050565b6136d981613542565b81146136e457600080fd5b50565b6000813590506136f6816136d0565b92915050565b600080604083850312156137135761371261349b565b5b6000613721858286016134b7565b9250506020613732858286016136e7565b9150509250929050565b6000602082840312156137525761375161349b565b5b6000613760848285016136e7565b91505092915050565b600060208201905061377e6000830184613463565b92915050565b60006020828403121561379a5761379961349b565b5b60006137a8848285016134ed565b91505092915050565b60006060820190506137c6600083018661354e565b6137d3602083018561354e565b6137e0604083018461354e565b949350505050565b6000806000606084860312156138015761380061349b565b5b600061380f868287016136e7565b9350506020613820868287016134ed565b9250506040613831868287016134ed565b9150509250925092565b600060c0820190506138506000830189613578565b61385d6020830188613578565b61386a6040830187613578565b6138776060830186613578565b6138846080830185613578565b61389160a0830184613578565b979650505050505050565b600080604083850312156138b3576138b261349b565b5b60006138c1858286016134b7565b92505060206138d2858286016134b7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061392357607f821691505b602082108103613936576139356138dc565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061397260208361338a565b915061397d8261393c565b602082019050919050565b600060208201905081810360008301526139a181613965565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139e2826134cc565b91506139ed836134cc565b9250828201905080821115613a0557613a046139a8565b5b92915050565b7f546f74616c20627579206665652063616e6e6f7420626520686967686572207460008201527f68616e2031303025000000000000000000000000000000000000000000000000602082015250565b6000613a6760288361338a565b9150613a7282613a0b565b604082019050919050565b60006020820190508181036000830152613a9681613a5a565b9050919050565b6000606082019050613ab26000830186613578565b613abf6020830185613578565b613acc6040830184613578565b949350505050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000613b3060288361338a565b9150613b3b82613ad4565b604082019050919050565b60006020820190508181036000830152613b5f81613b23565b9050919050565b7f546f74616c2073656c6c206665652063616e6e6f74206265206869676865722060008201527f7468616e20313030250000000000000000000000000000000000000000000000602082015250565b6000613bc260298361338a565b9150613bcd82613b66565b604082019050919050565b60006020820190508181036000830152613bf181613bb5565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613c5460258361338a565b9150613c5f82613bf8565b604082019050919050565b60006020820190508181036000830152613c8381613c47565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b6000613ce660248361338a565b9150613cf182613c8a565b604082019050919050565b60006020820190508181036000830152613d1581613cd9565b9050919050565b6000613d27826134cc565b9150613d32836134cc565b9250828202613d40816134cc565b91508282048414831517613d5757613d566139a8565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613d98826134cc565b9150613da3836134cc565b925082613db357613db2613d5e565b5b828204905092915050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e30312520746f74616c20737570706c792e000000000000000000000000602082015250565b6000613e1a60348361338a565b9150613e2582613dbe565b604082019050919050565b60006020820190508181036000830152613e4981613e0d565b9050919050565b7f6d6178696d756d20616d6f756e742063616e742062652068696768657220746860008201527f616e206d696e696d756d00000000000000000000000000000000000000000000602082015250565b6000613eac602a8361338a565b9150613eb782613e50565b604082019050919050565b60006020820190508181036000830152613edb81613e9f565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b6000613f3e60398361338a565b9150613f4982613ee2565b604082019050919050565b60006020820190508181036000830152613f6d81613f31565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613fd060268361338a565b9150613fdb82613f74565b604082019050919050565b60006020820190508181036000830152613fff81613fc3565b9050919050565b7f43616e6e6f7420736574206d61785478206c6f776572207468616e20302e3225600082015250565b600061403c60208361338a565b915061404782614006565b602082019050919050565b6000602082019050818103600083015261406b8161402f565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006140ce60248361338a565b91506140d982614072565b604082019050919050565b600060208201905081810360008301526140fd816140c1565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061416060228361338a565b915061416b82614104565b604082019050919050565b6000602082019050818103600083015261418f81614153565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006141f260258361338a565b91506141fd82614196565b604082019050919050565b60006020820190508181036000830152614221816141e5565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061428460238361338a565b915061428f82614228565b604082019050919050565b600060208201905081810360008301526142b381614277565b9050919050565b7f5f7472616e736665723a3a2054726164696e67206973206e6f7420616374697660008201527f652e000000000000000000000000000000000000000000000000000000000000602082015250565b600061431660228361338a565b9150614321826142ba565b604082019050919050565b6000602082019050818103600083015261434581614309565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d617854782e0000000000000000000000000000000000000000000000000000602082015250565b60006143a860268361338a565b91506143b38261434c565b604082019050919050565b600060208201905081810360008301526143d78161439b565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b600061441460138361338a565b915061441f826143de565b602082019050919050565b6000602082019050818103600083015261444381614407565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d617854782e00000000000000000000000000000000000000000000000000602082015250565b60006144a660278361338a565b91506144b18261444a565b604082019050919050565b600060208201905081810360008301526144d581614499565b9050919050565b60006144e7826134cc565b91506144f2836134cc565b925082820390508181111561450a576145096139a8565b5b92915050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061456c60268361338a565b915061457782614510565b604082019050919050565b6000602082019050818103600083015261459b8161455f565b9050919050565b600081905092915050565b50565b60006145bd6000836145a2565b91506145c8826145ad565b600082019050919050565b60006145de826145b0565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050614655816134a0565b92915050565b6000602082840312156146715761467061349b565b5b600061467f84828501614646565b91505092915050565b6000819050919050565b6000819050919050565b60006146b76146b26146ad84614688565b614692565b6134cc565b9050919050565b6146c78161469c565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61470281613451565b82525050565b600061471483836146f9565b60208301905092915050565b6000602082019050919050565b6000614738826146cd565b61474281856146d8565b935061474d836146e9565b8060005b8381101561477e5781516147658882614708565b975061477083614720565b925050600181019050614751565b5085935050505092915050565b600060a0820190506147a06000830188613578565b6147ad60208301876146be565b81810360408301526147bf818661472d565b90506147ce6060830185613463565b6147db6080830184613578565b969550505050505056fea26469706673582212203b17342367e68bb9b74e9ae48e8721f339b8d8f8f3e0421104fa05c34833dbca64736f6c63430008130033
Deployed Bytecode Sourcemap
25449:20260:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11047:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38097:193;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;13280:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12167:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33524:403;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13952:529;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12009:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37619:246;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;36380:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34216:455;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14886:290;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33035:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25977:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36019:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36914:358;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;12338:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22386:103;;;;;;;;;;;;;:::i;:::-;;44524:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21735:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11266:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15675:475;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12694:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32477:290;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39811:453;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;30273:162;;;;;;;;;;;;;:::i;:::-;;34920:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31194:555;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38774:577;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;12957:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35426:241;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25574:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22644:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31992:267;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30590:140;;;;;;;;;;;;;:::i;:::-;;11047:100;11101:13;11134:5;11127:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11047:100;:::o;38097:193::-;38177:24;38203:22;38251:15;;;;;;;;;;;38268:13;;;;;;;;;;;38243:39;;;;38097:193;;:::o;13280:194::-;13388:4;13405:39;13414:12;:10;:12::i;:::-;13428:7;13437:6;13405:8;:39::i;:::-;13462:4;13455:11;;13280:194;;;;:::o;12167:108::-;12228:7;12255:12;;12248:19;;12167:108;:::o;33524:403::-;21966:12;:10;:12::i;:::-;21955:23;;:7;:5;:7::i;:::-;:23;;;21947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33660:13:::1;33642:15;:31;;;;33700:7;33684:13;:23;;;;33750:13;;33732:15;;:31;;;;:::i;:::-;33718:11;:45;;;;33797:3;33782:11;;:18;;33774:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;33861:58;33875:11;;33888:15;;33905:13;;33861:58;;;;;;;;:::i;:::-;;;;;;;;33524:403:::0;;:::o;13952:529::-;14092:4;14109:36;14119:6;14127:9;14138:6;14109:9;:36::i;:::-;14158:24;14185:11;:19;14197:6;14185:19;;;;;;;;;;;;;;;:33;14205:12;:10;:12::i;:::-;14185:33;;;;;;;;;;;;;;;;14158:60;;14271:6;14251:16;:26;;14229:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;14381:57;14390:6;14398:12;:10;:12::i;:::-;14431:6;14412:16;:25;14381:8;:57::i;:::-;14469:4;14462:11;;;13952:529;;;;;:::o;12009:93::-;12067:5;12092:2;12085:9;;12009:93;:::o;37619:246::-;37696:19;37717:18;37737:14;37786:13;;;;;;;;;;;37769:30;;37823:9;;37810:22;;37852:5;;37843:14;;37619:246;;;:::o;36380:175::-;21966:12;:10;:12::i;:::-;21955:23;;:7;:5;:7::i;:::-;:23;;;21947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36497:13:::1;;;;;;;;;;;36465:46;;36486:9;36465:46;;;;;;;;;;;;36538:9;36522:13;;:25;;;;;;;;;;;;;;;;;;36380:175:::0;:::o;34216:455::-;21966:12;:10;:12::i;:::-;21955:23;;:7;:5;:7::i;:::-;:23;;;21947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34357:13:::1;34338:16;:32;;;;34398:7;34381:14;:24;;;;34450:14;;34431:16;;:33;;;;:::i;:::-;34416:12;:48;;;;34513:3;34497:12;;:19;;34475:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;34601:62;34616:12;;34630:16;;34648:14;;34601:62;;;;;;;;:::i;:::-;;;;;;;;34216:455:::0;;:::o;14886:290::-;14999:4;15016:130;15039:12;:10;:12::i;:::-;15066:7;15125:10;15088:11;:25;15100:12;:10;:12::i;:::-;15088:25;;;;;;;;;;;;;;;:34;15114:7;15088:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;15016:8;:130::i;:::-;15164:4;15157:11;;14886:290;;;;:::o;33035:202::-;21966:12;:10;:12::i;:::-;21955:23;;:7;:5;:7::i;:::-;:23;;;21947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33178:4:::1;33148:19;:27;33168:6;33148:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;33216:6;33198:31;;;33224:4;33198:31;;;;;;:::i;:::-;;;;;;;;33035:202:::0;;:::o;25977:34::-;;;;;;;;;;;;;:::o;36019:181::-;21966:12;:10;:12::i;:::-;21955:23;;:7;:5;:7::i;:::-;:23;;;21947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36138:15:::1;;;;;;;;;;;36104:50;;36127:9;36104:50;;;;;;;;;;;;36183:9;36165:15;;:27;;;;;;;;;;;;;;;;;;36019:181:::0;:::o;36914:358::-;37007:21;37043:25;37083;37155:15;;;;;;;;;;;37136:34;;37201:16;;37181:36;;37248:16;;37228:36;;36914:358;;;:::o;12338:143::-;12428:7;12455:9;:18;12465:7;12455:18;;;;;;;;;;;;;;;;12448:25;;12338:143;;;:::o;22386:103::-;21966:12;:10;:12::i;:::-;21955:23;;:7;:5;:7::i;:::-;:23;;;21947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22451:30:::1;22478:1;22451:18;:30::i;:::-;22386:103::o:0;44524:79::-;21966:12;:10;:12::i;:::-;21955:23;;:7;:5;:7::i;:::-;:23;;;21947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44590:5:::1;44583:4;;:12;;;;;;;;;;;;;;;;;;44524:79:::0;:::o;21735:87::-;21781:7;21808:6;;;;;;;;;;;21801:13;;21735:87;:::o;11266:104::-;11322:13;11355:7;11348:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11266:104;:::o;15675:475::-;15793:4;15810:24;15837:11;:25;15849:12;:10;:12::i;:::-;15837:25;;;;;;;;;;;;;;;:34;15863:7;15837:34;;;;;;;;;;;;;;;;15810:61;;15924:15;15904:16;:35;;15882:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;16040:67;16049:12;:10;:12::i;:::-;16063:7;16091:15;16072:16;:34;16040:8;:67::i;:::-;16138:4;16131:11;;;15675:475;;;;:::o;12694:200::-;12805:4;12822:42;12832:12;:10;:12::i;:::-;12846:9;12857:6;12822:9;:42::i;:::-;12882:4;12875:11;;12694:200;;;;:::o;32477:290::-;21966:12;:10;:12::i;:::-;21955:23;;:7;:5;:7::i;:::-;:23;;;21947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32609:1:::1;32588:17;:22;;32580:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;32712:4;32695:13;:11;:13::i;:::-;32675:17;:33;;;;:::i;:::-;32674:42;;;;:::i;:::-;32662:9;:54;;;;32732:27;32749:9;;32732:27;;;;;;:::i;:::-;;;;;;;;32477:290:::0;:::o;39811:453::-;39936:23;39974:25;40014:31;40094:17;:26;40112:7;40094:26;;;;;;;;;;;;;;;;;;;;;;;;;40073:47;;40154:19;:28;40174:7;40154:28;;;;;;;;;;;;;;;;;;;;;;;;;40131:51;;40222:25;:34;40248:7;40222:34;;;;;;;;;;;;;;;;;;;;;;;;;40193:63;;39811:453;;;;;:::o;30273:162::-;21966:12;:10;:12::i;:::-;21955:23;;:7;:5;:7::i;:::-;:23;;;21947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30343:4:::1;30326:14;;:21;;;;;;;;;;;;;;;;;;30376:4;30358:15;;:22;;;;;;;;;;;;;;;;;;30411:15;30396:31;;;;;;;;;;30273:162::o:0;34920:212::-;21966:12;:10;:12::i;:::-;21955:23;;:7;:5;:7::i;:::-;:23;;;21947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35066:8:::1;35037:17;:26;35055:7;35037:26;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;35106:7;35090:34;;;35115:8;35090:34;;;;;;:::i;:::-;;;;;;;;34920:212:::0;;:::o;31194:555::-;21966:12;:10;:12::i;:::-;21955:23;;:7;:5;:7::i;:::-;:23;;;21947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31364:1:::1;31356:4;:9;;31334:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;31472:4;31464;:12;;31456:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;31554:7;31536:15;;:25;;;;;;;;;;;;;;;;;;31616:5;31608:4;31592:13;:11;:13::i;:::-;:20;;;;:::i;:::-;31591:30;;;;:::i;:::-;31572:16;:49;;;;31676:5;31668:4;31652:13;:11;:13::i;:::-;:20;;;;:::i;:::-;31651:30;;;;:::i;:::-;31632:16;:49;;;;31697:44;31721:7;31730:4;31736;31697:44;;;;;;;;:::i;:::-;;;;;;;;31194:555:::0;;;:::o;38774:577::-;38864:20;38899:24;38938:22;38975:21;39011:25;39051:23;39117:11;;39102:26;;39158:15;;39139:34;;39201:13;;39184:30;;39241:12;;39225:28;;39284:16;;39264:36;;39329:14;;39311:32;;38774:577;;;;;;:::o;12957:176::-;13071:7;13098:11;:18;13110:5;13098:18;;;;;;;;;;;;;;;:27;13117:7;13098:27;;;;;;;;;;;;;;;;13091:34;;12957:176;;;;:::o;35426:241::-;21966:12;:10;:12::i;:::-;21955:23;;:7;:5;:7::i;:::-;:23;;;21947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35530:7:::1;35522:15;;:4;:15;;::::0;35500:122:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;35635:24;35647:4;35653:5;35635:11;:24::i;:::-;35426:241:::0;;:::o;25574:32::-;;;:::o;22644:238::-;21966:12;:10;:12::i;:::-;21955:23;;:7;:5;:7::i;:::-;:23;;;21947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22767:1:::1;22747:22;;:8;:22;;::::0;22725:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22846:28;22865:8;22846:18;:28::i;:::-;22644:238:::0;:::o;31992:267::-;21966:12;:10;:12::i;:::-;21955:23;;:7;:5;:7::i;:::-;:23;;;21947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32121:1:::1;32104:13;:18;;32096:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;32212:4;32195:13;:11;:13::i;:::-;32179;:29;;;;:::i;:::-;32178:38;;;;:::i;:::-;32170:5;:46;;;;32232:19;32245:5;;32232:19;;;;;;:::i;:::-;;;;;;;;31992:267:::0;:::o;30590:140::-;21966:12;:10;:12::i;:::-;21955:23;;:7;:5;:7::i;:::-;:23;;;21947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30671:5:::1;30655:13;;:21;;;;;;;;;;;;;;;;;;30706:15;30692:30;;;;;;;;;;30590:140::o:0;10053:98::-;10106:7;10133:10;10126:17;;10053:98;:::o;19458:380::-;19611:1;19594:19;;:5;:19;;;19586:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19692:1;19673:21;;:7;:21;;;19665:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19776:6;19746:11;:18;19758:5;19746:18;;;;;;;;;;;;;;;:27;19765:7;19746:27;;;;;;;;;;;;;;;:36;;;;19814:7;19798:32;;19807:5;19798:32;;;19823:6;19798:32;;;;;;:::i;:::-;;;;;;;;19458:380;;;:::o;40272:3640::-;40420:1;40404:18;;:4;:18;;;40396:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40497:1;40483:16;;:2;:16;;;40475:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;40566:1;40556:6;:11;40552:93;;40584:28;40600:4;40606:2;40610:1;40584:15;:28::i;:::-;40627:7;;40552:93;40661:13;;;;;;;;;;;40657:1564;;;40721:7;:5;:7::i;:::-;40713:15;;:4;:15;;;;:49;;;;;40755:7;:5;:7::i;:::-;40749:13;;:2;:13;;;;40713:49;:86;;;;;40797:1;40783:16;;:2;:16;;;;40713:86;:128;;;;;40834:6;40820:21;;:2;:21;;;;40713:128;:158;;;;;40863:8;;;;;;;;;;;40862:9;40713:158;40691:1519;;;40911:14;;;;;;;;;;;40906:232;;40984:17;:23;41002:4;40984:23;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;;41011:17;:21;41029:2;41011:21;;;;;;;;;;;;;;;;;;;;;;;;;40984:48;40950:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;40906:232;41212:25;:31;41238:4;41212:31;;;;;;;;;;;;;;;;;;;;;;;;;:59;;;;;41248:19;:23;41268:2;41248:23;;;;;;;;;;;;;;;;;;;;;;;;;41247:24;41212:59;41186:1009;;;41358:5;;41348:6;:15;;41314:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;41536:9;;41519:13;41529:2;41519:9;:13::i;:::-;41510:6;:22;;;;:::i;:::-;:35;;41476:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;41186:1009;;;41714:25;:29;41740:2;41714:29;;;;;;;;;;;;;;;;;;;;;;;;;:59;;;;;41748:19;:25;41768:4;41748:25;;;;;;;;;;;;;;;;;;;;;;;;;41747:26;41714:59;41688:507;;;41860:5;;41850:6;:15;;41816:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;41688:507;;;41987:19;:23;42007:2;41987:23;;;;;;;;;;;;;;;;;;;;;;;;;41982:213;;42095:9;;42078:13;42088:2;42078:9;:13::i;:::-;42069:6;:22;;;;:::i;:::-;:35;;42035:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;41982:213;41688:507;41186:1009;40691:1519;40657:1564;42233:28;42264:24;42282:4;42264:9;:24::i;:::-;42233:55;;42301:12;42340:16;;42316:20;:40;;42301:55;;42387:7;:39;;;;;42411:15;;;;;;;;;;;42387:39;:65;;;;;42444:8;;;;;;;;;;;42443:9;42387:65;:114;;;;;42470:25;:31;42496:4;42470:31;;;;;;;;;;;;;;;;;;;;;;;;;42469:32;42387:114;:155;;;;;42519:17;:23;42537:4;42519:23;;;;;;;;;;;;;;;;;;;;;;;;;42518:24;42387:155;:194;;;;;42560:17;:21;42578:2;42560:21;;;;;;;;;;;;;;;;;;;;;;;;;42559:22;42387:194;42369:332;;;42619:4;42608:8;;:15;;;;;;;;;;;;;;;;;;42640:16;42649:6;42640:8;:16::i;:::-;42684:5;42673:8;;:16;;;;;;;;;;;;;;;;;;42369:332;42713:12;42729:8;;;;;;;;;;;42728:9;42713:24;;42839:17;:23;42857:4;42839:23;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;;42866:17;:21;42884:2;42866:21;;;;;;;;;;;;;;;;;;;;;;;;;42839:48;42835:96;;;42914:5;42904:15;;42835:96;42943:12;43048:7;43044:815;;;43100:25;:29;43126:2;43100:29;;;;;;;;;;;;;;;;;;;;;;;;;:49;;;;;43148:1;43133:12;;:16;43100:49;43096:614;;;43177:33;43206:3;43177:24;43188:12;;43177:6;:10;;:24;;;;:::i;:::-;:28;;:33;;;;:::i;:::-;43170:40;;43275:12;;43257:14;;43250:4;:21;;;;:::i;:::-;43249:38;;;;:::i;:::-;43229:16;;:58;;;;;;;:::i;:::-;;;;;;;;43356:12;;43336:16;;43329:4;:23;;;;:::i;:::-;43328:40;;;;:::i;:::-;43306:18;;:62;;;;;;;:::i;:::-;;;;;;;;43096:614;;;43430:25;:31;43456:4;43430:31;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;;43479:1;43465:11;;:15;43430:50;43426:284;;;43508:32;43536:3;43508:23;43519:11;;43508:6;:10;;:23;;;;:::i;:::-;:27;;:32;;;;:::i;:::-;43501:39;;43604:11;;43587:13;;43580:4;:20;;;;:::i;:::-;43579:36;;;;:::i;:::-;43559:16;;:56;;;;;;;:::i;:::-;;;;;;;;43683:11;;43664:15;;43657:4;:22;;;;:::i;:::-;43656:38;;;;:::i;:::-;43634:18;;:60;;;;;;;:::i;:::-;;;;;;;;43426:284;43096:614;43737:1;43730:4;:8;43726:91;;;43759:42;43775:4;43789;43796;43759:15;:42::i;:::-;43726:91;43843:4;43833:14;;;;;:::i;:::-;;;43044:815;43871:33;43887:4;43893:2;43897:6;43871:15;:33::i;:::-;40385:3527;;;;40272:3640;;;;:::o;23042:191::-;23116:16;23135:6;;;;;;;;;;;23116:25;;23161:8;23152:6;;:17;;;;;;;;;;;;;;;;;;23216:8;23185:40;;23206:8;23185:40;;;;;;;;;;;;23105:128;23042:191;:::o;35675:154::-;35775:5;35741:25;:31;35767:4;35741:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;35815:5;35798:23;;35809:4;35798:23;;;;;;;;;;;;35675:154;;:::o;16640:770::-;16798:1;16780:20;;:6;:20;;;16772:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;16882:1;16861:23;;:9;:23;;;16853:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;16937:47;16958:6;16966:9;16977:6;16937:20;:47::i;:::-;16997:21;17021:9;:17;17031:6;17021:17;;;;;;;;;;;;;;;;16997:41;;17088:6;17071:13;:23;;17049:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;17232:6;17216:13;:22;17196:9;:17;17206:6;17196:17;;;;;;;;;;;;;;;:42;;;;17284:6;17260:9;:20;17270:9;17260:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;17325:9;17308:35;;17317:6;17308:35;;;17336:6;17308:35;;;;;;:::i;:::-;;;;;;;;17356:46;17376:6;17384:9;17395:6;17356:19;:46::i;:::-;16761:649;16640:770;;;:::o;44611:1095::-;44664:23;44690:24;44708:4;44690:9;:24::i;:::-;44664:50;;44725:25;44753:15;44725:43;;44779:12;44827:1;44808:15;:20;44804:59;;44845:7;;;;;44804:59;44897:16;;44879:15;:34;44875:101;;;44948:16;;44930:34;;44875:101;44992:4;;;;;;;;;;;:36;;;;;45027:1;45018:6;:10;;;;:::i;:::-;45000:15;:28;44992:36;44988:97;;;45072:1;45063:6;:10;;;;:::i;:::-;45045:28;;44988:97;45097:26;45126:15;45097:44;;45154:25;45182:21;45154:49;;45216:36;45233:18;45216:16;:36::i;:::-;45265:18;45286:44;45312:17;45286:21;:25;;:44;;;;:::i;:::-;45265:65;;45343:17;45363:79;45414:17;45363:32;45378:16;;45363:10;:14;;:32;;;;:::i;:::-;:36;;:79;;;;:::i;:::-;45343:99;;45476:1;45455:18;:22;;;;45507:1;45488:16;:20;;;;45543:13;;;;;;;;;;;45535:27;;45570:9;45535:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45521:63;;;;;45619:15;;;;;;;;;;;45611:29;;45662:21;45611:87;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45597:101;;;;;44653:1053;;;;;;;44611:1095;;:::o;3412:98::-;3470:7;3501:1;3497;:5;;;;:::i;:::-;3490:12;;3412:98;;;;:::o;3811:::-;3869:7;3900:1;3896;:5;;;;:::i;:::-;3889:12;;3811:98;;;;:::o;20438:125::-;;;;:::o;21167:124::-;;;;:::o;43920:571::-;44046:21;44084:1;44070:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44046:40;;44115:4;44097;44102:1;44097:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;44141:9;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44131:4;44136:1;44131:7;;;;;;;;:::i;:::-;;;;;;;:26;;;;;;;;;;;44170:56;44187:4;44202:9;44214:11;44170:8;:56::i;:::-;44265:9;:60;;;44340:11;44366:1;44410:4;44437;44457:15;44265:218;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43975:516;43920:571;:::o;3055:98::-;3113:7;3144:1;3140;:5;;;;:::i;:::-;3133:12;;3055: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://3b17342367e68bb9b74e9ae48e8721f339b8d8f8f3e0421104fa05c34833dbca
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.