ERC-20
Overview
Max Total Supply
100,000,000 MHB
Holders
1,042
Market
Price
$0.00 @ 0.000000 POL
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
MiniHarambe
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
No with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Unlicensed pragma solidity ^0.8.20; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol"; import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol"; contract MiniHarambe is IERC20, IERC20Metadata, Ownable { using Address for address; using SafeMath for uint8; using SafeMath for uint256; using EnumerableSet for EnumerableSet.AddressSet; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Basic ERC20 properties //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Token decimals uint8 constant private _decimals = 18; // Total circulating supply uint256 private _totalSupply; function name() public pure override returns (string memory) { return "Mini Harambe"; } function symbol() public pure override returns (string memory) { return "MHB"; } function decimals() public pure override returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _totalSupply; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Settings //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Divider for the MaxBalance based on circulating Supply uint16 public constant BalanceLimitDivider = 1000; // Divider for buyLimit based on circulating Supply uint16 public constant BuyLimitDivider = 1000; // Divider for sellLimit based on circulating Supply uint16 public constant SellLimitDivider = 1000; // Sellers get locked for MaxSellLockTime so they can't dump repeatedly uint16 public constant MaxSellLockTime = 60 seconds; // Buyers get locked for MaxBuyLockTime so they can't buy repeatedly uint16 public constant MaxBuyLockTime = 0 seconds; // Maximum tax amount to make it impossible creating a honeypot uint16 public constant MaxTax = 20; // The time Liquidity gets locked at start and prolonged once it gets released uint256 private constant DefaultLiquidityLockTime = 0; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Public variables //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Initially false, can be set to true by the owner and not be disabled again afterwards bool public tradingEnabled = false; // Variables that track buy/sell/balance limits uint256 public balanceLimit; uint256 public buyLimit; uint256 public sellLimit; uint256 public buyLockTime; uint256 public sellLockTime; bool public buyLockDisabled; bool public sellLockDisabled; bool public isContractSwappingPaused; // Amount to swap for liquidity uint256 public liquiditySwapAmount = 50000 * 10**_decimals; // Total liquidity generated, useful for tickers uint256 public totalLiquidityGenerated; // Total funding balance uint256 public fundingBalance; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Private variables //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Tracks the current Taxes, different taxes can be applied for buy/sell/transfer uint256 private _buyTax; uint256 private _sellTax; uint256 private _transferTax; uint256 private _percentTaxUsedToBurn; uint256 private _percentTaxUsedForLiquidity; uint256 private _percentTaxUsedForFunding; address private _teamWallet; address private _liquidityAddress; //the timestamp when Liquidity unlocks uint256 private _liquidityUnlockTime; mapping (address => uint256) private _sellLock; mapping (address => uint256) private _buyLock; // Tracked addresses EnumerableSet.AddressSet private _team; EnumerableSet.AddressSet private _excluded; EnumerableSet.AddressSet private _excludedFromSellLock; EnumerableSet.AddressSet private _excludedFromBuyLock; IUniswapV2Router02 private _router; // ERC20 values mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _initialSupply; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Initialization //////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor (address _routerAddress) { _initialSupply = 100000000 * 10**_decimals; // 500 million tokens _teamWallet = msg.sender; _mint(msg.sender, _initialSupply); _totalSupply = _initialSupply; // connect to router and create pair _router = IUniswapV2Router02(_routerAddress); _liquidityAddress = IUniswapV2Factory(_router.factory()).createPair(address(this), _router.WETH()); // sets buy/sell limits balanceLimit = _initialSupply; buyLimit = _initialSupply; sellLimit = _initialSupply; // sets lock times buyLockTime = MaxBuyLockTime; sellLockTime = MaxSellLockTime; // sets starting tax _buyTax=3; _sellTax=3; _transferTax=0; // and the tax usage _percentTaxUsedToBurn = 0; _percentTaxUsedForLiquidity = 50; _percentTaxUsedForFunding = 50; //Team wallet and deployer are excluded from Taxes _excluded.add(msg.sender); // set liquidity lock _liquidityUnlockTime = block.timestamp + DefaultLiquidityLockTime; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Public methods //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Resets sell lock of caller to the default sellLockTime should something go very wrong function resetSellLock() public { _sellLock[msg.sender] = block.timestamp + sellLockTime; } // Resets buy lock of caller to the default buyLockTime should something go very wrong function resetBuyLock() public { _buyLock[msg.sender] = block.timestamp + buyLockTime; } // Gets the amount of tokens burned so far function getBurnedTokens() public view returns (uint256){ return _initialSupply.sub(_totalSupply); } // Gets the LP address function getLiquidityAddress() public view returns (address) { return _liquidityAddress; } // Gets a breakdown of the current taxes and how they are used function getTaxes() public view returns ( uint256 buyTax, uint256 sellTax, uint256 transferTax, uint256 percentOfTaxesUsedToBurn, uint256 percentOfTaxesUsedForLiquidity, uint256 percentOfTaxesUsedForFunding) { buyTax = _buyTax; sellTax = _sellTax; transferTax = _transferTax; percentOfTaxesUsedToBurn = _percentTaxUsedToBurn; percentOfTaxesUsedForLiquidity = _percentTaxUsedForLiquidity; percentOfTaxesUsedForFunding = _percentTaxUsedForFunding; } // How long is a given address still locked from buying function getAddressBuyLockTimeInSeconds(address _address) public view returns (uint256) { uint256 lockTime = _buyLock[_address]; if(lockTime <= block.timestamp) { return 0; } return lockTime - block.timestamp; } function getBuyLockTimeInSeconds() public view returns (uint256){ return buyLockTime; } // How long is a given address still locked from selling function getAddressSellLockTimeInSeconds(address _address) public view returns (uint256) { uint256 lockTime = _sellLock[_address]; if(lockTime <= block.timestamp) { return 0; } return lockTime - block.timestamp; } function getSellLockTimeInSeconds() public view returns (uint256){ return sellLockTime; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Owner privileges //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Enables trading for everyone function enableTrading() public onlyOwner { tradingEnabled = true; } // Sets the amount of tokens to swap for liquidity function setLiquiditySwapAmount (uint256 _amount) public onlyOwner { liquiditySwapAmount = _amount; } // Enables or disables automatic contract swapping for liquidity and funding function toggleContractSwappingPaused() public onlyOwner { isContractSwappingPaused = !isContractSwappingPaused; } // Updates the LP address function setLiquidityPoolAddress(address _address) public onlyOwner { _liquidityAddress = _address; } // Updates team wallet address function setTeamWallet(address _address) public onlyOwner { _teamWallet = _address; } // Add a wallet to team function addToTeam(address _address) public onlyOwner { require(!_isTeam(_address), "Address is already in team"); _team.add(_address); } // Remove a wallet from team function removeFromTeam(address _address) public onlyOwner { require(_isTeam(_address), "Address is not in team"); _team.remove(_address); } // Extract all native coins function extractNative() public onlyOwner { payable(msg.sender).transfer( address(this).balance ); fundingBalance = 0; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Team privileges //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Team doesn't have access to critical Functions that could turn this into a rug pull (except liquidity unlocks) function _isTeam(address _address) private view returns (bool){ return _address == owner() || _address == _teamWallet || _team.contains(_address); } modifier onlyTeam() { require(_isTeam(msg.sender), "Caller is not a team member"); _; } // Include / exclude wallets from taxes function teamExcludeFromTaxes(address _address) public onlyTeam { require(!_excluded.contains(_address), "Address is already excluded"); _excluded.add(_address); } function teamIncludeForTaxes(address _address) public onlyTeam { require(_excluded.contains(_address), "Address is already included"); _excluded.remove(_address); } // Include / exclude wallets from buy lock function teamExcludeFromBuyLock(address _address) public onlyTeam { require(!_excludedFromBuyLock.contains(_address), "Address is already excluded"); _excludedFromBuyLock.add(_address); } function teamIncludeForBuyLock(address _address) public onlyTeam { require(_excludedFromBuyLock.contains(_address), "Address is already included"); _excludedFromBuyLock.remove(_address); } // Include / exclude wallets from sell lock function teamExcludeFromSellLock(address _address) public onlyTeam { require(!_excludedFromSellLock.contains(_address), "Address is already excluded"); _excludedFromSellLock.add(_address); } function teamIncludeForSellLock(address _address) public onlyTeam { require(_excludedFromSellLock.contains(_address), "Address is already included"); _excludedFromSellLock.remove(_address); } // Withdraw funding balance to team wallet function teamWithdrawFundingBalance() public onlyTeam { uint256 _amount = fundingBalance; fundingBalance = 0; payable(_teamWallet).transfer(_amount); } function teamWithdrawFundingAmount(uint256 _amount) public onlyTeam { require(_amount <= fundingBalance, "Amount to withdraw exceeds existing balance"); fundingBalance = fundingBalance.sub(_amount); payable(_teamWallet).transfer(_amount); } function teamWithdrawTokenBalance() public onlyTeam { uint256 _amount = balanceOf(address(this)); _approve(address(this), msg.sender, _amount); transferFrom(address(this), _teamWallet, _amount); } // Set swap threshold (amount of contract balance at which contract sell is done) function teamSetLiquiditySwapBalance(uint256 _amount) public onlyTeam { require(_amount >= 0, "Swap threshold must be larger than zero"); require(_amount <= _totalSupply.div(100), "Swap threshold must be at most 1% of total supply"); liquiditySwapAmount = _amount; } // Toggle buy and sell locks function teamToggleBuyLock() public onlyTeam { buyLockDisabled = !buyLockDisabled; } function teamToggleSellLock() public onlyTeam { sellLockDisabled = !sellLockDisabled; } // Set buy and sell lock time function teamSetBuyLockTime(uint256 _seconds) public onlyTeam { require(_seconds <= MaxBuyLockTime, "Buy lock time exceeds maximum"); buyLockTime = _seconds; } function teamSetSellLockTime(uint256 _seconds) public onlyTeam { require(_seconds <= MaxSellLockTime, "Sell lock time exceeds maximum"); sellLockTime = _seconds; } // Set taxes and tax distribution function teamSetTaxes( uint256 _newBuyTax, uint256 _newSellTax, uint256 _newTransferTax, uint256 _newPercentOfTaxesUsedToBurn, uint256 _newPercentOfTaxesUsedForLiquidity, uint256 _newPercentOfTaxesUsedForFunding ) public onlyTeam { uint256 _newTotalTax = _newPercentOfTaxesUsedToBurn + _newPercentOfTaxesUsedForLiquidity + _newPercentOfTaxesUsedForFunding; require(_newTotalTax == 100, "Burn-, liquidity- and funding share of taxes need to sum to 100"); require(_newBuyTax <= MaxTax, "Buy tax too high"); require(_newSellTax <= MaxTax, "Sell tax too high"); require(_newTransferTax <= MaxTax, "Transfer tax too high"); _percentTaxUsedToBurn = _newPercentOfTaxesUsedToBurn; _percentTaxUsedForLiquidity = _newPercentOfTaxesUsedForLiquidity; _percentTaxUsedForFunding = _newPercentOfTaxesUsedForFunding; _buyTax = _newBuyTax; _sellTax = _newSellTax; _transferTax = _newTransferTax; } // Set buy-, sell- and balance limits function teamSetLimits( uint256 _buyLimit, uint256 _sellLimit, uint256 _balanceLimit) public onlyTeam { // Adds decimals to limits _balanceLimit = _balanceLimit; _sellLimit = _sellLimit; // Limits need to be at least target, to avoid setting value to 0 (avoid potential honeypot) uint256 targetBalanceLimit = _totalSupply.div(BalanceLimitDivider); uint256 targetSellLimit = _totalSupply.div(SellLimitDivider); uint256 targetBuyLimit = _totalSupply.div(BuyLimitDivider); require((_buyLimit >= targetBuyLimit), "New sell limit needs to be at least target"); require((_sellLimit >= targetSellLimit), "New sell limit needs to be at least target"); require((_balanceLimit >= targetBalanceLimit), "New balance limit needs to be at least target"); // Sell limit needs to be below 1% to avoid a large price impact when generating LP require(_sellLimit <= _totalSupply.div(100), "Sell limit needs to be below or equal to 1% of circulating supply"); balanceLimit = _balanceLimit; sellLimit = _sellLimit; buyLimit = _buyLimit; } // Manually trigger the swapping of contract tokens for LP and funding balance function teamManuallySwapContractTokenBalance() public onlyTeam { _swapContractToken(true, 0); } function teamManuallySwapContractTokenAmount(uint256 _amount) public onlyTeam { _swapContractToken(true, _amount); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Private methods //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Transfer function, every transfer runs through this function function _transfer(address sender, address recipient, uint256 amount) private { require(sender != address(0), "Transfer from zero"); require(recipient != address(0), "Transfer to zero"); //Manually Excluded addresses are transferring tax and lock free bool isExcluded = (_excluded.contains(sender) || _excluded.contains(recipient)); //Transactions from and to the contract are always tax and lock free bool isContractTransfer=(sender==address(this) || recipient==address(this)); //transfers between router and pair are tax and lock free address router = address(_router); bool isLiquidityTransfer = ( (sender == _liquidityAddress && recipient == router) || (recipient == _liquidityAddress && sender == router) ); //differentiate between buy/sell/transfer to apply different taxes/restrictions bool isBuy = sender == _liquidityAddress || sender == router; bool isSell = recipient == _liquidityAddress || recipient == router; // Pick transfer if (isContractTransfer || isLiquidityTransfer || isExcluded) { _feelessTransfer(sender, recipient, amount); } else{ require(tradingEnabled,"ERC20: Trading not yet enabled"); _taxedTransfer(sender, recipient, amount, isBuy, isSell); } } // Applies taxes, checks for limits, locks generates auto LP and staking assets, and automatic stakes function _taxedTransfer(address sender, address recipient, uint256 amount, bool isBuy, bool isSell) private { uint256 recipientBalance = _balances[recipient]; uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: Transfer exceeds balance"); uint256 tax; if (isSell) { if(!_excludedFromSellLock.contains(sender)) { // If seller sold less than sellLockTime ago, sell is declined, can be disabled by Team require(_sellLock[sender] <= block.timestamp || sellLockDisabled, "ERC20: Caller in sell lock period"); // Sets the time sellers get locked _sellLock[sender] = block.timestamp + sellLockTime; } // Sells can't exceed the sell limit require(amount <= sellLimit, "ERC20: Sell limit exceeded"); tax = _sellTax; } else if (isBuy) { if (!_excludedFromBuyLock.contains(recipient)) { // If buyer bought less than buyLockTime ago, buy is declined, can be disabled by Team require(_buyLock[recipient]<=block.timestamp || buyLockDisabled,"ERC20: Caller in buy lock period"); // Sets the time buyers get locked _buyLock[recipient] = block.timestamp + buyLockTime; } // Checks if the recipient balance (excluding taxes) would exceed balance limit require(recipientBalance + amount <= balanceLimit,"ERC20: Balance limit exceeded"); require(amount <= buyLimit, "ERC20: Buy limit exceeded"); tax = _buyTax; } else { //Transfer // Checks If the recipient balance (excluding taxes) would exceed balance Limit require(recipientBalance+amount<=balanceLimit,"ERC20: Balance limit exceeded"); // Transfers are disabled in sell lock, this doesn't stop someone from transferring before // selling, but there is no satisfying solution for that, and you would need to pax additional tax if(!_excludedFromSellLock.contains(sender)) { require(_sellLock[sender]<=block.timestamp||sellLockDisabled, "ERC20: Sender in sell lock period"); } tax = _transferTax; } // Swapping auto LP and funding value is only possible if sender is not LP pair, // if its not manually disabled, if its not already swapping and if its a sell to avoid // people from causing a large price impact from repeatedly transferring when theres a large backlog of tokens if ((sender != _liquidityAddress) && (!isContractSwappingPaused) && (!_isSwappingContractModifier) && isSell) { _swapContractToken(false, 0); } // Calculates the exact token amount for each tax uint256 tokensToBeBurnt = _calculateFee(amount, tax, _percentTaxUsedToBurn); // Staking and liquidity tax get treated the same, only during conversion they get split uint256 contractToken = _calculateFee(amount, tax, _percentTaxUsedForFunding + _percentTaxUsedForLiquidity); // Subtract the taxed tokens from the amount uint256 taxedAmount = amount - (tokensToBeBurnt + contractToken); // Removes token and handles staking _removeToken(sender, amount); // Adds the taxed tokens to the contract wallet _balances[address(this)] += contractToken; // Burns tokens _burn(address(this), tokensToBeBurnt); _totalSupply = _totalSupply.sub(tokensToBeBurnt); //Adds token and handles staking _addToken(recipient, taxedAmount); emit Transfer(sender, recipient, taxedAmount); } // Feeless transfer only transfers and stakes function _feelessTransfer(address sender, address recipient, uint256 amount) private { uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: Transfer exceeds balance"); // Removes token and handles staking _removeToken(sender,amount); // Adds token and handles staking _addToken(recipient, amount); emit Transfer(sender, recipient, amount); } // Calculates the token that should be taxed function _calculateFee(uint256 amount, uint256 tax, uint256 taxPercent) private pure returns (uint256) { return (amount).mul(tax).mul(taxPercent).div(10000); } // Adds Token to balance function _addToken(address _address, uint256 amount) private { _balances[_address] = _balances[_address].add(amount); } // Removes token from balance function _removeToken(address _address, uint256 amount) private { _balances[_address] = _balances[_address].sub(amount); } // Swaps the token on the contract for funding assets and LP token. function _swapContractToken(bool _force, uint256 _amount) private lockTheSwap { uint256 contractBalance = _balances[address(this)]; uint256 totalTax = _percentTaxUsedForLiquidity.add(_percentTaxUsedForFunding); // don't swap zero if (contractBalance <= 0) { return; } // only swap if contractBalance is larger than tokenToSwap, and totalTax is not equal to 0 if (!_force && (contractBalance < liquiditySwapAmount || totalTax == 0)) { return; } // We accept the given amount uint256 actualAmount = _amount; if (actualAmount == 0) { // If zero was passed, we will use the contract balance actualAmount = contractBalance; if (actualAmount > liquiditySwapAmount) { // If the contract balance is larger than the sell limit, we use the sell limit actualAmount = liquiditySwapAmount; } } require(actualAmount <= contractBalance, "Sell amount larger than contract balance"); // splits the token into liquidity and funding uint256 tokenForLiquidity = actualAmount.mul(_percentTaxUsedForLiquidity).div(totalTax); uint256 tokenForFunding = actualAmount.sub(tokenForLiquidity); // splits tokenForLiquidity in 2 halves uint256 liqTokenShare = tokenForLiquidity.div(2); uint256 liqNativeTokenShare = tokenForLiquidity.sub(liqTokenShare); // swaps fundingToken and the liquidity token half for native token uint256 swapToken = liqNativeTokenShare.add(tokenForFunding); // gets the initial native balance, so adding liquidity won't touch any deposited native assets uint256 initialNativeBalance = address(this).balance; _swapTokenForNative(swapToken); uint256 swappedNative = (address(this).balance.sub(initialNativeBalance)); // calculates the amount of native asset belonging to the LP-Pair and converts them to LP uint256 liqNativeShare = swappedNative.mul(liqNativeTokenShare).div(swapToken); _addLiquidity(liqTokenShare, liqNativeShare); // and the rest to the funding balance fundingBalance = fundingBalance.add(swappedNative.sub(liqNativeShare)); } // Swaps tokens on the contract for native token function _swapTokenForNative(uint256 amount) private { _approve(address(this), address(_router), amount); address[] memory path = new address[](2); path[0] = address(this); path[1] = _router.WETH(); _router.swapExactTokensForETHSupportingFeeOnTransferTokens( amount, 0, path, address(this), block.timestamp ); } // Adds Liquidity directly to the contract where LP are locked (unlike SafeMoon-forks, that transfer it to the owner) function _addLiquidity(uint256 _tokens, uint256 _native) private { totalLiquidityGenerated += _native; _approve(address(this), address(_router), _tokens); _router.addLiquidityETH{value: _native}( address(this), _tokens, 0, 0, address(this), block.timestamp ); } // Creates tokens increasing the total supply function _mint(address account, uint256 amount) private { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply = _totalSupply.add(amount); _addToken(account, amount); emit Transfer(address(0), account, amount); } // Removes tokens decreasing the total supply function _burn(address account, uint256 amount) private { require(account != address(0), "ERC20: burn from the zero address"); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); _removeToken(account, amount); emit Transfer(account, address(0), amount); } // Grants the rights to spend owners tokens by spender function _approve(address owner, address spender, uint256 amount) private { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } // Reduce the allowance of owner towards spender function _spendAllowance(address owner, address spender, uint256 amount) private { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); _approve(owner, spender, currentAllowance.sub(amount)); } } //Locks the swap if already swapping bool private _isSwappingContractModifier; modifier lockTheSwap { _isSwappingContractModifier = true; _; _isSwappingContractModifier = false; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ERC20 implementation //////////////////////////////////////////////////////////////////////////////////////////////////////////////// function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } function transfer(address to, uint256 amount) public override returns (bool) { _transfer(msg.sender, to, amount); return true; } function transferFrom(address from, address to, uint256 amount) public override returns (bool) { _spendAllowance(from, msg.sender, amount); _transfer(from, to, amount); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { uint256 currentAllowance = _allowances[msg.sender][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(msg.sender, spender, currentAllowance - subtractedValue); } return true; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Receiving //////////////////////////////////////////////////////////////////////////////////////////////////////////////// fallback() external payable {} receive() external payable {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ 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}. * * 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 default value returned by this function, unless * it's 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: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, 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}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, 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 updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, 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 updated 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) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * 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: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, 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; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _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; // Overflow not possible: amount <= accountBalance <= totalSupply. _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 Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - 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 {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction 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; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ```solidity * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; }
pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); }
pragma solidity >=0.6.2; import './IUniswapV2Router01.sol'; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; }
{ "evmVersion": "paris", "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_routerAddress","type":"address"}],"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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"BalanceLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BuyLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxBuyLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxSellLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxTax","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SellLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addToTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLockDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"extractNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fundingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getAddressBuyLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getAddressSellLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBuyLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSellLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxes","outputs":[{"internalType":"uint256","name":"buyTax","type":"uint256"},{"internalType":"uint256","name":"sellTax","type":"uint256"},{"internalType":"uint256","name":"transferTax","type":"uint256"},{"internalType":"uint256","name":"percentOfTaxesUsedToBurn","type":"uint256"},{"internalType":"uint256","name":"percentOfTaxesUsedForLiquidity","type":"uint256"},{"internalType":"uint256","name":"percentOfTaxesUsedForFunding","type":"uint256"}],"stateMutability":"view","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":[],"name":"isContractSwappingPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquiditySwapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeFromTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetBuyLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setLiquidityPoolAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setLiquiditySwapAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setTeamWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"teamExcludeFromBuyLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"teamExcludeFromSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"teamExcludeFromTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"teamIncludeForBuyLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"teamIncludeForSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"teamIncludeForTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"teamManuallySwapContractTokenAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamManuallySwapContractTokenBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_seconds","type":"uint256"}],"name":"teamSetBuyLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyLimit","type":"uint256"},{"internalType":"uint256","name":"_sellLimit","type":"uint256"},{"internalType":"uint256","name":"_balanceLimit","type":"uint256"}],"name":"teamSetLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"teamSetLiquiditySwapBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_seconds","type":"uint256"}],"name":"teamSetSellLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newBuyTax","type":"uint256"},{"internalType":"uint256","name":"_newSellTax","type":"uint256"},{"internalType":"uint256","name":"_newTransferTax","type":"uint256"},{"internalType":"uint256","name":"_newPercentOfTaxesUsedToBurn","type":"uint256"},{"internalType":"uint256","name":"_newPercentOfTaxesUsedForLiquidity","type":"uint256"},{"internalType":"uint256","name":"_newPercentOfTaxesUsedForFunding","type":"uint256"}],"name":"teamSetTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamToggleBuyLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamToggleSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"teamWithdrawFundingAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamWithdrawFundingBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamWithdrawTokenBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleContractSwappingPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalLiquidityGenerated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526000600260006101000a81548160ff0219169083151502179055506012600a6200002f9190620008d4565b61c3506200003e919062000925565b6009553480156200004e57600080fd5b506040516200672c3803806200672c8339818101604052810190620000749190620009da565b6200009462000088620003d960201b60201c565b620003e160201b60201c565b6012600a620000a49190620008d4565b6305f5e100620000b5919062000925565b60228190555033601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200011033602254620004a560201b60201c565b60225460018190555080601f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001c8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ee9190620009da565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000278573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029e9190620009da565b6040518363ffffffff1660e01b8152600401620002bd92919062000a1d565b6020604051808303816000875af1158015620002dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003039190620009da565b601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602254600381905550602254600481905550602254600581905550600061ffff16600681905550603c61ffff166007819055506003600c819055506003600d819055506000600e819055506000600f8190555060326010819055506032601181905550620003bc336019620005b260201b90919060201c565b50600042620003cc919062000a4a565b6014819055505062000b36565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000517576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200050e9062000ae6565b60405180910390fd5b6200052e81600154620005ea60201b90919060201c565b6001819055506200054682826200060260201b60201c565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620005a6919062000b19565b60405180910390a35050565b6000620005e2836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200069d60201b60201c565b905092915050565b60008183620005fa919062000a4a565b905092915050565b6200065681602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620005ea60201b90919060201c565b602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6000620006b183836200071760201b60201c565b6200070c57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000711565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b6001851115620007c857808604811115620007a0576200079f6200073a565b5b6001851615620007b05780820291505b8081029050620007c08562000769565b945062000780565b94509492505050565b600082620007e35760019050620008b6565b81620007f35760009050620008b6565b81600181146200080c576002811462000817576200084d565b6001915050620008b6565b60ff8411156200082c576200082b6200073a565b5b8360020a9150848211156200084657620008456200073a565b5b50620008b6565b5060208310610133831016604e8410600b8410161715620008875782820a9050838111156200088157620008806200073a565b5b620008b6565b62000896848484600162000776565b92509050818404811115620008b057620008af6200073a565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b6000620008e182620008bd565b9150620008ee83620008c7565b92506200091d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620007d1565b905092915050565b60006200093282620008bd565b91506200093f83620008bd565b92508282026200094f81620008bd565b915082820484148315176200096957620009686200073a565b5b5092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009a28262000975565b9050919050565b620009b48162000995565b8114620009c057600080fd5b50565b600081519050620009d481620009a9565b92915050565b600060208284031215620009f357620009f262000970565b5b600062000a0384828501620009c3565b91505092915050565b62000a178162000995565b82525050565b600060408201905062000a34600083018562000a0c565b62000a43602083018462000a0c565b9392505050565b600062000a5782620008bd565b915062000a6483620008bd565b925082820190508082111562000a7f5762000a7e6200073a565b5b92915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000ace601f8362000a85565b915062000adb8262000a96565b602082019050919050565b6000602082019050818103600083015262000b018162000abf565b9050919050565b62000b1381620008bd565b82525050565b600060208201905062000b30600083018462000b08565b92915050565b615be68062000b466000396000f3fe6080604052600436106103e85760003560e01c806373f3109d11610208578063a9059cbb11610118578063dd62ed3e116100ab578063eb33dc7e1161007a578063eb33dc7e14610e18578063eb8e886314610e41578063f2fde38b14610e6c578063f88b0e4614610e95578063ffa7942a14610ec0576103ef565b8063dd62ed3e14610d4a578063df7f568614610d87578063dfdedf6914610db2578063e803050c14610ddb576103ef565b8063c3f4f54f116100e7578063c3f4f54f14610cc6578063ce533dbe14610cf1578063d0b4f46214610d08578063dc61266814610d1f576103ef565b8063a9059cbb14610c1e578063afbf720114610c5b578063c0fc5fc114610c72578063c1b1190614610c9d576103ef565b80638a8c523c1161019b5780639c0635991161016a5780639c06359914610b615780639efc971714610b8a578063a2f9c62e14610ba1578063a457c2d714610bca578063a8e6a0a814610c07576103ef565b80638a8c523c14610acb5780638da5cb5b14610ae257806395d89b4114610b0d5780639a5e580e14610b38576103ef565b80638724a289116101d75780638724a28914610a355780638728ecd114610a4c578063887c60fb14610a8957806388b4811b14610ab4576103ef565b806373f3109d1461098f5780637523f7f7146109b8578063762bb282146109e15780638219599714610a0c576103ef565b8063313ce567116103035780634f91e48c1161029657806363986aba1161026557806363986aba146108be57806365abd912146108e75780636c20a4a91461091257806370a082311461093b578063715018a614610978576103ef565b80634f91e48c14610814578063589210d91461083f5780635c69f6901461086a5780636195a3b514610895576103ef565b80634437106a116102d25780634437106a1461076c57806344f3c83a146107955780634ada218b146107c05780634e6baf74146107eb576103ef565b8063313ce567146106b05780633478154b146106db578063395093511461070657806343696f1814610743576103ef565b806318160ddd1161037b57806323b872dd1161034a57806323b872dd146105ed5780632973ef2d1461062a5780633054f8a31461065a578063311a869714610685576103ef565b806318160ddd14610557578063196d7bd3146105825780631f8b845e14610599578063205063b4146105c4576103ef565b806312384c88116103b757806312384c88146104ad5780631285073c146104d857806314ddc095146105035780631525ff7d1461052e576103ef565b806306fdde03146103f1578063095ea7b31461041c5780630d78baea146104595780630fd99e1614610482576103ef565b366103ef57005b005b3480156103fd57600080fd5b50610406610ed7565b60405161041391906141aa565b60405180910390f35b34801561042857600080fd5b50610443600480360381019061043e9190614265565b610f14565b60405161045091906142c0565b60405180910390f35b34801561046557600080fd5b50610480600480360381019061047b91906142db565b610f37565b005b34801561048e57600080fd5b50610497610feb565b6040516104a49190614325565b60405180910390f35b3480156104b957600080fd5b506104c2610ff1565b6040516104cf919061434f565b60405180910390f35b3480156104e457600080fd5b506104ed61101b565b6040516104fa9190614379565b60405180910390f35b34801561050f57600080fd5b50610518611025565b6040516105259190614379565b60405180910390f35b34801561053a57600080fd5b50610555600480360381019061055091906142db565b61102f565b005b34801561056357600080fd5b5061056c61107b565b6040516105799190614379565b60405180910390f35b34801561058e57600080fd5b50610597611085565b005b3480156105a557600080fd5b506105ae6110d8565b6040516105bb9190614325565b60405180910390f35b3480156105d057600080fd5b506105eb60048036038101906105e69190614394565b6110de565b005b3480156105f957600080fd5b50610614600480360381019061060f91906143c1565b611178565b60405161062191906142c0565b60405180910390f35b34801561063657600080fd5b5061063f61119b565b60405161065196959493929190614414565b60405180910390f35b34801561066657600080fd5b5061066f6111ca565b60405161067c91906142c0565b60405180910390f35b34801561069157600080fd5b5061069a6111dd565b6040516106a79190614325565b60405180910390f35b3480156106bc57600080fd5b506106c56111e3565b6040516106d29190614491565b60405180910390f35b3480156106e757600080fd5b506106f06111ec565b6040516106fd9190614325565b60405180910390f35b34801561071257600080fd5b5061072d60048036038101906107289190614265565b6111f1565b60405161073a91906142c0565b60405180910390f35b34801561074f57600080fd5b5061076a600480360381019061076591906142db565b61128f565b005b34801561077857600080fd5b50610793600480360381019061078e9190614394565b6112f8565b005b3480156107a157600080fd5b506107aa61140c565b6040516107b79190614379565b60405180910390f35b3480156107cc57600080fd5b506107d5611412565b6040516107e291906142c0565b60405180910390f35b3480156107f757600080fd5b50610812600480360381019061080d9190614394565b611425565b005b34801561082057600080fd5b50610829611437565b6040516108369190614379565b60405180910390f35b34801561084b57600080fd5b5061085461143d565b6040516108619190614379565b60405180910390f35b34801561087657600080fd5b5061087f611443565b60405161088c9190614325565b60405180910390f35b3480156108a157600080fd5b506108bc60048036038101906108b791906142db565b611448565b005b3480156108ca57600080fd5b506108e560048036038101906108e091906142db565b6114fc565b005b3480156108f357600080fd5b506108fc611548565b6040516109099190614379565b60405180910390f35b34801561091e57600080fd5b5061093960048036038101906109349190614394565b61154e565b005b34801561094757600080fd5b50610962600480360381019061095d91906142db565b6115e8565b60405161096f9190614379565b60405180910390f35b34801561098457600080fd5b5061098d611631565b005b34801561099b57600080fd5b506109b660048036038101906109b191906142db565b611645565b005b3480156109c457600080fd5b506109df60048036038101906109da91906142db565b6116f9565b005b3480156109ed57600080fd5b506109f66117ac565b604051610a039190614379565b60405180910390f35b348015610a1857600080fd5b50610a336004803603810190610a2e91906142db565b6117b2565b005b348015610a4157600080fd5b50610a4a611865565b005b348015610a5857600080fd5b50610a736004803603810190610a6e91906142db565b6118d9565b604051610a809190614379565b60405180910390f35b348015610a9557600080fd5b50610a9e611944565b604051610aab91906142c0565b60405180910390f35b348015610ac057600080fd5b50610ac9611957565b005b348015610ad757600080fd5b50610ae0611a1a565b005b348015610aee57600080fd5b50610af7611a3f565b604051610b04919061434f565b60405180910390f35b348015610b1957600080fd5b50610b22611a68565b604051610b2f91906141aa565b60405180910390f35b348015610b4457600080fd5b50610b5f6004803603810190610b5a91906142db565b611aa5565b005b348015610b6d57600080fd5b50610b886004803603810190610b8391906144ac565b611b58565b005b348015610b9657600080fd5b50610b9f611d09565b005b348015610bad57600080fd5b50610bc86004803603810190610bc39190614394565b611d9a565b005b348015610bd657600080fd5b50610bf16004803603810190610bec9190614265565b611df0565b604051610bfe91906142c0565b60405180910390f35b348015610c1357600080fd5b50610c1c611ecd565b005b348015610c2a57600080fd5b50610c456004803603810190610c409190614265565b611f20565b604051610c5291906142c0565b60405180910390f35b348015610c6757600080fd5b50610c70611f37565b005b348015610c7e57600080fd5b50610c87611f6b565b604051610c9491906142c0565b60405180910390f35b348015610ca957600080fd5b50610cc46004803603810190610cbf9190614394565b611f7e565b005b348015610cd257600080fd5b50610cdb61206c565b604051610ce89190614379565b60405180910390f35b348015610cfd57600080fd5b50610d0661208a565b005b348015610d1457600080fd5b50610d1d6120e3565b005b348015610d2b57600080fd5b50610d34612157565b604051610d419190614379565b60405180910390f35b348015610d5657600080fd5b50610d716004803603810190610d6c9190614539565b61215d565b604051610d7e9190614379565b60405180910390f35b348015610d9357600080fd5b50610d9c6121e4565b604051610da99190614379565b60405180910390f35b348015610dbe57600080fd5b50610dd96004803603810190610dd491906142db565b6121ea565b005b348015610de757600080fd5b50610e026004803603810190610dfd91906142db565b612252565b604051610e0f9190614379565b60405180910390f35b348015610e2457600080fd5b50610e3f6004803603810190610e3a9190614579565b6122bd565b005b348015610e4d57600080fd5b50610e566124a0565b604051610e639190614325565b60405180910390f35b348015610e7857600080fd5b50610e936004803603810190610e8e91906142db565b6124a5565b005b348015610ea157600080fd5b50610eaa612528565b604051610eb79190614379565b60405180910390f35b348015610ecc57600080fd5b50610ed561252e565b005b60606040518060400160405280600c81526020017f4d696e6920486172616d62650000000000000000000000000000000000000000815250905090565b600080610f1f612584565b9050610f2c81858561258c565b600191505092915050565b610f4033612755565b610f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7690614618565b60405180910390fd5b610f9381601b61280790919063ffffffff16565b15610fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca90614684565b60405180910390fd5b610fe781601b61283790919063ffffffff16565b5050565b6103e881565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600754905090565b6000600654905090565b611037612867565b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600154905090565b6006544261109391906146d3565b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b6103e881565b6110e733612755565b611126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111d90614618565b60405180910390fd5b600061ffff1681111561116e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116590614753565b60405180910390fd5b8060068190555050565b60006111858433846128e5565b611190848484612981565b600190509392505050565b600080600080600080600c549550600d549450600e549350600f54925060105491506011549050909192939495565b600860009054906101000a900460ff1681565b6103e881565b60006012905090565b603c81565b6000611285338484602160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461128091906146d3565b61258c565b6001905092915050565b611297612867565b6112a081612755565b156112e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d7906147bf565b60405180910390fd5b6112f481601761283790919063ffffffff16565b5050565b61130133612755565b611340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133790614618565b60405180910390fd5b600b54811115611385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137c90614851565b60405180910390fd5b61139a81600b54612de190919063ffffffff16565b600b81905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611408573d6000803e3d6000fd5b5050565b60065481565b600260009054906101000a900460ff1681565b61142d612867565b8060098190555050565b60055481565b60045481565b600081565b61145133612755565b611490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148790614618565b60405180910390fd5b6114a481601d61280790919063ffffffff16565b156114e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114db90614684565b60405180910390fd5b6114f881601d61283790919063ffffffff16565b5050565b611504612867565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b5481565b61155733612755565b611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158d90614618565b60405180910390fd5b603c61ffff168111156115de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d5906148bd565b60405180910390fd5b8060078190555050565b6000602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611639612867565b6116436000612df7565b565b61164e33612755565b61168d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168490614618565b60405180910390fd5b6116a181601961280790919063ffffffff16565b156116e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d890614684565b60405180910390fd5b6116f581601961283790919063ffffffff16565b5050565b61170233612755565b611741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173890614618565b60405180910390fd5b61175581601b61280790919063ffffffff16565b611794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178b90614929565b60405180910390fd5b6117a881601b612ebb90919063ffffffff16565b5050565b60035481565b6117bb33612755565b6117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f190614618565b60405180910390fd5b61180e81601961280790919063ffffffff16565b61184d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184490614929565b60405180910390fd5b611861816019612ebb90919063ffffffff16565b5050565b61186e33612755565b6118ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a490614618565b60405180910390fd5b600860019054906101000a900460ff1615600860016101000a81548160ff021916908315150217905550565b600080601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905042811161192f57600091505061193f565b428161193b9190614949565b9150505b919050565b600860019054906101000a900460ff1681565b61196033612755565b61199f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199690614618565b60405180910390fd5b6000600b5490506000600b81905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611a16573d6000803e3d6000fd5b5050565b611a22612867565b6001600260006101000a81548160ff021916908315150217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600381526020017f4d48420000000000000000000000000000000000000000000000000000000000815250905090565b611aae33612755565b611aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae490614618565b60405180910390fd5b611b0181601d61280790919063ffffffff16565b611b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3790614929565b60405180910390fd5b611b5481601d612ebb90919063ffffffff16565b5050565b611b6133612755565b611ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9790614618565b60405180910390fd5b6000818385611baf91906146d3565b611bb991906146d3565b905060648114611bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf5906149ef565b60405180910390fd5b601461ffff16871115611c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3d90614a5b565b60405180910390fd5b601461ffff16861115611c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8590614ac7565b60405180910390fd5b601461ffff16851115611cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccd90614b33565b60405180910390fd5b83600f81905550826010819055508160118190555086600c8190555085600d8190555084600e8190555050505050505050565b611d1233612755565b611d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4890614618565b60405180910390fd5b6000611d5c306115e8565b9050611d6930338361258c565b611d9630601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611178565b5050565b611da333612755565b611de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd990614618565b60405180910390fd5b611ded600182612eeb565b50565b600080602160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eac90614bc5565b60405180910390fd5b611ec2338585840361258c565b600191505092915050565b60075442611edb91906146d3565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b6000611f2d338484612981565b6001905092915050565b611f3f612867565b600860029054906101000a900460ff1615600860026101000a81548160ff021916908315150217905550565b600860029054906101000a900460ff1681565b611f8733612755565b611fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbd90614618565b60405180910390fd5b600081101561200a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200190614c57565b60405180910390fd5b612020606460015461313690919063ffffffff16565b811115612062576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205990614ce9565b60405180910390fd5b8060098190555050565b6000612085600154602254612de190919063ffffffff16565b905090565b612092612867565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156120d8573d6000803e3d6000fd5b506000600b81905550565b6120ec33612755565b61212b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212290614618565b60405180910390fd5b600860009054906101000a900460ff1615600860006101000a81548160ff021916908315150217905550565b600a5481565b6000602160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60095481565b6121f2612867565b6121fb81612755565b61223a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223190614d55565b60405180910390fd5b61224e816017612ebb90919063ffffffff16565b5050565b600080601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490504281116122a85760009150506122b8565b42816122b49190614949565b9150505b919050565b6122c633612755565b612305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fc90614618565b60405180910390fd5b60006123226103e861ffff1660015461313690919063ffffffff16565b905060006123416103e861ffff1660015461313690919063ffffffff16565b905060006123606103e861ffff1660015461313690919063ffffffff16565b9050808610156123a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239c90614de7565b60405180910390fd5b818510156123e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123df90614de7565b60405180910390fd5b8284101561242b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242290614e79565b60405180910390fd5b612441606460015461313690919063ffffffff16565b851115612483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247a90614f31565b60405180910390fd5b836003819055508460058190555085600481905550505050505050565b601481565b6124ad612867565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361251c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251390614fc3565b60405180910390fd5b61252581612df7565b50565b60075481565b61253733612755565b612576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256d90614618565b60405180910390fd5b61258260016000612eeb565b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036125fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f290615055565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361266a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612661906150e7565b60405180910390fd5b80602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516127489190614379565b60405180910390a3505050565b600061275f611a3f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806127e55750601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b8061280057506127ff82601761280790919063ffffffff16565b5b9050919050565b600061282f836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61314c565b905092915050565b600061285f836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61316f565b905092915050565b61286f612584565b73ffffffffffffffffffffffffffffffffffffffff1661288d611a3f565b73ffffffffffffffffffffffffffffffffffffffff16146128e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128da90615153565b60405180910390fd5b565b60006128f1848461215d565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461297b578181101561295d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612954906151bf565b60405180910390fd5b61297a84846129758585612de190919063ffffffff16565b61258c565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036129f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e79061522b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5690615297565b60405180910390fd5b6000612a7584601961280790919063ffffffff16565b80612a905750612a8f83601961280790919063ffffffff16565b5b905060003073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480612af957503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b90506000601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16148015612bac57508173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b80612c3b5750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16148015612c3a57508173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b5b90506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161480612cc657508273ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b90506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161480612d5157508373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b90508480612d5c5750825b80612d645750855b15612d7957612d748989896131df565b612dd6565b600260009054906101000a900460ff16612dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dbf90615303565b60405180910390fd5b612dd589898985856132e5565b5b505050505050505050565b60008183612def9190614949565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612ee3836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6139a4565b905092915050565b6001602360006101000a81548160ff0219169083151502179055506000602060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000612f63601154601054613ab890919063ffffffff16565b905060008211612f74575050613117565b83158015612f8e5750600954821080612f8d5750600081145b5b15612f9a575050613117565b600083905060008103612fbb57829050600954811115612fba5760095490505b5b82811115612ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff590615395565b60405180910390fd5b60006130278361301960105485613ace90919063ffffffff16565b61313690919063ffffffff16565b9050600061303e8284612de190919063ffffffff16565b9050600061305660028461313690919063ffffffff16565b9050600061306d8285612de190919063ffffffff16565b905060006130848483613ab890919063ffffffff16565b9050600047905061309482613ae4565b60006130a98247612de190919063ffffffff16565b905060006130d2846130c48785613ace90919063ffffffff16565b61313690919063ffffffff16565b90506130de8682613d27565b6131056130f48284612de190919063ffffffff16565b600b54613ab890919063ffffffff16565b600b8190555050505050505050505050505b6000602360006101000a81548160ff0219169083151502179055505050565b6000818361314491906153e4565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600061317b838361314c565b6131d45782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506131d9565b600090505b92915050565b6000602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325d90615461565b60405180910390fd5b6132708483613e1e565b61327a8383613eb7565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516132d79190614379565b60405180910390a350505050565b6000602060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000602060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050848110156133b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a790615461565b60405180910390fd5b6000831561350a576133cc88601b61280790919063ffffffff16565b6134bb5742601560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411158061342a5750600860019054906101000a900460ff165b613469576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613460906154f3565b60405180910390fd5b6007544261347791906146d3565b601560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600554861115613500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f79061555f565b60405180910390fd5b600d5490506137bb565b84156136b25761352487601d61280790919063ffffffff16565b6136135742601660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115806135825750600860009054906101000a900460ff165b6135c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b8906155cb565b60405180910390fd5b600654426135cf91906146d3565b601660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600354868461362291906146d3565b1115613663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365a90615637565b60405180910390fd5b6004548611156136a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161369f906156a3565b60405180910390fd5b600c5490506137ba565b60035486846136c191906146d3565b1115613702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136f990615637565b60405180910390fd5b61371688601b61280790919063ffffffff16565b6137b45742601560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115806137745750600860019054906101000a900460ff165b6137b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137aa90615735565b60405180910390fd5b5b600e5490505b5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16141580156138265750600860029054906101000a900460ff16155b801561383f5750602360009054906101000a900460ff16155b80156138485750835b1561385957613858600080612eeb565b5b60006138688783600f54613f50565b90506000613886888460105460115461388191906146d3565b613f50565b90506000818361389691906146d3565b896138a19190614949565b90506138ad8b8a613e1e565b81602060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138fc91906146d3565b9250508190555061390d3084613f94565b61392283600154612de190919063ffffffff16565b6001819055506139328a82613eb7565b8973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161398f9190614379565b60405180910390a35050505050505050505050565b60008083600101600084815260200190815260200160002054905060008114613aac5760006001826139d69190614949565b90506000600186600001805490506139ee9190614949565b9050818114613a5d576000866000018281548110613a0f57613a0e615755565b5b9060005260206000200154905080876000018481548110613a3357613a32615755565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480613a7157613a70615784565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050613ab2565b60009150505b92915050565b60008183613ac691906146d3565b905092915050565b60008183613adc91906157b3565b905092915050565b613b1130601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361258c565b6000600267ffffffffffffffff811115613b2e57613b2d6157f5565b5b604051908082528060200260200182016040528015613b5c5781602001602082028036833780820191505090505b5090503081600081518110613b7457613b73615755565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c3f9190615839565b81600181518110613c5357613c52615755565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613cf1959493929190615969565b600060405180830381600087803b158015613d0b57600080fd5b505af1158015613d1f573d6000803e3d6000fd5b505050505050565b80600a6000828254613d3991906146d3565b92505081905550613d6d30601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461258c565b601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008030426040518863ffffffff1660e01b8152600401613dd4969594939291906159c3565b60606040518083038185885af1158015613df2573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613e179190615a39565b5050505050565b613e7081602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612de190919063ffffffff16565b602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b613f0981602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ab890919063ffffffff16565b602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6000613f8b612710613f7d84613f6f8789613ace90919063ffffffff16565b613ace90919063ffffffff16565b61313690919063ffffffff16565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603614003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ffa90615afe565b60405180910390fd5b6000602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561408a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161408190615b90565b60405180910390fd5b61409f82600154612de190919063ffffffff16565b6001819055506140af8383613e1e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161410d9190614379565b60405180910390a3505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614154578082015181840152602081019050614139565b60008484015250505050565b6000601f19601f8301169050919050565b600061417c8261411a565b6141868185614125565b9350614196818560208601614136565b61419f81614160565b840191505092915050565b600060208201905081810360008301526141c48184614171565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006141fc826141d1565b9050919050565b61420c816141f1565b811461421757600080fd5b50565b60008135905061422981614203565b92915050565b6000819050919050565b6142428161422f565b811461424d57600080fd5b50565b60008135905061425f81614239565b92915050565b6000806040838503121561427c5761427b6141cc565b5b600061428a8582860161421a565b925050602061429b85828601614250565b9150509250929050565b60008115159050919050565b6142ba816142a5565b82525050565b60006020820190506142d560008301846142b1565b92915050565b6000602082840312156142f1576142f06141cc565b5b60006142ff8482850161421a565b91505092915050565b600061ffff82169050919050565b61431f81614308565b82525050565b600060208201905061433a6000830184614316565b92915050565b614349816141f1565b82525050565b60006020820190506143646000830184614340565b92915050565b6143738161422f565b82525050565b600060208201905061438e600083018461436a565b92915050565b6000602082840312156143aa576143a96141cc565b5b60006143b884828501614250565b91505092915050565b6000806000606084860312156143da576143d96141cc565b5b60006143e88682870161421a565b93505060206143f98682870161421a565b925050604061440a86828701614250565b9150509250925092565b600060c082019050614429600083018961436a565b614436602083018861436a565b614443604083018761436a565b614450606083018661436a565b61445d608083018561436a565b61446a60a083018461436a565b979650505050505050565b600060ff82169050919050565b61448b81614475565b82525050565b60006020820190506144a66000830184614482565b92915050565b60008060008060008060c087890312156144c9576144c86141cc565b5b60006144d789828a01614250565b96505060206144e889828a01614250565b95505060406144f989828a01614250565b945050606061450a89828a01614250565b935050608061451b89828a01614250565b92505060a061452c89828a01614250565b9150509295509295509295565b600080604083850312156145505761454f6141cc565b5b600061455e8582860161421a565b925050602061456f8582860161421a565b9150509250929050565b600080600060608486031215614592576145916141cc565b5b60006145a086828701614250565b93505060206145b186828701614250565b92505060406145c286828701614250565b9150509250925092565b7f43616c6c6572206973206e6f742061207465616d206d656d6265720000000000600082015250565b6000614602601b83614125565b915061460d826145cc565b602082019050919050565b60006020820190508181036000830152614631816145f5565b9050919050565b7f4164647265737320697320616c7265616479206578636c756465640000000000600082015250565b600061466e601b83614125565b915061467982614638565b602082019050919050565b6000602082019050818103600083015261469d81614661565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006146de8261422f565b91506146e98361422f565b9250828201905080821115614701576147006146a4565b5b92915050565b7f427579206c6f636b2074696d652065786365656473206d6178696d756d000000600082015250565b600061473d601d83614125565b915061474882614707565b602082019050919050565b6000602082019050818103600083015261476c81614730565b9050919050565b7f4164647265737320697320616c726561647920696e207465616d000000000000600082015250565b60006147a9601a83614125565b91506147b482614773565b602082019050919050565b600060208201905081810360008301526147d88161479c565b9050919050565b7f416d6f756e7420746f207769746864726177206578636565647320657869737460008201527f696e672062616c616e6365000000000000000000000000000000000000000000602082015250565b600061483b602b83614125565b9150614846826147df565b604082019050919050565b6000602082019050818103600083015261486a8161482e565b9050919050565b7f53656c6c206c6f636b2074696d652065786365656473206d6178696d756d0000600082015250565b60006148a7601e83614125565b91506148b282614871565b602082019050919050565b600060208201905081810360008301526148d68161489a565b9050919050565b7f4164647265737320697320616c726561647920696e636c756465640000000000600082015250565b6000614913601b83614125565b915061491e826148dd565b602082019050919050565b6000602082019050818103600083015261494281614906565b9050919050565b60006149548261422f565b915061495f8361422f565b9250828203905081811115614977576149766146a4565b5b92915050565b7f4275726e2d2c206c69717569646974792d20616e642066756e64696e6720736860008201527f617265206f66207461786573206e65656420746f2073756d20746f2031303000602082015250565b60006149d9603f83614125565b91506149e48261497d565b604082019050919050565b60006020820190508181036000830152614a08816149cc565b9050919050565b7f4275792074617820746f6f206869676800000000000000000000000000000000600082015250565b6000614a45601083614125565b9150614a5082614a0f565b602082019050919050565b60006020820190508181036000830152614a7481614a38565b9050919050565b7f53656c6c2074617820746f6f2068696768000000000000000000000000000000600082015250565b6000614ab1601183614125565b9150614abc82614a7b565b602082019050919050565b60006020820190508181036000830152614ae081614aa4565b9050919050565b7f5472616e736665722074617820746f6f20686967680000000000000000000000600082015250565b6000614b1d601583614125565b9150614b2882614ae7565b602082019050919050565b60006020820190508181036000830152614b4c81614b10565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614baf602583614125565b9150614bba82614b53565b604082019050919050565b60006020820190508181036000830152614bde81614ba2565b9050919050565b7f53776170207468726573686f6c64206d757374206265206c617267657220746860008201527f616e207a65726f00000000000000000000000000000000000000000000000000602082015250565b6000614c41602783614125565b9150614c4c82614be5565b604082019050919050565b60006020820190508181036000830152614c7081614c34565b9050919050565b7f53776170207468726573686f6c64206d757374206265206174206d6f7374203160008201527f25206f6620746f74616c20737570706c79000000000000000000000000000000602082015250565b6000614cd3603183614125565b9150614cde82614c77565b604082019050919050565b60006020820190508181036000830152614d0281614cc6565b9050919050565b7f41646472657373206973206e6f7420696e207465616d00000000000000000000600082015250565b6000614d3f601683614125565b9150614d4a82614d09565b602082019050919050565b60006020820190508181036000830152614d6e81614d32565b9050919050565b7f4e65772073656c6c206c696d6974206e6565647320746f206265206174206c6560008201527f6173742074617267657400000000000000000000000000000000000000000000602082015250565b6000614dd1602a83614125565b9150614ddc82614d75565b604082019050919050565b60006020820190508181036000830152614e0081614dc4565b9050919050565b7f4e65772062616c616e6365206c696d6974206e6565647320746f20626520617460008201527f206c656173742074617267657400000000000000000000000000000000000000602082015250565b6000614e63602d83614125565b9150614e6e82614e07565b604082019050919050565b60006020820190508181036000830152614e9281614e56565b9050919050565b7f53656c6c206c696d6974206e6565647320746f2062652062656c6f77206f722060008201527f657175616c20746f203125206f662063697263756c6174696e6720737570706c60208201527f7900000000000000000000000000000000000000000000000000000000000000604082015250565b6000614f1b604183614125565b9150614f2682614e99565b606082019050919050565b60006020820190508181036000830152614f4a81614f0e565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614fad602683614125565b9150614fb882614f51565b604082019050919050565b60006020820190508181036000830152614fdc81614fa0565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061503f602483614125565b915061504a82614fe3565b604082019050919050565b6000602082019050818103600083015261506e81615032565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006150d1602283614125565b91506150dc82615075565b604082019050919050565b60006020820190508181036000830152615100816150c4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061513d602083614125565b915061514882615107565b602082019050919050565b6000602082019050818103600083015261516c81615130565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006151a9601d83614125565b91506151b482615173565b602082019050919050565b600060208201905081810360008301526151d88161519c565b9050919050565b7f5472616e736665722066726f6d207a65726f0000000000000000000000000000600082015250565b6000615215601283614125565b9150615220826151df565b602082019050919050565b6000602082019050818103600083015261524481615208565b9050919050565b7f5472616e7366657220746f207a65726f00000000000000000000000000000000600082015250565b6000615281601083614125565b915061528c8261524b565b602082019050919050565b600060208201905081810360008301526152b081615274565b9050919050565b7f45524332303a2054726164696e67206e6f742079657420656e61626c65640000600082015250565b60006152ed601e83614125565b91506152f8826152b7565b602082019050919050565b6000602082019050818103600083015261531c816152e0565b9050919050565b7f53656c6c20616d6f756e74206c6172676572207468616e20636f6e747261637460008201527f2062616c616e6365000000000000000000000000000000000000000000000000602082015250565b600061537f602883614125565b915061538a82615323565b604082019050919050565b600060208201905081810360008301526153ae81615372565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006153ef8261422f565b91506153fa8361422f565b92508261540a576154096153b5565b5b828204905092915050565b7f45524332303a205472616e7366657220657863656564732062616c616e636500600082015250565b600061544b601f83614125565b915061545682615415565b602082019050919050565b6000602082019050818103600083015261547a8161543e565b9050919050565b7f45524332303a2043616c6c657220696e2073656c6c206c6f636b20706572696f60008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b60006154dd602183614125565b91506154e882615481565b604082019050919050565b6000602082019050818103600083015261550c816154d0565b9050919050565b7f45524332303a2053656c6c206c696d6974206578636565646564000000000000600082015250565b6000615549601a83614125565b915061555482615513565b602082019050919050565b600060208201905081810360008301526155788161553c565b9050919050565b7f45524332303a2043616c6c657220696e20627579206c6f636b20706572696f64600082015250565b60006155b5602083614125565b91506155c08261557f565b602082019050919050565b600060208201905081810360008301526155e4816155a8565b9050919050565b7f45524332303a2042616c616e6365206c696d6974206578636565646564000000600082015250565b6000615621601d83614125565b915061562c826155eb565b602082019050919050565b6000602082019050818103600083015261565081615614565b9050919050565b7f45524332303a20427579206c696d697420657863656564656400000000000000600082015250565b600061568d601983614125565b915061569882615657565b602082019050919050565b600060208201905081810360008301526156bc81615680565b9050919050565b7f45524332303a2053656e64657220696e2073656c6c206c6f636b20706572696f60008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b600061571f602183614125565b915061572a826156c3565b604082019050919050565b6000602082019050818103600083015261574e81615712565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006157be8261422f565b91506157c98361422f565b92508282026157d78161422f565b915082820484148315176157ee576157ed6146a4565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008151905061583381614203565b92915050565b60006020828403121561584f5761584e6141cc565b5b600061585d84828501615824565b91505092915050565b6000819050919050565b6000819050919050565b600061589561589061588b84615866565b615870565b61422f565b9050919050565b6158a58161587a565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6158e0816141f1565b82525050565b60006158f283836158d7565b60208301905092915050565b6000602082019050919050565b6000615916826158ab565b61592081856158b6565b935061592b836158c7565b8060005b8381101561595c57815161594388826158e6565b975061594e836158fe565b92505060018101905061592f565b5085935050505092915050565b600060a08201905061597e600083018861436a565b61598b602083018761589c565b818103604083015261599d818661590b565b90506159ac6060830185614340565b6159b9608083018461436a565b9695505050505050565b600060c0820190506159d86000830189614340565b6159e5602083018861436a565b6159f2604083018761589c565b6159ff606083018661589c565b615a0c6080830185614340565b615a1960a083018461436a565b979650505050505050565b600081519050615a3381614239565b92915050565b600080600060608486031215615a5257615a516141cc565b5b6000615a6086828701615a24565b9350506020615a7186828701615a24565b9250506040615a8286828701615a24565b9150509250925092565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615ae8602183614125565b9150615af382615a8c565b604082019050919050565b60006020820190508181036000830152615b1781615adb565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000615b7a602283614125565b9150615b8582615b1e565b604082019050919050565b60006020820190508181036000830152615ba981615b6d565b905091905056fea2646970667358221220a43f139424e122647ad1b6ecd16d3b80d473c797ce13a089f41b6c8174c4e02764736f6c63430008140033000000000000000000000000a5e0829caced8ffdd4de3c43696c57f7d7a678ff
Deployed Bytecode
0x6080604052600436106103e85760003560e01c806373f3109d11610208578063a9059cbb11610118578063dd62ed3e116100ab578063eb33dc7e1161007a578063eb33dc7e14610e18578063eb8e886314610e41578063f2fde38b14610e6c578063f88b0e4614610e95578063ffa7942a14610ec0576103ef565b8063dd62ed3e14610d4a578063df7f568614610d87578063dfdedf6914610db2578063e803050c14610ddb576103ef565b8063c3f4f54f116100e7578063c3f4f54f14610cc6578063ce533dbe14610cf1578063d0b4f46214610d08578063dc61266814610d1f576103ef565b8063a9059cbb14610c1e578063afbf720114610c5b578063c0fc5fc114610c72578063c1b1190614610c9d576103ef565b80638a8c523c1161019b5780639c0635991161016a5780639c06359914610b615780639efc971714610b8a578063a2f9c62e14610ba1578063a457c2d714610bca578063a8e6a0a814610c07576103ef565b80638a8c523c14610acb5780638da5cb5b14610ae257806395d89b4114610b0d5780639a5e580e14610b38576103ef565b80638724a289116101d75780638724a28914610a355780638728ecd114610a4c578063887c60fb14610a8957806388b4811b14610ab4576103ef565b806373f3109d1461098f5780637523f7f7146109b8578063762bb282146109e15780638219599714610a0c576103ef565b8063313ce567116103035780634f91e48c1161029657806363986aba1161026557806363986aba146108be57806365abd912146108e75780636c20a4a91461091257806370a082311461093b578063715018a614610978576103ef565b80634f91e48c14610814578063589210d91461083f5780635c69f6901461086a5780636195a3b514610895576103ef565b80634437106a116102d25780634437106a1461076c57806344f3c83a146107955780634ada218b146107c05780634e6baf74146107eb576103ef565b8063313ce567146106b05780633478154b146106db578063395093511461070657806343696f1814610743576103ef565b806318160ddd1161037b57806323b872dd1161034a57806323b872dd146105ed5780632973ef2d1461062a5780633054f8a31461065a578063311a869714610685576103ef565b806318160ddd14610557578063196d7bd3146105825780631f8b845e14610599578063205063b4146105c4576103ef565b806312384c88116103b757806312384c88146104ad5780631285073c146104d857806314ddc095146105035780631525ff7d1461052e576103ef565b806306fdde03146103f1578063095ea7b31461041c5780630d78baea146104595780630fd99e1614610482576103ef565b366103ef57005b005b3480156103fd57600080fd5b50610406610ed7565b60405161041391906141aa565b60405180910390f35b34801561042857600080fd5b50610443600480360381019061043e9190614265565b610f14565b60405161045091906142c0565b60405180910390f35b34801561046557600080fd5b50610480600480360381019061047b91906142db565b610f37565b005b34801561048e57600080fd5b50610497610feb565b6040516104a49190614325565b60405180910390f35b3480156104b957600080fd5b506104c2610ff1565b6040516104cf919061434f565b60405180910390f35b3480156104e457600080fd5b506104ed61101b565b6040516104fa9190614379565b60405180910390f35b34801561050f57600080fd5b50610518611025565b6040516105259190614379565b60405180910390f35b34801561053a57600080fd5b50610555600480360381019061055091906142db565b61102f565b005b34801561056357600080fd5b5061056c61107b565b6040516105799190614379565b60405180910390f35b34801561058e57600080fd5b50610597611085565b005b3480156105a557600080fd5b506105ae6110d8565b6040516105bb9190614325565b60405180910390f35b3480156105d057600080fd5b506105eb60048036038101906105e69190614394565b6110de565b005b3480156105f957600080fd5b50610614600480360381019061060f91906143c1565b611178565b60405161062191906142c0565b60405180910390f35b34801561063657600080fd5b5061063f61119b565b60405161065196959493929190614414565b60405180910390f35b34801561066657600080fd5b5061066f6111ca565b60405161067c91906142c0565b60405180910390f35b34801561069157600080fd5b5061069a6111dd565b6040516106a79190614325565b60405180910390f35b3480156106bc57600080fd5b506106c56111e3565b6040516106d29190614491565b60405180910390f35b3480156106e757600080fd5b506106f06111ec565b6040516106fd9190614325565b60405180910390f35b34801561071257600080fd5b5061072d60048036038101906107289190614265565b6111f1565b60405161073a91906142c0565b60405180910390f35b34801561074f57600080fd5b5061076a600480360381019061076591906142db565b61128f565b005b34801561077857600080fd5b50610793600480360381019061078e9190614394565b6112f8565b005b3480156107a157600080fd5b506107aa61140c565b6040516107b79190614379565b60405180910390f35b3480156107cc57600080fd5b506107d5611412565b6040516107e291906142c0565b60405180910390f35b3480156107f757600080fd5b50610812600480360381019061080d9190614394565b611425565b005b34801561082057600080fd5b50610829611437565b6040516108369190614379565b60405180910390f35b34801561084b57600080fd5b5061085461143d565b6040516108619190614379565b60405180910390f35b34801561087657600080fd5b5061087f611443565b60405161088c9190614325565b60405180910390f35b3480156108a157600080fd5b506108bc60048036038101906108b791906142db565b611448565b005b3480156108ca57600080fd5b506108e560048036038101906108e091906142db565b6114fc565b005b3480156108f357600080fd5b506108fc611548565b6040516109099190614379565b60405180910390f35b34801561091e57600080fd5b5061093960048036038101906109349190614394565b61154e565b005b34801561094757600080fd5b50610962600480360381019061095d91906142db565b6115e8565b60405161096f9190614379565b60405180910390f35b34801561098457600080fd5b5061098d611631565b005b34801561099b57600080fd5b506109b660048036038101906109b191906142db565b611645565b005b3480156109c457600080fd5b506109df60048036038101906109da91906142db565b6116f9565b005b3480156109ed57600080fd5b506109f66117ac565b604051610a039190614379565b60405180910390f35b348015610a1857600080fd5b50610a336004803603810190610a2e91906142db565b6117b2565b005b348015610a4157600080fd5b50610a4a611865565b005b348015610a5857600080fd5b50610a736004803603810190610a6e91906142db565b6118d9565b604051610a809190614379565b60405180910390f35b348015610a9557600080fd5b50610a9e611944565b604051610aab91906142c0565b60405180910390f35b348015610ac057600080fd5b50610ac9611957565b005b348015610ad757600080fd5b50610ae0611a1a565b005b348015610aee57600080fd5b50610af7611a3f565b604051610b04919061434f565b60405180910390f35b348015610b1957600080fd5b50610b22611a68565b604051610b2f91906141aa565b60405180910390f35b348015610b4457600080fd5b50610b5f6004803603810190610b5a91906142db565b611aa5565b005b348015610b6d57600080fd5b50610b886004803603810190610b8391906144ac565b611b58565b005b348015610b9657600080fd5b50610b9f611d09565b005b348015610bad57600080fd5b50610bc86004803603810190610bc39190614394565b611d9a565b005b348015610bd657600080fd5b50610bf16004803603810190610bec9190614265565b611df0565b604051610bfe91906142c0565b60405180910390f35b348015610c1357600080fd5b50610c1c611ecd565b005b348015610c2a57600080fd5b50610c456004803603810190610c409190614265565b611f20565b604051610c5291906142c0565b60405180910390f35b348015610c6757600080fd5b50610c70611f37565b005b348015610c7e57600080fd5b50610c87611f6b565b604051610c9491906142c0565b60405180910390f35b348015610ca957600080fd5b50610cc46004803603810190610cbf9190614394565b611f7e565b005b348015610cd257600080fd5b50610cdb61206c565b604051610ce89190614379565b60405180910390f35b348015610cfd57600080fd5b50610d0661208a565b005b348015610d1457600080fd5b50610d1d6120e3565b005b348015610d2b57600080fd5b50610d34612157565b604051610d419190614379565b60405180910390f35b348015610d5657600080fd5b50610d716004803603810190610d6c9190614539565b61215d565b604051610d7e9190614379565b60405180910390f35b348015610d9357600080fd5b50610d9c6121e4565b604051610da99190614379565b60405180910390f35b348015610dbe57600080fd5b50610dd96004803603810190610dd491906142db565b6121ea565b005b348015610de757600080fd5b50610e026004803603810190610dfd91906142db565b612252565b604051610e0f9190614379565b60405180910390f35b348015610e2457600080fd5b50610e3f6004803603810190610e3a9190614579565b6122bd565b005b348015610e4d57600080fd5b50610e566124a0565b604051610e639190614325565b60405180910390f35b348015610e7857600080fd5b50610e936004803603810190610e8e91906142db565b6124a5565b005b348015610ea157600080fd5b50610eaa612528565b604051610eb79190614379565b60405180910390f35b348015610ecc57600080fd5b50610ed561252e565b005b60606040518060400160405280600c81526020017f4d696e6920486172616d62650000000000000000000000000000000000000000815250905090565b600080610f1f612584565b9050610f2c81858561258c565b600191505092915050565b610f4033612755565b610f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7690614618565b60405180910390fd5b610f9381601b61280790919063ffffffff16565b15610fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca90614684565b60405180910390fd5b610fe781601b61283790919063ffffffff16565b5050565b6103e881565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600754905090565b6000600654905090565b611037612867565b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600154905090565b6006544261109391906146d3565b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b6103e881565b6110e733612755565b611126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111d90614618565b60405180910390fd5b600061ffff1681111561116e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116590614753565b60405180910390fd5b8060068190555050565b60006111858433846128e5565b611190848484612981565b600190509392505050565b600080600080600080600c549550600d549450600e549350600f54925060105491506011549050909192939495565b600860009054906101000a900460ff1681565b6103e881565b60006012905090565b603c81565b6000611285338484602160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461128091906146d3565b61258c565b6001905092915050565b611297612867565b6112a081612755565b156112e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d7906147bf565b60405180910390fd5b6112f481601761283790919063ffffffff16565b5050565b61130133612755565b611340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133790614618565b60405180910390fd5b600b54811115611385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137c90614851565b60405180910390fd5b61139a81600b54612de190919063ffffffff16565b600b81905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611408573d6000803e3d6000fd5b5050565b60065481565b600260009054906101000a900460ff1681565b61142d612867565b8060098190555050565b60055481565b60045481565b600081565b61145133612755565b611490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148790614618565b60405180910390fd5b6114a481601d61280790919063ffffffff16565b156114e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114db90614684565b60405180910390fd5b6114f881601d61283790919063ffffffff16565b5050565b611504612867565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b5481565b61155733612755565b611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158d90614618565b60405180910390fd5b603c61ffff168111156115de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d5906148bd565b60405180910390fd5b8060078190555050565b6000602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611639612867565b6116436000612df7565b565b61164e33612755565b61168d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168490614618565b60405180910390fd5b6116a181601961280790919063ffffffff16565b156116e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d890614684565b60405180910390fd5b6116f581601961283790919063ffffffff16565b5050565b61170233612755565b611741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173890614618565b60405180910390fd5b61175581601b61280790919063ffffffff16565b611794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178b90614929565b60405180910390fd5b6117a881601b612ebb90919063ffffffff16565b5050565b60035481565b6117bb33612755565b6117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f190614618565b60405180910390fd5b61180e81601961280790919063ffffffff16565b61184d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184490614929565b60405180910390fd5b611861816019612ebb90919063ffffffff16565b5050565b61186e33612755565b6118ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a490614618565b60405180910390fd5b600860019054906101000a900460ff1615600860016101000a81548160ff021916908315150217905550565b600080601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905042811161192f57600091505061193f565b428161193b9190614949565b9150505b919050565b600860019054906101000a900460ff1681565b61196033612755565b61199f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199690614618565b60405180910390fd5b6000600b5490506000600b81905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611a16573d6000803e3d6000fd5b5050565b611a22612867565b6001600260006101000a81548160ff021916908315150217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600381526020017f4d48420000000000000000000000000000000000000000000000000000000000815250905090565b611aae33612755565b611aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae490614618565b60405180910390fd5b611b0181601d61280790919063ffffffff16565b611b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3790614929565b60405180910390fd5b611b5481601d612ebb90919063ffffffff16565b5050565b611b6133612755565b611ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9790614618565b60405180910390fd5b6000818385611baf91906146d3565b611bb991906146d3565b905060648114611bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf5906149ef565b60405180910390fd5b601461ffff16871115611c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3d90614a5b565b60405180910390fd5b601461ffff16861115611c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8590614ac7565b60405180910390fd5b601461ffff16851115611cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccd90614b33565b60405180910390fd5b83600f81905550826010819055508160118190555086600c8190555085600d8190555084600e8190555050505050505050565b611d1233612755565b611d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4890614618565b60405180910390fd5b6000611d5c306115e8565b9050611d6930338361258c565b611d9630601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611178565b5050565b611da333612755565b611de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd990614618565b60405180910390fd5b611ded600182612eeb565b50565b600080602160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eac90614bc5565b60405180910390fd5b611ec2338585840361258c565b600191505092915050565b60075442611edb91906146d3565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b6000611f2d338484612981565b6001905092915050565b611f3f612867565b600860029054906101000a900460ff1615600860026101000a81548160ff021916908315150217905550565b600860029054906101000a900460ff1681565b611f8733612755565b611fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbd90614618565b60405180910390fd5b600081101561200a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200190614c57565b60405180910390fd5b612020606460015461313690919063ffffffff16565b811115612062576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205990614ce9565b60405180910390fd5b8060098190555050565b6000612085600154602254612de190919063ffffffff16565b905090565b612092612867565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156120d8573d6000803e3d6000fd5b506000600b81905550565b6120ec33612755565b61212b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212290614618565b60405180910390fd5b600860009054906101000a900460ff1615600860006101000a81548160ff021916908315150217905550565b600a5481565b6000602160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60095481565b6121f2612867565b6121fb81612755565b61223a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223190614d55565b60405180910390fd5b61224e816017612ebb90919063ffffffff16565b5050565b600080601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490504281116122a85760009150506122b8565b42816122b49190614949565b9150505b919050565b6122c633612755565b612305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fc90614618565b60405180910390fd5b60006123226103e861ffff1660015461313690919063ffffffff16565b905060006123416103e861ffff1660015461313690919063ffffffff16565b905060006123606103e861ffff1660015461313690919063ffffffff16565b9050808610156123a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239c90614de7565b60405180910390fd5b818510156123e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123df90614de7565b60405180910390fd5b8284101561242b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242290614e79565b60405180910390fd5b612441606460015461313690919063ffffffff16565b851115612483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247a90614f31565b60405180910390fd5b836003819055508460058190555085600481905550505050505050565b601481565b6124ad612867565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361251c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251390614fc3565b60405180910390fd5b61252581612df7565b50565b60075481565b61253733612755565b612576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256d90614618565b60405180910390fd5b61258260016000612eeb565b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036125fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f290615055565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361266a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612661906150e7565b60405180910390fd5b80602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516127489190614379565b60405180910390a3505050565b600061275f611a3f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806127e55750601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b8061280057506127ff82601761280790919063ffffffff16565b5b9050919050565b600061282f836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61314c565b905092915050565b600061285f836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61316f565b905092915050565b61286f612584565b73ffffffffffffffffffffffffffffffffffffffff1661288d611a3f565b73ffffffffffffffffffffffffffffffffffffffff16146128e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128da90615153565b60405180910390fd5b565b60006128f1848461215d565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461297b578181101561295d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612954906151bf565b60405180910390fd5b61297a84846129758585612de190919063ffffffff16565b61258c565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036129f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e79061522b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5690615297565b60405180910390fd5b6000612a7584601961280790919063ffffffff16565b80612a905750612a8f83601961280790919063ffffffff16565b5b905060003073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480612af957503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b90506000601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16148015612bac57508173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b80612c3b5750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16148015612c3a57508173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b5b90506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161480612cc657508273ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b90506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161480612d5157508373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b90508480612d5c5750825b80612d645750855b15612d7957612d748989896131df565b612dd6565b600260009054906101000a900460ff16612dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dbf90615303565b60405180910390fd5b612dd589898985856132e5565b5b505050505050505050565b60008183612def9190614949565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612ee3836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6139a4565b905092915050565b6001602360006101000a81548160ff0219169083151502179055506000602060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000612f63601154601054613ab890919063ffffffff16565b905060008211612f74575050613117565b83158015612f8e5750600954821080612f8d5750600081145b5b15612f9a575050613117565b600083905060008103612fbb57829050600954811115612fba5760095490505b5b82811115612ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff590615395565b60405180910390fd5b60006130278361301960105485613ace90919063ffffffff16565b61313690919063ffffffff16565b9050600061303e8284612de190919063ffffffff16565b9050600061305660028461313690919063ffffffff16565b9050600061306d8285612de190919063ffffffff16565b905060006130848483613ab890919063ffffffff16565b9050600047905061309482613ae4565b60006130a98247612de190919063ffffffff16565b905060006130d2846130c48785613ace90919063ffffffff16565b61313690919063ffffffff16565b90506130de8682613d27565b6131056130f48284612de190919063ffffffff16565b600b54613ab890919063ffffffff16565b600b8190555050505050505050505050505b6000602360006101000a81548160ff0219169083151502179055505050565b6000818361314491906153e4565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600061317b838361314c565b6131d45782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506131d9565b600090505b92915050565b6000602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325d90615461565b60405180910390fd5b6132708483613e1e565b61327a8383613eb7565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516132d79190614379565b60405180910390a350505050565b6000602060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000602060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050848110156133b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a790615461565b60405180910390fd5b6000831561350a576133cc88601b61280790919063ffffffff16565b6134bb5742601560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411158061342a5750600860019054906101000a900460ff165b613469576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613460906154f3565b60405180910390fd5b6007544261347791906146d3565b601560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600554861115613500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f79061555f565b60405180910390fd5b600d5490506137bb565b84156136b25761352487601d61280790919063ffffffff16565b6136135742601660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115806135825750600860009054906101000a900460ff165b6135c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b8906155cb565b60405180910390fd5b600654426135cf91906146d3565b601660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600354868461362291906146d3565b1115613663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365a90615637565b60405180910390fd5b6004548611156136a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161369f906156a3565b60405180910390fd5b600c5490506137ba565b60035486846136c191906146d3565b1115613702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136f990615637565b60405180910390fd5b61371688601b61280790919063ffffffff16565b6137b45742601560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115806137745750600860019054906101000a900460ff165b6137b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137aa90615735565b60405180910390fd5b5b600e5490505b5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16141580156138265750600860029054906101000a900460ff16155b801561383f5750602360009054906101000a900460ff16155b80156138485750835b1561385957613858600080612eeb565b5b60006138688783600f54613f50565b90506000613886888460105460115461388191906146d3565b613f50565b90506000818361389691906146d3565b896138a19190614949565b90506138ad8b8a613e1e565b81602060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138fc91906146d3565b9250508190555061390d3084613f94565b61392283600154612de190919063ffffffff16565b6001819055506139328a82613eb7565b8973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161398f9190614379565b60405180910390a35050505050505050505050565b60008083600101600084815260200190815260200160002054905060008114613aac5760006001826139d69190614949565b90506000600186600001805490506139ee9190614949565b9050818114613a5d576000866000018281548110613a0f57613a0e615755565b5b9060005260206000200154905080876000018481548110613a3357613a32615755565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480613a7157613a70615784565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050613ab2565b60009150505b92915050565b60008183613ac691906146d3565b905092915050565b60008183613adc91906157b3565b905092915050565b613b1130601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361258c565b6000600267ffffffffffffffff811115613b2e57613b2d6157f5565b5b604051908082528060200260200182016040528015613b5c5781602001602082028036833780820191505090505b5090503081600081518110613b7457613b73615755565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c3f9190615839565b81600181518110613c5357613c52615755565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613cf1959493929190615969565b600060405180830381600087803b158015613d0b57600080fd5b505af1158015613d1f573d6000803e3d6000fd5b505050505050565b80600a6000828254613d3991906146d3565b92505081905550613d6d30601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461258c565b601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008030426040518863ffffffff1660e01b8152600401613dd4969594939291906159c3565b60606040518083038185885af1158015613df2573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613e179190615a39565b5050505050565b613e7081602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612de190919063ffffffff16565b602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b613f0981602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ab890919063ffffffff16565b602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6000613f8b612710613f7d84613f6f8789613ace90919063ffffffff16565b613ace90919063ffffffff16565b61313690919063ffffffff16565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603614003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ffa90615afe565b60405180910390fd5b6000602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561408a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161408190615b90565b60405180910390fd5b61409f82600154612de190919063ffffffff16565b6001819055506140af8383613e1e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161410d9190614379565b60405180910390a3505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614154578082015181840152602081019050614139565b60008484015250505050565b6000601f19601f8301169050919050565b600061417c8261411a565b6141868185614125565b9350614196818560208601614136565b61419f81614160565b840191505092915050565b600060208201905081810360008301526141c48184614171565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006141fc826141d1565b9050919050565b61420c816141f1565b811461421757600080fd5b50565b60008135905061422981614203565b92915050565b6000819050919050565b6142428161422f565b811461424d57600080fd5b50565b60008135905061425f81614239565b92915050565b6000806040838503121561427c5761427b6141cc565b5b600061428a8582860161421a565b925050602061429b85828601614250565b9150509250929050565b60008115159050919050565b6142ba816142a5565b82525050565b60006020820190506142d560008301846142b1565b92915050565b6000602082840312156142f1576142f06141cc565b5b60006142ff8482850161421a565b91505092915050565b600061ffff82169050919050565b61431f81614308565b82525050565b600060208201905061433a6000830184614316565b92915050565b614349816141f1565b82525050565b60006020820190506143646000830184614340565b92915050565b6143738161422f565b82525050565b600060208201905061438e600083018461436a565b92915050565b6000602082840312156143aa576143a96141cc565b5b60006143b884828501614250565b91505092915050565b6000806000606084860312156143da576143d96141cc565b5b60006143e88682870161421a565b93505060206143f98682870161421a565b925050604061440a86828701614250565b9150509250925092565b600060c082019050614429600083018961436a565b614436602083018861436a565b614443604083018761436a565b614450606083018661436a565b61445d608083018561436a565b61446a60a083018461436a565b979650505050505050565b600060ff82169050919050565b61448b81614475565b82525050565b60006020820190506144a66000830184614482565b92915050565b60008060008060008060c087890312156144c9576144c86141cc565b5b60006144d789828a01614250565b96505060206144e889828a01614250565b95505060406144f989828a01614250565b945050606061450a89828a01614250565b935050608061451b89828a01614250565b92505060a061452c89828a01614250565b9150509295509295509295565b600080604083850312156145505761454f6141cc565b5b600061455e8582860161421a565b925050602061456f8582860161421a565b9150509250929050565b600080600060608486031215614592576145916141cc565b5b60006145a086828701614250565b93505060206145b186828701614250565b92505060406145c286828701614250565b9150509250925092565b7f43616c6c6572206973206e6f742061207465616d206d656d6265720000000000600082015250565b6000614602601b83614125565b915061460d826145cc565b602082019050919050565b60006020820190508181036000830152614631816145f5565b9050919050565b7f4164647265737320697320616c7265616479206578636c756465640000000000600082015250565b600061466e601b83614125565b915061467982614638565b602082019050919050565b6000602082019050818103600083015261469d81614661565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006146de8261422f565b91506146e98361422f565b9250828201905080821115614701576147006146a4565b5b92915050565b7f427579206c6f636b2074696d652065786365656473206d6178696d756d000000600082015250565b600061473d601d83614125565b915061474882614707565b602082019050919050565b6000602082019050818103600083015261476c81614730565b9050919050565b7f4164647265737320697320616c726561647920696e207465616d000000000000600082015250565b60006147a9601a83614125565b91506147b482614773565b602082019050919050565b600060208201905081810360008301526147d88161479c565b9050919050565b7f416d6f756e7420746f207769746864726177206578636565647320657869737460008201527f696e672062616c616e6365000000000000000000000000000000000000000000602082015250565b600061483b602b83614125565b9150614846826147df565b604082019050919050565b6000602082019050818103600083015261486a8161482e565b9050919050565b7f53656c6c206c6f636b2074696d652065786365656473206d6178696d756d0000600082015250565b60006148a7601e83614125565b91506148b282614871565b602082019050919050565b600060208201905081810360008301526148d68161489a565b9050919050565b7f4164647265737320697320616c726561647920696e636c756465640000000000600082015250565b6000614913601b83614125565b915061491e826148dd565b602082019050919050565b6000602082019050818103600083015261494281614906565b9050919050565b60006149548261422f565b915061495f8361422f565b9250828203905081811115614977576149766146a4565b5b92915050565b7f4275726e2d2c206c69717569646974792d20616e642066756e64696e6720736860008201527f617265206f66207461786573206e65656420746f2073756d20746f2031303000602082015250565b60006149d9603f83614125565b91506149e48261497d565b604082019050919050565b60006020820190508181036000830152614a08816149cc565b9050919050565b7f4275792074617820746f6f206869676800000000000000000000000000000000600082015250565b6000614a45601083614125565b9150614a5082614a0f565b602082019050919050565b60006020820190508181036000830152614a7481614a38565b9050919050565b7f53656c6c2074617820746f6f2068696768000000000000000000000000000000600082015250565b6000614ab1601183614125565b9150614abc82614a7b565b602082019050919050565b60006020820190508181036000830152614ae081614aa4565b9050919050565b7f5472616e736665722074617820746f6f20686967680000000000000000000000600082015250565b6000614b1d601583614125565b9150614b2882614ae7565b602082019050919050565b60006020820190508181036000830152614b4c81614b10565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614baf602583614125565b9150614bba82614b53565b604082019050919050565b60006020820190508181036000830152614bde81614ba2565b9050919050565b7f53776170207468726573686f6c64206d757374206265206c617267657220746860008201527f616e207a65726f00000000000000000000000000000000000000000000000000602082015250565b6000614c41602783614125565b9150614c4c82614be5565b604082019050919050565b60006020820190508181036000830152614c7081614c34565b9050919050565b7f53776170207468726573686f6c64206d757374206265206174206d6f7374203160008201527f25206f6620746f74616c20737570706c79000000000000000000000000000000602082015250565b6000614cd3603183614125565b9150614cde82614c77565b604082019050919050565b60006020820190508181036000830152614d0281614cc6565b9050919050565b7f41646472657373206973206e6f7420696e207465616d00000000000000000000600082015250565b6000614d3f601683614125565b9150614d4a82614d09565b602082019050919050565b60006020820190508181036000830152614d6e81614d32565b9050919050565b7f4e65772073656c6c206c696d6974206e6565647320746f206265206174206c6560008201527f6173742074617267657400000000000000000000000000000000000000000000602082015250565b6000614dd1602a83614125565b9150614ddc82614d75565b604082019050919050565b60006020820190508181036000830152614e0081614dc4565b9050919050565b7f4e65772062616c616e6365206c696d6974206e6565647320746f20626520617460008201527f206c656173742074617267657400000000000000000000000000000000000000602082015250565b6000614e63602d83614125565b9150614e6e82614e07565b604082019050919050565b60006020820190508181036000830152614e9281614e56565b9050919050565b7f53656c6c206c696d6974206e6565647320746f2062652062656c6f77206f722060008201527f657175616c20746f203125206f662063697263756c6174696e6720737570706c60208201527f7900000000000000000000000000000000000000000000000000000000000000604082015250565b6000614f1b604183614125565b9150614f2682614e99565b606082019050919050565b60006020820190508181036000830152614f4a81614f0e565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614fad602683614125565b9150614fb882614f51565b604082019050919050565b60006020820190508181036000830152614fdc81614fa0565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061503f602483614125565b915061504a82614fe3565b604082019050919050565b6000602082019050818103600083015261506e81615032565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006150d1602283614125565b91506150dc82615075565b604082019050919050565b60006020820190508181036000830152615100816150c4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061513d602083614125565b915061514882615107565b602082019050919050565b6000602082019050818103600083015261516c81615130565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006151a9601d83614125565b91506151b482615173565b602082019050919050565b600060208201905081810360008301526151d88161519c565b9050919050565b7f5472616e736665722066726f6d207a65726f0000000000000000000000000000600082015250565b6000615215601283614125565b9150615220826151df565b602082019050919050565b6000602082019050818103600083015261524481615208565b9050919050565b7f5472616e7366657220746f207a65726f00000000000000000000000000000000600082015250565b6000615281601083614125565b915061528c8261524b565b602082019050919050565b600060208201905081810360008301526152b081615274565b9050919050565b7f45524332303a2054726164696e67206e6f742079657420656e61626c65640000600082015250565b60006152ed601e83614125565b91506152f8826152b7565b602082019050919050565b6000602082019050818103600083015261531c816152e0565b9050919050565b7f53656c6c20616d6f756e74206c6172676572207468616e20636f6e747261637460008201527f2062616c616e6365000000000000000000000000000000000000000000000000602082015250565b600061537f602883614125565b915061538a82615323565b604082019050919050565b600060208201905081810360008301526153ae81615372565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006153ef8261422f565b91506153fa8361422f565b92508261540a576154096153b5565b5b828204905092915050565b7f45524332303a205472616e7366657220657863656564732062616c616e636500600082015250565b600061544b601f83614125565b915061545682615415565b602082019050919050565b6000602082019050818103600083015261547a8161543e565b9050919050565b7f45524332303a2043616c6c657220696e2073656c6c206c6f636b20706572696f60008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b60006154dd602183614125565b91506154e882615481565b604082019050919050565b6000602082019050818103600083015261550c816154d0565b9050919050565b7f45524332303a2053656c6c206c696d6974206578636565646564000000000000600082015250565b6000615549601a83614125565b915061555482615513565b602082019050919050565b600060208201905081810360008301526155788161553c565b9050919050565b7f45524332303a2043616c6c657220696e20627579206c6f636b20706572696f64600082015250565b60006155b5602083614125565b91506155c08261557f565b602082019050919050565b600060208201905081810360008301526155e4816155a8565b9050919050565b7f45524332303a2042616c616e6365206c696d6974206578636565646564000000600082015250565b6000615621601d83614125565b915061562c826155eb565b602082019050919050565b6000602082019050818103600083015261565081615614565b9050919050565b7f45524332303a20427579206c696d697420657863656564656400000000000000600082015250565b600061568d601983614125565b915061569882615657565b602082019050919050565b600060208201905081810360008301526156bc81615680565b9050919050565b7f45524332303a2053656e64657220696e2073656c6c206c6f636b20706572696f60008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b600061571f602183614125565b915061572a826156c3565b604082019050919050565b6000602082019050818103600083015261574e81615712565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006157be8261422f565b91506157c98361422f565b92508282026157d78161422f565b915082820484148315176157ee576157ed6146a4565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008151905061583381614203565b92915050565b60006020828403121561584f5761584e6141cc565b5b600061585d84828501615824565b91505092915050565b6000819050919050565b6000819050919050565b600061589561589061588b84615866565b615870565b61422f565b9050919050565b6158a58161587a565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6158e0816141f1565b82525050565b60006158f283836158d7565b60208301905092915050565b6000602082019050919050565b6000615916826158ab565b61592081856158b6565b935061592b836158c7565b8060005b8381101561595c57815161594388826158e6565b975061594e836158fe565b92505060018101905061592f565b5085935050505092915050565b600060a08201905061597e600083018861436a565b61598b602083018761589c565b818103604083015261599d818661590b565b90506159ac6060830185614340565b6159b9608083018461436a565b9695505050505050565b600060c0820190506159d86000830189614340565b6159e5602083018861436a565b6159f2604083018761589c565b6159ff606083018661589c565b615a0c6080830185614340565b615a1960a083018461436a565b979650505050505050565b600081519050615a3381614239565b92915050565b600080600060608486031215615a5257615a516141cc565b5b6000615a6086828701615a24565b9350506020615a7186828701615a24565b9250506040615a8286828701615a24565b9150509250925092565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615ae8602183614125565b9150615af382615a8c565b604082019050919050565b60006020820190508181036000830152615b1781615adb565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000615b7a602283614125565b9150615b8582615b1e565b604082019050919050565b60006020820190508181036000830152615ba981615b6d565b905091905056fea2646970667358221220a43f139424e122647ad1b6ecd16d3b80d473c797ce13a089f41b6c8174c4e02764736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a5e0829caced8ffdd4de3c43696c57f7d7a678ff
-----Decoded View---------------
Arg [0] : _routerAddress (address): 0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5e0829caced8ffdd4de3c43696c57f7d7a678ff
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.