ERC-20
Overview
Max Total Supply
1,000,000,000,000 ASTAX 🦍
Holders
1,124
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
68,406.048640641 ASTAX 🦍Value
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ApeToken
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Unlicensed pragma solidity ^0.8.4; import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.1.0/contracts/token/ERC20/IERC20.sol"; import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.1.0/contracts/access/Ownable.sol"; import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.1.0/contracts/utils/Context.sol"; import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.1.0/contracts/utils/math/SafeMath.sol"; import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.1.0/contracts/utils/Address.sol"; contract ApeToken is Context, IERC20, Ownable { using SafeMath for uint256; using Address for address; // erc20 mapping (address => uint256) private _rOwned; mapping(address => mapping(address => uint256)) private _allowances; // total supply = 1 trillion uint256 private constant _tTotal = 10**12 * 10**_decimals; uint256 private constant MAX = ~uint256(0); uint256 private _rTotal = (MAX - (MAX % _tTotal)); string private _name = 'APE STAX'; string private _symbol = 'ASTAX \xF0\x9F\xA6\x8D'; uint8 private constant _decimals = 9; // uniswap address public constant uniswapV2RouterAddr = address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); IUniswapV2Router02 public uniswapV2Router = IUniswapV2Router02(uniswapV2RouterAddr); address public constant uniswapV2FactoryAddr = address(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f); address public liquidityPoolAddr = UniswapV2Library.pairFor(uniswapV2FactoryAddr, uniswapV2Router.WETH(), address(this)); // initial token allocations uint256 private _ownerTokenAmount = _rTotal.div(100).mul(90); uint256 private _marketingInitialTokenAmount = _rTotal.div(100).mul(5); uint256 private _lotteryTokenAmount = _rTotal.div(100).mul(5); // cooldown and numsells struct Holder { uint256 timeTransfer; uint256 numSells; uint256 timeSell; } mapping (address => Holder) public holder; // first 10 minutes there is a buy limit of 1.1 bn // uint256 private constant _buylimitPriceImpact = 3; uint256 private constant _buyLimit = 11 * 10**8 * 10**_decimals; uint256 private constant _buyLimitTime = 10 minutes; uint256 private constant _resetTime = 24 hours; uint256 private _buyCooldown = 10 seconds; uint256 private _sellCooldown = 30 seconds; uint256 private _w2wCooldown = 30 seconds; // taxes mapping (address => bool) public whitelist; mapping (address => bool) public blacklist; struct Taxes { uint256 marketing; uint256 redistribution; uint256 lottery; uint256 buybackBurn; } // index 0 in setter Taxes private _buyTaxrates = Taxes(50, 25, 25, 0); Taxes private _firstSellTaxrates = Taxes(50, 0, 20, 30); Taxes private _secondSellTaxrates = Taxes(130, 0, 30, 40); Taxes private _thirdSellTaxrates = Taxes(150, 0, 40, 60); Taxes private _fourthSellTaxrates = Taxes(180, 0, 40, 80); Taxes private _w2wSellTaxrates = Taxes(150, 0, 40, 60); address public constant burnAddr = address(0x000000000000000000000000000000000000dEaD); address payable public marketingAddr = payable(0x7B7B7c8A9cd0922E5894B3d3166f313Cf200A363); address payable public marketingInitialAddr = payable(0xdcBBcAA8fD8e610017D6922517Ff3f4ed2611e71); address public lotteryAddr = address(0x284c1D4Fb47e6548bde1e63A47198419Ec678449); // gets set to true after openTrading is called bool public tradingEnabled = false; uint256 public launchTime; // preventing circular calls of swapping bool public inSwap = false; modifier lockTheSwap { inSwap = true; _; inSwap = false; } // every time the contract has 0.000005% of the total supply in tokens it will swap // them to eth in the next sell, keeping the buyback taxes whilst sending the rest to marketing uint256 public minimumTokensBeforeSwap = _tTotal.mul(5).div(1000000); // every time the contract has 1 eth it will use that for the buyback burn uint256 public minimumETHBeforeBurn = 1 ether; // the counter for how much of the token balance of the contract is allocated to buyback. // get reset every time the contract balance is swapped to eth. uint256 public rBuybackBurn; // incase something goes wrong, pause all transfers completely bool public transfersPaused = false; // to make sure that transfers can never be locked forever, pauses are 1 week long uint256 public transfersPausedTime; uint256 private constant _pauseDuration = 1 weeks; event SwapETHForTokens(uint256 amountIn, address[] path); event SwapTokensForETH(uint256 amountIn, address[] path); constructor () { // 90% of tsupply to owner _rOwned[_msgSender()] = _ownerTokenAmount; emit Transfer(address(0), _msgSender(), _ownerTokenAmount); // 5% of tsupply to marketingInitial _rOwned[marketingInitialAddr] = _marketingInitialTokenAmount; emit Transfer(address(0), marketingInitialAddr, _marketingInitialTokenAmount); // 5% of tsupply to lottery _rOwned[lotteryAddr] = _lotteryTokenAmount; emit Transfer(address(0), lotteryAddr, _lotteryTokenAmount); whitelist[address(this)] = true; whitelist[_msgSender()] = true; whitelist[lotteryAddr] = true; whitelist[burnAddr] = true; whitelist[marketingInitialAddr] = true; whitelist[marketingAddr] = true; // this is for the disperse app (airdrop) whitelist[address(0xD152f549545093347A162Dce210e7293f1452150)] = true; } receive() external payable {} // ========== ERC20 function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public pure returns (uint8) { return _decimals; } function totalSupply() public pure override returns (uint256) { return _tTotal; } function balanceOf(address account) public view override returns (uint256) { return tokenFromReflection(_rOwned[account]); } function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } 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); } // ========== TRANSFER function _transfer(address sender, address recipient, uint256 tAmount) private { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); require(tAmount > 0, "Transfer amount must be greater than zero"); require(tradingEnabled || whitelist[sender] || whitelist[recipient], "ASTAX: Trading is not live yet. "); require(!blacklist[sender] && !blacklist[recipient], "ASTAX: Address is blacklisted. "); require(!transfersPaused || transfersPausedTime.add(_pauseDuration) <= block.timestamp, "ASTAX: Trading is paused. "); Taxes memory taxRates = Taxes(0,0,0,0); // getting appropiate tax rates and swapping of tokens/ sending of eth when threshhold passed if (!whitelist[sender] && !whitelist[recipient]) { // buy tax if (sender == liquidityPoolAddr && recipient != uniswapV2RouterAddr) { if (launchTime.add(_buyLimitTime) >= block.timestamp) { require( tAmount <= _buyLimit, "ASTAX: No buy greater than 1.1 billion can be made for the first 10 minutes. " ); } // enforce cooldown and note down time require( holder[recipient].timeTransfer.add(_buyCooldown) < block.timestamp, "ASTAX: Need to wait until next transfer. " ); holder[recipient].timeTransfer = block.timestamp; // set standard buy taxrates taxRates = _buyTaxrates; } // sell tax if (recipient == liquidityPoolAddr) { // enforce cooldown and note down time require( holder[sender].timeTransfer.add(_sellCooldown) < block.timestamp, "ASTAX: Need to wait until next transfer. " ); holder[sender].timeTransfer = block.timestamp; // reset number of sells after 24 hours if (holder[sender].numSells > 0 && holder[sender].timeSell.add(_resetTime) < block.timestamp) { holder[sender].numSells = 0; holder[sender].timeSell = block.timestamp; } // set tax according to price impact or number of sells uint256 priceImpact = tAmount.mul(100).div(balanceOf(liquidityPoolAddr)); // default sell taxrate, gets changed if numsells or priceimpact indicates that it should taxRates = _firstSellTaxrates; if (priceImpact > 1 || holder[sender].numSells == 1) { taxRates = _secondSellTaxrates; } if (priceImpact > 2 || holder[sender].numSells >= 2) { taxRates = _thirdSellTaxrates; } if (priceImpact > 3) { taxRates = _fourthSellTaxrates; } // increment number of sells for holder if (holder[sender].numSells < 2) { holder[sender].numSells = holder[sender].numSells.add(1); } } // wallet 2 wallet tax (or nonuniswap) if (sender != liquidityPoolAddr && recipient != liquidityPoolAddr) { // enforce cooldown and note down time require( holder[sender].timeTransfer.add(_w2wCooldown) < block.timestamp, "ASTAX: Need to wait until next transfer. " ); holder[sender].timeTransfer = block.timestamp; // same tax rates as a third sell taxRates = _w2wSellTaxrates; } // if not already swapping then tokens and eth can be swapped now // when marketing, lottery and burn address are whitelisted inSwap is irrelevant if (!inSwap && sender != liquidityPoolAddr) { // swap tokens and send some to marketing, whilst keeping the eth for buyback burn uint256 contractTokenBalance = balanceOf(address(this)); if (contractTokenBalance >= minimumTokensBeforeSwap) { if (rBuybackBurn != 0) { uint256 toBeBurned = tokenFromReflection(rBuybackBurn); uint256 toBeSentToMarketing = contractTokenBalance.sub(toBeBurned); if (toBeSentToMarketing != 0) { swapTokensForETHTo(toBeSentToMarketing, marketingAddr); } rBuybackBurn = 0; swapTokensForETHTo(toBeBurned, payable(this)); } else { swapTokensForETHTo(contractTokenBalance, marketingAddr); } } // swap eth for buyback burn if above minimum uint256 contractETHBalance = address(this).balance; if (contractETHBalance >= minimumETHBeforeBurn) { swapETHForTokensTo(contractETHBalance, burnAddr); } } } // make sure taxes are not applied when swapping internal balances // in case marketing, lottery or burn address are not whitelisted if(inSwap) { taxRates = Taxes(0,0,0,0); } // check taxrates and use simpler transfer if appropiate if (taxRates.marketing == 0 && taxRates.buybackBurn == 0 && taxRates.redistribution == 0 && taxRates.lottery == 0) { _tokenTransferWithoutFees(sender, recipient, tAmount); } else { _tokenTransferWithFees(sender, recipient, tAmount, taxRates); } } function _tokenTransferWithoutFees(address sender, address recipient, uint256 tAmount) private { uint256 currentRate = _getRate(); uint256 rAmount = tAmount.mul(currentRate); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rAmount); emit Transfer(sender, recipient, tAmount); } function _tokenTransferWithFees(address sender, address recipient, uint256 tAmount, Taxes memory taxRates) private { // translating amount to reflected amount uint256 currentRate = _getRate(); uint256 rAmount = tAmount.mul(currentRate); // getting tax values Taxes memory tTaxValues = _getTTaxValues(tAmount, taxRates); Taxes memory rTaxValues = _getRTaxValues(tTaxValues); // removing tax values from the total amount uint256 rTransferAmount = _getTransferAmount(rAmount, rTaxValues); uint256 tTransferAmount = _getTransferAmount(tAmount, tTaxValues); // reflecting sender and recipient balances _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); // reflecting redistribution fees _rTotal = _rTotal.sub(rTaxValues.redistribution); // reflecting lottery fees _rOwned[lotteryAddr] = _rOwned[lotteryAddr].add(rTaxValues.lottery); // reflecting buybackburn and marketing fees _rOwned[address(this)] = _rOwned[address(this)].add(rTaxValues.marketing).add(rTaxValues.buybackBurn); rBuybackBurn = rBuybackBurn.add(rTaxValues.buybackBurn); // standard erc20 event emit Transfer(sender, recipient, tTransferAmount); } // ========== SWAP function swapTokensForETHTo(uint256 tokenAmount, address payable recipient) private lockTheSwap { address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), uniswapV2RouterAddr, tokenAmount); uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, path, recipient, block.timestamp ); emit SwapTokensForETH(tokenAmount, path); } function swapETHForTokensTo(uint256 amount, address recipient) private lockTheSwap { address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = address(this); uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}( 0, path, recipient, block.timestamp.add(300) ); emit SwapETHForTokens(amount, path); } // ========== REFLECT function _getRate() private view returns(uint256) { return _rTotal.div(_tTotal); } function tokenFromReflection(uint256 rAmount) public view returns(uint256) { require(rAmount <= _rTotal, "Amount must be less or equal than total reflections"); uint256 currentRate = _getRate(); return rAmount.div(currentRate); } function _getTTaxValues(uint256 amount, Taxes memory taxRates) private pure returns (Taxes memory) { Taxes memory taxValues; taxValues.redistribution = amount.div(1000).mul(taxRates.redistribution); taxValues.buybackBurn = amount.div(1000).mul(taxRates.buybackBurn); taxValues.marketing = amount.div(1000).mul(taxRates.marketing); taxValues.lottery = amount.div(1000).mul(taxRates.lottery); return taxValues; } function _getRTaxValues(Taxes memory tTaxValues) private view returns (Taxes memory) { Taxes memory taxValues; uint256 currentRate = _getRate(); taxValues.redistribution = tTaxValues.redistribution.mul(currentRate); taxValues.buybackBurn = tTaxValues.buybackBurn.mul(currentRate); taxValues.marketing = tTaxValues.marketing.mul(currentRate); taxValues.lottery = tTaxValues.lottery.mul(currentRate); return taxValues; } function _getTransferAmount(uint256 amount, Taxes memory taxValues) private pure returns (uint256) { return amount.sub(taxValues.marketing).sub(taxValues.lottery).sub(taxValues.buybackBurn).sub(taxValues.redistribution); } // ========== ADMIN function openTrading() external onlyOwner() { require(!tradingEnabled, "ASTAX: Trading is already enabled. "); tradingEnabled = true; launchTime = block.timestamp; } // swap tokens and send some to marketing, whilst keeping some eth for buyback burn function manualTaxConv() external onlyOwner() returns (bool) { uint256 contractTokenBalance = balanceOf(address(this)); if (contractTokenBalance > 0) { if (rBuybackBurn != 0) { uint256 toBeBurned = tokenFromReflection(rBuybackBurn); uint256 toBeSentToMarketing = contractTokenBalance.sub(toBeBurned); if (toBeSentToMarketing != 0) { swapTokensForETHTo(toBeSentToMarketing, marketingAddr); } rBuybackBurn = 0; swapTokensForETHTo(toBeBurned, payable(this)); } else { swapTokensForETHTo(contractTokenBalance, marketingAddr); } } return true; } function manualBuybackBurn() external onlyOwner() returns (bool) { uint256 contractETHBalance = address(this).balance; if (contractETHBalance > 0) { swapETHForTokensTo(contractETHBalance, burnAddr); } return true; } function setWhitelist(address addr, bool onoff) external onlyOwner() { whitelist[addr] = onoff; } function setBlacklist(address addr, bool onoff) external onlyOwner() { require(addr != liquidityPoolAddr && addr != uniswapV2RouterAddr, "ASTAX: Can't block uniswap. "); blacklist[addr] = onoff; } function setMarketingWallet(address payable marketing) external onlyOwner() { marketingAddr = marketing; } function setMarketingLottery(address lottery) external onlyOwner() { lotteryAddr = lottery; } function setMinimumTokensBeforeSwap(uint256 val) external onlyOwner() { minimumTokensBeforeSwap = val; } function setMinimumETHBeforeBurn(uint256 val) external onlyOwner() { minimumETHBeforeBurn = val; } function setBuyCooldown(uint256 cooldown) external onlyOwner() { require(cooldown <= 60 seconds, "ASTAX: Cooldown value too large. "); _buyCooldown = cooldown; } function setW2WCooldown(uint256 cooldown) external onlyOwner() { require(cooldown <= 60 seconds, "ASTAX: Cooldown value too large. "); _w2wCooldown = cooldown; } function setSellCooldown(uint256 cooldown) external onlyOwner() { require(cooldown <= 60 seconds, "ASTAX: Cooldown value too large. "); _sellCooldown = cooldown; } // ugly. not proud of it, but works. in theory allows setting firststell taxrates to 45%, // but because of contract code size limits this has to suffice. function setTaxrates(uint256 i, Taxes calldata taxrates) external onlyOwner() { if (i == 0) { _firstSellTaxrates = taxrates; } else if (i == 1) { _secondSellTaxrates = taxrates; } else if (i == 2) { _thirdSellTaxrates = taxrates; } else if (i == 3) { _fourthSellTaxrates = taxrates; } else if (i == 4) { _w2wSellTaxrates = taxrates; } else if (i == 5) { _buyTaxrates = taxrates; } else if (i == 6) { _firstSellTaxrates = taxrates; _secondSellTaxrates = taxrates; _thirdSellTaxrates = taxrates; _fourthSellTaxrates = taxrates; _w2wSellTaxrates = taxrates; } } function setPauseTrading(bool onoff) external onlyOwner() { transfersPaused = onoff; if (onoff) { transfersPausedTime = block.timestamp; } } } // ========== LIBS library UniswapV2Library { // returns sorted token addresses, used to handle return values from pairs sorted in this order function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) { require(tokenA != tokenB, 'UniswapV2Library: IDENTICAL_ADDRESSES'); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), 'UniswapV2Library: ZERO_ADDRESS'); } // calculates the CREATE2 address for a pair without making any external calls function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = address(uint160(uint(keccak256(abi.encodePacked( hex'ff', factory, keccak256(abi.encodePacked(token0, token1)), hex'96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f' // init code hash ))))); } } interface IUniswapV2Router02 { 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; function WETH() external pure returns (address); function addLiquidity( address tokenA, 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT 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 no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT 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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT 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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapETHForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"address","name":"","type":"address"}],"name":"holder","outputs":[{"internalType":"uint256","name":"timeTransfer","type":"uint256"},{"internalType":"uint256","name":"numSells","type":"uint256"},{"internalType":"uint256","name":"timeSell","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityPoolAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lotteryAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualBuybackBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualTaxConv","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingAddr","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingInitialAddr","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumETHBeforeBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rBuybackBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cooldown","type":"uint256"}],"name":"setBuyCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lottery","type":"address"}],"name":"setMarketingLottery","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"marketing","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setMinimumETHBeforeBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setMinimumTokensBeforeSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setPauseTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cooldown","type":"uint256"}],"name":"setSellCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"},{"components":[{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"redistribution","type":"uint256"},{"internalType":"uint256","name":"lottery","type":"uint256"},{"internalType":"uint256","name":"buybackBurn","type":"uint256"}],"internalType":"struct ApeToken.Taxes","name":"taxrates","type":"tuple"}],"name":"setTaxrates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cooldown","type":"uint256"}],"name":"setW2WCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transfersPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transfersPausedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2FactoryAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2RouterAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526009600a6200001491906200125a565b64e8d4a5100062000026919062001397565b600019620000359190620014f0565b600019620000449190620013f8565b6003556040518060400160405280600881526020017f4150452053544158000000000000000000000000000000000000000000000000815250600490805190602001906200009492919062000efa565b506040518060400160405280600a81526020017f415354415820f09fa68d0000000000000000000000000000000000000000000081525060059080519060200190620000e292919062000efa565b50737a250d5630b4cf539739df2c5dacb4c659f2488d600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000207735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620001ba57600080fd5b505afa158015620001cf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f5919062000fc1565b3062000d0e60201b620021c81760201c565b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200027e605a6200026a606460035462000d8c60201b6200223a1790919060201c565b62000da460201b620022501790919060201c565b600855620002b86005620002a4606460035462000d8c60201b6200223a1790919060201c565b62000da460201b620022501790919060201c565b600955620002f26005620002de606460035462000d8c60201b6200223a1790919060201c565b62000da460201b620022501790919060201c565b600a55600a600c55601e600d55601e600e556040518060800160405280603281526020016019815260200160198152602001600081525060116000820151816000015560208201518160010155604082015181600201556060820151816003015550506040518060800160405280603281526020016000815260200160148152602001601e815250601560008201518160000155602082015181600101556040820151816002015560608201518160030155505060405180608001604052806082815260200160008152602001601e8152602001602881525060196000820151816000015560208201518160010155604082015181600201556060820151816003015550506040518060800160405280609681526020016000815260200160288152602001603c815250601d600082015181600001556020820151816001015560408201518160020155606082015181600301555050604051806080016040528060b481526020016000815260200160288152602001605081525060216000820151816000015560208201518160010155604082015181600201556060820151816003015550506040518060800160405280609681526020016000815260200160288152602001603c8152506025600082015181600001556020820151816001015560408201518160020155606082015181600301555050737b7b7c8a9cd0922e5894b3d3166f313cf200a363602960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073dcbbcaa8fd8e610017d6922517ff3f4ed2611e71602a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073284c1d4fb47e6548bde1e63a47198419ec678449602b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000602b60146101000a81548160ff0219169083151502179055506000602d60006101000a81548160ff02191690831515021790555062000677620f42406200066360056009600a6200063d91906200125a565b64e8d4a510006200064f919062001397565b62000da460201b620022501790919060201c565b62000d8c60201b6200223a1790919060201c565b602e55670de0b6b3a7640000602f556000603160006101000a81548160ff021916908315150217905550348015620006ae57600080fd5b506000620006c162000dbc60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600854600160006200077662000dbc60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620007c462000dbc60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6008546040516200082591906200118e565b60405180910390a360095460016000602a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550602a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6009546040516200091991906200118e565b60405180910390a3600a5460016000602b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550602b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600a5460405162000a0d91906200118e565b60405180910390a36001600f60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f600062000a8362000dbc60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000602b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000602a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000602960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f600073d152f549545093347a162dce210e7293f145215073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620016b3565b600080600062000d25858562000dc460201b60201c565b9150915085828260405160200162000d3f929190620010d0565b6040516020818303038152906040528051906020012060405160200162000d6892919062001100565b6040516020818303038152906040528051906020012060001c925050509392505050565b6000818362000d9c9190620011c7565b905092915050565b6000818362000db4919062001397565b905092915050565b600033905090565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141562000e39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000e30906200114a565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161062000e7557828462000e78565b83835b8092508193505050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000ef3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000eea906200116c565b60405180910390fd5b9250929050565b82805462000f089062001488565b90600052602060002090601f01602090048101928262000f2c576000855562000f78565b82601f1062000f4757805160ff191683800117855562000f78565b8280016001018555821562000f78579182015b8281111562000f7757825182559160200191906001019062000f5a565b5b50905062000f87919062000f8b565b5090565b5b8082111562000fa657600081600090555060010162000f8c565b5090565b60008151905062000fbb8162001699565b92915050565b60006020828403121562000fd457600080fd5b600062000fe48482850162000faa565b91505092915050565b6200100262000ffc8262001433565b620014be565b82525050565b6200101d620010178262001447565b620014d2565b82525050565b600062001032602583620011ab565b91506200103f82620015cf565b604082019050919050565b600062001059602083620011bc565b915062001066826200161e565b602082019050919050565b600062001080600183620011bc565b91506200108d8262001647565b600182019050919050565b6000620010a7601e83620011ab565b9150620010b48262001670565b602082019050919050565b620010ca8162001471565b82525050565b6000620010de828562000fed565b601482019150620010f0828462000fed565b6014820191508190509392505050565b60006200110d8262001071565b91506200111b828562000fed565b6014820191506200112d828462001008565b6020820191506200113e826200104a565b91508190509392505050565b60006020820190508181036000830152620011658162001023565b9050919050565b60006020820190508181036000830152620011878162001098565b9050919050565b6000602082019050620011a56000830184620010bf565b92915050565b600082825260208201905092915050565b600081905092915050565b6000620011d48262001471565b9150620011e18362001471565b925082620011f457620011f362001557565b5b828204905092915050565b6000808291508390505b6001851115620012515780860481111562001229576200122862001528565b5b6001851615620012395780820291505b80810290506200124985620015c2565b945062001209565b94509492505050565b6000620012678262001471565b915062001274836200147b565b9250620012a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620012ab565b905092915050565b600082620012bd576001905062001390565b81620012cd576000905062001390565b8160018114620012e65760028114620012f15762001327565b600191505062001390565b60ff84111562001306576200130562001528565b5b8360020a91508482111562001320576200131f62001528565b5b5062001390565b5060208310610133831016604e8410600b8410161715620013615782820a9050838111156200135b576200135a62001528565b5b62001390565b620013708484846001620011ff565b925090508184048111156200138a576200138962001528565b5b81810290505b9392505050565b6000620013a48262001471565b9150620013b18362001471565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620013ed57620013ec62001528565b5b828202905092915050565b6000620014058262001471565b9150620014128362001471565b92508282101562001428576200142762001528565b5b828203905092915050565b6000620014408262001451565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006002820490506001821680620014a157607f821691505b60208210811415620014b857620014b762001586565b5b50919050565b6000620014cb82620014dc565b9050919050565b6000819050919050565b6000620014e982620015b5565b9050919050565b6000620014fd8262001471565b91506200150a8362001471565b9250826200151d576200151c62001557565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160601b9050919050565b60008160011c9050919050565b7f556e697377617056324c6962726172793a204944454e544943414c5f4144445260008201527f4553534553000000000000000000000000000000000000000000000000000000602082015250565b7f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f600082015250565b7fff00000000000000000000000000000000000000000000000000000000000000600082015250565b7f556e697377617056324c6962726172793a205a45524f5f414444524553530000600082015250565b620016a48162001433565b8114620016b057600080fd5b50565b615ade80620016c36000396000f3fe6080604052600436106102975760003560e01c8063790ca4131161015a578063c9567bf9116100c1578063dd62ed3e1161007a578063dd62ed3e14610a1b578063ee9e20c614610a58578063f2fde38b14610a81578063f9f92be414610aaa578063fc1ca33c14610ae7578063ff142f9714610b105761029e565b8063c9567bf91461092d578063cea2085114610944578063d246d4111461096f578063d2d7ad831461099a578063d8306786146109c5578063d85ff2ff146109f05761029e565b8063a091273b11610113578063a091273b1461080d578063a457c2d714610838578063a9059cbb14610875578063aee50b1e146108b2578063bad291ab146108db578063c29632bd146109045761029e565b8063790ca413146106f957806381f181431461072457806381f651aa1461074f5780638da5cb5b1461077a57806395d89b41146107a55780639b19251a146107d05761029e565b8063313ce567116101fe578063497f3eeb116101b7578063497f3eeb146105fd5780634ada218b1461062857806353d6fd59146106535780635d098b381461067c57806370a08231146106a5578063715018a6146106e25761029e565b8063313ce567146104ed5780633155c4ba1461051857806339509351146105415780633ff42b921461057e57806341d72548146105a95780634563f30a146105d25761029e565b80631eb7caba116102505780631eb7caba146103b5578063216fb989146103f457806323b872dd1461041f5780632c66562b1461045c5780632d838119146104855780632f5b1564146104c25761029e565b806306fdde03146102a357806307d51141146102ce578063095ea7b3146102f9578063153b0d1e146103365780631694505e1461035f57806318160ddd1461038a5761029e565b3661029e57005b600080fd5b3480156102af57600080fd5b506102b8610b3b565b6040516102c59190614b3c565b60405180910390f35b3480156102da57600080fd5b506102e3610bcd565b6040516102f09190614d9e565b60405180910390f35b34801561030557600080fd5b50610320600480360381019061031b919061452c565b610bd3565b60405161032d9190614aba565b60405180910390f35b34801561034257600080fd5b5061035d600480360381019061035891906144f0565b610bf1565b005b34801561036b57600080fd5b50610374610da5565b6040516103819190614ad5565b60405180910390f35b34801561039657600080fd5b5061039f610dcb565b6040516103ac9190614d9e565b60405180910390f35b3480156103c157600080fd5b506103dc60048036038101906103d791906143ea565b610df0565b6040516103eb93929190614e43565b60405180910390f35b34801561040057600080fd5b50610409610e1a565b6040516104169190614aba565b60405180910390f35b34801561042b57600080fd5b50610446600480360381019061044191906144a1565b610ebb565b6040516104539190614aba565b60405180910390f35b34801561046857600080fd5b50610483600480360381019061047e9190614591565b610f94565b005b34801561049157600080fd5b506104ac60048036038101906104a79190614591565b61105e565b6040516104b99190614d9e565b60405180910390f35b3480156104ce57600080fd5b506104d76110cc565b6040516104e49190614a84565b60405180910390f35b3480156104f957600080fd5b506105026110f2565b60405161050f9190614e7a565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a9190614568565b6110fb565b005b34801561054d57600080fd5b506105686004803603810190610563919061452c565b6111a2565b6040516105759190614aba565b60405180910390f35b34801561058a57600080fd5b50610593611255565b6040516105a09190614a9f565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb9190614591565b61127b565b005b3480156105de57600080fd5b506105e7611345565b6040516105f49190614aba565b60405180910390f35b34801561060957600080fd5b50610612611358565b60405161061f9190614a9f565b60405180910390f35b34801561063457600080fd5b5061063d61137e565b60405161064a9190614aba565b60405180910390f35b34801561065f57600080fd5b5061067a600480360381019061067591906144f0565b611391565b005b34801561068857600080fd5b506106a3600480360381019061069e919061443c565b611468565b005b3480156106b157600080fd5b506106cc60048036038101906106c791906143ea565b611528565b6040516106d99190614d9e565b60405180910390f35b3480156106ee57600080fd5b506106f7611579565b005b34801561070557600080fd5b5061070e6116b3565b60405161071b9190614d9e565b60405180910390f35b34801561073057600080fd5b506107396116b9565b6040516107469190614aba565b60405180910390f35b34801561075b57600080fd5b50610764611801565b6040516107719190614a84565b60405180910390f35b34801561078657600080fd5b5061078f611827565b60405161079c9190614a84565b60405180910390f35b3480156107b157600080fd5b506107ba611850565b6040516107c79190614b3c565b60405180910390f35b3480156107dc57600080fd5b506107f760048036038101906107f291906143ea565b6118e2565b6040516108049190614aba565b60405180910390f35b34801561081957600080fd5b50610822611902565b60405161082f9190614d9e565b60405180910390f35b34801561084457600080fd5b5061085f600480360381019061085a919061452c565b611908565b60405161086c9190614aba565b60405180910390f35b34801561088157600080fd5b5061089c6004803603810190610897919061452c565b6119d5565b6040516108a99190614aba565b60405180910390f35b3480156108be57600080fd5b506108d960048036038101906108d49190614591565b6119f3565b005b3480156108e757600080fd5b5061090260048036038101906108fd91906143ea565b611a79565b005b34801561091057600080fd5b5061092b60048036038101906109269190614591565b611b39565b005b34801561093957600080fd5b50610942611c03565b005b34801561095057600080fd5b50610959611cf3565b6040516109669190614a84565b60405180910390f35b34801561097b57600080fd5b50610984611d0b565b6040516109919190614a84565b60405180910390f35b3480156109a657600080fd5b506109af611d11565b6040516109bc9190614d9e565b60405180910390f35b3480156109d157600080fd5b506109da611d17565b6040516109e79190614aba565b60405180910390f35b3480156109fc57600080fd5b50610a05611d2a565b604051610a129190614d9e565b60405180910390f35b348015610a2757600080fd5b50610a426004803603810190610a3d9190614465565b611d30565b604051610a4f9190614d9e565b60405180910390f35b348015610a6457600080fd5b50610a7f6004803603810190610a7a9190614591565b611db7565b005b348015610a8d57600080fd5b50610aa86004803603810190610aa391906143ea565b611e3d565b005b348015610ab657600080fd5b50610ad16004803603810190610acc91906143ea565b611fe6565b604051610ade9190614aba565b60405180910390f35b348015610af357600080fd5b50610b0e6004803603810190610b0991906145ba565b612006565b005b348015610b1c57600080fd5b50610b256121b0565b604051610b329190614a84565b60405180910390f35b606060048054610b4a90615325565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7690615325565b8015610bc35780601f10610b9857610100808354040283529160200191610bc3565b820191906000526020600020905b815481529060010190602001808311610ba657829003601f168201915b5050505050905090565b60325481565b6000610be7610be0612266565b848461226e565b6001905092915050565b610bf9612266565b73ffffffffffffffffffffffffffffffffffffffff16610c17611827565b73ffffffffffffffffffffffffffffffffffffffff1614610c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6490614c7e565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610d0b5750737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b610d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4190614d7e565b60405180910390fd5b80601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006009600a610ddb9190614fcf565b64e8d4a51000610deb91906150ed565b905090565b600b6020528060005260406000206000915090508060000154908060010154908060020154905083565b6000610e24612266565b73ffffffffffffffffffffffffffffffffffffffff16610e42611827565b73ffffffffffffffffffffffffffffffffffffffff1614610e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8f90614c7e565b60405180910390fd5b60004790506000811115610eb357610eb28161dead612439565b5b600191505090565b6000610ec8848484612753565b610f8984610ed4612266565b610f8485604051806060016040528060288152602001615a5c60289139600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610f3a612266565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136c59092919063ffffffff16565b61226e565b600190509392505050565b610f9c612266565b73ffffffffffffffffffffffffffffffffffffffff16610fba611827565b73ffffffffffffffffffffffffffffffffffffffff1614611010576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100790614c7e565b60405180910390fd5b603c811115611054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104b90614d5e565b60405180910390fd5b80600d8190555050565b60006003548211156110a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109c90614bfe565b60405180910390fd5b60006110af61371a565b90506110c4818461223a90919063ffffffff16565b915050919050565b602b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006009905090565b611103612266565b73ffffffffffffffffffffffffffffffffffffffff16611121611827565b73ffffffffffffffffffffffffffffffffffffffff1614611177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116e90614c7e565b60405180910390fd5b80603160006101000a81548160ff021916908315150217905550801561119f57426032819055505b50565b600061124b6111af612266565b8461124685600260006111c0612266565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461375390919063ffffffff16565b61226e565b6001905092915050565b602960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611283612266565b73ffffffffffffffffffffffffffffffffffffffff166112a1611827565b73ffffffffffffffffffffffffffffffffffffffff16146112f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ee90614c7e565b60405180910390fd5b603c81111561133b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133290614d5e565b60405180910390fd5b80600e8190555050565b603160009054906101000a900460ff1681565b602a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b602b60149054906101000a900460ff1681565b611399612266565b73ffffffffffffffffffffffffffffffffffffffff166113b7611827565b73ffffffffffffffffffffffffffffffffffffffff161461140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140490614c7e565b60405180910390fd5b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611470612266565b73ffffffffffffffffffffffffffffffffffffffff1661148e611827565b73ffffffffffffffffffffffffffffffffffffffff16146114e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114db90614c7e565b60405180910390fd5b80602960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611572600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461105e565b9050919050565b611581612266565b73ffffffffffffffffffffffffffffffffffffffff1661159f611827565b73ffffffffffffffffffffffffffffffffffffffff16146115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec90614c7e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b602c5481565b60006116c3612266565b73ffffffffffffffffffffffffffffffffffffffff166116e1611827565b73ffffffffffffffffffffffffffffffffffffffff1614611737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172e90614c7e565b60405180910390fd5b600061174230611528565b905060008111156117f9576000603054146117cb57600061176460305461105e565b9050600061177b828461376990919063ffffffff16565b9050600081146117b2576117b181602960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661377f565b5b60006030819055506117c4823061377f565b50506117f8565b6117f781602960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661377f565b5b5b600191505090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606005805461185f90615325565b80601f016020809104026020016040519081016040528092919081815260200182805461188b90615325565b80156118d85780601f106118ad576101008083540402835291602001916118d8565b820191906000526020600020905b8154815290600101906020018083116118bb57829003601f168201915b5050505050905090565b600f6020528060005260406000206000915054906101000a900460ff1681565b602f5481565b60006119cb611915612266565b846119c685604051806060016040528060258152602001615a84602591396002600061193f612266565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136c59092919063ffffffff16565b61226e565b6001905092915050565b60006119e96119e2612266565b8484612753565b6001905092915050565b6119fb612266565b73ffffffffffffffffffffffffffffffffffffffff16611a19611827565b73ffffffffffffffffffffffffffffffffffffffff1614611a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6690614c7e565b60405180910390fd5b80602e8190555050565b611a81612266565b73ffffffffffffffffffffffffffffffffffffffff16611a9f611827565b73ffffffffffffffffffffffffffffffffffffffff1614611af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aec90614c7e565b60405180910390fd5b80602b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611b41612266565b73ffffffffffffffffffffffffffffffffffffffff16611b5f611827565b73ffffffffffffffffffffffffffffffffffffffff1614611bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bac90614c7e565b60405180910390fd5b603c811115611bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf090614d5e565b60405180910390fd5b80600c8190555050565b611c0b612266565b73ffffffffffffffffffffffffffffffffffffffff16611c29611827565b73ffffffffffffffffffffffffffffffffffffffff1614611c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7690614c7e565b60405180910390fd5b602b60149054906101000a900460ff1615611ccf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc690614d1e565b60405180910390fd5b6001602b60146101000a81548160ff02191690831515021790555042602c81905550565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b61dead81565b602e5481565b602d60009054906101000a900460ff1681565b60305481565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611dbf612266565b73ffffffffffffffffffffffffffffffffffffffff16611ddd611827565b73ffffffffffffffffffffffffffffffffffffffff1614611e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2a90614c7e565b60405180910390fd5b80602f8190555050565b611e45612266565b73ffffffffffffffffffffffffffffffffffffffff16611e63611827565b73ffffffffffffffffffffffffffffffffffffffff1614611eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb090614c7e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2090614bbe565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60106020528060005260406000206000915054906101000a900460ff1681565b61200e612266565b73ffffffffffffffffffffffffffffffffffffffff1661202c611827565b73ffffffffffffffffffffffffffffffffffffffff1614612082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207990614c7e565b60405180910390fd5b60008214156120a257806015818161209a91906159ce565b9050506121ac565b60018214156120c25780601981816120ba91906159ce565b9050506121ab565b60028214156120e25780601d81816120da91906159ce565b9050506121aa565b60038214156121025780602181816120fa91906159ce565b9050506121a9565b600482141561212257806025818161211a91906159ce565b9050506121a8565b600582141561214257806011818161213a91906159ce565b9050506121a7565b60068214156121a657806015818161215a91906159ce565b905050806019818161216c91906159ce565b90505080601d818161217e91906159ce565b905050806021818161219091906159ce565b90505080602581816121a291906159ce565b9050505b5b5b5b5b5b5b5050565b735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b60008060006121d78585613aa5565b915091508582826040516020016121ef929190614a16565b60405160208183030381529060405280519060200120604051602001612216929190614a42565b6040516020818303038152906040528051906020012060001c925050509392505050565b600081836122489190614f4b565b905092915050565b6000818361225e91906150ed565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d590614cfe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561234e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234590614bde565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161242c9190614d9e565b60405180910390a3505050565b6001602d60006101000a81548160ff0219169083151502179055506000600267ffffffffffffffff811115612497577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156124c55781602001602082028036833780820191505090505b509050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561253057600080fd5b505afa158015612544573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125689190614413565b816000815181106125a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110612617577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de9584600084866126a961012c4261375390919063ffffffff16565b6040518663ffffffff1660e01b81526004016126c89493929190614af0565b6000604051808303818588803b1580156126e157600080fd5b505af11580156126f5573d6000803e3d6000fd5b50505050507f6fd378a9d8b7345c2e5b18229aaf1e39d32b177b501d0a0d26a0a858a23a9624838260405161272b929190614db9565b60405180910390a1506000602d60006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ba90614cde565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282a90614b5e565b60405180910390fd5b60008111612876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286d90614c9e565b60405180910390fd5b602b60149054906101000a900460ff16806128da5750600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8061292e5750600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61296d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296490614c5e565b60405180910390fd5b601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612a115750601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b612a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4790614c3e565b60405180910390fd5b603160009054906101000a900460ff161580612a83575042612a8062093a8060325461375390919063ffffffff16565b11155b612ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab990614b9e565b60405180910390fd5b6000604051806080016040528060008152602001600081526020016000815260200160008152509050600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612b8f5750600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561362857600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148015612c315750737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15612dca5742612c4e610258602c5461375390919063ffffffff16565b10612cb3576009600a612c619190614fcf565b634190ab00612c7091906150ed565b821115612cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca990614b7e565b60405180910390fd5b5b42612d0b600c54600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461375390919063ffffffff16565b10612d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4290614cbe565b60405180910390fd5b42600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550601160405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090505b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561330f5742612e78600d54600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461375390919063ffffffff16565b10612eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eaf90614cbe565b60405180910390fd5b42600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506000600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154118015612fa7575042612fa562015180600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015461375390919063ffffffff16565b105b1561303c576000600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555042600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505b600061308e61306c600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611528565b61308060648661225090919063ffffffff16565b61223a90919063ffffffff16565b905060156040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509150600181118061311857506001600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154145b1561315557601960405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505091505b60028111806131a757506002600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015410155b156131e457601d60405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505091505b600381111561322557602160405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505091505b6002600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154101561330d576132c66001600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461375390919063ffffffff16565b600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505b505b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156133bb5750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b156134d75742613418600e54600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461375390919063ffffffff16565b10613458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344f90614cbe565b60405180910390fd5b42600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550602560405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090505b602d60009054906101000a900460ff161580156135425750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1561362757600061355230611528565b9050602e548110613609576000603054146135db57600061357460305461105e565b9050600061358b828461376990919063ffffffff16565b9050600081146135c2576135c181602960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661377f565b5b60006030819055506135d4823061377f565b5050613608565b61360781602960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661377f565b5b5b6000479050602f548110613624576136238161dead612439565b5b50505b5b602d60009054906101000a900460ff1615613665576040518060800160405280600081526020016000815260200160008152602001600081525090505b6000816000015114801561367d575060008160600151145b801561368d575060008160200151145b801561369d575060008160400151145b156136b2576136ad848484613bd3565b6136bf565b6136be84848484613d8c565b5b50505050565b600083831115829061370d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137049190614b3c565b60405180910390fd5b5082840390509392505050565b600061374e6009600a61372d9190614fcf565b64e8d4a5100061373d91906150ed565b60035461223a90919063ffffffff16565b905090565b600081836137619190614ef5565b905092915050565b600081836137779190615147565b905092915050565b6001602d60006101000a81548160ff0219169083151502179055506000600267ffffffffffffffff8111156137dd577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561380b5781602001602082028036833780820191505090505b5090503081600081518110613849577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156138eb57600080fd5b505afa1580156138ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139239190614413565b8160018151811061395d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506139b630737a250d5630b4cf539739df2c5dacb4c659f2488d8561226e565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008486426040518663ffffffff1660e01b8152600401613a1a959493929190614de9565b600060405180830381600087803b158015613a3457600080fd5b505af1158015613a48573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78382604051613a7d929190614db9565b60405180910390a1506000602d60006101000a81548160ff0219169083151502179055505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b0e90614c1e565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610613b51578284613b54565b83835b8092508193505050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bc390614d3e565b60405180910390fd5b9250929050565b6000613bdd61371a565b90506000613bf4828461225090919063ffffffff16565b9050613c4881600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461376990919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613cdd81600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461375390919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613d7d9190614d9e565b60405180910390a35050505050565b6000613d9661371a565b90506000613dad828561225090919063ffffffff16565b90506000613dbb858561414b565b90506000613dc882614235565b90506000613dd684836142db565b90506000613de488856142db565b9050613e3885600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461376990919063ffffffff16565b600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ecd82600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461375390919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613f29836020015160035461376990919063ffffffff16565b600381905550613fa7836040015160016000602b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461375390919063ffffffff16565b60016000602b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614078836060015161406a8560000151600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461375390919063ffffffff16565b61375390919063ffffffff16565b600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506140d4836060015160305461375390919063ffffffff16565b6030819055508873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516141379190614d9e565b60405180910390a350505050505050505050565b61415361433e565b61415b61433e565b61418683602001516141786103e88761223a90919063ffffffff16565b61225090919063ffffffff16565b8160200181815250506141ba83606001516141ac6103e88761223a90919063ffffffff16565b61225090919063ffffffff16565b8160600181815250506141ee83600001516141e06103e88761223a90919063ffffffff16565b61225090919063ffffffff16565b81600001818152505061422283604001516142146103e88761223a90919063ffffffff16565b61225090919063ffffffff16565b8160400181815250508091505092915050565b61423d61433e565b61424561433e565b600061424f61371a565b905061426881856020015161225090919063ffffffff16565b82602001818152505061428881856060015161225090919063ffffffff16565b8260600181815250506142a881856000015161225090919063ffffffff16565b8260000181815250506142c881856040015161225090919063ffffffff16565b8260400181815250508192505050919050565b60006143368260200151614328846060015161431a866040015161430c88600001518a61376990919063ffffffff16565b61376990919063ffffffff16565b61376990919063ffffffff16565b61376990919063ffffffff16565b905092915050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600081359050614375816159ff565b92915050565b60008151905061438a816159ff565b92915050565b60008135905061439f81615a16565b92915050565b6000813590506143b481615a2d565b92915050565b6000608082840312156143cc57600080fd5b81905092915050565b6000813590506143e481615a44565b92915050565b6000602082840312156143fc57600080fd5b600061440a84828501614366565b91505092915050565b60006020828403121561442557600080fd5b60006144338482850161437b565b91505092915050565b60006020828403121561444e57600080fd5b600061445c84828501614390565b91505092915050565b6000806040838503121561447857600080fd5b600061448685828601614366565b925050602061449785828601614366565b9150509250929050565b6000806000606084860312156144b657600080fd5b60006144c486828701614366565b93505060206144d586828701614366565b92505060406144e6868287016143d5565b9150509250925092565b6000806040838503121561450357600080fd5b600061451185828601614366565b9250506020614522858286016143a5565b9150509250929050565b6000806040838503121561453f57600080fd5b600061454d85828601614366565b925050602061455e858286016143d5565b9150509250929050565b60006020828403121561457a57600080fd5b6000614588848285016143a5565b91505092915050565b6000602082840312156145a357600080fd5b60006145b1848285016143d5565b91505092915050565b60008060a083850312156145cd57600080fd5b60006145db858286016143d5565b92505060206145ec858286016143ba565b9150509250929050565b6000614602838361462c565b60208301905092915050565b614617816151ec565b82525050565b6146268161518d565b82525050565b6146358161517b565b82525050565b6146448161517b565b82525050565b61465b6146568261517b565b615357565b82525050565b600061466c82614ea5565b6146768185614ec8565b935061468183614e95565b8060005b838110156146b257815161469988826145f6565b97506146a483614ebb565b925050600181019050614685565b5085935050505092915050565b6146c88161519f565b82525050565b6146df6146da826151ab565b615369565b82525050565b6146ee816151fe565b82525050565b6146fd81615222565b82525050565b600061470e82614eb0565b6147188185614ed9565b935061472881856020860161526a565b61473181615432565b840191505092915050565b6000614749602383614ed9565b91506147548261546a565b604082019050919050565b600061476c604d83614ed9565b9150614777826154b9565b606082019050919050565b600061478f601a83614ed9565b915061479a8261552e565b602082019050919050565b60006147b2602683614ed9565b91506147bd82615557565b604082019050919050565b60006147d5602283614ed9565b91506147e0826155a6565b604082019050919050565b60006147f8603383614ed9565b9150614803826155f5565b604082019050919050565b600061481b602583614ed9565b915061482682615644565b604082019050919050565b600061483e602083614eea565b915061484982615693565b602082019050919050565b6000614861601f83614ed9565b915061486c826156bc565b602082019050919050565b6000614884600183614eea565b915061488f826156e5565b600182019050919050565b60006148a7602083614ed9565b91506148b28261570e565b602082019050919050565b60006148ca602083614ed9565b91506148d582615737565b602082019050919050565b60006148ed602983614ed9565b91506148f882615760565b604082019050919050565b6000614910602983614ed9565b915061491b826157af565b604082019050919050565b6000614933602583614ed9565b915061493e826157fe565b604082019050919050565b6000614956602483614ed9565b91506149618261584d565b604082019050919050565b6000614979602383614ed9565b91506149848261589c565b604082019050919050565b600061499c601e83614ed9565b91506149a7826158eb565b602082019050919050565b60006149bf602183614ed9565b91506149ca82615914565b604082019050919050565b60006149e2601c83614ed9565b91506149ed82615963565b602082019050919050565b614a01816151d5565b82525050565b614a10816151df565b82525050565b6000614a22828561464a565b601482019150614a32828461464a565b6014820191508190509392505050565b6000614a4d82614877565b9150614a59828561464a565b601482019150614a6982846146ce565b602082019150614a7882614831565b91508190509392505050565b6000602082019050614a99600083018461463b565b92915050565b6000602082019050614ab4600083018461461d565b92915050565b6000602082019050614acf60008301846146bf565b92915050565b6000602082019050614aea60008301846146e5565b92915050565b6000608082019050614b0560008301876146f4565b8181036020830152614b178186614661565b9050614b26604083018561463b565b614b3360608301846149f8565b95945050505050565b60006020820190508181036000830152614b568184614703565b905092915050565b60006020820190508181036000830152614b778161473c565b9050919050565b60006020820190508181036000830152614b978161475f565b9050919050565b60006020820190508181036000830152614bb781614782565b9050919050565b60006020820190508181036000830152614bd7816147a5565b9050919050565b60006020820190508181036000830152614bf7816147c8565b9050919050565b60006020820190508181036000830152614c17816147eb565b9050919050565b60006020820190508181036000830152614c378161480e565b9050919050565b60006020820190508181036000830152614c5781614854565b9050919050565b60006020820190508181036000830152614c778161489a565b9050919050565b60006020820190508181036000830152614c97816148bd565b9050919050565b60006020820190508181036000830152614cb7816148e0565b9050919050565b60006020820190508181036000830152614cd781614903565b9050919050565b60006020820190508181036000830152614cf781614926565b9050919050565b60006020820190508181036000830152614d1781614949565b9050919050565b60006020820190508181036000830152614d378161496c565b9050919050565b60006020820190508181036000830152614d578161498f565b9050919050565b60006020820190508181036000830152614d77816149b2565b9050919050565b60006020820190508181036000830152614d97816149d5565b9050919050565b6000602082019050614db360008301846149f8565b92915050565b6000604082019050614dce60008301856149f8565b8181036020830152614de08184614661565b90509392505050565b600060a082019050614dfe60008301886149f8565b614e0b60208301876146f4565b8181036040830152614e1d8186614661565b9050614e2c606083018561460e565b614e3960808301846149f8565b9695505050505050565b6000606082019050614e5860008301866149f8565b614e6560208301856149f8565b614e7260408301846149f8565b949350505050565b6000602082019050614e8f6000830184614a07565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f00826151d5565b9150614f0b836151d5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f4057614f3f615385565b5b828201905092915050565b6000614f56826151d5565b9150614f61836151d5565b925082614f7157614f706153b4565b5b828204905092915050565b6000808291508390505b6001851115614fc657808604811115614fa257614fa1615385565b5b6001851615614fb15780820291505b8081029050614fbf8561545d565b9450614f86565b94509492505050565b6000614fda826151d5565b9150614fe5836151df565b92506150127fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461501a565b905092915050565b60008261502a57600190506150e6565b8161503857600090506150e6565b816001811461504e576002811461505857615087565b60019150506150e6565b60ff84111561506a57615069615385565b5b8360020a91508482111561508157615080615385565b5b506150e6565b5060208310610133831016604e8410600b84101617156150bc5782820a9050838111156150b7576150b6615385565b5b6150e6565b6150c98484846001614f7c565b925090508184048111156150e0576150df615385565b5b81810290505b9392505050565b60006150f8826151d5565b9150615103836151d5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561513c5761513b615385565b5b828202905092915050565b6000615152826151d5565b915061515d836151d5565b9250828210156151705761516f615385565b5b828203905092915050565b6000615186826151b5565b9050919050565b6000615198826151b5565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006151f782615234565b9050919050565b600061520982615210565b9050919050565b600061521b826151b5565b9050919050565b600061522d826151d5565b9050919050565b600061523f82615246565b9050919050565b6000615251826151b5565b9050919050565b6000615263826151d5565b9050919050565b60005b8381101561528857808201518184015260208101905061526d565b83811115615297576000848401525b50505050565b6000810160008301806152af8161541c565b90506152bb81846159dc565b5050506001810160208301806152d08161541c565b90506152dc81846159dc565b5050506002810160408301806152f18161541c565b90506152fd81846159dc565b5050506003810160608301806153128161541c565b905061531e81846159dc565b5050505050565b6000600282049050600182168061533d57607f821691505b60208210811415615351576153506153e3565b5b50919050565b600061536282615373565b9050919050565b6000819050919050565b600061537e82615450565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000819050919050565b6000813561542981615a44565b80915050919050565b6000601f19601f8301169050919050565b60008160001b9050919050565b60008160601b9050919050565b60008160011c9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f41535441583a204e6f206275792067726561746572207468616e20312e31206260008201527f696c6c696f6e2063616e206265206d61646520666f722074686520666972737460208201527f203130206d696e757465732e2000000000000000000000000000000000000000604082015250565b7f41535441583a2054726164696e67206973207061757365642e20000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e74206d757374206265206c657373206f7220657175616c2074686160008201527f6e20746f74616c207265666c656374696f6e7300000000000000000000000000602082015250565b7f556e697377617056324c6962726172793a204944454e544943414c5f4144445260008201527f4553534553000000000000000000000000000000000000000000000000000000602082015250565b7f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f600082015250565b7f41535441583a204164647265737320697320626c61636b6c69737465642e2000600082015250565b7fff00000000000000000000000000000000000000000000000000000000000000600082015250565b7f41535441583a2054726164696e67206973206e6f74206c697665207965742e20600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b7f41535441583a204e65656420746f207761697420756e74696c206e657874207460008201527f72616e736665722e200000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f41535441583a2054726164696e6720697320616c726561647920656e61626c6560008201527f642e200000000000000000000000000000000000000000000000000000000000602082015250565b7f556e697377617056324c6962726172793a205a45524f5f414444524553530000600082015250565b7f41535441583a20436f6f6c646f776e2076616c756520746f6f206c617267652e60008201527f2000000000000000000000000000000000000000000000000000000000000000602082015250565b7f41535441583a2043616e277420626c6f636b20756e69737761702e2000000000600082015250565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6159b884615443565b9350801983169250808416831791505092915050565b6159d8828261529d565b5050565b6159e582615258565b6159f86159f182615412565b835461598c565b8255505050565b615a088161517b565b8114615a1357600080fd5b50565b615a1f8161518d565b8114615a2a57600080fd5b50565b615a368161519f565b8114615a4157600080fd5b50565b615a4d816151d5565b8114615a5857600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220eb7c799f0302d690c2e828bafd230f7e2d369eb59aa104f00366bba49a0b2c5a64736f6c63430008040033
Deployed Bytecode
0x6080604052600436106102975760003560e01c8063790ca4131161015a578063c9567bf9116100c1578063dd62ed3e1161007a578063dd62ed3e14610a1b578063ee9e20c614610a58578063f2fde38b14610a81578063f9f92be414610aaa578063fc1ca33c14610ae7578063ff142f9714610b105761029e565b8063c9567bf91461092d578063cea2085114610944578063d246d4111461096f578063d2d7ad831461099a578063d8306786146109c5578063d85ff2ff146109f05761029e565b8063a091273b11610113578063a091273b1461080d578063a457c2d714610838578063a9059cbb14610875578063aee50b1e146108b2578063bad291ab146108db578063c29632bd146109045761029e565b8063790ca413146106f957806381f181431461072457806381f651aa1461074f5780638da5cb5b1461077a57806395d89b41146107a55780639b19251a146107d05761029e565b8063313ce567116101fe578063497f3eeb116101b7578063497f3eeb146105fd5780634ada218b1461062857806353d6fd59146106535780635d098b381461067c57806370a08231146106a5578063715018a6146106e25761029e565b8063313ce567146104ed5780633155c4ba1461051857806339509351146105415780633ff42b921461057e57806341d72548146105a95780634563f30a146105d25761029e565b80631eb7caba116102505780631eb7caba146103b5578063216fb989146103f457806323b872dd1461041f5780632c66562b1461045c5780632d838119146104855780632f5b1564146104c25761029e565b806306fdde03146102a357806307d51141146102ce578063095ea7b3146102f9578063153b0d1e146103365780631694505e1461035f57806318160ddd1461038a5761029e565b3661029e57005b600080fd5b3480156102af57600080fd5b506102b8610b3b565b6040516102c59190614b3c565b60405180910390f35b3480156102da57600080fd5b506102e3610bcd565b6040516102f09190614d9e565b60405180910390f35b34801561030557600080fd5b50610320600480360381019061031b919061452c565b610bd3565b60405161032d9190614aba565b60405180910390f35b34801561034257600080fd5b5061035d600480360381019061035891906144f0565b610bf1565b005b34801561036b57600080fd5b50610374610da5565b6040516103819190614ad5565b60405180910390f35b34801561039657600080fd5b5061039f610dcb565b6040516103ac9190614d9e565b60405180910390f35b3480156103c157600080fd5b506103dc60048036038101906103d791906143ea565b610df0565b6040516103eb93929190614e43565b60405180910390f35b34801561040057600080fd5b50610409610e1a565b6040516104169190614aba565b60405180910390f35b34801561042b57600080fd5b50610446600480360381019061044191906144a1565b610ebb565b6040516104539190614aba565b60405180910390f35b34801561046857600080fd5b50610483600480360381019061047e9190614591565b610f94565b005b34801561049157600080fd5b506104ac60048036038101906104a79190614591565b61105e565b6040516104b99190614d9e565b60405180910390f35b3480156104ce57600080fd5b506104d76110cc565b6040516104e49190614a84565b60405180910390f35b3480156104f957600080fd5b506105026110f2565b60405161050f9190614e7a565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a9190614568565b6110fb565b005b34801561054d57600080fd5b506105686004803603810190610563919061452c565b6111a2565b6040516105759190614aba565b60405180910390f35b34801561058a57600080fd5b50610593611255565b6040516105a09190614a9f565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb9190614591565b61127b565b005b3480156105de57600080fd5b506105e7611345565b6040516105f49190614aba565b60405180910390f35b34801561060957600080fd5b50610612611358565b60405161061f9190614a9f565b60405180910390f35b34801561063457600080fd5b5061063d61137e565b60405161064a9190614aba565b60405180910390f35b34801561065f57600080fd5b5061067a600480360381019061067591906144f0565b611391565b005b34801561068857600080fd5b506106a3600480360381019061069e919061443c565b611468565b005b3480156106b157600080fd5b506106cc60048036038101906106c791906143ea565b611528565b6040516106d99190614d9e565b60405180910390f35b3480156106ee57600080fd5b506106f7611579565b005b34801561070557600080fd5b5061070e6116b3565b60405161071b9190614d9e565b60405180910390f35b34801561073057600080fd5b506107396116b9565b6040516107469190614aba565b60405180910390f35b34801561075b57600080fd5b50610764611801565b6040516107719190614a84565b60405180910390f35b34801561078657600080fd5b5061078f611827565b60405161079c9190614a84565b60405180910390f35b3480156107b157600080fd5b506107ba611850565b6040516107c79190614b3c565b60405180910390f35b3480156107dc57600080fd5b506107f760048036038101906107f291906143ea565b6118e2565b6040516108049190614aba565b60405180910390f35b34801561081957600080fd5b50610822611902565b60405161082f9190614d9e565b60405180910390f35b34801561084457600080fd5b5061085f600480360381019061085a919061452c565b611908565b60405161086c9190614aba565b60405180910390f35b34801561088157600080fd5b5061089c6004803603810190610897919061452c565b6119d5565b6040516108a99190614aba565b60405180910390f35b3480156108be57600080fd5b506108d960048036038101906108d49190614591565b6119f3565b005b3480156108e757600080fd5b5061090260048036038101906108fd91906143ea565b611a79565b005b34801561091057600080fd5b5061092b60048036038101906109269190614591565b611b39565b005b34801561093957600080fd5b50610942611c03565b005b34801561095057600080fd5b50610959611cf3565b6040516109669190614a84565b60405180910390f35b34801561097b57600080fd5b50610984611d0b565b6040516109919190614a84565b60405180910390f35b3480156109a657600080fd5b506109af611d11565b6040516109bc9190614d9e565b60405180910390f35b3480156109d157600080fd5b506109da611d17565b6040516109e79190614aba565b60405180910390f35b3480156109fc57600080fd5b50610a05611d2a565b604051610a129190614d9e565b60405180910390f35b348015610a2757600080fd5b50610a426004803603810190610a3d9190614465565b611d30565b604051610a4f9190614d9e565b60405180910390f35b348015610a6457600080fd5b50610a7f6004803603810190610a7a9190614591565b611db7565b005b348015610a8d57600080fd5b50610aa86004803603810190610aa391906143ea565b611e3d565b005b348015610ab657600080fd5b50610ad16004803603810190610acc91906143ea565b611fe6565b604051610ade9190614aba565b60405180910390f35b348015610af357600080fd5b50610b0e6004803603810190610b0991906145ba565b612006565b005b348015610b1c57600080fd5b50610b256121b0565b604051610b329190614a84565b60405180910390f35b606060048054610b4a90615325565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7690615325565b8015610bc35780601f10610b9857610100808354040283529160200191610bc3565b820191906000526020600020905b815481529060010190602001808311610ba657829003601f168201915b5050505050905090565b60325481565b6000610be7610be0612266565b848461226e565b6001905092915050565b610bf9612266565b73ffffffffffffffffffffffffffffffffffffffff16610c17611827565b73ffffffffffffffffffffffffffffffffffffffff1614610c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6490614c7e565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610d0b5750737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b610d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4190614d7e565b60405180910390fd5b80601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006009600a610ddb9190614fcf565b64e8d4a51000610deb91906150ed565b905090565b600b6020528060005260406000206000915090508060000154908060010154908060020154905083565b6000610e24612266565b73ffffffffffffffffffffffffffffffffffffffff16610e42611827565b73ffffffffffffffffffffffffffffffffffffffff1614610e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8f90614c7e565b60405180910390fd5b60004790506000811115610eb357610eb28161dead612439565b5b600191505090565b6000610ec8848484612753565b610f8984610ed4612266565b610f8485604051806060016040528060288152602001615a5c60289139600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610f3a612266565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136c59092919063ffffffff16565b61226e565b600190509392505050565b610f9c612266565b73ffffffffffffffffffffffffffffffffffffffff16610fba611827565b73ffffffffffffffffffffffffffffffffffffffff1614611010576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100790614c7e565b60405180910390fd5b603c811115611054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104b90614d5e565b60405180910390fd5b80600d8190555050565b60006003548211156110a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109c90614bfe565b60405180910390fd5b60006110af61371a565b90506110c4818461223a90919063ffffffff16565b915050919050565b602b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006009905090565b611103612266565b73ffffffffffffffffffffffffffffffffffffffff16611121611827565b73ffffffffffffffffffffffffffffffffffffffff1614611177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116e90614c7e565b60405180910390fd5b80603160006101000a81548160ff021916908315150217905550801561119f57426032819055505b50565b600061124b6111af612266565b8461124685600260006111c0612266565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461375390919063ffffffff16565b61226e565b6001905092915050565b602960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611283612266565b73ffffffffffffffffffffffffffffffffffffffff166112a1611827565b73ffffffffffffffffffffffffffffffffffffffff16146112f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ee90614c7e565b60405180910390fd5b603c81111561133b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133290614d5e565b60405180910390fd5b80600e8190555050565b603160009054906101000a900460ff1681565b602a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b602b60149054906101000a900460ff1681565b611399612266565b73ffffffffffffffffffffffffffffffffffffffff166113b7611827565b73ffffffffffffffffffffffffffffffffffffffff161461140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140490614c7e565b60405180910390fd5b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611470612266565b73ffffffffffffffffffffffffffffffffffffffff1661148e611827565b73ffffffffffffffffffffffffffffffffffffffff16146114e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114db90614c7e565b60405180910390fd5b80602960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611572600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461105e565b9050919050565b611581612266565b73ffffffffffffffffffffffffffffffffffffffff1661159f611827565b73ffffffffffffffffffffffffffffffffffffffff16146115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec90614c7e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b602c5481565b60006116c3612266565b73ffffffffffffffffffffffffffffffffffffffff166116e1611827565b73ffffffffffffffffffffffffffffffffffffffff1614611737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172e90614c7e565b60405180910390fd5b600061174230611528565b905060008111156117f9576000603054146117cb57600061176460305461105e565b9050600061177b828461376990919063ffffffff16565b9050600081146117b2576117b181602960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661377f565b5b60006030819055506117c4823061377f565b50506117f8565b6117f781602960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661377f565b5b5b600191505090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606005805461185f90615325565b80601f016020809104026020016040519081016040528092919081815260200182805461188b90615325565b80156118d85780601f106118ad576101008083540402835291602001916118d8565b820191906000526020600020905b8154815290600101906020018083116118bb57829003601f168201915b5050505050905090565b600f6020528060005260406000206000915054906101000a900460ff1681565b602f5481565b60006119cb611915612266565b846119c685604051806060016040528060258152602001615a84602591396002600061193f612266565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136c59092919063ffffffff16565b61226e565b6001905092915050565b60006119e96119e2612266565b8484612753565b6001905092915050565b6119fb612266565b73ffffffffffffffffffffffffffffffffffffffff16611a19611827565b73ffffffffffffffffffffffffffffffffffffffff1614611a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6690614c7e565b60405180910390fd5b80602e8190555050565b611a81612266565b73ffffffffffffffffffffffffffffffffffffffff16611a9f611827565b73ffffffffffffffffffffffffffffffffffffffff1614611af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aec90614c7e565b60405180910390fd5b80602b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611b41612266565b73ffffffffffffffffffffffffffffffffffffffff16611b5f611827565b73ffffffffffffffffffffffffffffffffffffffff1614611bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bac90614c7e565b60405180910390fd5b603c811115611bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf090614d5e565b60405180910390fd5b80600c8190555050565b611c0b612266565b73ffffffffffffffffffffffffffffffffffffffff16611c29611827565b73ffffffffffffffffffffffffffffffffffffffff1614611c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7690614c7e565b60405180910390fd5b602b60149054906101000a900460ff1615611ccf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc690614d1e565b60405180910390fd5b6001602b60146101000a81548160ff02191690831515021790555042602c81905550565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b61dead81565b602e5481565b602d60009054906101000a900460ff1681565b60305481565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611dbf612266565b73ffffffffffffffffffffffffffffffffffffffff16611ddd611827565b73ffffffffffffffffffffffffffffffffffffffff1614611e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2a90614c7e565b60405180910390fd5b80602f8190555050565b611e45612266565b73ffffffffffffffffffffffffffffffffffffffff16611e63611827565b73ffffffffffffffffffffffffffffffffffffffff1614611eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb090614c7e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2090614bbe565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60106020528060005260406000206000915054906101000a900460ff1681565b61200e612266565b73ffffffffffffffffffffffffffffffffffffffff1661202c611827565b73ffffffffffffffffffffffffffffffffffffffff1614612082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207990614c7e565b60405180910390fd5b60008214156120a257806015818161209a91906159ce565b9050506121ac565b60018214156120c25780601981816120ba91906159ce565b9050506121ab565b60028214156120e25780601d81816120da91906159ce565b9050506121aa565b60038214156121025780602181816120fa91906159ce565b9050506121a9565b600482141561212257806025818161211a91906159ce565b9050506121a8565b600582141561214257806011818161213a91906159ce565b9050506121a7565b60068214156121a657806015818161215a91906159ce565b905050806019818161216c91906159ce565b90505080601d818161217e91906159ce565b905050806021818161219091906159ce565b90505080602581816121a291906159ce565b9050505b5b5b5b5b5b5b5050565b735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b60008060006121d78585613aa5565b915091508582826040516020016121ef929190614a16565b60405160208183030381529060405280519060200120604051602001612216929190614a42565b6040516020818303038152906040528051906020012060001c925050509392505050565b600081836122489190614f4b565b905092915050565b6000818361225e91906150ed565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d590614cfe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561234e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234590614bde565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161242c9190614d9e565b60405180910390a3505050565b6001602d60006101000a81548160ff0219169083151502179055506000600267ffffffffffffffff811115612497577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156124c55781602001602082028036833780820191505090505b509050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561253057600080fd5b505afa158015612544573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125689190614413565b816000815181106125a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110612617577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de9584600084866126a961012c4261375390919063ffffffff16565b6040518663ffffffff1660e01b81526004016126c89493929190614af0565b6000604051808303818588803b1580156126e157600080fd5b505af11580156126f5573d6000803e3d6000fd5b50505050507f6fd378a9d8b7345c2e5b18229aaf1e39d32b177b501d0a0d26a0a858a23a9624838260405161272b929190614db9565b60405180910390a1506000602d60006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ba90614cde565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282a90614b5e565b60405180910390fd5b60008111612876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286d90614c9e565b60405180910390fd5b602b60149054906101000a900460ff16806128da5750600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8061292e5750600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61296d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296490614c5e565b60405180910390fd5b601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612a115750601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b612a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4790614c3e565b60405180910390fd5b603160009054906101000a900460ff161580612a83575042612a8062093a8060325461375390919063ffffffff16565b11155b612ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab990614b9e565b60405180910390fd5b6000604051806080016040528060008152602001600081526020016000815260200160008152509050600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612b8f5750600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561362857600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148015612c315750737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15612dca5742612c4e610258602c5461375390919063ffffffff16565b10612cb3576009600a612c619190614fcf565b634190ab00612c7091906150ed565b821115612cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca990614b7e565b60405180910390fd5b5b42612d0b600c54600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461375390919063ffffffff16565b10612d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4290614cbe565b60405180910390fd5b42600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550601160405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090505b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561330f5742612e78600d54600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461375390919063ffffffff16565b10612eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eaf90614cbe565b60405180910390fd5b42600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506000600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154118015612fa7575042612fa562015180600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015461375390919063ffffffff16565b105b1561303c576000600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555042600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505b600061308e61306c600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611528565b61308060648661225090919063ffffffff16565b61223a90919063ffffffff16565b905060156040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509150600181118061311857506001600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154145b1561315557601960405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505091505b60028111806131a757506002600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015410155b156131e457601d60405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505091505b600381111561322557602160405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505091505b6002600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154101561330d576132c66001600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461375390919063ffffffff16565b600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505b505b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156133bb5750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b156134d75742613418600e54600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461375390919063ffffffff16565b10613458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344f90614cbe565b60405180910390fd5b42600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550602560405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090505b602d60009054906101000a900460ff161580156135425750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1561362757600061355230611528565b9050602e548110613609576000603054146135db57600061357460305461105e565b9050600061358b828461376990919063ffffffff16565b9050600081146135c2576135c181602960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661377f565b5b60006030819055506135d4823061377f565b5050613608565b61360781602960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661377f565b5b5b6000479050602f548110613624576136238161dead612439565b5b50505b5b602d60009054906101000a900460ff1615613665576040518060800160405280600081526020016000815260200160008152602001600081525090505b6000816000015114801561367d575060008160600151145b801561368d575060008160200151145b801561369d575060008160400151145b156136b2576136ad848484613bd3565b6136bf565b6136be84848484613d8c565b5b50505050565b600083831115829061370d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137049190614b3c565b60405180910390fd5b5082840390509392505050565b600061374e6009600a61372d9190614fcf565b64e8d4a5100061373d91906150ed565b60035461223a90919063ffffffff16565b905090565b600081836137619190614ef5565b905092915050565b600081836137779190615147565b905092915050565b6001602d60006101000a81548160ff0219169083151502179055506000600267ffffffffffffffff8111156137dd577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561380b5781602001602082028036833780820191505090505b5090503081600081518110613849577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156138eb57600080fd5b505afa1580156138ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139239190614413565b8160018151811061395d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506139b630737a250d5630b4cf539739df2c5dacb4c659f2488d8561226e565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008486426040518663ffffffff1660e01b8152600401613a1a959493929190614de9565b600060405180830381600087803b158015613a3457600080fd5b505af1158015613a48573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78382604051613a7d929190614db9565b60405180910390a1506000602d60006101000a81548160ff0219169083151502179055505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b0e90614c1e565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610613b51578284613b54565b83835b8092508193505050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bc390614d3e565b60405180910390fd5b9250929050565b6000613bdd61371a565b90506000613bf4828461225090919063ffffffff16565b9050613c4881600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461376990919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613cdd81600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461375390919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613d7d9190614d9e565b60405180910390a35050505050565b6000613d9661371a565b90506000613dad828561225090919063ffffffff16565b90506000613dbb858561414b565b90506000613dc882614235565b90506000613dd684836142db565b90506000613de488856142db565b9050613e3885600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461376990919063ffffffff16565b600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ecd82600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461375390919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613f29836020015160035461376990919063ffffffff16565b600381905550613fa7836040015160016000602b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461375390919063ffffffff16565b60016000602b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614078836060015161406a8560000151600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461375390919063ffffffff16565b61375390919063ffffffff16565b600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506140d4836060015160305461375390919063ffffffff16565b6030819055508873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516141379190614d9e565b60405180910390a350505050505050505050565b61415361433e565b61415b61433e565b61418683602001516141786103e88761223a90919063ffffffff16565b61225090919063ffffffff16565b8160200181815250506141ba83606001516141ac6103e88761223a90919063ffffffff16565b61225090919063ffffffff16565b8160600181815250506141ee83600001516141e06103e88761223a90919063ffffffff16565b61225090919063ffffffff16565b81600001818152505061422283604001516142146103e88761223a90919063ffffffff16565b61225090919063ffffffff16565b8160400181815250508091505092915050565b61423d61433e565b61424561433e565b600061424f61371a565b905061426881856020015161225090919063ffffffff16565b82602001818152505061428881856060015161225090919063ffffffff16565b8260600181815250506142a881856000015161225090919063ffffffff16565b8260000181815250506142c881856040015161225090919063ffffffff16565b8260400181815250508192505050919050565b60006143368260200151614328846060015161431a866040015161430c88600001518a61376990919063ffffffff16565b61376990919063ffffffff16565b61376990919063ffffffff16565b61376990919063ffffffff16565b905092915050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600081359050614375816159ff565b92915050565b60008151905061438a816159ff565b92915050565b60008135905061439f81615a16565b92915050565b6000813590506143b481615a2d565b92915050565b6000608082840312156143cc57600080fd5b81905092915050565b6000813590506143e481615a44565b92915050565b6000602082840312156143fc57600080fd5b600061440a84828501614366565b91505092915050565b60006020828403121561442557600080fd5b60006144338482850161437b565b91505092915050565b60006020828403121561444e57600080fd5b600061445c84828501614390565b91505092915050565b6000806040838503121561447857600080fd5b600061448685828601614366565b925050602061449785828601614366565b9150509250929050565b6000806000606084860312156144b657600080fd5b60006144c486828701614366565b93505060206144d586828701614366565b92505060406144e6868287016143d5565b9150509250925092565b6000806040838503121561450357600080fd5b600061451185828601614366565b9250506020614522858286016143a5565b9150509250929050565b6000806040838503121561453f57600080fd5b600061454d85828601614366565b925050602061455e858286016143d5565b9150509250929050565b60006020828403121561457a57600080fd5b6000614588848285016143a5565b91505092915050565b6000602082840312156145a357600080fd5b60006145b1848285016143d5565b91505092915050565b60008060a083850312156145cd57600080fd5b60006145db858286016143d5565b92505060206145ec858286016143ba565b9150509250929050565b6000614602838361462c565b60208301905092915050565b614617816151ec565b82525050565b6146268161518d565b82525050565b6146358161517b565b82525050565b6146448161517b565b82525050565b61465b6146568261517b565b615357565b82525050565b600061466c82614ea5565b6146768185614ec8565b935061468183614e95565b8060005b838110156146b257815161469988826145f6565b97506146a483614ebb565b925050600181019050614685565b5085935050505092915050565b6146c88161519f565b82525050565b6146df6146da826151ab565b615369565b82525050565b6146ee816151fe565b82525050565b6146fd81615222565b82525050565b600061470e82614eb0565b6147188185614ed9565b935061472881856020860161526a565b61473181615432565b840191505092915050565b6000614749602383614ed9565b91506147548261546a565b604082019050919050565b600061476c604d83614ed9565b9150614777826154b9565b606082019050919050565b600061478f601a83614ed9565b915061479a8261552e565b602082019050919050565b60006147b2602683614ed9565b91506147bd82615557565b604082019050919050565b60006147d5602283614ed9565b91506147e0826155a6565b604082019050919050565b60006147f8603383614ed9565b9150614803826155f5565b604082019050919050565b600061481b602583614ed9565b915061482682615644565b604082019050919050565b600061483e602083614eea565b915061484982615693565b602082019050919050565b6000614861601f83614ed9565b915061486c826156bc565b602082019050919050565b6000614884600183614eea565b915061488f826156e5565b600182019050919050565b60006148a7602083614ed9565b91506148b28261570e565b602082019050919050565b60006148ca602083614ed9565b91506148d582615737565b602082019050919050565b60006148ed602983614ed9565b91506148f882615760565b604082019050919050565b6000614910602983614ed9565b915061491b826157af565b604082019050919050565b6000614933602583614ed9565b915061493e826157fe565b604082019050919050565b6000614956602483614ed9565b91506149618261584d565b604082019050919050565b6000614979602383614ed9565b91506149848261589c565b604082019050919050565b600061499c601e83614ed9565b91506149a7826158eb565b602082019050919050565b60006149bf602183614ed9565b91506149ca82615914565b604082019050919050565b60006149e2601c83614ed9565b91506149ed82615963565b602082019050919050565b614a01816151d5565b82525050565b614a10816151df565b82525050565b6000614a22828561464a565b601482019150614a32828461464a565b6014820191508190509392505050565b6000614a4d82614877565b9150614a59828561464a565b601482019150614a6982846146ce565b602082019150614a7882614831565b91508190509392505050565b6000602082019050614a99600083018461463b565b92915050565b6000602082019050614ab4600083018461461d565b92915050565b6000602082019050614acf60008301846146bf565b92915050565b6000602082019050614aea60008301846146e5565b92915050565b6000608082019050614b0560008301876146f4565b8181036020830152614b178186614661565b9050614b26604083018561463b565b614b3360608301846149f8565b95945050505050565b60006020820190508181036000830152614b568184614703565b905092915050565b60006020820190508181036000830152614b778161473c565b9050919050565b60006020820190508181036000830152614b978161475f565b9050919050565b60006020820190508181036000830152614bb781614782565b9050919050565b60006020820190508181036000830152614bd7816147a5565b9050919050565b60006020820190508181036000830152614bf7816147c8565b9050919050565b60006020820190508181036000830152614c17816147eb565b9050919050565b60006020820190508181036000830152614c378161480e565b9050919050565b60006020820190508181036000830152614c5781614854565b9050919050565b60006020820190508181036000830152614c778161489a565b9050919050565b60006020820190508181036000830152614c97816148bd565b9050919050565b60006020820190508181036000830152614cb7816148e0565b9050919050565b60006020820190508181036000830152614cd781614903565b9050919050565b60006020820190508181036000830152614cf781614926565b9050919050565b60006020820190508181036000830152614d1781614949565b9050919050565b60006020820190508181036000830152614d378161496c565b9050919050565b60006020820190508181036000830152614d578161498f565b9050919050565b60006020820190508181036000830152614d77816149b2565b9050919050565b60006020820190508181036000830152614d97816149d5565b9050919050565b6000602082019050614db360008301846149f8565b92915050565b6000604082019050614dce60008301856149f8565b8181036020830152614de08184614661565b90509392505050565b600060a082019050614dfe60008301886149f8565b614e0b60208301876146f4565b8181036040830152614e1d8186614661565b9050614e2c606083018561460e565b614e3960808301846149f8565b9695505050505050565b6000606082019050614e5860008301866149f8565b614e6560208301856149f8565b614e7260408301846149f8565b949350505050565b6000602082019050614e8f6000830184614a07565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f00826151d5565b9150614f0b836151d5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f4057614f3f615385565b5b828201905092915050565b6000614f56826151d5565b9150614f61836151d5565b925082614f7157614f706153b4565b5b828204905092915050565b6000808291508390505b6001851115614fc657808604811115614fa257614fa1615385565b5b6001851615614fb15780820291505b8081029050614fbf8561545d565b9450614f86565b94509492505050565b6000614fda826151d5565b9150614fe5836151df565b92506150127fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461501a565b905092915050565b60008261502a57600190506150e6565b8161503857600090506150e6565b816001811461504e576002811461505857615087565b60019150506150e6565b60ff84111561506a57615069615385565b5b8360020a91508482111561508157615080615385565b5b506150e6565b5060208310610133831016604e8410600b84101617156150bc5782820a9050838111156150b7576150b6615385565b5b6150e6565b6150c98484846001614f7c565b925090508184048111156150e0576150df615385565b5b81810290505b9392505050565b60006150f8826151d5565b9150615103836151d5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561513c5761513b615385565b5b828202905092915050565b6000615152826151d5565b915061515d836151d5565b9250828210156151705761516f615385565b5b828203905092915050565b6000615186826151b5565b9050919050565b6000615198826151b5565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006151f782615234565b9050919050565b600061520982615210565b9050919050565b600061521b826151b5565b9050919050565b600061522d826151d5565b9050919050565b600061523f82615246565b9050919050565b6000615251826151b5565b9050919050565b6000615263826151d5565b9050919050565b60005b8381101561528857808201518184015260208101905061526d565b83811115615297576000848401525b50505050565b6000810160008301806152af8161541c565b90506152bb81846159dc565b5050506001810160208301806152d08161541c565b90506152dc81846159dc565b5050506002810160408301806152f18161541c565b90506152fd81846159dc565b5050506003810160608301806153128161541c565b905061531e81846159dc565b5050505050565b6000600282049050600182168061533d57607f821691505b60208210811415615351576153506153e3565b5b50919050565b600061536282615373565b9050919050565b6000819050919050565b600061537e82615450565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000819050919050565b6000813561542981615a44565b80915050919050565b6000601f19601f8301169050919050565b60008160001b9050919050565b60008160601b9050919050565b60008160011c9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f41535441583a204e6f206275792067726561746572207468616e20312e31206260008201527f696c6c696f6e2063616e206265206d61646520666f722074686520666972737460208201527f203130206d696e757465732e2000000000000000000000000000000000000000604082015250565b7f41535441583a2054726164696e67206973207061757365642e20000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e74206d757374206265206c657373206f7220657175616c2074686160008201527f6e20746f74616c207265666c656374696f6e7300000000000000000000000000602082015250565b7f556e697377617056324c6962726172793a204944454e544943414c5f4144445260008201527f4553534553000000000000000000000000000000000000000000000000000000602082015250565b7f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f600082015250565b7f41535441583a204164647265737320697320626c61636b6c69737465642e2000600082015250565b7fff00000000000000000000000000000000000000000000000000000000000000600082015250565b7f41535441583a2054726164696e67206973206e6f74206c697665207965742e20600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b7f41535441583a204e65656420746f207761697420756e74696c206e657874207460008201527f72616e736665722e200000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f41535441583a2054726164696e6720697320616c726561647920656e61626c6560008201527f642e200000000000000000000000000000000000000000000000000000000000602082015250565b7f556e697377617056324c6962726172793a205a45524f5f414444524553530000600082015250565b7f41535441583a20436f6f6c646f776e2076616c756520746f6f206c617267652e60008201527f2000000000000000000000000000000000000000000000000000000000000000602082015250565b7f41535441583a2043616e277420626c6f636b20756e69737761702e2000000000600082015250565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6159b884615443565b9350801983169250808416831791505092915050565b6159d8828261529d565b5050565b6159e582615258565b6159f86159f182615412565b835461598c565b8255505050565b615a088161517b565b8114615a1357600080fd5b50565b615a1f8161518d565b8114615a2a57600080fd5b50565b615a368161519f565b8114615a4157600080fd5b50565b615a4d816151d5565b8114615a5857600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220eb7c799f0302d690c2e828bafd230f7e2d369eb59aa104f00366bba49a0b2c5a64736f6c63430008040033
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.