Contract Address Details

0xE57f6bBc0fCf5b89B2d1aF54Ea4D4A1AaEa678AD

AutoBurnTokenExpanse AutoBurn on Expanse (EABN) Last Balance Update: Block #5819111
Created by 0xb133–29b6a1 at 0xc664–225d71

Balance

0 EXP

(@ /EXP)

Fetching tokens...

Contract name:
AutoBurnTokenExpanse




Optimization enabled
false
Compiler version
v0.7.6+commit.7338295f




EVM Version
default

Contract source code

/**
* Submitted for verification at blockscout.com on 2021-03-01 10:04:47.610105Z
*/
//Contract = 0xE57f6bBc0fCf5b89B2d1aF54Ea4D4A1AaEa678AD
//LP = 0x7f7a3F2c1fef5ADA32c0CeC3428EB3c515a6851e
//Presale = 0x4874142bb71619254eeedec7b37e8869f3f10419
//Compiled with optimization disabled
/*
EABN = AutoBurn token on Expanse blockchain. Enjoy near zero gas fees!
Modifications: 10x less supply (10k instead of 100k), but 10x bigger max tx amount (tx < 1/9 instead of tx < 1/99).
Planned presale: 1000 EXP = 94 EABN after fees.
Planned bridge or at least cross-chain exchange. Watch social channels for updates. 1 ETH = 10000 EXP on Bittrex
at the time of EABN creation. Thus if 0.1 ETH = 94 ABN then 1000 EXP = 94 EABN. Final bridge/exchange ratio may
differ from 1:1 depending on circulating supply and market conditions and will incur 3+3% fees on both sides.
Experimental, trade at your own risk.
*** AutoBurn ***
Deflationary. Low gas. Made simple.
This token has decreasing supply and increasing price achieved by 3% burn and 3% added
to liquidity on each transaction except wallet to wallet transactions (non-contract).
This is done by direct balance adjustments which are much cheaper than calling external
methods for sell, add liquidity and mint LP tokens functions on each trade. The pool
is verified to stay in sync despite no additional LP tokens are minted or burned,
proportionally rewarding any additional liquidity providers.
Price is driven up every day by burning 3% of ABN from liquidity pool while keeping WETH there
intact. Wallet and other pool balances are not daily burn, only WETH-ABN pool is affected.
Net size of a single transaction is limited to 1% of available supply, no limit on balances
and no limit for wallet to wallet transactions (non-contract).
If you get "error:undefined" on swap or "confirm" button is dead:
Check slippage, increase to 7%.
Set exact amount for ABN, not for the counterparty.
Check token available supply, 1% bought at once may be later sold in 2 or more transactions if
some supply was burn in meantime.
Tip to remove liquidity: Save one transaction fee by removing liquidity to WETH instead of ETH.
Disclaimer: This is an experimental project. DYOR and read contract code thoroughly before trading.
Check liquidity distribution and lock duration.
Deployer has no liability, direct or indirectly implied, of any loss or damage caused by bugs in
code or EVM, Solidity vulnerabilities, bot activity or malicious behavior of token holders.
WEXP = 0x331631B4bb93b9B8962faE15860BD538a389395A
*/
//SPDX-License-Identifier: UNLICENSED
// License: Parts different from open-zeppelin implementations are copyrighted. Any clones should send a 0.3% of tx value to deployer of this contract provided the tx is not considered feeless here.
pragma solidity =0.7.6;
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
function increaseAllowance(address spender, uint256 addedValue) external returns (bool);
function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function burn(uint256 amount) external returns (bool);
function burnFrom(address account, uint256 amount) external returns (bool);
}
interface UNIV2Sync {
function sync() external;
}
interface IWETH {
function deposit() external payable;
function balanceOf(address _owner) external returns (uint256);
function transfer(address _to, uint256 _value) external returns (bool);
function withdraw(uint256 _amount) external;
}
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
library Address {
function isContract(address account) internal view returns (bool) {
// According to EIP-1052, 0x0 is the value returned for not-yet created accounts
// and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
// for accounts without code, i.e. `keccak256('')`
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
// solhint-disable-next-line no-inline-assembly
assembly { codehash := extcodehash(account) }
return (codehash != accountHash && codehash != 0x0);
}
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");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, errorMessage);
}
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");
}
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");
return _functionCallWithValue(target, data, value, errorMessage);
}
function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
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);
}
}
}
}
/*
* An {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract DeflationaryERC20 is Context, IERC20 {
using SafeMath for uint256;
using Address for address;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
uint8 private _decimals;
address private _deployer;
uint256 public lastPoolBurnTime;
uint256 public epoch;
// Transaction Fees:
uint8 public txFee = 6; // total in %, half will burn and half adds to liquidity
address public feeDistributor; // fees are sent to fee distributor = uniswap pool
address public wethContract; // wrap ethers sent to contract to increase liquidity
constructor (string memory __name, string memory __symbol) {
_name = __name;
_symbol = __symbol;
_decimals = 6;
_deployer = tx.origin;
epoch = 86400;
wethContract=0x331631B4bb93b9B8962faE15860BD538a389395A; // WEXP
lastPoolBurnTime = block.timestamp.div(epoch).mul(epoch); //set time part to midnight UTC
}
function name() public view returns (string memory) {
return _name;
}
function symbol() public view returns (string memory) {
return _symbol;
}
function decimals() public view returns (uint8) {
return _decimals;
}
function totalSupply() public view override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
_transfer(sender, recipient, amount);
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual override returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual override returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
function countdownPoolBurnDue() public view returns (uint256) {
return ((lastPoolBurnTime.add(epoch))>block.timestamp?(lastPoolBurnTime.add(epoch).sub(block.timestamp)):0);
}
//Important: Due to checks made during swap process avoid calling this method inside a swap transaction.
function PoolBurnAndSync() public virtual returns (bool) {
// Burns any token balance donated to the contract (always)
if (_balances[address(this)] > 0) {
_burn(address(this),_balances[address(this)]);
}
//Convert any ETH to WETH (always).
uint256 amountETH = address(this).balance;
if (amountETH > 0) {
IWETH(wethContract).deposit{value : amountETH}();
}
//Checks pool address and time since last pool burn
if (countdownPoolBurnDue() == 0 && feeDistributor != address(0)) {
lastPoolBurnTime = lastPoolBurnTime.add(epoch);
//Burns 3% from pool address
if (_balances[feeDistributor] > 100) {
_burn(feeDistributor,_balances[feeDistributor].mul(3).div(100));
}
}
//Calls sync anytime it's not a swap. Swaps sync at the end automatically.
if(feeDistributor != address(0)) {
//Gets weth balance
uint256 amountWETH = IWETH(wethContract).balanceOf(address(this));
//Sends weth to pool
if (amountWETH > 0) {
IWETH(wethContract).transfer(feeDistributor, amountWETH);
}
UNIV2Sync(feeDistributor).sync(); //important to reflect updated price
}
return true;
}
// assign a new pool address, enforce deflationary features and renounce ownership
function setFeeDistributor(address _distributor) public {
require(tx.origin == _deployer, "Not from deployer");
require(feeDistributor == address(0), "Pool: Address immutable once set");
feeDistributor = _distributor;
}
// to caclulate the amounts for recipient and distributer after fees have been applied
function calculateAmountsAfterFee(
address sender,
address recipient,
uint256 amount
) public view returns (uint256 transferToAmount, uint256 transferToFeeDistributorAmount, uint256 burnAmount) {
// check if fees should apply to this transaction
if (sender.isContract() || recipient.isContract()) {
// calculate fees and amounts if any address is an active contract
uint256 fee = amount.mul(txFee).div(100);
uint256 burnFee = fee.div(2);
return (amount.sub(fee), fee.sub(burnFee),burnFee);
}
return (amount, 0, 0);
}
function burnFrom(address account,uint256 amount) public virtual override returns (bool) {
_approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
_burn(account, amount);
return true;
}
function burn(uint256 amount) public virtual override returns (bool) {
_burn(_msgSender(), amount);
return true;
}
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
require(amount >= 100, "amount below 100 base units, avoiding underflows");
_beforeTokenTransfer(sender, recipient, amount);
// calculate fee:
(uint256 transferToAmount, uint256 transferToFeeDistributorAmount,uint256 burnAmount) = calculateAmountsAfterFee(sender, recipient, amount);
// subtract net amount, keep amount for fees to be subtracted later
_balances[sender] = _balances[sender].sub(transferToAmount, "ERC20: transfer amount exceeds balance");
// update recipients balance:
_balances[recipient] = _balances[recipient].add(transferToAmount);
emit Transfer(sender, recipient, transferToAmount);
// update pool balance, limit max tx once pool contract is known and funded
if(transferToFeeDistributorAmount > 0 && feeDistributor != address(0)){
require(_totalSupply.div(transferToAmount) >= 9, "max single trade 10% of current total supply");
_burn(sender,burnAmount);
_balances[sender] = _balances[sender].sub(transferToFeeDistributorAmount, "ERC20: fee transfer amount exceeds remaining balance");
_balances[feeDistributor] = _balances[feeDistributor].add(transferToFeeDistributorAmount);
emit Transfer(sender, feeDistributor, transferToFeeDistributorAmount);
//Sync is made automatically at the end of swap transaction, doing it earlier reverts the swap
} else {
//Since there may be relayers like 1inch allow sync on feeless txs only
PoolBurnAndSync();
}
}
function _mint(address account, uint256 amount) internal virtual {
require(_totalSupply == 0, "Mint: Not an initial supply mint");
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
if(amount != 0) {
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
}
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* Hook that is called before any transfer of tokens. This includes minting and burning.
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
//Before sennding ether to this contract ensure gas cost is estimated properly
receive() external payable {
PoolBurnAndSync();
}
}
/**
* ABN is a token designed to implement pool inflation and supply deflation using simplified way of transferring or burning
* fees manually and then forcing Uniswap pool to resync balances instead of costly sell, add liquidity and mint LP tokens.
* The ABN Token itself is just a standard ERC20, with:
* No minting.
* Public burning.
* Transfer fee applied. Fixed to 3% into pool + 3% burn.
*/
contract AutoBurnTokenExpanse is DeflationaryERC20 {
constructor() DeflationaryERC20("AutoBurn on Expanse", "EABN") {
// maximum supply = 10000 whole units with decimals = 6
_mint(msg.sender, 10000e6);
}
}

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"PoolBurnAndSync","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"burn","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"burnFrom","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"transferToAmount","internalType":"uint256"},{"type":"uint256","name":"transferToFeeDistributorAmount","internalType":"uint256"},{"type":"uint256","name":"burnAmount","internalType":"uint256"}],"name":"calculateAmountsAfterFee","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"countdownPoolBurnDue","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"epoch","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"feeDistributor","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lastPoolBurnTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeDistributor","inputs":[{"type":"address","name":"_distributor","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"txFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"wethContract","inputs":[]},{"type":"receive","stateMutability":"payable"}]
            

