Swing DAO: SWING Token
Token Contract
More Info
Private Name Tags
ContractCreator
TokenTracker
Multi Chain
Multichain Addresses
1 address found via
Latest 25 from a total of 1,437 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Transfer | 17389831 | 3 days 2 hrs ago | IN | 0 ETH | 0.00216312 | ||||
Approve | 17376807 | 4 days 22 hrs ago | IN | 0 ETH | 0.00068041 | ||||
Transfer | 17341783 | 9 days 20 hrs ago | IN | 0 ETH | 0.00249674 | ||||
Transfer | 17249008 | 22 days 22 hrs ago | IN | 0 ETH | 0.00426507 | ||||
Transfer | 17245897 | 23 days 8 hrs ago | IN | 0 ETH | 0.00747913 | ||||
Approve | 17200951 | 29 days 17 hrs ago | IN | 0 ETH | 0.00493749 | ||||
Approve | 17188330 | 31 days 12 hrs ago | IN | 0 ETH | 0.00261454 | ||||
Approve | 17130943 | 39 days 13 hrs ago | IN | 0 ETH | 0.00158988 | ||||
Transfer | 17124082 | 40 days 12 hrs ago | IN | 0 ETH | 0.00394849 | ||||
Approve | 17059796 | 49 days 14 hrs ago | IN | 0 ETH | 0.00065985 | ||||
Approve | 17048610 | 51 days 4 hrs ago | IN | 0 ETH | 0.00065573 | ||||
Approve | 17031834 | 53 days 15 hrs ago | IN | 0 ETH | 0.0009525 | ||||
Approve | 17009808 | 56 days 18 hrs ago | IN | 0 ETH | 0.00052713 | ||||
Approve | 17009805 | 56 days 18 hrs ago | IN | 0 ETH | 0.00052879 | ||||
Approve | 17009687 | 56 days 19 hrs ago | IN | 0 ETH | 0.00055953 | ||||
Transfer | 16895640 | 72 days 21 hrs ago | IN | 0 ETH | 0.00098243 | ||||
Transfer | 16895552 | 72 days 21 hrs ago | IN | 0 ETH | 0.00132645 | ||||
Approve | 16817706 | 83 days 20 hrs ago | IN | 0 ETH | 0.00084696 | ||||
Transfer From | 16816154 | 84 days 1 hr ago | IN | 0 ETH | 0.00200166 | ||||
Approve | 16816151 | 84 days 1 hr ago | IN | 0 ETH | 0.0012084 | ||||
Approve | 16779665 | 89 days 4 hrs ago | IN | 0 ETH | 0.00072572 | ||||
Approve | 16760872 | 91 days 19 hrs ago | IN | 0 ETH | 0.00086888 | ||||
Approve | 16748619 | 93 days 13 hrs ago | IN | 0 ETH | 0.00082165 | ||||
Approve | 16729809 | 96 days 4 hrs ago | IN | 0 ETH | 0.00109593 | ||||
Transfer | 16729796 | 96 days 4 hrs ago | IN | 0 ETH | 0.00211793 |
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
15619215 | 251 days 9 hrs ago | Contract Creation | 0 ETH |
Loading...
Loading
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xbAD485...456eB7C6
Contract Name:
SwingDao
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
//SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.7; import "./Interfaces.sol"; import "./BaseErc20.sol"; import "./Burnable.sol"; import "./Taxable.sol"; import "./TaxDistributor.sol"; import "./AntiSniper.sol"; contract SwingDao is BaseErc20, AntiSniper, Burnable, Taxable { constructor () { configure(msg.sender); symbol = "SWING"; name = "Swing DAO"; decimals = 18; address routerAddress; address pairedToken; if (block.chainid == 1) { routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ; // ETHEREUM pairedToken = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; // USDC } else if (block.chainid == 3 || block.chainid == 4) { routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ; // ROPSTEN pairedToken = 0x07865c6E87B9F70255377e024ace6630C1Eaa37F; } else if (block.chainid == 56) { routerAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E; // BSC MAINNET } else if (block.chainid == 97) { routerAddress = 0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3; // BSC TESTNET } else { revert("Unknown Chain ID"); } IDEXRouter router = IDEXRouter(routerAddress); address pair = IDEXFactory(router.factory()).createPair(pairedToken, address(this)); exchanges[pair] = true; exchanges[0xE592427A0AEce92De3Edee1F18E0157C05861564] = true; taxDistributor = new TaxDistributor(routerAddress, pair, pairedToken, 1200, 1200); // Anti Sniper enableSniperBlocking = true; isNeverSniper[address(taxDistributor)] = true; // Tax minimumTimeBetweenSwaps = 5 minutes; minimumTokensBeforeSwap = 1000 * 10 ** decimals; excludedFromTax[address(taxDistributor)] = true; taxDistributor.createLiquidityTax("Liquidity", 200, 200, 0x000000000000000000000000000000000000dEaD); taxDistributor.createBurnTax("Burn", 200, 200); taxDistributor.createWalletTax("Treasury", 400, 400, 0x4C4DEd8268ABa5767161bD761dc996B8e8FA4026, true); taxDistributor.createWalletTax("Development", 400, 400, 0x3514d7B31E3a1F1e20E85D71409226f46665605A, true); autoSwapTax = false; // Burnable ableToBurn[address(taxDistributor)] = true; _allowed[address(taxDistributor)][routerAddress] = 2**256 - 1; _totalSupply = _totalSupply + (1_500_000_000 * 10 ** decimals); _balances[owner] = _balances[owner] + _totalSupply; emit Transfer(address(0), owner, _totalSupply); } // Overrides function launch() public override(AntiSniper, BaseErc20) onlyOwner { super.launch(); emit ConfigurationChanged(msg.sender, "Swing Token Launched"); } function configure(address _owner) internal override(AntiSniper, Burnable, Taxable, BaseErc20) { super.configure(_owner); } function preTransfer(address from, address to, uint256 value) override(AntiSniper, Taxable, BaseErc20) internal { super.preTransfer(from, to, value); } function calculateTransferAmount(address from, address to, uint256 value) override(Taxable, BaseErc20) internal returns (uint256) { return super.calculateTransferAmount(from, to, value); } function postTransfer(address from, address to) override(BaseErc20) internal { super.postTransfer(from, to); } }
//SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.7; import "./Interfaces.sol"; import "./BaseErc20.sol"; abstract contract AntiSniper is BaseErc20 { bool public enableSniperBlocking; bool public enableBlockLogProtection; uint256 public maxGasLimit; uint256 public launchTime; uint256 public launchBlock; uint256 public snipersCaught; mapping (address => bool) public isSniper; mapping (address => bool) public isNeverSniper; mapping (address => uint256) public transactionBlockLog; // Overrides function configure(address _owner) internal virtual override { isNeverSniper[_owner] = true; super.configure(_owner); } function launch() override virtual public onlyOwner { super.launch(); launchTime = block.timestamp; launchBlock = block.number; emit ConfigurationChanged(msg.sender, "Anti Sniper Launched"); } function preTransfer(address from, address to, uint256 value) override virtual internal { require(enableSniperBlocking == false || isSniper[msg.sender] == false, "sniper rejected"); if (launched && from != owner && isNeverSniper[from] == false && isNeverSniper[to] == false) { if (maxGasLimit > 0) { require(gasleft() <= maxGasLimit, "this is over the max gas limit"); } if(enableBlockLogProtection) { if (transactionBlockLog[to] == block.number) { isSniper[to] = true; snipersCaught ++; } if (transactionBlockLog[from] == block.number) { isSniper[from] = true; snipersCaught ++; } if (exchanges[to] == false) { transactionBlockLog[to] = block.number; } if (exchanges[from] == false) { transactionBlockLog[from] = block.number; } } } super.preTransfer(from, to, value); } // Admin methods function setSniperBlocking(bool enabled) external onlyOwner { enableSniperBlocking = enabled; emit ConfigurationChanged(msg.sender, "Enable/Disable Sniper Blocking"); } function setBlockLogProtection(bool enabled) external onlyOwner { enableBlockLogProtection = enabled; emit ConfigurationChanged(msg.sender, "Enable/Disable Block Log Protection"); } function setMaxGasLimit(uint256 amount) external onlyOwner { require(amount == 0 || amount > 200, "This gas limit is too low"); maxGasLimit = amount; emit ConfigurationChanged(msg.sender, "Max Gas Limit Changed"); } function setIsSniper(address who, bool enabled) external onlyOwner { isSniper[who] = enabled; emit ConfigurationChanged(msg.sender, "Sniper List Changed"); } function setNeverSniper(address who, bool enabled) external onlyOwner { isNeverSniper[who] = enabled; emit ConfigurationChanged(msg.sender, "Never Sniper List Changed"); } // private methods }
//SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.7; import "./Interfaces.sol"; abstract contract BaseErc20 is IERC20, IOwnable { mapping (address => uint256) internal _balances; mapping (address => mapping (address => uint256)) internal _allowed; uint256 internal _totalSupply; bool internal _useSafeTransfer; string public symbol; string public name; uint8 public decimals; address public override owner; bool public isTradingEnabled = true; bool public launched; mapping (address => bool) public canAlwaysTrade; mapping (address => bool) public excludedFromSelling; mapping (address => bool) public exchanges; event ConfigurationChanged(address indexed owner, string option); modifier onlyOwner() { require(msg.sender == owner, "can only be called by the contract owner"); _; } modifier isLaunched() { require(launched, "can only be called once token is launched"); _; } // @dev Trading is allowed before launch if the sender is the owner, we are transferring from the owner, or in canAlwaysTrade list modifier tradingEnabled(address from) { require((isTradingEnabled && launched) || from == owner || canAlwaysTrade[msg.sender], "trading not enabled"); _; } function configure(address _owner) internal virtual { owner = _owner; canAlwaysTrade[owner] = true; } /** * @dev Total number of tokens in existence */ function totalSupply() public override view returns (uint256) { return _totalSupply; } /** * @dev Gets the balance of the specified address. * @param _owner The address to query the balance of. * @return An uint256 representing the amount owned by the passed address. */ function balanceOf(address _owner) external override view returns (uint256) { return _balances[_owner]; } /** * @dev Function to check the amount of tokens that an owner allowed to a spender. * @param _owner address The address which owns the funds. * @param spender address The address which will spend the funds. * @return A uint256 specifying the amount of tokens still available for the spender. */ function allowance(address _owner, address spender) external override view returns (uint256) { return _allowed[_owner][spender]; } /** * @dev Transfer token for a specified address * @param to The address to transfer to. * @param value The amount to be transferred. */ function transfer(address to, uint256 value) public override tradingEnabled(msg.sender) returns (bool) { _transfer(msg.sender, to, value); return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * 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 * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. */ function approve(address spender, uint256 value) external override tradingEnabled(msg.sender) returns (bool) { require(spender != address(0), "cannot approve the 0 address"); _allowed[msg.sender][spender] = value; emit Approval(msg.sender, spender, value); return true; } /** * @dev Transfer tokens from one address to another. * Note that while this function emits an Approval event, this is not required as per the specification, * and other compliant implementations may not emit the event. * @param from address The address which you want to send tokens from * @param to address The address which you want to transfer to * @param value uint256 the amount of tokens to be transferred */ function transferFrom(address from, address to, uint256 value) external override tradingEnabled(from) returns (bool) { _allowed[from][msg.sender] = _allowed[from][msg.sender] - value; _transfer(from, to, value); emit Approval(from, msg.sender, _allowed[from][msg.sender]); return true; } /** * @dev Increase the amount of tokens that an owner allowed to a spender. * approve should be called when allowed_[_spender] == 0. To increment * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * Emits an Approval event. * @param spender The address which will spend the funds. * @param addedValue The amount of tokens to increase the allowance by. */ function increaseAllowance(address spender, uint256 addedValue) external tradingEnabled(msg.sender) returns (bool) { require(spender != address(0), "cannot approve the 0 address"); _allowed[msg.sender][spender] = _allowed[msg.sender][spender] + addedValue; emit Approval(msg.sender, spender, _allowed[msg.sender][spender]); return true; } /** * @dev Decrease the amount of tokens that an owner allowed to a spender. * approve should be called when allowed_[_spender] == 0. To decrement * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * Emits an Approval event. * @param spender The address which will spend the funds. * @param subtractedValue The amount of tokens to decrease the allowance by. */ function decreaseAllowance(address spender, uint256 subtractedValue) external tradingEnabled(msg.sender) returns (bool) { require(spender != address(0), "cannot approve the 0 address"); _allowed[msg.sender][spender] = _allowed[msg.sender][spender] - subtractedValue; emit Approval(msg.sender, spender, _allowed[msg.sender][spender]); return true; } // Virtual methods function launch() virtual public onlyOwner { launched = true; emit ConfigurationChanged(msg.sender, "Token Launched"); } function preTransfer(address from, address to, uint256 value) virtual internal { } function calculateTransferAmount(address from, address to, uint256 value) virtual internal returns (uint256) { require(from != to, "you cannot transfer to yourself"); return value; } function postTransfer(address from, address to) virtual internal { } // Admin methods function changeOwner(address who) external onlyOwner { require(who != address(0), "cannot be zero address"); owner = who; emit ConfigurationChanged(msg.sender, "Owner Changed"); } function removeBnb() external onlyOwner { uint256 balance = address(this).balance; payable(owner).transfer(balance); emit ConfigurationChanged(msg.sender, "Native Token Removed"); } function transferTokens(address token, address to) external onlyOwner returns(bool){ uint256 balance = IERC20(token).balanceOf(address(this)); emit ConfigurationChanged(msg.sender, "Custom Token Removed"); return IERC20(token).transfer(to, balance); } function setTradingEnabled(bool enabled) external onlyOwner { isTradingEnabled = enabled; emit ConfigurationChanged(msg.sender, "Enable/Disable Trading"); } function setCanAlwaysTrade(address who, bool enabled) external onlyOwner { canAlwaysTrade[who] = enabled; emit ConfigurationChanged(msg.sender, "Always Trade List Changed"); } function setExchange(address who, bool isExchange) external onlyOwner { exchanges[who] = isExchange; emit ConfigurationChanged(msg.sender, "Exchanges Changed"); } function setExcludedFromSelling(address who, bool isExcluded) external onlyOwner { excludedFromSelling[who] = isExcluded; emit ConfigurationChanged(msg.sender, "Selling Exclusion Changed"); } // Private methods /** * @dev Transfer token for a specified addresses * @param from The address to transfer from. * @param to The address to transfer to. * @param value The amount to be transferred. */ function _transfer(address from, address to, uint256 value) private { require(to != address(0), "cannot be zero address"); require(excludedFromSelling[from] == false, "address is not allowed to sell"); preTransfer(from, to, value); uint256 modifiedAmount = calculateTransferAmount(from, to, value); _balances[from] = _balances[from] - value; _balances[to] = _balances[to] + modifiedAmount; emit Transfer(from, to, modifiedAmount); postTransfer(from, to); } }
//SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.7; import "./Interfaces.sol"; import "./BaseErc20.sol"; abstract contract Burnable is BaseErc20, IBurnable { mapping (address => bool) public ableToBurn; modifier onlyBurner() { require(ableToBurn[msg.sender], "no burn permissions"); _; } // Overrides function configure(address _owner) internal virtual override { ableToBurn[_owner] = true; super.configure(_owner); } // Admin methods function setAbleToBurn(address who, bool enabled) external onlyOwner { ableToBurn[who] = enabled; emit ConfigurationChanged(msg.sender, "Burner List Changed"); } // Private methods /** * @dev Internal function that burns an amount of the token of a given * account. * @param account The account whose tokens will be burnt. * @param value The amount that will be burnt. */ function burn(address account, uint256 value) external override onlyBurner { require(account != address(0), "Cannot burn from the 0 address"); if (account != msg.sender) { _allowed[account][msg.sender] = _allowed[account][msg.sender] - value; } _totalSupply = _totalSupply - value; _balances[account] = _balances[account] - value; emit Transfer(account, address(0), value); } }
//SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.7; interface IOwnable { function owner() external view returns (address); } interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address _owner, address spender) external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } interface IBurnable { function burn(address account, uint256 value) external; } interface IDEXFactory { function createPair(address tokenA, address tokenB) external returns (address pair); } interface IDEXRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH(address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external payable returns (uint amountToken, uint amountETH, uint liquidity); function addLiquidity(address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint amountA, uint amountB, uint liquidity); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); } interface IDividendDistributor { function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external; function setShare(address shareholder, uint256 amount) external; function depositNative() external payable; function depositToken(address from, uint256 amount) external; function process(uint256 gas) external; function inSwap() external view returns (bool); } interface ITaxDistributor { receive() external payable; function lastSwapTime() external view returns (uint256); function inSwap() external view returns (bool); function createWalletTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external; function createDistributorTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external; function createDividendTax(string memory name, uint256 buyTax, uint256 sellTax, address dividendDistributor, bool convertToNative) external; function createBurnTax(string memory name, uint256 buyTax, uint256 sellTax) external; function createLiquidityTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet) external; function distribute() external payable; function getSellTax() external view returns (uint256); function getBuyTax() external view returns (uint256); function setTaxWallet(string memory taxName, address wallet) external; function setSellTax(string memory taxName, uint256 taxPercentage) external; function setBuyTax(string memory taxName, uint256 taxPercentage) external; function takeSellTax(uint256 value) external returns (uint256); function takeBuyTax(uint256 value) external returns (uint256); } interface IWalletDistributor { function receiveToken(address token, address from, uint256 amount) external; }
//SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.7; import "./Interfaces.sol"; import "./BaseErc20.sol"; abstract contract Taxable is BaseErc20 { ITaxDistributor taxDistributor; bool public autoSwapTax; uint256 public minimumTimeBetweenSwaps; uint256 public minimumTokensBeforeSwap; mapping (address => bool) public excludedFromTax; uint256 swapStartTime; // Overrides function configure(address _owner) internal virtual override { excludedFromTax[_owner] = true; super.configure(_owner); } function calculateTransferAmount(address from, address to, uint256 value) internal virtual override returns (uint256) { uint256 amountAfterTax = value; if (excludedFromTax[from] == false && excludedFromTax[to] == false && launched) { if (exchanges[from]) { // we are BUYING amountAfterTax = taxDistributor.takeBuyTax(value); } else if (exchanges[to]) { // we are SELLING amountAfterTax = taxDistributor.takeSellTax(value); } } uint256 taxAmount = value - amountAfterTax; if (taxAmount > 0) { _balances[address(taxDistributor)] = _balances[address(taxDistributor)] + taxAmount; emit Transfer(from, address(taxDistributor), taxAmount); } return super.calculateTransferAmount(from, to, amountAfterTax); } function preTransfer(address from, address to, uint256 value) override virtual internal { uint256 timeSinceLastSwap = block.timestamp - taxDistributor.lastSwapTime(); if ( launched && autoSwapTax && exchanges[to] && swapStartTime + 60 <= block.timestamp && timeSinceLastSwap >= minimumTimeBetweenSwaps && _balances[address(taxDistributor)] >= minimumTokensBeforeSwap && taxDistributor.inSwap() == false ) { swapStartTime = block.timestamp; try taxDistributor.distribute() {} catch {} } super.preTransfer(from, to, value); } // Public methods /** * @dev Return the current total sell tax from the tax distributor */ function sellTax() public view returns (uint256) { return taxDistributor.getSellTax(); } /** * @dev Return the current total sell tax from the tax distributor */ function buyTax() public view returns (uint256) { return taxDistributor.getBuyTax(); } /** * @dev Return the address of the tax distributor contract */ function taxDistributorAddress() public view returns (address) { return address(taxDistributor); } // Admin methods function setExcludedFromTax(address who, bool enabled) external onlyOwner { excludedFromTax[who] = enabled; emit ConfigurationChanged(msg.sender, "Tax Exlusion List Changed"); } function setTaxDistributionThresholds(uint256 minAmount, uint256 minTime) external onlyOwner { require(minimumTokensBeforeSwap > 1 * 10 ** decimals && minimumTokensBeforeSwap < 100_000 * 10 ** decimals, "Invalid minAmount value"); require(minimumTimeBetweenSwaps > 1 minutes && minimumTimeBetweenSwaps < 1 days, "Invalid minTime value"); minimumTokensBeforeSwap = minAmount; minimumTimeBetweenSwaps = minTime; emit ConfigurationChanged(msg.sender, "Distribution Thresholds Changed"); } function setSellTax(string memory taxName, uint256 taxAmount) external onlyOwner { taxDistributor.setSellTax(taxName, taxAmount); emit ConfigurationChanged(msg.sender, "Sell Tax Changed"); } function setBuyTax(string memory taxName, uint256 taxAmount) external onlyOwner { taxDistributor.setBuyTax(taxName, taxAmount); emit ConfigurationChanged(msg.sender, "Buy Tax Changed"); } function setTaxWallet(string memory taxName, address wallet) external onlyOwner { taxDistributor.setTaxWallet(taxName, wallet); emit ConfigurationChanged(msg.sender, "Tax Wallet Changed"); } function runSwapManually() external isLaunched { taxDistributor.distribute(); } }
//SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.7; import "./Interfaces.sol"; contract TaxDistributor is ITaxDistributor { address immutable public tokenPair; address immutable public routerAddress; address immutable private _token; address immutable private _pairedToken; IDEXRouter private _router; bool public override inSwap; uint256 public override lastSwapTime; uint256 immutable public maxSellTax; uint256 immutable public maxBuyTax; enum TaxType { WALLET, DIVIDEND, LIQUIDITY, DISTRIBUTOR, BURN } struct Tax { string taxName; uint256 buyTaxPercentage; uint256 sellTaxPercentage; uint256 taxPool; TaxType taxType; address location; uint256 share; bool convertToNative; } Tax[] public taxes; event TaxesDistributed(uint256 tokensSwapped, uint256 ethReceived); event ConfigurationChanged(address indexed owner, string option); event DistributionError(string text); modifier onlyToken() { require(msg.sender == _token, "no permissions"); _; } modifier swapLock() { require(inSwap == false, "already swapping"); inSwap = true; _; inSwap = false; } constructor (address router, address pair, address pairedToken, uint256 _maxSellTax, uint256 _maxBuyTax) { require(pairedToken != address(0), "pairedToken cannot be 0 address"); require(pair != address(0), "pair cannot be 0 address"); require(router != address(0), "router cannot be 0 address"); _token = msg.sender; _pairedToken = pairedToken; _router = IDEXRouter(router); maxSellTax = _maxSellTax; maxBuyTax = _maxBuyTax; tokenPair = pair; routerAddress = router; IERC20(pairedToken).approve(router, 2**256 - 1); } receive() external override payable {} function createWalletTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) public override onlyToken { taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.WALLET, wallet, 0, convertToNative)); emit ConfigurationChanged(msg.sender, "Tax Created"); } function createDistributorTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) public override onlyToken { taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.DISTRIBUTOR, wallet, 0, convertToNative)); emit ConfigurationChanged(msg.sender, "Tax Created"); } function createDividendTax(string memory name, uint256 buyTax, uint256 sellTax, address dividendDistributor, bool convertToNative) public override onlyToken { taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.DIVIDEND, dividendDistributor, 0, convertToNative)); emit ConfigurationChanged(msg.sender, "Tax Created"); } function createBurnTax(string memory name, uint256 buyTax, uint256 sellTax) public override onlyToken { taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.BURN, address(0), 0, false)); emit ConfigurationChanged(msg.sender, "Tax Created"); } function createLiquidityTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet) public override onlyToken { taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.LIQUIDITY, wallet, 0, false)); emit ConfigurationChanged(msg.sender, "Tax Created"); } function distribute() public payable override onlyToken swapLock { address[] memory path = new address[](2); path[0] = _token; path[1] = _pairedToken; IERC20 token = IERC20(_token); IERC20 pairedToken = IERC20(_pairedToken); uint256 totalTokens; for (uint256 i = 0; i < taxes.length; i++) { if (taxes[i].taxType == TaxType.LIQUIDITY) { uint256 half = taxes[i].taxPool / 2; totalTokens += taxes[i].taxPool - half; } else if (taxes[i].convertToNative) { totalTokens += taxes[i].taxPool; } } totalTokens = checkTokenAmount(token, totalTokens); if (checkTokenAmount(token, totalTokens) != totalTokens) { emit DistributionError("Insufficient tokens to swap. Please add more tokens"); return; } uint256[] memory amts = _router.swapExactTokensForTokens( totalTokens, 0, path, address(this), block.timestamp + 300 ); uint256 amountBNB = pairedToken.balanceOf(address(this)); if (totalTokens != amts[0] || amountBNB != amts[1] ) { emit DistributionError("Unexpected amounts returned from swap"); } // Calculate the distribution uint256 toDistribute = amountBNB; for (uint256 i = 0; i < taxes.length; i++) { if (taxes[i].convertToNative || taxes[i].taxType == TaxType.LIQUIDITY) { if (i == taxes.length - 1) { taxes[i].share = toDistribute; } else if (taxes[i].taxType == TaxType.LIQUIDITY) { uint256 half = taxes[i].taxPool / 2; uint256 share = (amountBNB * (taxes[i].taxPool - half)) / totalTokens; taxes[i].share = share; toDistribute = toDistribute - share; } else { uint256 share = (amountBNB * taxes[i].taxPool) / totalTokens; taxes[i].share = share; toDistribute = toDistribute - share; } } } // Distribute the coins for (uint256 i = 0; i < taxes.length; i++) { if (taxes[i].taxType == TaxType.WALLET) { if (taxes[i].convertToNative) { pairedToken.transfer(taxes[i].location, taxes[i].share); } else { token.transfer(taxes[i].location, checkTokenAmount(token, taxes[i].taxPool)); } } else if (taxes[i].taxType == TaxType.DISTRIBUTOR) { if (taxes[i].convertToNative) { pairedToken.transfer(taxes[i].location, taxes[i].share); } else { token.approve(taxes[i].location, taxes[i].taxPool); IWalletDistributor(taxes[i].location).receiveToken(_token, address(this), checkTokenAmount(token, taxes[i].taxPool)); } } else if (taxes[i].taxType == TaxType.DIVIDEND) { if (taxes[i].convertToNative) { IDividendDistributor(taxes[i].location).depositToken(address(this), checkTokenAmount(pairedToken, taxes[i].taxPool)); } else { IDividendDistributor(taxes[i].location).depositToken(address(this), checkTokenAmount(token, taxes[i].taxPool)); } } else if (taxes[i].taxType == TaxType.BURN) { IBurnable(_token).burn(address(this), checkTokenAmount(token, taxes[i].taxPool)); } else if (taxes[i].taxType == TaxType.LIQUIDITY) { if(taxes[i].share > 0){ uint256 half = checkTokenAmount(token, taxes[i].taxPool / 2); _router.addLiquidity( _token, _pairedToken, half, taxes[i].share, 0, 0, taxes[i].location, block.timestamp + 300 ); } } taxes[i].taxPool = 0; taxes[i].share = 0; } emit TaxesDistributed(totalTokens, amountBNB); lastSwapTime = block.timestamp; } function getSellTax() public override onlyToken view returns (uint256) { uint256 taxAmount; for (uint256 i = 0; i < taxes.length; i++) { taxAmount += taxes[i].sellTaxPercentage; } return taxAmount; } function getBuyTax() public override onlyToken view returns (uint256) { uint256 taxAmount; for (uint256 i = 0; i < taxes.length; i++) { taxAmount += taxes[i].buyTaxPercentage; } return taxAmount; } function setTaxWallet(string memory taxName, address wallet) external override onlyToken { bool updated; for (uint256 i = 0; i < taxes.length; i++) { if (taxes[i].taxType == TaxType.WALLET && compareStrings(taxes[i].taxName, taxName)) { taxes[i].location = wallet; updated = true; } } require(updated, "could not find tax to update"); emit ConfigurationChanged(msg.sender, "Tax Wallet Changed"); } function setSellTax(string memory taxName, uint256 taxPercentage) external override onlyToken { bool updated; for (uint256 i = 0; i < taxes.length; i++) { if (compareStrings(taxes[i].taxName, taxName)) { taxes[i].sellTaxPercentage = taxPercentage; updated = true; } } require(updated, "could not find tax to update"); require(getSellTax() <= maxSellTax, "tax cannot be set this high"); emit ConfigurationChanged(msg.sender, "Sell Tax Changed"); } function setBuyTax(string memory taxName, uint256 taxPercentage) external override onlyToken { bool updated; for (uint256 i = 0; i < taxes.length; i++) { //if (taxes[i].taxName == taxName) { if (compareStrings(taxes[i].taxName, taxName)) { taxes[i].buyTaxPercentage = taxPercentage; updated = true; } } require(updated, "could not find tax to update"); require(getBuyTax() <= maxBuyTax, "tax cannot be set this high"); emit ConfigurationChanged(msg.sender, "Buy Tax Changed"); } function takeSellTax(uint256 value) external override onlyToken returns (uint256) { for (uint256 i = 0; i < taxes.length; i++) { if (taxes[i].sellTaxPercentage > 0) { uint256 taxAmount = (value * taxes[i].sellTaxPercentage) / 10000; taxes[i].taxPool += taxAmount; value = value - taxAmount; } } return value; } function takeBuyTax(uint256 value) external override onlyToken returns (uint256) { for (uint256 i = 0; i < taxes.length; i++) { if (taxes[i].buyTaxPercentage > 0) { uint256 taxAmount = (value * taxes[i].buyTaxPercentage) / 10000; taxes[i].taxPool += taxAmount; value = value - taxAmount; } } return value; } // Private methods function compareStrings(string memory a, string memory b) private pure returns (bool) { return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b)))); } function checkTokenAmount(IERC20 token, uint256 amount) private view returns (uint256) { uint256 balance = token.balanceOf(address(this)); if (balance > amount) { return amount; } return balance; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"string","name":"option","type":"string"}],"name":"ConfigurationChanged","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":"","type":"address"}],"name":"ableToBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoSwapTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canAlwaysTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableBlockLogProtection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableSniperBlocking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exchanges","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromSelling","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromTax","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":[{"internalType":"address","name":"","type":"address"}],"name":"isNeverSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGasLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTimeBetweenSwaps","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":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeBnb","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"runSwapManually","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAbleToBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setBlockLogProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setCanAlwaysTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"isExchange","type":"bool"}],"name":"setExchange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"setExcludedFromSelling","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setIsSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxGasLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setNeverSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSniperBlocking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"minTime","type":"uint256"}],"name":"setTaxDistributionThresholds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"address","name":"wallet","type":"address"}],"name":"setTaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setTradingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"snipersCaught","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxDistributorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"transactionBlockLog","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"transferTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526006805460ff60a81b1916600160a81b1790553480156200002457600080fd5b506200003033620007ae565b604080518082019091526005808252645357494e4760d81b60209092019182526200005e91600491620008c0565b50604080518082019091526009808252685377696e672044414f60b81b60209092019182526200009191600591620008c0565b506006805460ff191660121790556000804660011415620000df5750737a250d5630b4cf539739df2c5dacb4c659f2488d905073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48620001b5565b4660031480620000ef5750466004145b15620001285750737a250d5630b4cf539739df2c5dacb4c659f2488d90507307865c6e87b9f70255377e024ace6630c1eaa37f620001b5565b46603814156200014f577310ed43c718714eb63d5aa57b78b54704e256024e9150620001b5565b46606114156200017657739ac64cc6e4415144c455bd8e4837fea55603e5c39150620001b5565b60405162461bcd60e51b815260206004820152601060248201526f155b9adb9bdddb8810da185a5b88125160821b604482015260640160405180910390fd5b60008290506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620001f657600080fd5b505afa1580156200020b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000231919062000974565b6040516364e329cb60e11b81526001600160a01b038581166004830152306024830152919091169063c9c6539690604401602060405180830381600087803b1580156200027d57600080fd5b505af115801562000292573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b8919062000974565b6001600160a01b0381166000908152600960205260408082208054600160ff19918216811790925573e592427a0aece92de3edee1f18e0157c058615649093527fde2897c64f0af56474cba6e3bb2d58b5c85a42ee6dff042546bc919c03512137805490931617909155519091508490829085906104b09081906200033d906200094f565b6001600160a01b03958616815293851660208501529390911660408301526060820152608081019190915260a001604051809103906000f08015801562000388573d6000803e3d6000fd5b50601380546001600160a01b0319166001600160a01b03929092169182179055600a805460ff1990811660019081178355600093845260106020526040909320805490911690921790915561012c601455600654620003ed9160ff9091169062000a0a565b620003fb906103e862000acb565b601555601380546001600160a01b0390811660009081526016602052604090819020805460ff19166001179055915491516376a674cf60e11b81526080600482015260096084820152684c697175696469747960b81b60a482015260c860248201819052604482015261dead606482015291169063ed4ce99e9060c401600060405180830381600087803b1580156200049357600080fd5b505af1158015620004a8573d6000803e3d6000fd5b5050601354604051633ed69e0360e21b81526060600480830191909152606482015263213ab93760e11b608482015260c86024820181905260448201526001600160a01b03909116925063fb5a780c915060a401600060405180830381600087803b1580156200051757600080fd5b505af11580156200052c573d6000803e3d6000fd5b5050601354604051634693167f60e11b815260a06004820152600860a482015267547265617375727960c01b60c4820152610190602482018190526044820152734c4ded8268aba5767161bd761dc996b8e8fa40266064820152600160848201526001600160a01b039091169250638d262cfe915060e401600060405180830381600087803b158015620005bf57600080fd5b505af1158015620005d4573d6000803e3d6000fd5b5050601354604051634693167f60e11b815260a06004820152600b60a48201526a11195d995b1bdc1b595b9d60aa1b60c4820152610190602482018190526044820152733514d7b31e3a1f1e20e85d71409226f46665605a6064820152600160848201526001600160a01b039091169250638d262cfe915060e401600060405180830381600087803b1580156200066a57600080fd5b505af11580156200067f573d6000803e3d6000fd5b50506013805460ff60a01b19811682556001600160a01b039081166000908152601260209081526040808320805460ff19166001908117909155945484168352938152838220928a168252919091522060001990555050600654620006e99060ff16600a62000a0a565b620006f9906359682f0062000acb565b600254620007089190620009a6565b600281905560065461010090046001600160a01b0316600090815260208190526040902054620007399190620009a6565b600680546001600160a01b03610100918290048116600090815260208190526040808220959095559254600254945192900416927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef916200079c91815260200190565b60405180910390a35050505062000b40565b620007c481620007c760201b62001f631760201c565b50565b6001600160a01b0381166000908152601660209081526040909120805460ff19166001179055620007c490829062001f9262000803821b17901c565b6001600160a01b0381166000908152601260209081526040909120805460ff19166001179055620007c490829062001fba6200083f821b17901c565b6001600160a01b0381166000908152601060209081526040909120805460ff19166001179055620007c490829062001fe26200087b821b17901c565b60068054610100600160a81b0319166101006001600160a01b03938416810291909117918290559004166000908152600760205260409020805460ff19166001179055565b828054620008ce9062000aed565b90600052602060002090601f016020900481019282620008f257600085556200093d565b82601f106200090d57805160ff19168380011785556200093d565b828001600101855582156200093d579182015b828111156200093d57825182559160200191906001019062000920565b506200094b9291506200095d565b5090565b6130ea8062003b9983390190565b5b808211156200094b57600081556001016200095e565b6000602082840312156200098757600080fd5b81516001600160a01b03811681146200099f57600080fd5b9392505050565b60008219821115620009bc57620009bc62000b2a565b500190565b600181815b8085111562000a02578160001904821115620009e657620009e662000b2a565b80851615620009f457918102915b93841c9390800290620009c6565b509250929050565b60006200099f60ff84168360008262000a265750600162000ac5565b8162000a355750600062000ac5565b816001811462000a4e576002811462000a595762000a79565b600191505062000ac5565b60ff84111562000a6d5762000a6d62000b2a565b50506001821b62000ac5565b5060208310610133831016604e8410600b841016171562000a9e575081810a62000ac5565b62000aaa8383620009c1565b806000190482111562000ac15762000ac162000b2a565b0290505b92915050565b600081600019048311821515161562000ae85762000ae862000b2a565b500290565b600181811c9082168062000b0257607f821691505b6020821081141562000b2457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6130498062000b506000396000f3fe608060405234801561001057600080fd5b506004361061035d5760003560e01c80636a092e79116101d3578063c2e5ec0411610104578063db38a41d116100a2578063e53be8d11161007c578063e53be8d1146107a8578063e79d4160146107b0578063e948474b146107b9578063ede49a19146107dc57600080fd5b8063db38a41d14610746578063dba61c5814610766578063dd62ed3e1461076f57600080fd5b8063cc1776d3116100de578063cc1776d314610719578063d00efb2f14610721578063d2d7ad831461072a578063d31acb281461073357600080fd5b8063c2e5ec04146106e0578063c2ed286b146106f3578063c552f4c51461070657600080fd5b806395d89b4111610171578063a457c2d71161014b578063a457c2d714610684578063a6f9dae114610697578063a9059cbb146106aa578063b0ad3ebf146106bd57600080fd5b806395d89b4114610646578063989763ef1461064e5780639dc29fac1461067157600080fd5b80637412dbb3116101ad5780637412dbb3146105ee578063790ca413146106115780638091f3bf1461061a5780638da5cb5b1461062e57600080fd5b80636a092e791461059e5780636b8f2f3b146105b157806370a08231146105c557600080fd5b8063313ce567116102ad57806352c6dbc41161024b5780635d90bbaf116102255780635d90bbaf1461055c5780635d9d7d431461056f5780635e45da23146105825780636508c57e1461058b57600080fd5b806352c6dbc4146105245780635543379a14610536578063583dd79d1461054957600080fd5b8063442ef7d211610287578063442ef7d2146104ee5780634f7041a5146104f65780634fbc2775146104fe57806352468d2b1461051157600080fd5b8063313ce567146104995780633164df8b146104b857806339509351146104db57600080fd5b80631776834a1161031a5780631e19ae77116102f45780631e19ae771461043d57806323b872dd1461045057806328be9038146104635780632b7506271461047657600080fd5b80631776834a146103f357806318160ddd14610406578063185511081461041857600080fd5b806301339c2114610362578063064a59d01461036c57806306fdde031461039557806307a1cfbd146103aa578063095ea7b3146103bd5780630f3a325f146103d0575b600080fd5b61036a6107e9565b005b60065461038090600160a81b900460ff1681565b60405190151581526020015b60405180910390f35b61039d610881565b60405161038c9190612d1c565b61036a6103b8366004612c36565b61090f565b6103806103cb366004612b8d565b6109f7565b6103806103de366004612ac5565b600f6020526000908152604090205460ff1681565b61036a610401366004612c7b565b610afd565b6002545b60405190815260200161038c565b6013546001600160a01b03165b6040516001600160a01b03909116815260200161038c565b61036a61044b366004612b56565b610bdd565b61038061045e366004612b1a565b610c78565b61036a610471366004612b56565b610db5565b610380610484366004612ac5565b60106020526000908152604090205460ff1681565b6006546104a69060ff1681565b60405160ff909116815260200161038c565b6103806104c6366004612ac5565b60126020526000908152604090205460ff1681565b6103806104e9366004612b8d565b610e4e565b61036a610f74565b61040a611049565b61036a61050c366004612b56565b6110cb565b61036a61051f366004612b56565b611170565b600a5461038090610100900460ff1681565b61036a610544366004612bb7565b611215565b61036a610557366004612bf1565b6112b5565b61036a61056a366004612b56565b611394565b61036a61057d366004612b56565b61142f565b61040a600b5481565b61036a610599366004612c36565b6114d4565b6103806105ac366004612ae7565b6115b1565b60135461038090600160a01b900460ff1681565b61040a6105d3366004612ac5565b6001600160a01b031660009081526020819052604090205490565b6103806105fc366004612ac5565b60096020526000908152604090205460ff1681565b61040a600c5481565b60065461038090600160b01b900460ff1681565b6006546104259061010090046001600160a01b031681565b61039d611741565b61038061065c366004612ac5565b60166020526000908152604090205460ff1681565b61036a61067f366004612b8d565b61174e565b610380610692366004612b8d565b6118e5565b61036a6106a5366004612ac5565b6119b4565b6103806106b8366004612b8d565b611a94565b6103806106cb366004612ac5565b60076020526000908152604090205460ff1681565b61036a6106ee366004612bb7565b611b23565b61036a610701366004612b56565b611bb4565b61036a610714366004612bb7565b611c59565b61040a611ce8565b61040a600d5481565b61040a60155481565b61036a610741366004612cad565b611d2d565b61040a610754366004612ac5565b60116020526000908152604090205481565b61040a60145481565b61040a61077d366004612ae7565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61036a611ea6565b61040a600e5481565b6103806107c7366004612ac5565b60086020526000908152604090205460ff1681565b600a546103809060ff1681565b60065461010090046001600160a01b031633146108215760405162461bcd60e51b815260040161081890612ddf565b60405180910390fd5b610829612027565b336001600160a01b0316600080516020612ff48339815191526040516108779060208082526014908201527314ddda5b99c8151bdad95b8813185d5b98da195960621b604082015260600190565b60405180910390a2565b6005805461088e90612f63565b80601f01602080910402602001604051908101604052809291908181526020018280546108ba90612f63565b80156109075780601f106108dc57610100808354040283529160200191610907565b820191906000526020600020905b8154815290600101906020018083116108ea57829003601f168201915b505050505081565b60065461010090046001600160a01b0316331461093e5760405162461bcd60e51b815260040161081890612ddf565b6013546040516307a1cfbd60e01b81526001600160a01b03909116906307a1cfbd906109709085908590600401612d59565b600060405180830381600087803b15801561098a57600080fd5b505af115801561099e573d6000803e3d6000fd5b50505050336001600160a01b0316600080516020612ff48339815191526040516109eb906020808252600f908201526e109d5e4815185e0810da185b99d959608a1b604082015260600190565b60405180910390a25050565b6006546000903390600160a81b900460ff168015610a1e5750600654600160b01b900460ff165b80610a3b57506006546001600160a01b0382811661010090920416145b80610a5557503360009081526007602052604090205460ff165b610a715760405162461bcd60e51b815260040161081890612db2565b6001600160a01b038416610a975760405162461bcd60e51b815260040161081890612d7b565b3360008181526001602090815260408083206001600160a01b03891680855290835292819020879055518681529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a35060019392505050565b60065461010090046001600160a01b03163314610b2c5760405162461bcd60e51b815260040161081890612ddf565b801580610b39575060c881115b610b855760405162461bcd60e51b815260206004820152601960248201527f5468697320676173206c696d697420697320746f6f206c6f77000000000000006044820152606401610818565b600b8190556040513390600080516020612ff483398151915290610bd29060208082526015908201527413585e0811d85cc8131a5b5a5d0810da185b99d959605a1b604082015260600190565b60405180910390a250565b60065461010090046001600160a01b03163314610c0c5760405162461bcd60e51b815260040161081890612ddf565b6001600160a01b03821660009081526012602052604090819020805483151560ff19909116179055513390600080516020612ff4833981519152906109eb90602080825260139082015272109d5c9b995c88131a5cdd0810da185b99d959606a1b604082015260600190565b6006546000908490600160a81b900460ff168015610c9f5750600654600160b01b900460ff165b80610cbc57506006546001600160a01b0382811661010090920416145b80610cd657503360009081526007602052604090205460ff165b610cf25760405162461bcd60e51b815260040161081890612db2565b6001600160a01b0385166000908152600160209081526040808320338452909152902054610d21908490612f4c565b6001600160a01b0386166000908152600160209081526040808320338452909152902055610d508585856120ad565b6001600160a01b038516600081815260016020908152604080832033808552908352928190205490519081529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3506001949350505050565b60065461010090046001600160a01b03163314610de45760405162461bcd60e51b815260040161081890612ddf565b6001600160a01b03821660009081526009602052604090819020805483151560ff19909116179055513390600080516020612ff4833981519152906109eb90602080825260119082015270115e18da185b99d95cc810da185b99d959607a1b604082015260600190565b6006546000903390600160a81b900460ff168015610e755750600654600160b01b900460ff165b80610e9257506006546001600160a01b0382811661010090920416145b80610eac57503360009081526007602052604090205460ff165b610ec85760405162461bcd60e51b815260040161081890612db2565b6001600160a01b038416610eee5760405162461bcd60e51b815260040161081890612d7b565b3360009081526001602090815260408083206001600160a01b0388168452909152902054610f1d908490612e27565b3360008181526001602090815260408083206001600160a01b038a16808552908352928190208590555193845290927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101610aeb565b600654600160b01b900460ff16610fdf5760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b6064820152608401610818565b601360009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561102f57600080fd5b505af1158015611043573d6000803e3d6000fd5b50505050565b60135460408051631296b91d60e11b815290516000926001600160a01b03169163252d723a916004808301926020929190829003018186803b15801561108e57600080fd5b505afa1580156110a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c69190612c94565b905090565b60065461010090046001600160a01b031633146110fa5760405162461bcd60e51b815260040161081890612ddf565b6001600160a01b03821660009081526007602052604090819020805483151560ff19909116179055513390600080516020612ff4833981519152906109eb9060208082526019908201527f416c77617973205472616465204c697374204368616e67656400000000000000604082015260600190565b60065461010090046001600160a01b0316331461119f5760405162461bcd60e51b815260040161081890612ddf565b6001600160a01b03821660009081526008602052604090819020805483151560ff19909116179055513390600080516020612ff4833981519152906109eb9060208082526019908201527f53656c6c696e67204578636c7573696f6e204368616e67656400000000000000604082015260600190565b60065461010090046001600160a01b031633146112445760405162461bcd60e51b815260040161081890612ddf565b600a80548215156101000261ff00199091161790556040513390600080516020612ff483398151915290610bd29060208082526023908201527f456e61626c652f44697361626c6520426c6f636b204c6f672050726f7465637460408201526234b7b760e91b606082015260800190565b60065461010090046001600160a01b031633146112e45760405162461bcd60e51b815260040161081890612ddf565b60135460405163583dd79d60e01b81526001600160a01b039091169063583dd79d906113169085908590600401612d2f565b600060405180830381600087803b15801561133057600080fd5b505af1158015611344573d6000803e3d6000fd5b50505050336001600160a01b0316600080516020612ff48339815191526040516109eb9060208082526012908201527115185e0815d85b1b195d0810da185b99d95960721b604082015260600190565b60065461010090046001600160a01b031633146113c35760405162461bcd60e51b815260040161081890612ddf565b6001600160a01b0382166000908152600f602052604090819020805483151560ff19909116179055513390600080516020612ff4833981519152906109eb9060208082526013908201527214db9a5c195c88131a5cdd0810da185b99d959606a1b604082015260600190565b60065461010090046001600160a01b0316331461145e5760405162461bcd60e51b815260040161081890612ddf565b6001600160a01b03821660009081526010602052604090819020805483151560ff19909116179055513390600080516020612ff4833981519152906109eb9060208082526019908201527f4e6576657220536e69706572204c697374204368616e67656400000000000000604082015260600190565b60065461010090046001600160a01b031633146115035760405162461bcd60e51b815260040161081890612ddf565b60135460405163328462bf60e11b81526001600160a01b0390911690636508c57e906115359085908590600401612d59565b600060405180830381600087803b15801561154f57600080fd5b505af1158015611563573d6000803e3d6000fd5b50505050336001600160a01b0316600080516020612ff48339815191526040516109eb9060208082526010908201526f14d95b1b0815185e0810da185b99d95960821b604082015260600190565b60065460009061010090046001600160a01b031633146115e35760405162461bcd60e51b815260040161081890612ddf565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b15801561162557600080fd5b505afa158015611639573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165d9190612c94565b9050336001600160a01b0316600080516020612ff48339815191526040516116ad9060208082526014908201527310dd5cdd1bdb48151bdad95b8814995b5bdd995960621b604082015260600190565b60405180910390a260405163a9059cbb60e01b81526001600160a01b0384811660048301526024820183905285169063a9059cbb90604401602060405180830381600087803b1580156116ff57600080fd5b505af1158015611713573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117379190612bd4565b9150505b92915050565b6004805461088e90612f63565b3360009081526012602052604090205460ff166117a35760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610818565b6001600160a01b0382166117f95760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74206275726e2066726f6d207468652030206164647265737300006044820152606401610818565b6001600160a01b038216331461185d576001600160a01b0382166000908152600160209081526040808320338452909152902054611838908290612f4c565b6001600160a01b03831660009081526001602090815260408083203384529091529020555b8060025461186b9190612f4c565b6002556001600160a01b038216600090815260208190526040902054611892908290612f4c565b6001600160a01b03831660008181526020818152604080832094909455925184815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6006546000903390600160a81b900460ff16801561190c5750600654600160b01b900460ff165b8061192957506006546001600160a01b0382811661010090920416145b8061194357503360009081526007602052604090205460ff165b61195f5760405162461bcd60e51b815260040161081890612db2565b6001600160a01b0384166119855760405162461bcd60e51b815260040161081890612d7b565b3360009081526001602090815260408083206001600160a01b0388168452909152902054610f1d908490612f4c565b60065461010090046001600160a01b031633146119e35760405162461bcd60e51b815260040161081890612ddf565b6001600160a01b038116611a325760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610818565b600680546001600160a01b03831661010002610100600160a81b03199091161790556040513390600080516020612ff483398151915290610bd2906020808252600d908201526c13dddb995c8810da185b99d959609a1b604082015260600190565b6006546000903390600160a81b900460ff168015611abb5750600654600160b01b900460ff165b80611ad857506006546001600160a01b0382811661010090920416145b80611af257503360009081526007602052604090205460ff165b611b0e5760405162461bcd60e51b815260040161081890612db2565b611b193385856120ad565b5060019392505050565b60065461010090046001600160a01b03163314611b525760405162461bcd60e51b815260040161081890612ddf565b60068054821515600160a81b0260ff60a81b199091161790556040513390600080516020612ff483398151915290610bd290602080825260169082015275456e61626c652f44697361626c652054726164696e6760501b604082015260600190565b60065461010090046001600160a01b03163314611be35760405162461bcd60e51b815260040161081890612ddf565b6001600160a01b03821660009081526016602052604090819020805483151560ff19909116179055513390600080516020612ff4833981519152906109eb9060208082526019908201527f5461782045786c7573696f6e204c697374204368616e67656400000000000000604082015260600190565b60065461010090046001600160a01b03163314611c885760405162461bcd60e51b815260040161081890612ddf565b600a805482151560ff199091161790556040513390600080516020612ff483398151915290610bd2906020808252601e908201527f456e61626c652f44697361626c6520536e6970657220426c6f636b696e670000604082015260600190565b6013546040805163585e42ef60e11b815290516000926001600160a01b03169163b0bc85de916004808301926020929190829003018186803b15801561108e57600080fd5b60065461010090046001600160a01b03163314611d5c5760405162461bcd60e51b815260040161081890612ddf565b600654611d6d9060ff16600a612e82565b611d78906001612f2d565b601554118015611da65750600654611d949060ff16600a612e82565b611da190620186a0612f2d565b601554105b611df25760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964206d696e416d6f756e742076616c75650000000000000000006044820152606401610818565b603c601454118015611e08575062015180601454105b611e4c5760405162461bcd60e51b8152602060048201526015602482015274496e76616c6964206d696e54696d652076616c756560581b6044820152606401610818565b601582905560148190556040513390600080516020612ff4833981519152906109eb906020808252601f908201527f446973747269627574696f6e205468726573686f6c6473204368616e67656400604082015260600190565b60065461010090046001600160a01b03163314611ed55760405162461bcd60e51b815260040161081890612ddf565b600654604051479161010090046001600160a01b0316906108fc8315029083906000818181858888f19350505050158015611f14573d6000803e3d6000fd5b50336001600160a01b0316600080516020612ff4833981519152604051610bd29060208082526014908201527313985d1a5d9948151bdad95b8814995b5bdd995960621b604082015260600190565b6001600160a01b0381166000908152601660205260409020805460ff19166001179055611f8f81611f92565b50565b6001600160a01b0381166000908152601260205260409020805460ff19166001179055611f8f815b6001600160a01b0381166000908152601060205260409020805460ff19166001179055611f8f815b60068054610100600160a81b0319166101006001600160a01b03938416810291909117918290559004166000908152600760205260409020805460ff19166001179055565b60065461010090046001600160a01b031633146120565760405162461bcd60e51b815260040161081890612ddf565b61205e61222d565b42600c5543600d556040513390600080516020612ff48339815191529061087790602080825260149082015273105b9d1a4814db9a5c195c8813185d5b98da195960621b604082015260600190565b6001600160a01b0382166120fc5760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610818565b6001600160a01b03831660009081526008602052604090205460ff16156121655760405162461bcd60e51b815260206004820152601e60248201527f61646472657373206973206e6f7420616c6c6f77656420746f2073656c6c00006044820152606401610818565b6121708383836122b0565b600061217d8484846122c0565b6001600160a01b0385166000908152602081905260409020549091506121a4908390612f4c565b6001600160a01b0380861660009081526020819052604080822093909355908516815220546121d4908290612e27565b6001600160a01b038481166000818152602081815260409182902094909455518481529092918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611043565b60065461010090046001600160a01b0316331461225c5760405162461bcd60e51b815260040161081890612ddf565b6006805460ff60b01b1916600160b01b1790556040513390600080516020612ff483398151915290610877906020808252600e908201526d151bdad95b8813185d5b98da195960921b604082015260600190565b6122bb8383836122d5565b505050565b60006122cd8484846124f1565b949350505050565b60135460408051630dd8715760e01b815290516000926001600160a01b031691630dd87157916004808301926020929190829003018186803b15801561231a57600080fd5b505afa15801561232e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123529190612c94565b61235c9042612f4c565b600654909150600160b01b900460ff1680156123815750601354600160a01b900460ff165b80156123a557506001600160a01b03831660009081526009602052604090205460ff165b80156123bf575042601754603c6123bc9190612e27565b11155b80156123cd57506014548110155b80156123f557506015546013546001600160a01b031660009081526020819052604090205410155b80156124845750601360009054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b815260040160206040518083038186803b15801561244a57600080fd5b505afa15801561245e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124829190612bd4565b155b156124e657426017556013546040805163e4fc6b6d60e01b815290516001600160a01b039092169163e4fc6b6d9160048082019260009290919082900301818387803b1580156124d357600080fd5b505af19250505080156124e4575060015b505b611043848484612744565b6001600160a01b038316600090815260166020526040812054829060ff1615801561253557506001600160a01b03841660009081526016602052604090205460ff16155b801561254a5750600654600160b01b900460ff165b15612697576001600160a01b03851660009081526009602052604090205460ff16156125f55760135460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc790602401602060405180830381600087803b1580156125b657600080fd5b505af11580156125ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ee9190612c94565b9050612697565b6001600160a01b03841660009081526009602052604090205460ff161561269757601354604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd590602401602060405180830381600087803b15801561265c57600080fd5b505af1158015612670573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126949190612c94565b90505b60006126a38285612f4c565b9050801561272f576013546001600160a01b03166000908152602081905260409020546126d1908290612e27565b601380546001600160a01b0390811660009081526020818152604091829020949094559154915184815291811692908916917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35b61273a8686846129b1565b9695505050505050565b600a5460ff1615806127665750336000908152600f602052604090205460ff16155b6127a45760405162461bcd60e51b815260206004820152600f60248201526e1cdb9a5c195c881c995a9958dd1959608a1b6044820152606401610818565b600654600160b01b900460ff1680156127d057506006546001600160a01b038481166101009092041614155b80156127f557506001600160a01b03831660009081526010602052604090205460ff16155b801561281a57506001600160a01b03821660009081526010602052604090205460ff16155b156122bb57600b541561287957600b545a11156128795760405162461bcd60e51b815260206004820152601e60248201527f74686973206973206f76657220746865206d617820676173206c696d697400006044820152606401610818565b600a54610100900460ff16156122bb576001600160a01b0382166000908152601160205260409020544314156128e0576001600160a01b0382166000908152600f60205260408120805460ff19166001179055600e8054916128da83612f9e565b91905055505b6001600160a01b038316600090815260116020526040902054431415612937576001600160a01b0383166000908152600f60205260408120805460ff19166001179055600e80549161293183612f9e565b91905055505b6001600160a01b03821660009081526009602052604090205460ff16612973576001600160a01b03821660009081526011602052604090204390555b6001600160a01b03831660009081526009602052604090205460ff166122bb5750506001600160a01b03166000908152601160205260409020439055565b6000826001600160a01b0316846001600160a01b03161415612a155760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c66006044820152606401610818565b5092915050565b80356001600160a01b0381168114612a3357600080fd5b919050565b600082601f830112612a4957600080fd5b813567ffffffffffffffff80821115612a6457612a64612fcf565b604051601f8301601f19908116603f01168101908282118183101715612a8c57612a8c612fcf565b81604052838152866020858801011115612aa557600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215612ad757600080fd5b612ae082612a1c565b9392505050565b60008060408385031215612afa57600080fd5b612b0383612a1c565b9150612b1160208401612a1c565b90509250929050565b600080600060608486031215612b2f57600080fd5b612b3884612a1c565b9250612b4660208501612a1c565b9150604084013590509250925092565b60008060408385031215612b6957600080fd5b612b7283612a1c565b91506020830135612b8281612fe5565b809150509250929050565b60008060408385031215612ba057600080fd5b612ba983612a1c565b946020939093013593505050565b600060208284031215612bc957600080fd5b8135612ae081612fe5565b600060208284031215612be657600080fd5b8151612ae081612fe5565b60008060408385031215612c0457600080fd5b823567ffffffffffffffff811115612c1b57600080fd5b612c2785828601612a38565b925050612b1160208401612a1c565b60008060408385031215612c4957600080fd5b823567ffffffffffffffff811115612c6057600080fd5b612c6c85828601612a38565b95602094909401359450505050565b600060208284031215612c8d57600080fd5b5035919050565b600060208284031215612ca657600080fd5b5051919050565b60008060408385031215612cc057600080fd5b50508035926020909101359150565b6000815180845260005b81811015612cf557602081850181015186830182015201612cd9565b81811115612d07576000602083870101525b50601f01601f19169290920160200192915050565b602081526000612ae06020830184612ccf565b604081526000612d426040830185612ccf565b905060018060a01b03831660208301529392505050565b604081526000612d6c6040830185612ccf565b90508260208301529392505050565b6020808252601c908201527f63616e6e6f7420617070726f7665207468652030206164647265737300000000604082015260600190565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b60208082526028908201527f63616e206f6e6c792062652063616c6c65642062792074686520636f6e74726160408201526731ba1037bbb732b960c11b606082015260800190565b60008219821115612e3a57612e3a612fb9565b500190565b600181815b80851115612e7a578160001904821115612e6057612e60612fb9565b80851615612e6d57918102915b93841c9390800290612e44565b509250929050565b6000612ae060ff841683600082612e9b5750600161173b565b81612ea85750600061173b565b8160018114612ebe5760028114612ec857612ee4565b600191505061173b565b60ff841115612ed957612ed9612fb9565b50506001821b61173b565b5060208310610133831016604e8410600b8410161715612f07575081810a61173b565b612f118383612e3f565b8060001904821115612f2557612f25612fb9565b029392505050565b6000816000190483118215151615612f4757612f47612fb9565b500290565b600082821015612f5e57612f5e612fb9565b500390565b600181811c90821680612f7757607f821691505b60208210811415612f9857634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612fb257612fb2612fb9565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114611f8f57600080fdfed43eee071b91e7714b533dbf825ec024145ba03675691f363d9a4c47e88b4dc5a264697066735822122095e2787f757b0c0cb69eb579be5b4ef0461283400ee4be3a684cf8751eebc47664736f6c634300080700336101406040523480156200001257600080fd5b50604051620030ea380380620030ea833981016040819052620000359162000241565b6001600160a01b038316620000915760405162461bcd60e51b815260206004820152601f60248201527f706169726564546f6b656e2063616e6e6f74206265203020616464726573730060448201526064015b60405180910390fd5b6001600160a01b038416620000e95760405162461bcd60e51b815260206004820152601860248201527f706169722063616e6e6f74206265203020616464726573730000000000000000604482015260640162000088565b6001600160a01b038516620001415760405162461bcd60e51b815260206004820152601a60248201527f726f757465722063616e6e6f7420626520302061646472657373000000000000604482015260640162000088565b33606090811b60c05283811b6001600160601b031990811660e052600080546001600160a01b0319166001600160a01b0389811691821790925561010086905261012085905287841b83166080529288901b90911660a05260405163095ea7b360e01b81526004810192909252600019602483015284169063095ea7b390604401602060405180830381600087803b158015620001dd57600080fd5b505af1158015620001f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200021891906200029e565b505050505050620002c9565b80516001600160a01b03811681146200023c57600080fd5b919050565b600080600080600060a086880312156200025a57600080fd5b620002658662000224565b9450620002756020870162000224565b9350620002856040870162000224565b6060870151608090970151959894975095949392505050565b600060208284031215620002b157600080fd5b81518015158114620002c257600080fd5b9392505050565b60805160601c60a05160601c60c05160601c60e05160601c6101005161012051612d32620003b86000396000818161032a01526105930152600081816102ad0152610c9e0152600081816111aa015281816112170152611f94015260008181610424015281816106690152818161080d015281816108ad0152818161093101528181610a5801528181610bd801528181610d6801528181610dec01528181610f7a0152818161109701528181611156015281816111f601528181611c1601528181611e5e01528181611f73015281816121960152612333015260006101e1015260006103d70152612d326000f3fe6080604052600436106101235760003560e01c8063a411209a116100a0578063db017dc711610064578063db017dc71461037d578063e4fc6b6d1461039d578063ed4ce99e146103a5578063ee16c160146103c5578063fb5a780c146103f957600080fd5b8063a411209a1461029b578063b0bc85de146102cf578063c5be2bc7146102e4578063c8e956ab14610318578063d83067861461034c57600080fd5b80633268cc56116100e75780633268cc56146101cf5780634fa26fd51461021b578063583dd79d1461023b5780636508c57e1461025b5780638d262cfe1461027b57600080fd5b806307a1cfbd1461012f5780630dd8715714610151578063135b4fc01461017a578063252d723a1461019a5780632b1fb89e146101af57600080fd5b3661012a57005b600080fd5b34801561013b57600080fd5b5061014f61014a3660046127d2565b610419565b005b34801561015d57600080fd5b5061016760015481565b6040519081526020015b60405180910390f35b34801561018657600080fd5b5061014f6101953660046128c6565b61065e565b3480156101a657600080fd5b50610167610800565b3480156101bb57600080fd5b5061014f6101ca3660046128c6565b6108a2565b3480156101db57600080fd5b506102037f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610171565b34801561022757600080fd5b5061016761023636600461293c565b610924565b34801561024757600080fd5b5061014f610256366004612784565b610a4d565b34801561026757600080fd5b5061014f6102763660046127d2565b610bcd565b34801561028757600080fd5b5061014f6102963660046128c6565b610d5d565b3480156102a757600080fd5b506101677f000000000000000000000000000000000000000000000000000000000000000081565b3480156102db57600080fd5b50610167610ddf565b3480156102f057600080fd5b506103046102ff36600461293c565b610e7b565b6040516101719897969594939291906129b8565b34801561032457600080fd5b506101677f000000000000000000000000000000000000000000000000000000000000000081565b34801561035857600080fd5b5060005461036d90600160a01b900460ff1681565b6040519015158152602001610171565b34801561038957600080fd5b5061016761039836600461293c565b610f6d565b61014f61108c565b3480156103b157600080fd5b5061014f6103c0366004612865565b61218b565b3480156103d157600080fd5b506102037f000000000000000000000000000000000000000000000000000000000000000081565b34801561040557600080fd5b5061014f610414366004612817565b612328565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461046a5760405162461bcd60e51b815260040161046190612ab3565b60405180910390fd5b6000805b6002548110156105735761052e6002828154811061048e5761048e612c9f565b906000526020600020906007020160000180546104aa90612c1d565b80601f01602080910402602001604051908101604052809291908181526020018280546104d690612c1d565b80156105235780601f106104f857610100808354040283529160200191610523565b820191906000526020600020905b81548152906001019060200180831161050657829003601f168201915b5050505050856124aa565b1561056157826002828154811061054757610547612c9f565b906000526020600020906007020160010181905550600191505b8061056b81612c58565b91505061046e565b50806105915760405162461bcd60e51b815260040161046190612a57565b7f00000000000000000000000000000000000000000000000000000000000000006105ba610800565b11156106085760405162461bcd60e51b815260206004820152601b60248201527f7461782063616e6e6f74206265207365742074686973206869676800000000006044820152606401610461565b336001600160a01b0316600080516020612cdd833981519152604051610651906020808252600f908201526e109d5e4815185e0810da185b99d959608a1b604082015260600190565b60405180910390a2505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106a65760405162461bcd60e51b815260040161046190612ab3565b600260405180610100016040528087815260200186815260200185815260200160008152602001600360048111156106e0576106e0612c89565b81526001600160a01b03851660208083019190915260006040830181905285151560609093019290925283546001810185559382529081902082518051939460070290910192610733928492019061259a565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083600481111561077c5761077c612c89565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff19169115159190911790556040513390600080516020612cdd833981519152906107f190612a8e565b60405180910390a25050505050565b6000336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461084a5760405162461bcd60e51b815260040161046190612ab3565b6000805b60025481101561089c576002818154811061086b5761086b612c9f565b906000526020600020906007020160010154826108889190612b7d565b91508061089481612c58565b91505061084e565b50905090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108ea5760405162461bcd60e51b815260040161046190612ab3565b600260405180610100016040528087815260200186815260200185815260200160008152602001600160048111156106e0576106e0612c89565b6000336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461096e5760405162461bcd60e51b815260040161046190612ab3565b60005b600254811015610a435760006002828154811061099057610990612c9f565b9060005260206000209060070201600201541115610a31576000612710600283815481106109c0576109c0612c9f565b906000526020600020906007020160020154856109dd9190612bb7565b6109e79190612b95565b905080600283815481106109fd576109fd612c9f565b90600052602060002090600702016003016000828254610a1d9190612b7d565b90915550610a2d90508185612bd6565b9350505b80610a3b81612c58565b915050610971565b508190505b919050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a955760405162461bcd60e51b815260040161046190612ab3565b6000805b600254811015610b6357600060028281548110610ab857610ab8612c9f565b60009182526020909120600460079092020181015460ff1690811115610ae057610ae0612c89565b148015610afe5750610afe6002828154811061048e5761048e612c9f565b15610b51578260028281548110610b1757610b17612c9f565b906000526020600020906007020160040160016101000a8154816001600160a01b0302191690836001600160a01b03160217905550600191505b80610b5b81612c58565b915050610a99565b5080610b815760405162461bcd60e51b815260040161046190612a57565b336001600160a01b0316600080516020612cdd8339815191526040516106519060208082526012908201527115185e0815d85b1b195d0810da185b99d95960721b604082015260600190565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c155760405162461bcd60e51b815260040161046190612ab3565b6000805b600254811015610c7e57610c396002828154811061048e5761048e612c9f565b15610c6c578260028281548110610c5257610c52612c9f565b906000526020600020906007020160020181905550600191505b80610c7681612c58565b915050610c19565b5080610c9c5760405162461bcd60e51b815260040161046190612a57565b7f0000000000000000000000000000000000000000000000000000000000000000610cc5610ddf565b1115610d135760405162461bcd60e51b815260206004820152601b60248201527f7461782063616e6e6f74206265207365742074686973206869676800000000006044820152606401610461565b336001600160a01b0316600080516020612cdd8339815191526040516106519060208082526010908201526f14d95b1b0815185e0810da185b99d95960821b604082015260600190565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610da55760405162461bcd60e51b815260040161046190612ab3565b600260405180610100016040528087815260200186815260200185815260200160008152602001600060048111156106e0576106e0612c89565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e295760405162461bcd60e51b815260040161046190612ab3565b6000805b60025481101561089c5760028181548110610e4a57610e4a612c9f565b90600052602060002090600702016002015482610e679190612b7d565b915080610e7381612c58565b915050610e2d565b60028181548110610e8b57600080fd5b9060005260206000209060070201600091509050806000018054610eae90612c1d565b80601f0160208091040260200160405190810160405280929190818152602001828054610eda90612c1d565b8015610f275780601f10610efc57610100808354040283529160200191610f27565b820191906000526020600020905b815481529060010190602001808311610f0a57829003601f168201915b505050506001830154600284015460038501546004860154600587015460069097015495969395929450909260ff808316936101009093046001600160a01b0316921688565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fb75760405162461bcd60e51b815260040161046190612ab3565b60005b600254811015610a4357600060028281548110610fd957610fd9612c9f565b906000526020600020906007020160010154111561107a5760006127106002838154811061100957611009612c9f565b906000526020600020906007020160010154856110269190612bb7565b6110309190612b95565b9050806002838154811061104657611046612c9f565b906000526020600020906007020160030160008282546110669190612b7d565b9091555061107690508185612bd6565b9350505b8061108481612c58565b915050610fba565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110d45760405162461bcd60e51b815260040161046190612ab3565b600054600160a01b900460ff16156111215760405162461bcd60e51b815260206004820152601060248201526f616c7265616479207377617070696e6760801b6044820152606401610461565b6000805460ff60a01b1916600160a01b17815560408051600280825260608201835290916020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061118857611188612c9f565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106111dc576111dc612c9f565b6001600160a01b03909216602092830291909101909101527f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006000805b60025481101561137057600280828154811061125857611258612c9f565b60009182526020909120600460079092020181015460ff169081111561128057611280612c89565b14156112fc576000600280838154811061129c5761129c612c9f565b9060005260206000209060070201600301546112b89190612b95565b905080600283815481106112ce576112ce612c9f565b9060005260206000209060070201600301546112ea9190612bd6565b6112f49084612b7d565b92505061135e565b6002818154811061130f5761130f612c9f565b600091825260209091206006600790920201015460ff161561135e576002818154811061133e5761133e612c9f565b9060005260206000209060070201600301548261135b9190612b7d565b91505b8061136881612c58565b91505061123a565b5061137b8382612504565b9050806113888483612504565b14611419577fde3142f93c040ab4be0d03a16ac06c502816c1205865dd41d9848727102570d16040516114089060208082526033908201527f496e73756666696369656e7420746f6b656e7320746f20737761702e20506c6560408201527261736520616464206d6f726520746f6b656e7360681b606082015260800190565b60405180910390a15050505061217c565b600080546001600160a01b03166338ed17398383883061143b4261012c612b7d565b6040518663ffffffff1660e01b815260040161145b959493929190612adb565b600060405180830381600087803b15801561147557600080fd5b505af1158015611489573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114b191908101906126ba565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038516906370a082319060240160206040518083038186803b1580156114f657600080fd5b505afa15801561150a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152e9190612955565b90508160008151811061154357611543612c9f565b60200260200101518314158061157357508160018151811061156757611567612c9f565b60200260200101518114155b156115ee577fde3142f93c040ab4be0d03a16ac06c502816c1205865dd41d9848727102570d16040516115e59060208082526025908201527f556e657870656374656420616d6f756e74732072657475726e65642066726f6d604082015264020737761760dc1b606082015260800190565b60405180910390a15b8060005b600254811015611834576002818154811061160f5761160f612c9f565b600091825260209091206006600790920201015460ff168061166a5750600280828154811061164057611640612c9f565b60009182526020909120600460079092020181015460ff169081111561166857611668612c89565b145b156118225760025461167e90600190612bd6565b8114156116b357816002828154811061169957611699612c9f565b906000526020600020906007020160050181905550611822565b60028082815481106116c7576116c7612c9f565b60009182526020909120600460079092020181015460ff16908111156116ef576116ef612c89565b14156117ad576000600280838154811061170b5761170b612c9f565b9060005260206000209060070201600301546117279190612b95565b9050600086826002858154811061174057611740612c9f565b90600052602060002090600702016003015461175c9190612bd6565b6117669087612bb7565b6117709190612b95565b9050806002848154811061178657611786612c9f565b60009182526020909120600560079092020101556117a48185612bd6565b93505050611822565b600085600283815481106117c3576117c3612c9f565b906000526020600020906007020160030154856117e09190612bb7565b6117ea9190612b95565b9050806002838154811061180057611800612c9f565b600091825260209091206005600790920201015561181e8184612bd6565b9250505b8061182c81612c58565b9150506115f2565b5060005b6002548110156121365760006002828154811061185757611857612c9f565b60009182526020909120600460079092020181015460ff169081111561187f5761187f612c89565b1415611a4d576002818154811061189857611898612c9f565b600091825260209091206006600790920201015460ff16156119a757856001600160a01b031663a9059cbb600283815481106118d6576118d6612c9f565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166002848154811061190e5761190e612c9f565b60009182526020909120600560079092020101546040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015b602060405180830381600087803b15801561196957600080fd5b505af115801561197d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a19190612767565b506120d1565b866001600160a01b031663a9059cbb600283815481106119c9576119c9612c9f565b906000526020600020906007020160040160019054906101000a90046001600160a01b0316611a1c8a60028681548110611a0557611a05612c9f565b906000526020600020906007020160030154612504565b6040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015260440161194f565b600360028281548110611a6257611a62612c9f565b60009182526020909120600460079092020181015460ff1690811115611a8a57611a8a612c89565b1415611cba5760028181548110611aa357611aa3612c9f565b600091825260209091206006600790920201015460ff1615611ae157856001600160a01b031663a9059cbb600283815481106118d6576118d6612c9f565b866001600160a01b031663095ea7b360028381548110611b0357611b03612c9f565b906000526020600020906007020160040160019054906101000a90046001600160a01b031660028481548110611b3b57611b3b612c9f565b60009182526020909120600360079092020101546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015611b9557600080fd5b505af1158015611ba9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bcd9190612767565b5060028181548110611be157611be1612c9f565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b0316634ec109f47f000000000000000000000000000000000000000000000000000000000000000030611c4d8b60028781548110611a0557611a05612c9f565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064015b600060405180830381600087803b158015611c9d57600080fd5b505af1158015611cb1573d6000803e3d6000fd5b505050506120d1565b600160028281548110611ccf57611ccf612c9f565b60009182526020909120600460079092020181015460ff1690811115611cf757611cf7612c89565b1415611e195760028181548110611d1057611d10612c9f565b600091825260209091206006600790920201015460ff1615611dbb5760028181548110611d3f57611d3f612c9f565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663338b5dea30611d8a8960028681548110611a0557611a05612c9f565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611c83565b60028181548110611dce57611dce612c9f565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663338b5dea30611d8a8a60028681548110611a0557611a05612c9f565b600460028281548110611e2e57611e2e612c9f565b60009182526020909120600460079092020181015460ff1690811115611e5657611e56612c89565b1415611ea3577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639dc29fac30611d8a8a60028681548110611a0557611a05612c9f565b6002808281548110611eb757611eb7612c9f565b60009182526020909120600460079092020181015460ff1690811115611edf57611edf612c89565b14156120d157600060028281548110611efa57611efa612c9f565b90600052602060002090600702016005015411156120d1576000611f4d886002808581548110611f2c57611f2c612c9f565b906000526020600020906007020160030154611f489190612b95565b612504565b905060008054906101000a90046001600160a01b03166001600160a01b031663e8e337007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008460028781548110611fc757611fc7612c9f565b90600052602060002090600702016005015460008060028a81548110611fef57611fef612c9f565b600091825260209091206007909102016004015461010090046001600160a01b031661201d4261012c612b7d565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e481019190915261010401606060405180830381600087803b15801561209457600080fd5b505af11580156120a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120cc919061296e565b505050505b6000600282815481106120e6576120e6612c9f565b90600052602060002090600702016003018190555060006002828154811061211057612110612c9f565b60009182526020909120600560079092020101558061212e81612c58565b915050611838565b5060408051858152602081018490527f5e20c9aee521e656eed033c4ae35378c79c584706f5ce7f410ab3fba389607a1910160405180910390a150504260015550505050505b6000805460ff60a01b19169055565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146121d35760405162461bcd60e51b815260040161046190612ab3565b6002604051806101000160405280868152602001858152602001848152602001600081526020016002600481111561220d5761220d612c89565b81526001600160a01b03841660208083019190915260006040830181905260609092018290528354600181018555938252908190208251805193946007029091019261225c928492019061259a565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908360048111156122a5576122a5612c89565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff19169115159190911790556040513390600080516020612cdd8339815191529061231a90612a8e565b60405180910390a250505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146123705760405162461bcd60e51b815260040161046190612ab3565b6002604051806101000160405280858152602001848152602001838152602001600081526020016004808111156123a9576123a9612c89565b8152600060208083018290526040830182905260609092018190528354600181018555938152819020825180519394600702909101926123ec928492019061259a565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083600481111561243557612435612c89565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff19169115159190911790556040513390600080516020612cdd8339815191529061065190612a8e565b6000816040516020016124bd919061299c565b60405160208183030381529060405280519060200120836040516020016124e4919061299c565b604051602081830303815290604052805190602001201490505b92915050565b6040516370a0823160e01b815230600482015260009081906001600160a01b038516906370a082319060240160206040518083038186803b15801561254857600080fd5b505afa15801561255c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125809190612955565b90508281111561259357829150506124fe565b9392505050565b8280546125a690612c1d565b90600052602060002090601f0160209004810192826125c8576000855561260e565b82601f106125e157805160ff191683800117855561260e565b8280016001018555821561260e579182015b8281111561260e5782518255916020019190600101906125f3565b5061261a92915061261e565b5090565b5b8082111561261a576000815560010161261f565b80356001600160a01b0381168114610a4857600080fd5b600082601f83011261265b57600080fd5b813567ffffffffffffffff81111561267557612675612cb5565b612688601f8201601f1916602001612b4c565b81815284602083860101111561269d57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208083850312156126cd57600080fd5b825167ffffffffffffffff808211156126e557600080fd5b818501915085601f8301126126f957600080fd5b81518181111561270b5761270b612cb5565b8060051b915061271c848301612b4c565b8181528481019084860184860187018a101561273757600080fd5b600095505b8386101561275a57805183526001959095019491860191860161273c565b5098975050505050505050565b60006020828403121561277957600080fd5b815161259381612ccb565b6000806040838503121561279757600080fd5b823567ffffffffffffffff8111156127ae57600080fd5b6127ba8582860161264a565b9250506127c960208401612633565b90509250929050565b600080604083850312156127e557600080fd5b823567ffffffffffffffff8111156127fc57600080fd5b6128088582860161264a565b95602094909401359450505050565b60008060006060848603121561282c57600080fd5b833567ffffffffffffffff81111561284357600080fd5b61284f8682870161264a565b9660208601359650604090950135949350505050565b6000806000806080858703121561287b57600080fd5b843567ffffffffffffffff81111561289257600080fd5b61289e8782880161264a565b94505060208501359250604085013591506128bb60608601612633565b905092959194509250565b600080600080600060a086880312156128de57600080fd5b853567ffffffffffffffff8111156128f557600080fd5b6129018882890161264a565b955050602086013593506040860135925061291e60608701612633565b9150608086013561292e81612ccb565b809150509295509295909350565b60006020828403121561294e57600080fd5b5035919050565b60006020828403121561296757600080fd5b5051919050565b60008060006060848603121561298357600080fd5b8351925060208401519150604084015190509250925092565b600082516129ae818460208701612bed565b9190910192915050565b60006101008083528a51808285015261012091506129dc8183860160208f01612bed565b602084018b9052604084018a905260608401899052601f01601f1916830101905060058610612a1b57634e487b7160e01b600052602160045260246000fd5b856080830152612a3660a08301866001600160a01b03169052565b8360c0830152612a4a60e083018415159052565b9998505050505050505050565b6020808252601c908201527f636f756c64206e6f742066696e642074617820746f2075706461746500000000604082015260600190565b6020808252600b908201526a15185e0810dc99585d195960aa1b604082015260600190565b6020808252600e908201526d6e6f207065726d697373696f6e7360901b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612b2b5784516001600160a01b031683529383019391830191600101612b06565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715612b7557612b75612cb5565b604052919050565b60008219821115612b9057612b90612c73565b500190565b600082612bb257634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612bd157612bd1612c73565b500290565b600082821015612be857612be8612c73565b500390565b60005b83811015612c08578181015183820152602001612bf0565b83811115612c17576000848401525b50505050565b600181811c90821680612c3157607f821691505b60208210811415612c5257634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612c6c57612c6c612c73565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114612cd957600080fd5b5056fed43eee071b91e7714b533dbf825ec024145ba03675691f363d9a4c47e88b4dc5a2646970667358221220be8b91d1281ae3c9842d1a838248dd6401df1e49a92ba461d2da995aabe33f5964736f6c63430008070033
Deployed ByteCode Sourcemap
235:3326:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2714:172;;;:::i;:::-;;484:35:1;;;;;-1:-1:-1;;;484:35:1;;;;;;;;;5332:14:7;;5325:22;5307:41;;5295:2;5280:18;484:35:1;;;;;;;;388:19;;;:::i;:::-;;;;;;;:::i;3904:210:6:-;;;;;;:::i;:::-;;:::i;3498:314:1:-;;;;;;:::i;:::-;;:::i;400:41:0:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2642:247;;;;;;:::i;:::-;;:::i;1584:100:1:-;1664:12;;1584:100;;;18807:25:7;;;18795:2;18780:18;1584:100:1;18661:177:7;2766:112:6;2855:14;;-1:-1:-1;;;;;2855:14:6;2766:112;;;-1:-1:-1;;;;;4844:32:7;;;4826:51;;4814:2;4799:18;2766:112:6;4680:203:7;560:184:2;;;;;;:::i;:::-;;:::i;4285:328:1:-;;;;;;:::i;:::-;;:::i;8164:185::-;;;;;;:::i;:::-;;:::i;448:46:0:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;414:21:1;;;;;;;;;;;;19015:4:7;19003:17;;;18985:36;;18973:2;18958:18;414:21:1;18843:184:7;188:43:2;;;;;;:::i;:::-;;;;;;;;;;;;;;;;5128:381:1;;;;;;:::i;:::-;;:::i;4351:93:6:-;;;:::i;2576:100::-;;;:::i;7954:198:1:-;;;;;;:::i;:::-;;:::i;8361:214::-;;;;;;:::i;:::-;;:::i;214:36:0:-;;;;;;;;;;;;2430:204;;;;;;:::i;:::-;;:::i;4126:213:6:-;;;;;;:::i;:::-;;:::i;2901:180:0:-;;;;;;:::i;:::-;;:::i;3089:194::-;;;;;;:::i;:::-;;:::i;259:26::-;;;;;;3683:213:6;;;;;;:::i;:::-;;:::i;7472:283:1:-;;;;;;:::i;:::-;;:::i;215:23:6:-;;;;;-1:-1:-1;;;215:23:6;;;;;;1901:119:1;;;;;;:::i;:::-;-1:-1:-1;;;;;1995:17:1;1968:7;1995:17;;;;;;;;;;;;1901:119;672:42;;;;;;:::i;:::-;;;;;;;;;;;;;;;;294:25:0;;;;;;526:20:1;;;;;-1:-1:-1;;;526:20:1;;;;;;448:29;;;;;;;;-1:-1:-1;;;;;448:29:1;;;361:20;;;:::i;335:48:6:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1006:457:2;;;;;;:::i;:::-;;:::i;6029:391:1:-;;;;;;:::i;:::-;;:::i;7032:211::-;;;;;;:::i;:::-;;:::i;2675:176::-;;;;;;:::i;:::-;;:::i;559:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;7763:179;;;;;;:::i;:::-;;:::i;2928:200:6:-;;;;;;:::i;:::-;;:::i;2227:191:0:-;;;;;;:::i;:::-;;:::i;2376:102:6:-;;;:::i;326:26:0:-;;;;;;290:38:6;;;;;;3136:535;;;;;;:::i;:::-;;:::i;501:55:0:-;;;;;;:::i;:::-;;;;;;;;;;;;;;245:38:6;;;;;;2360:144:1;;;;;;:::i;:::-;-1:-1:-1;;;;;2471:16:1;;;2444:7;2471:16;;;:8;:16;;;;;;;;:25;;;;;;;;;;;;;2360:144;7251:213;;;:::i;359:28:0:-;;;;;;613:52:1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;175:32:0;;;;;;;;;2714:172:4;854:5:1;;;;;-1:-1:-1;;;;;854:5:1;840:10;:19;832:72;;;;-1:-1:-1;;;832:72:1;;;;;;;:::i;:::-;;;;;;;;;2792:14:4::1;:12;:14::i;:::-;2843:10;-1:-1:-1::0;;;;;2822:56:4::1;-1:-1:-1::0;;;;;;;;;;;2822:56:4::1;;;;9271:2:7::0;9253:21;;;9310:2;9290:18;;;9283:30;-1:-1:-1;;;9344:2:7;9329:18;;9322:50;9404:2;9389:18;;9069:344;2822:56:4::1;;;;;;;;2714:172::o:0;388:19:1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3904:210:6:-;854:5:1;;;;;-1:-1:-1;;;;;854:5:1;840:10;:19;832:72;;;;-1:-1:-1;;;832:72:1;;;;;;;:::i;:::-;3995:14:6::1;::::0;:44:::1;::::0;-1:-1:-1;;;3995:44:6;;-1:-1:-1;;;;;3995:14:6;;::::1;::::0;:24:::1;::::0;:44:::1;::::0;4020:7;;4029:9;;3995:44:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4076:10;-1:-1:-1::0;;;;;4055:51:6::1;-1:-1:-1::0;;;;;;;;;;;4055:51:6::1;;;;8568:2:7::0;8550:21;;;8607:2;8587:18;;;8580:30;-1:-1:-1;;;8641:2:7;8626:18;;8619:45;8696:2;8681:18;;8366:339;4055:51:6::1;;;;;;;;3904:210:::0;;:::o;3498:314:1:-;1253:16;;3601:4;;3580:10;;-1:-1:-1;;;1253:16:1;;;;:28;;;;-1:-1:-1;1273:8:1;;-1:-1:-1;;;1273:8:1;;;;1253:28;1252:47;;;-1:-1:-1;1294:5:1;;-1:-1:-1;;;;;1286:13:1;;;1294:5;;;;;1286:13;1252:47;:77;;;-1:-1:-1;1318:10:1;1303:26;;;;:14;:26;;;;;;;;1252:77;1244:109;;;;-1:-1:-1;;;1244:109:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;3626:21:1;::::1;3618:62;;;;-1:-1:-1::0;;;3618:62:1::1;;;;;;;:::i;:::-;3702:10;3693:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;3693:29:1;::::1;::::0;;;;;;;;;;:37;;;3746:36;18807:25:7;;;3693:29:1;;3702:10;3746:36:::1;::::0;18780:18:7;3746:36:1::1;;;;;;;;-1:-1:-1::0;3800:4:1::1;::::0;3498:314;-1:-1:-1;;;3498:314:1:o;2642:247:0:-;854:5:1;;;;;-1:-1:-1;;;;;854:5:1;840:10;:19;832:72;;;;-1:-1:-1;;;832:72:1;;;;;;;:::i;:::-;2720:11:0;;;:27:::1;;;2744:3;2735:6;:12;2720:27;2712:65;;;::::0;-1:-1:-1;;;2712:65:0;;6404:2:7;2712:65:0::1;::::0;::::1;6386:21:7::0;6443:2;6423:18;;;6416:30;6482:27;6462:18;;;6455:55;6527:18;;2712:65:0::1;6202:349:7::0;2712:65:0::1;2788:11;:20:::0;;;2824:57:::1;::::0;2845:10:::1;::::0;-1:-1:-1;;;;;;;;;;;2824:57:0;::::1;::::0;11793:2:7;11775:21;;;11832:2;11812:18;;;11805:30;-1:-1:-1;;;11866:2:7;11851:18;;11844:51;11927:2;11912:18;;11591:345;2824:57:0::1;;;;;;;;2642:247:::0;:::o;560:184:2:-;854:5:1;;;;;-1:-1:-1;;;;;854:5:1;840:10;:19;832:72;;;;-1:-1:-1;;;832:72:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;640:15:2;::::1;;::::0;;;:10:::1;:15;::::0;;;;;;:25;;;::::1;;-1:-1:-1::0;;640:25:2;;::::1;;::::0;;681:55;702:10:::1;::::0;-1:-1:-1;;;;;;;;;;;681:55:2;::::1;::::0;15708:2:7;15690:21;;;15747:2;15727:18;;;15720:30;-1:-1:-1;;;15781:2:7;15766:18;;15759:49;15840:2;15825:18;;15506:343;4285:328:1;1253:16;;4396:4;;4381;;-1:-1:-1;;;1253:16:1;;;;:28;;;;-1:-1:-1;1273:8:1;;-1:-1:-1;;;1273:8:1;;;;1253:28;1252:47;;;-1:-1:-1;1294:5:1;;-1:-1:-1;;;;;1286:13:1;;;1294:5;;;;;1286:13;1252:47;:77;;;-1:-1:-1;1318:10:1;1303:26;;;;:14;:26;;;;;;;;1252:77;1244:109;;;;-1:-1:-1;;;1244:109:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;4442:14:1;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;4457:10:::1;4442:26:::0;;;;;;;;:34:::1;::::0;4471:5;;4442:34:::1;:::i;:::-;-1:-1:-1::0;;;;;4413:14:1;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;4428:10:::1;4413:26:::0;;;;;;;:63;4487:26:::1;4422:4:::0;4503:2;4507:5;4487:9:::1;:26::i;:::-;-1:-1:-1::0;;;;;4529:54:1;::::1;4556:14;::::0;;;:8:::1;:14;::::0;;;;;;;4544:10:::1;4556:26:::0;;;;;;;;;;;4529:54;;18807:25:7;;;4544:10:1;;4529:54;::::1;::::0;18780:18:7;4529:54:1::1;;;;;;;-1:-1:-1::0;4601:4:1::1;::::0;4285:328;-1:-1:-1;;;;4285:328:1:o;8164:185::-;854:5;;;;;-1:-1:-1;;;;;854:5:1;840:10;:19;832:72;;;;-1:-1:-1;;;832:72:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;8245:14:1;::::1;;::::0;;;:9:::1;:14;::::0;;;;;;:27;;;::::1;;-1:-1:-1::0;;8245:27:1;;::::1;;::::0;;8288:53;8309:10:::1;::::0;-1:-1:-1;;;;;;;;;;;8288:53:1;::::1;::::0;16758:2:7;16740:21;;;16797:2;16777:18;;;16770:30;-1:-1:-1;;;16831:2:7;16816:18;;16809:47;16888:2;16873:18;;16556:341;5128:381:1;1253:16;;5237:4;;5216:10;;-1:-1:-1;;;1253:16:1;;;;:28;;;;-1:-1:-1;1273:8:1;;-1:-1:-1;;;1273:8:1;;;;1253:28;1252:47;;;-1:-1:-1;1294:5:1;;-1:-1:-1;;;;;1286:13:1;;;1294:5;;;;;1286:13;1252:47;:77;;;-1:-1:-1;1318:10:1;1303:26;;;;:14;:26;;;;;;;;1252:77;1244:109;;;;-1:-1:-1;;;1244:109:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;5262:21:1;::::1;5254:62;;;;-1:-1:-1::0;;;5254:62:1::1;;;;;;;:::i;:::-;5370:10;5361:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;5361:29:1;::::1;::::0;;;;;;;;:42:::1;::::0;5393:10;;5361:42:::1;:::i;:::-;5338:10;5329:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;5329:29:1;::::1;::::0;;;;;;;;;;:74;;;5419:60;18807:25:7;;;5329:29:1;;5419:60:::1;::::0;18780:18:7;5419:60:1::1;18661:177:7::0;4351:93:6;977:8:1;;-1:-1:-1;;;977:8:1;;;;969:62;;;;-1:-1:-1;;;969:62:1;;11383:2:7;969:62:1;;;11365:21:7;11422:2;11402:18;;;11395:30;11461:34;11441:18;;;11434:62;-1:-1:-1;;;11512:18:7;;;11505:39;11561:19;;969:62:1;11181:405:7;969:62:1;4409:14:6::1;;;;;;;;;-1:-1:-1::0;;;;;4409:14:6::1;-1:-1:-1::0;;;;;4409:25:6::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4351:93::o:0;2576:100::-;2642:14;;:26;;;-1:-1:-1;;;2642:26:6;;;;2615:7;;-1:-1:-1;;;;;2642:14:6;;:24;;:26;;;;;;;;;;;;;;:14;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2635:33;;2576:100;:::o;7954:198:1:-;854:5;;;;;-1:-1:-1;;;;;854:5:1;840:10;:19;832:72;;;;-1:-1:-1;;;832:72:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;8038:19:1;::::1;;::::0;;;:14:::1;:19;::::0;;;;;;:29;;;::::1;;-1:-1:-1::0;;8038:29:1;;::::1;;::::0;;8083:61;8104:10:::1;::::0;-1:-1:-1;;;;;;;;;;;8083:61:1;::::1;::::0;9620:2:7;9602:21;;;9659:2;9639:18;;;9632:30;9698:27;9693:2;9678:18;;9671:55;9758:2;9743:18;;9418:349;8361:214:1;854:5;;;;;-1:-1:-1;;;;;854:5:1;840:10;:19;832:72;;;;-1:-1:-1;;;832:72:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;8453:24:1;::::1;;::::0;;;:19:::1;:24;::::0;;;;;;:37;;;::::1;;-1:-1:-1::0;;8453:37:1;;::::1;;::::0;;8506:61;8527:10:::1;::::0;-1:-1:-1;;;;;;;;;;;8506:61:1;::::1;::::0;10679:2:7;10661:21;;;10718:2;10698:18;;;10691:30;10757:27;10752:2;10737:18;;10730:55;10817:2;10802:18;;10477:349;2430:204:0;854:5:1;;;;;-1:-1:-1;;;;;854:5:1;840:10;:19;832:72;;;;-1:-1:-1;;;832:72:1;;;;;;;:::i;:::-;2505:24:0::1;:34:::0;;;::::1;;;;-1:-1:-1::0;;2505:34:0;;::::1;;::::0;;2555:71:::1;::::0;2576:10:::1;::::0;-1:-1:-1;;;;;;;;;;;2555:71:0;::::1;::::0;7460:2:7;7442:21;;;7499:2;7479:18;;;7472:30;7538:34;7533:2;7518:18;;7511:62;-1:-1:-1;;;7604:2:7;7589:18;;7582:33;7647:3;7632:19;;7258:399;4126:213:6;854:5:1;;;;;-1:-1:-1;;;;;854:5:1;840:10;:19;832:72;;;;-1:-1:-1;;;832:72:1;;;;;;;:::i;:::-;4217:14:6::1;::::0;:44:::1;::::0;-1:-1:-1;;;4217:44:6;;-1:-1:-1;;;;;4217:14:6;;::::1;::::0;:27:::1;::::0;:44:::1;::::0;4245:7;;4254:6;;4217:44:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4298:10;-1:-1:-1::0;;;;;4277:54:6::1;-1:-1:-1::0;;;;;;;;;;;4277:54:6::1;;;;17104:2:7::0;17086:21;;;17143:2;17123:18;;;17116:30;-1:-1:-1;;;17177:2:7;17162:18;;17155:48;17235:2;17220:18;;16902:342;2901:180:0;854:5:1;;;;;-1:-1:-1;;;;;854:5:1;840:10;:19;832:72;;;;-1:-1:-1;;;832:72:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;2979:13:0;::::1;;::::0;;;:8:::1;:13;::::0;;;;;;:23;;;::::1;;-1:-1:-1::0;;2979:23:0;;::::1;;::::0;;3018:55;3039:10:::1;::::0;-1:-1:-1;;;;;;;;;;;3018:55:0;::::1;::::0;6758:2:7;6740:21;;;6797:2;6777:18;;;6770:30;-1:-1:-1;;;6831:2:7;6816:18;;6809:49;6890:2;6875:18;;6556:343;3089:194:0;854:5:1;;;;;-1:-1:-1;;;;;854:5:1;840:10;:19;832:72;;;;-1:-1:-1;;;832:72:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;3170:18:0;::::1;;::::0;;;:13:::1;:18;::::0;;;;;;:28;;;::::1;;-1:-1:-1::0;;3170:28:0;;::::1;;::::0;;3214:61;3235:10:::1;::::0;-1:-1:-1;;;;;;;;;;;3214:61:0;::::1;::::0;7106:2:7;7088:21;;;7145:2;7125:18;;;7118:30;7184:27;7179:2;7164:18;;7157:55;7244:2;7229:18;;6904:349;3683:213:6;854:5:1;;;;;-1:-1:-1;;;;;854:5:1;840:10;:19;832:72;;;;-1:-1:-1;;;832:72:1;;;;;;;:::i;:::-;3775:14:6::1;::::0;:45:::1;::::0;-1:-1:-1;;;3775:45:6;;-1:-1:-1;;;;;3775:14:6;;::::1;::::0;:25:::1;::::0;:45:::1;::::0;3801:7;;3810:9;;3775:45:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3857:10;-1:-1:-1::0;;;;;3836:52:6::1;-1:-1:-1::0;;;;;;;;;;;3836:52:6::1;;;;7864:2:7::0;7846:21;;;7903:2;7883:18;;;7876:30;-1:-1:-1;;;7937:2:7;7922:18;;7915:46;7993:2;7978:18;;7662:340;7472:283:1;854:5;;7550:4;;854:5;;;-1:-1:-1;;;;;854:5:1;840:10;:19;832:72;;;;-1:-1:-1;;;832:72:1;;;;;;;:::i;:::-;7584:38:::1;::::0;-1:-1:-1;;;7584:38:1;;7616:4:::1;7584:38;::::0;::::1;4826:51:7::0;7566:15:1::1;::::0;-1:-1:-1;;;;;7584:23:1;::::1;::::0;::::1;::::0;4799:18:7;;7584:38:1::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7566:56;;7659:10;-1:-1:-1::0;;;;;7638:56:1::1;-1:-1:-1::0;;;;;;;;;;;7638:56:1::1;;;;12486:2:7::0;12468:21;;;12525:2;12505:18;;;12498:30;-1:-1:-1;;;12559:2:7;12544:18;;12537:50;12619:2;12604:18;;12284:344;7638:56:1::1;;;;;;;;7712:35;::::0;-1:-1:-1;;;7712:35:1;;-1:-1:-1;;;;;5080:32:7;;;7712:35:1::1;::::0;::::1;5062:51:7::0;5129:18;;;5122:34;;;7712:22:1;::::1;::::0;::::1;::::0;5035:18:7;;7712:35:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7705:42;;;915:1;7472:283:::0;;;;:::o;361:20::-;;;;;;;:::i;1006:457:2:-;292:10;281:22;;;;:10;:22;;;;;;;;273:54;;;;-1:-1:-1;;;273:54:2;;9974:2:7;273:54:2;;;9956:21:7;10013:2;9993:18;;;9986:30;-1:-1:-1;;;10032:18:7;;;10025:49;10091:18;;273:54:2;9772:343:7;273:54:2;-1:-1:-1;;;;;1100:21:2;::::1;1092:64;;;::::0;-1:-1:-1;;;1092:64:2;;8209:2:7;1092:64:2::1;::::0;::::1;8191:21:7::0;8248:2;8228:18;;;8221:30;8287:32;8267:18;;;8260:60;8337:18;;1092:64:2::1;8007:354:7::0;1092:64:2::1;-1:-1:-1::0;;;;;1171:21:2;::::1;1182:10;1171:21;1167:123;;-1:-1:-1::0;;;;;1241:17:2;::::1;;::::0;;;:8:::1;:17;::::0;;;;;;;1259:10:::1;1241:29:::0;;;;;;;;:37:::1;::::0;1273:5;;1241:37:::1;:::i;:::-;-1:-1:-1::0;;;;;1209:17:2;::::1;;::::0;;;:8:::1;:17;::::0;;;;;;;1227:10:::1;1209:29:::0;;;;;;;:69;1167:123:::1;1340:5;1325:12;;:20;;;;:::i;:::-;1310:12;:35:::0;-1:-1:-1;;;;;1377:18:2;::::1;:9;:18:::0;;;::::1;::::0;;;;;;;:26:::1;::::0;1398:5;;1377:26:::1;:::i;:::-;-1:-1:-1::0;;;;;1356:18:2;::::1;:9;:18:::0;;;::::1;::::0;;;;;;;:47;;;;1419:36;;18807:25:7;;;1356:9:2;;1419:36:::1;::::0;18780:18:7;1419:36:2::1;;;;;;;1006:457:::0;;:::o;6029:391:1:-;1253:16;;6143:4;;6122:10;;-1:-1:-1;;;1253:16:1;;;;:28;;;;-1:-1:-1;1273:8:1;;-1:-1:-1;;;1273:8:1;;;;1253:28;1252:47;;;-1:-1:-1;1294:5:1;;-1:-1:-1;;;;;1286:13:1;;;1294:5;;;;;1286:13;1252:47;:77;;;-1:-1:-1;1318:10:1;1303:26;;;;:14;:26;;;;;;;;1252:77;1244:109;;;;-1:-1:-1;;;1244:109:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;6168:21:1;::::1;6160:62;;;;-1:-1:-1::0;;;6160:62:1::1;;;;;;;:::i;:::-;6276:10;6267:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;6267:29:1;::::1;::::0;;;;;;;;:47:::1;::::0;6299:15;;6267:47:::1;:::i;7032:211::-:0;854:5;;;;;-1:-1:-1;;;;;854:5:1;840:10;:19;832:72;;;;-1:-1:-1;;;832:72:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;7104:17:1;::::1;7096:52;;;::::0;-1:-1:-1;;;7096:52:1;;16407:2:7;7096:52:1::1;::::0;::::1;16389:21:7::0;16446:2;16426:18;;;16419:30;-1:-1:-1;;;16465:18:7;;;16458:52;16527:18;;7096:52:1::1;16205:346:7::0;7096:52:1::1;7159:5;:11:::0;;-1:-1:-1;;;;;7159:11:1;::::1;;;-1:-1:-1::0;;;;;;7159:11:1;;::::1;;::::0;;7186:49:::1;::::0;7207:10:::1;::::0;-1:-1:-1;;;;;;;;;;;7186:49:1;::::1;::::0;15366:2:7;15348:21;;;15405:2;15385:18;;;15378:30;-1:-1:-1;;;15439:2:7;15424:18;;15417:43;15492:2;15477:18;;15164:337;2675:176:1;1253:16;;2772:4;;2751:10;;-1:-1:-1;;;1253:16:1;;;;:28;;;;-1:-1:-1;1273:8:1;;-1:-1:-1;;;1273:8:1;;;;1253:28;1252:47;;;-1:-1:-1;1294:5:1;;-1:-1:-1;;;;;1286:13:1;;;1294:5;;;;;1286:13;1252:47;:77;;;-1:-1:-1;1318:10:1;1303:26;;;;:14;:26;;;;;;;;1252:77;1244:109;;;;-1:-1:-1;;;1244:109:1;;;;;;;:::i;:::-;2789:32:::1;2799:10;2811:2;2815:5;2789:9;:32::i;:::-;-1:-1:-1::0;2839:4:1::1;::::0;2675:176;-1:-1:-1;;;2675:176:1:o;7763:179::-;854:5;;;;;-1:-1:-1;;;;;854:5:1;840:10;:19;832:72;;;;-1:-1:-1;;;832:72:1;;;;;;;:::i;:::-;7834:16:::1;:26:::0;;;::::1;;-1:-1:-1::0;;;7834:26:1::1;-1:-1:-1::0;;;;7834:26:1;;::::1;;::::0;;7876:58:::1;::::0;7897:10:::1;::::0;-1:-1:-1;;;;;;;;;;;7876:58:1;::::1;::::0;16056:2:7;16038:21;;;16095:2;16075:18;;;16068:30;-1:-1:-1;;;16129:2:7;16114:18;;16107:52;16191:2;16176:18;;15854:346;2928:200:6;854:5:1;;;;;-1:-1:-1;;;;;854:5:1;840:10;:19;832:72;;;;-1:-1:-1;;;832:72:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;3013:20:6;::::1;;::::0;;;:15:::1;:20;::::0;;;;;;:30;;;::::1;;-1:-1:-1::0;;3013:30:6;;::::1;;::::0;;3059:61;3080:10:::1;::::0;-1:-1:-1;;;;;;;;;;;3059:61:6;::::1;::::0;15012:2:7;14994:21;;;15051:2;15031:18;;;15024:30;15090:27;15085:2;15070:18;;15063:55;15150:2;15135:18;;14810:349;2227:191:0;854:5:1;;;;;-1:-1:-1;;;;;854:5:1;840:10;:19;832:72;;;;-1:-1:-1;;;832:72:1;;;;;;;:::i;:::-;2298:20:0::1;:30:::0;;;::::1;;-1:-1:-1::0;;2298:30:0;;::::1;;::::0;;2344:66:::1;::::0;2365:10:::1;::::0;-1:-1:-1;;;;;;;;;;;2344:66:0;::::1;::::0;13183:2:7;13165:21;;;13222:2;13202:18;;;13195:30;13261:32;13256:2;13241:18;;13234:60;13326:2;13311:18;;12981:354;2376:102:6;2443:14;;:27;;;-1:-1:-1;;;2443:27:6;;;;2416:7;;-1:-1:-1;;;;;2443:14:6;;:25;;:27;;;;;;;;;;;;;;:14;:27;;;;;;;;;;3136:535;854:5:1;;;;;-1:-1:-1;;;;;854:5:1;840:10;:19;832:72;;;;-1:-1:-1;;;832:72:1;;;;;;;:::i;:::-;3284:8:6::1;::::0;3278:14:::1;::::0;3284:8:::1;;3278:2;:14;:::i;:::-;3274:18;::::0;:1:::1;:18;:::i;:::-;3248:23;;:44;:98;;;;-1:-1:-1::0;3338:8:6::1;::::0;3332:14:::1;::::0;3338:8:::1;;3332:2;:14;:::i;:::-;3322:24;::::0;:7:::1;:24;:::i;:::-;3296:23;;:50;3248:98;3240:134;;;::::0;-1:-1:-1;;;3240:134:6;;13542:2:7;3240:134:6::1;::::0;::::1;13524:21:7::0;13581:2;13561:18;;;13554:30;13620:25;13600:18;;;13593:53;13663:18;;3240:134:6::1;13340:347:7::0;3240:134:6::1;3419:9;3393:23;;:35;:71;;;;;3458:6;3432:23;;:32;3393:71;3385:105;;;::::0;-1:-1:-1;;;3385:105:6;;11033:2:7;3385:105:6::1;::::0;::::1;11015:21:7::0;11072:2;11052:18;;;11045:30;-1:-1:-1;;;11091:18:7;;;11084:51;11152:18;;3385:105:6::1;10831:345:7::0;3385:105:6::1;3501:23;:35:::0;;;3547:23:::1;:33:::0;;;3596:67:::1;::::0;3617:10:::1;::::0;-1:-1:-1;;;;;;;;;;;3596:67:6;::::1;::::0;13894:2:7;13876:21;;;13933:2;13913:18;;;13906:30;13972:33;13967:2;13952:18;;13945:61;14038:2;14023:18;;13692:355;7251:213:1;854:5;;;;;-1:-1:-1;;;;;854:5:1;840:10;:19;832:72;;;;-1:-1:-1;;;832:72:1;;;;;;;:::i;:::-;7360:5:::1;::::0;7352:32:::1;::::0;7320:21:::1;::::0;7360:5:::1;::::0;::::1;-1:-1:-1::0;;;;;7360:5:1::1;::::0;7352:32:::1;::::0;::::1;;::::0;7320:21;;7302:15:::1;7352:32:::0;7302:15;7352:32;7320:21;7360:5;7352:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;7421:10;-1:-1:-1::0;;;;;7400:56:1::1;-1:-1:-1::0;;;;;;;;;;;7400:56:1::1;;;;14663:2:7::0;14645:21;;;14702:2;14682:18;;;14675:30;-1:-1:-1;;;14736:2:7;14721:18;;14714:50;14796:2;14781:18;;14461:344;448:144:6;-1:-1:-1;;;;;520:23:6;;;;;;:15;:23;;;;;:30;;-1:-1:-1;;520:30:6;546:4;520:30;;;561:23;536:6;561:15;:23::i;:::-;448:144;:::o;379:139:2:-;-1:-1:-1;;;;;451:18:2;;;;;;:10;:18;;;;;:25;;-1:-1:-1;;451:25:2;472:4;451:25;;;487:23;462:6;593:142:0;-1:-1:-1;;;;;665:21:0;;;;;;:13;:21;;;;;:28;;-1:-1:-1;;665:28:0;689:4;665:28;;;704:23;679:6;1387:124:1;1450:5;:14;;-1:-1:-1;;;;;;1450:14:1;;-1:-1:-1;;;;;1450:14:1;;;;;;;;;;;;;1490:5;;;-1:-1:-1;1475:21:1;;;:14;:21;;;;;:28;;-1:-1:-1;;1475:28:1;-1:-1:-1;1475:28:1;;;1387:124::o;747:233:0:-;854:5:1;;;;;-1:-1:-1;;;;;854:5:1;840:10;:19;832:72;;;;-1:-1:-1;;;832:72:1;;;;;;;:::i;:::-;810:14:0::1;:12;:14::i;:::-;848:15;835:10;:28:::0;888:12:::1;874:11;:26:::0;916:56:::1;::::0;937:10:::1;::::0;-1:-1:-1;;;;;;;;;;;916:56:0;::::1;::::0;18514:2:7;18496:21;;;18553:2;18533:18;;;18526:30;-1:-1:-1;;;18587:2:7;18572:18;;18565:50;18647:2;18632:18;;18312:344;8829:549:1;-1:-1:-1;;;;;8916:16:1;;8908:51;;;;-1:-1:-1;;;8908:51:1;;16407:2:7;8908:51:1;;;16389:21:7;16446:2;16426:18;;;16419:30;-1:-1:-1;;;16465:18:7;;;16458:52;16527:18;;8908:51:1;16205:346:7;8908:51:1;-1:-1:-1;;;;;8978:25:1;;;;;;:19;:25;;;;;;;;:34;8970:77;;;;-1:-1:-1;;;8970:77:1;;8912:2:7;8970:77:1;;;8894:21:7;8951:2;8931:18;;;8924:30;8990:32;8970:18;;;8963:60;9040:18;;8970:77:1;8710:354:7;8970:77:1;9068:28;9080:4;9086:2;9090:5;9068:11;:28::i;:::-;9109:22;9134:40;9158:4;9164:2;9168:5;9134:23;:40::i;:::-;-1:-1:-1;;;;;9203:15:1;;:9;:15;;;;;;;;;;;9109:65;;-1:-1:-1;9203:23:1;;9221:5;;9203:23;:::i;:::-;-1:-1:-1;;;;;9185:15:1;;;:9;:15;;;;;;;;;;;:41;;;;9253:13;;;;;;;:30;;9269:14;;9253:30;:::i;:::-;-1:-1:-1;;;;;9237:13:1;;;:9;:13;;;;;;;;;;;;:46;;;;9301:34;18807:25:7;;;9237:13:1;;9301:34;;;;;;18780:18:7;9301:34:1;;;;;;;9348:22;3434:124:4;6464:143:1;854:5;;;;;-1:-1:-1;;;;;854:5:1;840:10;:19;832:72;;;;-1:-1:-1;;;832:72:1;;;;;;;:::i;:::-;6518:8:::1;:15:::0;;-1:-1:-1;;;;6518:15:1::1;-1:-1:-1::0;;;6518:15:1::1;::::0;;6549:50:::1;::::0;6570:10:::1;::::0;-1:-1:-1;;;;;;;;;;;6549:50:1;::::1;::::0;12143:2:7;12125:21;;;12182:2;12162:18;;;12155:30;-1:-1:-1;;;12216:2:7;12201:18;;12194:44;12270:2;12255:18;;11941:338;3043:165:4;3166:34;3184:4;3190:2;3194:5;3166:17;:34::i;:::-;3043:165;;;:::o;3220:202::-;3341:7;3368:46;3398:4;3404:2;3408:5;3368:29;:46::i;:::-;3361:53;3220:202;-1:-1:-1;;;;3220:202:4:o;1546:693:6:-;1691:14;;:29;;;-1:-1:-1;;;1691:29:6;;;;1645:25;;-1:-1:-1;;;;;1691:14:6;;:27;;:29;;;;;;;;;;;;;;:14;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1673:47;;:15;:47;:::i;:::-;1749:8;;1645:75;;-1:-1:-1;;;;1749:8:6;;;;:37;;;;-1:-1:-1;1775:11:6;;-1:-1:-1;;;1775:11:6;;;;1749:37;:68;;;;-1:-1:-1;;;;;;1804:13:6;;;;;;:9;:13;;;;;;;;1749:68;:123;;;;;1857:15;1835:13;;1851:2;1835:18;;;;:::i;:::-;:37;;1749:123;:184;;;;;1910:23;;1889:17;:44;;1749:184;:262;;;;-1:-1:-1;1988:23:6;;1968:14;;-1:-1:-1;;;;;1968:14:6;1950:9;:34;;;;;;;;;;;:61;;1749:262;:311;;;;;2028:14;;;;;;;;;-1:-1:-1;;;;;2028:14:6;-1:-1:-1;;;;;2028:21:6;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;1749:311;1731:456;;;2103:15;2087:13;:31;2137:14;;:27;;;-1:-1:-1;;;2137:27:6;;;;-1:-1:-1;;;;;2137:14:6;;;;:25;;:27;;;;;:14;;:27;;;;;;;;:14;;:27;;;;;;;;;;;;;;;;;;;;;;;;;2133:43;;2197:34;2215:4;2221:2;2225:5;2197:17;:34::i;610:926::-;-1:-1:-1;;;;;796:21:6;;719:7;796:21;;;:15;:21;;;;;;774:5;;796:21;;:30;;;:62;;-1:-1:-1;;;;;;830:19:6;;;;;;:15;:19;;;;;;;;:28;796:62;:74;;;;-1:-1:-1;862:8:6;;-1:-1:-1;;;862:8:6;;;;796:74;792:390;;;-1:-1:-1;;;;;891:15:6;;;;;;:9;:15;;;;;;;;887:284;;;978:14;;:32;;-1:-1:-1;;;978:32:6;;;;;18807:25:7;;;-1:-1:-1;;;;;978:14:6;;;;:25;;18780:18:7;;978:32:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;961:49;;887:284;;;-1:-1:-1;;;;;1036:13:6;;;;;;:9;:13;;;;;;;;1032:139;;;1122:14;;:33;;-1:-1:-1;;;1122:33:6;;;;;18807:25:7;;;-1:-1:-1;;;;;1122:14:6;;;;:26;;18780:18:7;;1122:33:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1105:50;;1032:139;1194:17;1214:22;1222:14;1214:5;:22;:::i;:::-;1194:42;-1:-1:-1;1251:13:6;;1247:199;;1336:14;;-1:-1:-1;;;;;1336:14:6;1318:9;:34;;;;;;;;;;;:46;;1355:9;;1318:46;:::i;:::-;1299:14;;;-1:-1:-1;;;;;1299:14:6;;;1281:9;:34;;;;;;;;;;;;:83;;;;1407:14;;1384:50;;18807:25:7;;;1407:14:6;;;;1384:50;;;;;;18780:18:7;1384:50:6;;;;;;;1247:199;1473:55;1503:4;1509:2;1513:14;1473:29;:55::i;:::-;1466:62;610:926;-1:-1:-1;;;;;;610:926:6:o;992:1190:0:-;1099:20;;;;:29;;:62;;-1:-1:-1;1141:10:0;1132:20;;;;:8;:20;;;;;;;;:29;1099:62;1091:90;;;;-1:-1:-1;;;1091:90:0;;17451:2:7;1091:90:0;;;17433:21:7;17490:2;17470:18;;;17463:30;-1:-1:-1;;;17509:18:7;;;17502:45;17564:18;;1091:90:0;17249:339:7;1091:90:0;1206:8;;-1:-1:-1;;;1206:8:0;;;;:25;;;;-1:-1:-1;1226:5:0;;-1:-1:-1;;;;;1218:13:0;;;1226:5;;;;;1218:13;;1206:25;:57;;;;-1:-1:-1;;;;;;1235:19:0;;;;;;:13;:19;;;;;;;;:28;1206:57;:87;;;;-1:-1:-1;;;;;;1267:17:0;;;;;;:13;:17;;;;;;;;:26;1206:87;1202:918;;;1328:11;;:15;1324:122;;1384:11;;1371:9;:24;;1363:67;;;;-1:-1:-1;;;1363:67:0;;18155:2:7;1363:67:0;;;18137:21:7;18194:2;18174:18;;;18167:30;18233:32;18213:18;;;18206:60;18283:18;;1363:67:0;17953:354:7;1363:67:0;1477:24;;;;;;;1474:635;;;-1:-1:-1;;;;;1526:23:0;;;;;;:19;:23;;;;;;1553:12;1526:39;1522:146;;;-1:-1:-1;;;;;1590:12:0;;;;;;:8;:12;;;;;:19;;-1:-1:-1;;1590:19:0;1605:4;1590:19;;;1632:13;:16;;;;;;:::i;:::-;;;;;;1522:146;-1:-1:-1;;;;;1690:25:0;;;;;;:19;:25;;;;;;1719:12;1690:41;1686:150;;;-1:-1:-1;;;;;1756:14:0;;;;;;:8;:14;;;;;:21;;-1:-1:-1;;1756:21:0;1773:4;1756:21;;;1800:13;:16;;;;;;:::i;:::-;;;;;;1686:150;-1:-1:-1;;;;;1858:13:0;;;;;;:9;:13;;;;;;;;1854:109;;-1:-1:-1;;;;;1905:23:0;;;;;;:19;:23;;;;;1931:12;1905:38;;1854:109;-1:-1:-1;;;;;1985:15:0;;;;;;:9;:15;;;;;;;;1981:113;;-1:-1:-1;;;;;;;2034:25:0;;;;;:19;:25;;;;;2062:12;2034:40;;3043:165:4:o;6709:205:1:-;6809:7;6845:2;-1:-1:-1;;;;;6837:10:1;:4;-1:-1:-1;;;;;6837:10:1;;;6829:54;;;;-1:-1:-1;;;6829:54:1;;17795:2:7;6829:54:1;;;17777:21:7;17834:2;17814:18;;;17807:30;17873:33;17853:18;;;17846:61;17924:18;;6829:54:1;17593:355:7;6829:54:1;-1:-1:-1;6901:5:1;6709:205;-1:-1:-1;;6709:205:1:o;14:173:7:-;82:20;;-1:-1:-1;;;;;131:31:7;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:719::-;235:5;288:3;281:4;273:6;269:17;265:27;255:55;;306:1;303;296:12;255:55;342:6;329:20;368:18;405:2;401;398:10;395:36;;;411:18;;:::i;:::-;486:2;480:9;454:2;540:13;;-1:-1:-1;;536:22:7;;;560:2;532:31;528:40;516:53;;;584:18;;;604:22;;;581:46;578:72;;;630:18;;:::i;:::-;670:10;666:2;659:22;705:2;697:6;690:18;751:3;744:4;739:2;731:6;727:15;723:26;720:35;717:55;;;768:1;765;758:12;717:55;832:2;825:4;817:6;813:17;806:4;798:6;794:17;781:54;879:1;872:4;867:2;859:6;855:15;851:26;844:37;899:6;890:15;;;;;;192:719;;;;:::o;916:186::-;975:6;1028:2;1016:9;1007:7;1003:23;999:32;996:52;;;1044:1;1041;1034:12;996:52;1067:29;1086:9;1067:29;:::i;:::-;1057:39;916:186;-1:-1:-1;;;916:186:7:o;1107:260::-;1175:6;1183;1236:2;1224:9;1215:7;1211:23;1207:32;1204:52;;;1252:1;1249;1242:12;1204:52;1275:29;1294:9;1275:29;:::i;:::-;1265:39;;1323:38;1357:2;1346:9;1342:18;1323:38;:::i;:::-;1313:48;;1107:260;;;;;:::o;1372:328::-;1449:6;1457;1465;1518:2;1506:9;1497:7;1493:23;1489:32;1486:52;;;1534:1;1531;1524:12;1486:52;1557:29;1576:9;1557:29;:::i;:::-;1547:39;;1605:38;1639:2;1628:9;1624:18;1605:38;:::i;:::-;1595:48;;1690:2;1679:9;1675:18;1662:32;1652:42;;1372:328;;;;;:::o;1705:315::-;1770:6;1778;1831:2;1819:9;1810:7;1806:23;1802:32;1799:52;;;1847:1;1844;1837:12;1799:52;1870:29;1889:9;1870:29;:::i;:::-;1860:39;;1949:2;1938:9;1934:18;1921:32;1962:28;1984:5;1962:28;:::i;:::-;2009:5;1999:15;;;1705:315;;;;;:::o;2025:254::-;2093:6;2101;2154:2;2142:9;2133:7;2129:23;2125:32;2122:52;;;2170:1;2167;2160:12;2122:52;2193:29;2212:9;2193:29;:::i;:::-;2183:39;2269:2;2254:18;;;;2241:32;;-1:-1:-1;;;2025:254:7:o;2284:241::-;2340:6;2393:2;2381:9;2372:7;2368:23;2364:32;2361:52;;;2409:1;2406;2399:12;2361:52;2448:9;2435:23;2467:28;2489:5;2467:28;:::i;2530:245::-;2597:6;2650:2;2638:9;2629:7;2625:23;2621:32;2618:52;;;2666:1;2663;2656:12;2618:52;2698:9;2692:16;2717:28;2739:5;2717:28;:::i;2780:396::-;2858:6;2866;2919:2;2907:9;2898:7;2894:23;2890:32;2887:52;;;2935:1;2932;2925:12;2887:52;2975:9;2962:23;3008:18;3000:6;2997:30;2994:50;;;3040:1;3037;3030:12;2994:50;3063;3105:7;3096:6;3085:9;3081:22;3063:50;:::i;:::-;3053:60;;;3132:38;3166:2;3155:9;3151:18;3132:38;:::i;3181:390::-;3259:6;3267;3320:2;3308:9;3299:7;3295:23;3291:32;3288:52;;;3336:1;3333;3326:12;3288:52;3376:9;3363:23;3409:18;3401:6;3398:30;3395:50;;;3441:1;3438;3431:12;3395:50;3464;3506:7;3497:6;3486:9;3482:22;3464:50;:::i;:::-;3454:60;3561:2;3546:18;;;;3533:32;;-1:-1:-1;;;;3181:390:7:o;3576:180::-;3635:6;3688:2;3676:9;3667:7;3663:23;3659:32;3656:52;;;3704:1;3701;3694:12;3656:52;-1:-1:-1;3727:23:7;;3576:180;-1:-1:-1;3576:180:7:o;3761:184::-;3831:6;3884:2;3872:9;3863:7;3859:23;3855:32;3852:52;;;3900:1;3897;3890:12;3852:52;-1:-1:-1;3923:16:7;;3761:184;-1:-1:-1;3761:184:7:o;3950:248::-;4018:6;4026;4079:2;4067:9;4058:7;4054:23;4050:32;4047:52;;;4095:1;4092;4085:12;4047:52;-1:-1:-1;;4118:23:7;;;4188:2;4173:18;;;4160:32;;-1:-1:-1;3950:248:7:o;4203:472::-;4245:3;4283:5;4277:12;4310:6;4305:3;4298:19;4335:1;4345:162;4359:6;4356:1;4353:13;4345:162;;;4421:4;4477:13;;;4473:22;;4467:29;4449:11;;;4445:20;;4438:59;4374:12;4345:162;;;4525:6;4522:1;4519:13;4516:87;;;4591:1;4584:4;4575:6;4570:3;4566:16;4562:27;4555:38;4516:87;-1:-1:-1;4657:2:7;4636:15;-1:-1:-1;;4632:29:7;4623:39;;;;4664:4;4619:50;;4203:472;-1:-1:-1;;4203:472:7:o;5359:220::-;5508:2;5497:9;5490:21;5471:4;5528:45;5569:2;5558:9;5554:18;5546:6;5528:45;:::i;5584:317::-;5761:2;5750:9;5743:21;5724:4;5781:45;5822:2;5811:9;5807:18;5799:6;5781:45;:::i;:::-;5773:53;;5891:1;5887;5882:3;5878:11;5874:19;5866:6;5862:32;5857:2;5846:9;5842:18;5835:60;5584:317;;;;;:::o;5906:291::-;6083:2;6072:9;6065:21;6046:4;6103:45;6144:2;6133:9;6129:18;6121:6;6103:45;:::i;:::-;6095:53;;6184:6;6179:2;6168:9;6164:18;6157:34;5906:291;;;;;:::o;10120:352::-;10322:2;10304:21;;;10361:2;10341:18;;;10334:30;10400;10395:2;10380:18;;10373:58;10463:2;10448:18;;10120:352::o;12633:343::-;12835:2;12817:21;;;12874:2;12854:18;;;12847:30;-1:-1:-1;;;12908:2:7;12893:18;;12886:49;12967:2;12952:18;;12633:343::o;14052:404::-;14254:2;14236:21;;;14293:2;14273:18;;;14266:30;14332:34;14327:2;14312:18;;14305:62;-1:-1:-1;;;14398:2:7;14383:18;;14376:38;14446:3;14431:19;;14052:404::o;19032:128::-;19072:3;19103:1;19099:6;19096:1;19093:13;19090:39;;;19109:18;;:::i;:::-;-1:-1:-1;19145:9:7;;19032:128::o;19165:422::-;19254:1;19297:5;19254:1;19311:270;19332:7;19322:8;19319:21;19311:270;;;19391:4;19387:1;19383:6;19379:17;19373:4;19370:27;19367:53;;;19400:18;;:::i;:::-;19450:7;19440:8;19436:22;19433:55;;;19470:16;;;;19433:55;19549:22;;;;19509:15;;;;19311:270;;;19315:3;19165:422;;;;;:::o;19592:140::-;19650:5;19679:47;19720:4;19710:8;19706:19;19700:4;19786:5;19816:8;19806:80;;-1:-1:-1;19857:1:7;19871:5;;19806:80;19905:4;19895:76;;-1:-1:-1;19942:1:7;19956:5;;19895:76;19987:4;20005:1;20000:59;;;;20073:1;20068:130;;;;19980:218;;20000:59;20030:1;20021:10;;20044:5;;;20068:130;20105:3;20095:8;20092:17;20089:43;;;20112:18;;:::i;:::-;-1:-1:-1;;20168:1:7;20154:16;;20183:5;;19980:218;;20282:2;20272:8;20269:16;20263:3;20257:4;20254:13;20250:36;20244:2;20234:8;20231:16;20226:2;20220:4;20217:12;20213:35;20210:77;20207:159;;;-1:-1:-1;20319:19:7;;;20351:5;;20207:159;20398:34;20423:8;20417:4;20398:34;:::i;:::-;20468:6;20464:1;20460:6;20456:19;20447:7;20444:32;20441:58;;;20479:18;;:::i;:::-;20517:20;;19737:806;-1:-1:-1;;;19737:806:7:o;20548:168::-;20588:7;20654:1;20650;20646:6;20642:14;20639:1;20636:21;20631:1;20624:9;20617:17;20613:45;20610:71;;;20661:18;;:::i;:::-;-1:-1:-1;20701:9:7;;20548:168::o;20721:125::-;20761:4;20789:1;20786;20783:8;20780:34;;;20794:18;;:::i;:::-;-1:-1:-1;20831:9:7;;20721:125::o;20851:380::-;20930:1;20926:12;;;;20973;;;20994:61;;21048:4;21040:6;21036:17;21026:27;;20994:61;21101:2;21093:6;21090:14;21070:18;21067:38;21064:161;;;21147:10;21142:3;21138:20;21135:1;21128:31;21182:4;21179:1;21172:15;21210:4;21207:1;21200:15;21064:161;;20851:380;;;:::o;21236:135::-;21275:3;-1:-1:-1;;21296:17:7;;21293:43;;;21316:18;;:::i;:::-;-1:-1:-1;21363:1:7;21352:13;;21236:135::o;21376:127::-;21437:10;21432:3;21428:20;21425:1;21418:31;21468:4;21465:1;21458:15;21492:4;21489:1;21482:15;21508:127;21569:10;21564:3;21560:20;21557:1;21550:31;21600:4;21597:1;21590:15;21624:4;21621:1;21614:15;21640:118;21726:5;21719:13;21712:21;21705:5;21702:32;21692:60;;21748:1;21745;21738:12
Swarm Source
ipfs://be8b91d1281ae3c9842d1a838248dd6401df1e49a92ba461d2da995aabe33f59
Loading...
Loading
Loading...
Loading
OVERVIEW
SWING is an ERC-20 deflationary governance and utility token that acts as a decentralized protocol for the community structured by Swing Global.
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.