Contract Byte Code

0x6080604052600436106101395760003560e01c80634780eac1116100ab57806395d89b411161006f57806395d89b411461069e578063a457c2d71461072e578063a9059cbb1461079f578063ccfc2e8d14610810578063cf82046114610861578063dd62ed3e1461088f57610149565b80634780eac1146105315780635ceb62d71461057257806370a082311461059d57806379cc679014610602578063900cf0cf1461067357610149565b8063301a5801116100fd578063301a58011461034c578063303308f2146103e9578063313ce567146104165780633793675c14610444578063395093511461046f57806342966c68146104e057610149565b806306fdde031461014e578063095ea7b3146101de5780630d43e8ad1461024f57806318160ddd1461029057806323b872dd146102bb57610149565b3661014957610146610914565b50005b600080fd5b34801561015a57600080fd5b50610163610e83565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101a3578082015181840152602081019050610188565b50505050905090810190601f1680156101d05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156101ea57600080fd5b506102376004803603604081101561020157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f25565b60405180821515815260200191505060405180910390f35b34801561025b57600080fd5b50610264610f43565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561029c57600080fd5b506102a5610f69565b6040518082815260200191505060405180910390f35b3480156102c757600080fd5b50610334600480360360608110156102de57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f73565b60405180821515815260200191505060405180910390f35b34801561035857600080fd5b506103c56004803603606081101561036f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061104c565b60405180848152602001838152602001828152602001935050505060405180910390f35b3480156103f557600080fd5b506103fe610914565b60405180821515815260200191505060405180910390f35b34801561042257600080fd5b5061042b611137565b604051808260ff16815260200191505060405180910390f35b34801561045057600080fd5b5061045961114e565b6040518082815260200191505060405180910390f35b34801561047b57600080fd5b506104c86004803603604081101561049257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611154565b60405180821515815260200191505060405180910390f35b3480156104ec57600080fd5b506105196004803603602081101561050357600080fd5b8101908080359060200190929190505050611207565b60405180821515815260200191505060405180910390f35b34801561053d57600080fd5b50610546611223565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561057e57600080fd5b50610587611249565b6040518082815260200191505060405180910390f35b3480156105a957600080fd5b506105ec600480360360208110156105c057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061129e565b6040518082815260200191505060405180910390f35b34801561060e57600080fd5b5061065b6004803603604081101561062557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506112e6565b60405180821515815260200191505060405180910390f35b34801561067f57600080fd5b506106886113bd565b6040518082815260200191505060405180910390f35b3480156106aa57600080fd5b506106b36113c3565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106f35780820151818401526020810190506106d8565b50505050905090810190601f1680156107205780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561073a57600080fd5b506107876004803603604081101561075157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611465565b60405180821515815260200191505060405180910390f35b3480156107ab57600080fd5b506107f8600480360360408110156107c257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611532565b60405180821515815260200191505060405180910390f35b34801561081c57600080fd5b5061085f6004803603602081101561083357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611550565b005b34801561086d57600080fd5b5061087661171b565b604051808260ff16815260200191505060405180910390f35b34801561089b57600080fd5b506108fe600480360360408110156108b257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061172e565b6040518082815260200191505060405180910390f35b6000806000803073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156109a5576109a4306000803073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461190d565b5b60004790506000811115610a3757600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610a1d57600080fd5b505af1158015610a31573d6000803e3d6000fd5b50505050505b6000610a41611249565b148015610a9d5750600073ffffffffffffffffffffffffffffffffffffffff16600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15610bdc57610ab960075460065461188590919063ffffffff16565b6006819055506064600080600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610bdb57610bda600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610bd56064610bc76003600080600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117ff90919063ffffffff16565b6117b590919063ffffffff16565b61190d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff16600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e7b576000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015610cbf57600080fd5b505af1158015610cd3573d6000803e3d6000fd5b505050506040513d6020811015610ce957600080fd5b810190808051906020019092919050505090506000811115610df757600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610dba57600080fd5b505af1158015610dce573d6000803e3d6000fd5b505050506040513d6020811015610de457600080fd5b8101908080519060200190929190505050505b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610e6157600080fd5b505af1158015610e75573d6000803e3d6000fd5b50505050505b600191505090565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f1b5780601f10610ef057610100808354040283529160200191610f1b565b820191906000526020600020905b815481529060010190602001808311610efe57829003601f168201915b5050505050905090565b6000610f39610f32611ada565b8484611ae2565b6001905092915050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b600061103684610f81611ada565b6110318560405180606001604052806028815260200161266260289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610fe7611ada565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cd99092919063ffffffff16565b611ae2565b611041848484611d99565b600190509392505050565b60008060006110708673ffffffffffffffffffffffffffffffffffffffff166123c3565b8061109657506110958573ffffffffffffffffffffffffffffffffffffffff166123c3565b5b156111235760006110d560646110c7600860009054906101000a900460ff1660ff16886117ff90919063ffffffff16565b6117b590919063ffffffff16565b905060006110ed6002836117b590919063ffffffff16565b9050611102828761240e90919063ffffffff16565b611115828461240e90919063ffffffff16565b82945094509450505061112e565b836000809250925092505b93509350939050565b6000600560009054906101000a900460ff16905090565b60065481565b60006111fd611161611ada565b846111f88560016000611172611ada565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461188590919063ffffffff16565b611ae2565b6001905092915050565b600061121a611214611ada565b8361190d565b60019050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60004261126360075460065461188590919063ffffffff16565b1161126f576000611299565b6112984261128a60075460065461188590919063ffffffff16565b61240e90919063ffffffff16565b5b905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006113a9836112f4611ada565b6113a48560405180606001604052806024815260200161268a60249139600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061135a611ada565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cd99092919063ffffffff16565b611ae2565b6113b3838361190d565b6001905092915050565b60075481565b606060048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561145b5780601f106114305761010080835404028352916020019161145b565b820191906000526020600020905b81548152906001019060200180831161143e57829003601f168201915b5050505050905090565b6000611528611472611ada565b8461152385604051806060016040528060258152602001612718602591396001600061149c611ada565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cd99092919063ffffffff16565b611ae2565b6001905092915050565b600061154661153f611ada565b8484611d99565b6001905092915050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611613576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4e6f742066726f6d206465706c6f79657200000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f506f6f6c3a204164647265737320696d6d757461626c65206f6e63652073657481525060200191505060405180910390fd5b80600860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600860009054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006117f783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612458565b905092915050565b600080831415611812576000905061187f565b600082840290508284828161182357fe5b041461187a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806126116021913960400191505060405180910390fd5b809150505b92915050565b600080828401905083811015611903576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611993576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806126ae6021913960400191505060405180910390fd5b61199f8260008361251e565b60008114611ad657611a1281604051806060016040528060228152602001612547602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cd99092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611a698160025461240e90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35b5050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b68576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806126f46024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806125696022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000838311158290611d86576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611d4b578082015181840152602081019050611d30565b50505050905090810190601f168015611d785780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e1f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806126cf6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ea5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806125246023913960400191505060405180910390fd5b6064811015611eff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806126326030913960400191505060405180910390fd5b611f0a83838361251e565b6000806000611f1a86868661104c565b925092509250611f8b8360405180606001604052806026815260200161258b602691396000808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cd99092919063ffffffff16565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061201e836000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461188590919063ffffffff16565b6000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a36000821180156121245750600073ffffffffffffffffffffffffffffffffffffffff16600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156123b1576009612140846002546117b590919063ffffffff16565b1015612197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806125b1602c913960400191505060405180910390fd5b6121a1868261190d565b61220c826040518060600160405280603481526020016125dd603491396000808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cd99092919063ffffffff16565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506122c182600080600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461188590919063ffffffff16565b600080600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36123bb565b6123b9610914565b505b505050505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f915080821415801561240557506000801b8214155b92505050919050565b600061245083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611cd9565b905092915050565b60008083118290612504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156124c95780820151818401526020810190506124ae565b50505050905090810190601f1680156124f65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161251057fe5b049050809150509392505050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63656d61782073696e676c6520747261646520313025206f662063757272656e7420746f74616c20737570706c7945524332303a20666565207472616e7366657220616d6f756e7420657863656564732072656d61696e696e672062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77616d6f756e742062656c6f7720313030206261736520756e6974732c2061766f6964696e6720756e646572666c6f777345524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206dada04bf60e9f3bef24a7cea9a7568301b8aeefd657d5d1e1e93c981df4426c64736f6c63430007060033