S Price: $0.505161 (-0.68%)

Token

FARMER (FARM)

Overview

Max Total Supply

1,000,000 FARM

Holders

5

Market

Price

$0.00 @ 0.000000 S

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
14,001.989398309396800223 FARM

Value
$0.00
0x516649dbd606a980e767bdedbcd882d91c859c9c
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
FARMER

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at SonicScan.org on 2025-03-04
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

// OpenZeppelin Contracts v5.0.1

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 */
abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "R1");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}

/**
 * @dev Contract module which provides a basic access control mechanism
 */
abstract contract Ownable {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert("O1");
        }
        _transferOwnership(initialOwner);
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    function _checkOwner() internal view virtual {
        require(owner() == msg.sender, "O2");
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "O1");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

/**
 * @dev Implementation of the {IERC20} interface.
 */
contract ERC20 is IERC20 {
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;
    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function name() public view virtual returns (string memory) {
        return _name;
    }

    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        address owner = msg.sender;
        _transfer(owner, to, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        address owner = msg.sender;
        _approve(owner, spender, amount);
        return true;
    }

    function transferFrom(address from, address to, uint256 amount) public virtual returns (bool) {
        address spender = msg.sender;
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0) && to != address(0), "E1");
        _beforeTokenTransfer(from, to, amount);
        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "E2");
        unchecked {
            _balances[from] = fromBalance - amount;
            _balances[to] += amount;
        }
        emit Transfer(from, to, amount);
        _afterTokenTransfer(from, to, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "E3");
        _beforeTokenTransfer(address(0), account, amount);
        _totalSupply += amount;
        unchecked {
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);
        _afterTokenTransfer(address(0), account, amount);
    }

    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0) && spender != address(0), "E4");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= amount, "E5");
        unchecked {
            _approve(owner, spender, currentAllowance - amount);
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        // Boş implementasyon
    }

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        // Boş implementasyon
    }
}

interface IMetropolisRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    
    // Mevcut fonksiyonlar
    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 swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

    // Yeni eklenen fonksiyonlar
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    
    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    
    // WETH ile ilgili fonksiyonlar
    function swapExactTokensForWETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    
    function swapExactWETHForETH(
        uint wethAmount,
        uint amountOutMin,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
}

interface IMetropolisFactory {
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

// Pair interface'ini de ekleyelim
interface IMetropolisPair {
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
}

// SwapProxy interface
interface ISwapProxy {
    function sendETHToFarmer() external;
}

// FARMER Token Contract
contract FARMER is ERC20, ReentrancyGuard, Ownable {
    // Constants
    uint256 private constant TOTAL_SUPPLY = 1_000_000 * 10**18;
    uint256 private constant TAX_RATE = 5; // 5%
    uint256 private constant LIQUIDITY_TAX = 25; // 2.5%
    uint256 private constant AIRDROP_TAX = 25; // 2.5%
    uint256 private constant MIN_HOLDER_AMOUNT = 10 * 10**18; // 10 tokens minimum for holder status
    uint256 private constant MIN_TOKENS_FOR_PROCESS = 50 * 10**18; // 50 tokens minimum for processing (azaltıldı)
    uint256 private constant SWAP_PERCENTAGE = 75; // 75% will be swapped
    uint256 private constant LIQUIDITY_PERCENTAGE = 25; // 25% will be used for liquidity
    uint256 private constant MAX_SLIPPAGE = 100; // 100% slippage tolerance (maksimuma çıkarıldı)

    // Metropolis DEX addresses
    IMetropolisRouter public metropolisRouter;
    IMetropolisFactory public metropolisFactory;
    address public sonicToken;
    address public liquidityPair;
    address public treasuryWallet;

    // Holder tracking
    mapping(address => bool) public isHolder;
    address[] public holders;

    // Events
    event LiquidityAdded(uint256 tokenAmount, uint256 sonicAmount);
    event AirdropDistributed(uint256 amount, uint256 holdersCount);
    event SwapFailed(string reason);
    event ProcessStarted(uint256 tokensForLiquidity, uint256 tokensForAirdrop);
    event SwapSuccessful(uint256 tokensSwapped, uint256 wethReceived);
    event TreasuryWalletUpdated(address oldTreasury, address newTreasury);
    event LiquidityAddFailed(string reason);
    event AirdropFailed(string reason);
    event ApprovalRefreshed(address token, address spender, uint256 amount);
    event WaitingForTreasuryTransfer(uint256 amount);
    event SwapProxySet(address indexed proxyAddress);
    event ManualSwapCompleted(uint256 tokenAmount, uint256 ethReceived);
    event ETHReceived(address indexed sender, uint256 amount);

    uint256 private _pendingLiquidityTokens;
    uint256 private _pendingAirdropTokens;
    bool private _initialized;
    bool private _inSwap;

    // Proxy kontrat adresi
    address public swapProxy;
    bool public swapProxySet;

    constructor() ERC20("FARMER", "FARM") Ownable(msg.sender) {
        address _metropolisRouter = 0x95a7e403d7cF20F675fF9273D66e94d35ba49fA3;
        address _metropolisFactory = 0x1570300e9cFEC66c9Fb0C8bc14366C86EB170Ad0;
        address _sonicToken = 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38;
        address _treasuryWallet = 0x95503A306cD81e08c0c43C49FAae71165937d175;

        require(_metropolisRouter != address(0) && _metropolisFactory != address(0) && _sonicToken != address(0) && _treasuryWallet != address(0), "F1");

        metropolisRouter = IMetropolisRouter(_metropolisRouter);
        metropolisFactory = IMetropolisFactory(_metropolisFactory);
        sonicToken = _sonicToken;
        treasuryWallet = _treasuryWallet;

        _mint(address(this), TOTAL_SUPPLY);
    }

    function initialize() external onlyOwner {
        require(!_initialized, "F2");
        _initialized = true;

        // Try to get existing pair first
        liquidityPair = metropolisFactory.getPair(address(this), sonicToken);
        
        // If pair doesn't exist, create it
        if (liquidityPair == address(0)) {
            liquidityPair = metropolisFactory.createPair(address(this), sonicToken);
        }
        
        require(liquidityPair != address(0), "F3");

        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        require(IERC20(sonicToken).approve(address(metropolisRouter), type(uint256).max), "F4");
        IERC20(sonicToken).approve(liquidityPair, type(uint256).max);
        IERC20(address(this)).approve(liquidityPair, type(uint256).max);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        // Vergi işleme mantığı
        if (
            !_inSwap && 
            from != owner() && 
            to != owner() && 
            from != address(this) && 
            to == liquidityPair
        ) {
            // Vergi hesapla
            uint256 taxAmount = amount * TAX_RATE / 100;
            
            if (taxAmount > 0) {
                // Vergiyi likidite ve airdrop için ayır
                uint256 liquidityTokens = taxAmount * LIQUIDITY_TAX / 100;
                uint256 airdropTokens = taxAmount * AIRDROP_TAX / 100;
                
                // Vergi miktarını ana miktardan düş
                uint256 transferAmount = amount - taxAmount;
                
                // Vergiyi kontrata aktar
                super._transfer(from, address(this), taxAmount);
                
                // Kalan miktarı alıcıya aktar
                super._transfer(from, to, transferAmount);
                
                // Bekleyen miktarları güncelle
                _pendingLiquidityTokens += liquidityTokens;
                _pendingAirdropTokens += airdropTokens;
                
                // Eğer bekleyen tokenlar belirli bir miktarı aşarsa, işlemi başlat
                // Büyük satışlarda E5 hatasını önlemek için maksimum işlem miktarını sınırlıyoruz
                uint256 maxProcessAmount = 100 * 10**18; // Maksimum 100 token işlenecek (daha düşük değer)
                
                if (_pendingLiquidityTokens + _pendingAirdropTokens >= MIN_TOKENS_FOR_PROCESS) {
                    // Eğer bekleyen token miktarı çok fazlaysa, sadece bir kısmını işle
                    if (_pendingLiquidityTokens + _pendingAirdropTokens > maxProcessAmount) {
                        // Büyük miktarlar için işlemi başlatma, bir sonraki satışta daha küçük miktarla işlenecek
                        // Bu, E5 hatasını önlemeye yardımcı olur
                        emit ProcessStarted(_pendingLiquidityTokens, _pendingAirdropTokens);
                    } else {
                        // Normal işlemi başlat - try/catch bloğunu genişlet
                        try this.processLiquidityAndAirdrop() {
                            // İşlem başarılı
                        } catch Error(string memory reason) {
                            // Hata durumunda event yayınla
                            emit SwapFailed(reason);
                        } catch {
                            // Bilinmeyen hata durumunda event yayınla
                            emit SwapFailed("Unknown error in processLiquidityAndAirdrop");
                        }
                    }
                }
                
                // Holder durumunu güncelle
                _updateHolder(from, balanceOf(from) >= MIN_HOLDER_AMOUNT);
                _updateHolder(to, balanceOf(to) >= MIN_HOLDER_AMOUNT);
                
                return;
            }
        }
        
        // Normal transfer
        super._transfer(from, to, amount);
        
        // Holder durumunu güncelle
        _updateHolder(from, balanceOf(from) >= MIN_HOLDER_AMOUNT);
        _updateHolder(to, balanceOf(to) >= MIN_HOLDER_AMOUNT);
    }

    function _updateHolder(address account, bool isHolderStatus) private {
        if (account != liquidityPair && account != address(this)) {
            if (isHolderStatus && !isHolder[account]) {
                isHolder[account] = true;
                holders.push(account);
            } else if (!isHolderStatus && isHolder[account]) {
                isHolder[account] = false;
                
                // Remove from holders array
                for (uint256 i = 0; i < holders.length; i++) {
                    if (holders[i] == account) {
                        holders[i] = holders[holders.length - 1];
                        holders.pop();
                        break;
                    }
                }
            }
        }
    }

    function processLiquidityAndAirdrop() external nonReentrant {
        require(!_inSwap, "AP");
        _inSwap = true;
        
        uint256 tokensForLiquidity = _pendingLiquidityTokens;
        uint256 tokensForAirdrop = _pendingAirdropTokens;
        
        if (tokensForLiquidity == 0 && tokensForAirdrop == 0) {
            _inSwap = false;
            return;
        }
        
        // Kontratın token bakiyesini kontrol et
        uint256 contractTokenBalance = balanceOf(address(this));
        uint256 totalTokensToProcess = tokensForLiquidity + tokensForAirdrop;
        
        if (contractTokenBalance < totalTokensToProcess) {
            emit SwapFailed("Insufficient token balance");
            _inSwap = false;
            return;
        }
        
        // Maksimum işlem miktarını sınırla
        uint256 maxProcessAmount = 100 * 10**18; // Maksimum 100 token işlenecek (daha düşük değer)
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForAirdrop;
        
        // Eğer toplam miktar maksimum miktardan fazlaysa, sadece bir kısmını işle
        if (totalTokensToSwap > maxProcessAmount) {
            // Oranları koru
            uint256 ratio = maxProcessAmount * 1e18 / totalTokensToSwap;
            tokensForLiquidity = tokensForLiquidity * ratio / 1e18;
            tokensForAirdrop = tokensForAirdrop * ratio / 1e18;
            totalTokensToSwap = tokensForLiquidity + tokensForAirdrop;
            
            // Bekleyen miktarları güncelle
            _pendingLiquidityTokens -= tokensForLiquidity;
            _pendingAirdropTokens -= tokensForAirdrop;
        } else {
            // Tüm bekleyen miktarları sıfırla
            _pendingLiquidityTokens = 0;
            _pendingAirdropTokens = 0;
        }
        
        emit ProcessStarted(tokensForLiquidity, tokensForAirdrop);
        
        // Refresh approvals
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        // Başlangıç ETH bakiyesini kaydet
        uint256 initialEthBalance = address(this).balance;
        
        // Process swap - ETH doğrudan kontrata gelecek
        uint256 ethReceived = _processSwap(totalTokensToSwap);
        
        if (ethReceived == 0) {
            _inSwap = false;
            return;
        }
        
        // Kontratın ETH bakiyesini kontrol et
        uint256 contractEthBalance = address(this).balance;
        if (contractEthBalance <= initialEthBalance) {
            emit SwapFailed("No ETH received from swap");
            _inSwap = false;
            return;
        }
        
        // Gerçek ETH miktarını hesapla
        uint256 actualEthReceived = contractEthBalance - initialEthBalance;
        
        // Calculate amounts
        uint256 ethForLiquidity = actualEthReceived * tokensForLiquidity / totalTokensToSwap;
        uint256 ethForAirdrop = actualEthReceived - ethForLiquidity;
        
        // ETH ile likidite ekle
        if (ethForLiquidity > 0) {
            _addLiquidity(ethForLiquidity, tokensForLiquidity);
        }
        
        // Process airdrop with ETH
        if (ethForAirdrop > 0) {
            _processAirdropWithETH(ethForAirdrop);
        }
        
        _inSwap = false;
    }

    // Likidite işlemini ayrı bir fonksiyona taşıdık
    function _processLiquidity(uint256 wethAmount, uint256 tokenAmount) private {
        // Bu fonksiyon artık kullanılmıyor, kaldırılabilir
        // Doğrudan _addLiquidity fonksiyonu kullanılıyor
    }

    // Likidite ekleme işlemi
    function _addLiquidity(uint256 ethAmount, uint256 tokenAmount) private {
        // Kontratın token bakiyesini kontrol et
        uint256 contractTokenBalance = balanceOf(address(this));
        if (contractTokenBalance < tokenAmount) {
            emit LiquidityAddFailed("Insufficient token balance for liquidity");
            return;
        }
        
        // Daha yüksek slippage toleransı için minimum miktarları düşür
        uint256 minTokenAmount = tokenAmount * (100 - MAX_SLIPPAGE) / 100;
        uint256 minEthAmount = ethAmount * (100 - MAX_SLIPPAGE) / 100;
        
        // Swap işleminde kullanılacak token'lar için onay ver
        _approve(address(this), address(metropolisRouter), tokenAmount);
        
        try metropolisRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            minTokenAmount,
            minEthAmount,
            address(this),
            block.timestamp + 3600 // Deadline'ı 1 saate çıkardık
        ) {
            emit LiquidityAdded(tokenAmount, ethAmount);
        } catch Error(string memory reason) {
            emit LiquidityAddFailed(reason);
        } catch {
            emit LiquidityAddFailed("Unknown liquidity add error");
        }
    }

    function _processSwap(uint256 tokenAmount) private returns (uint256) {
        if (tokenAmount == 0) return 0;
        require(swapProxySet, "Swap proxy not set");
        
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = metropolisRouter.WETH();
        
        // Swap işlemi için minimum çıktı miktarını hesapla
        // Daha yüksek slippage toleransı için minimum çıktı miktarını 0 olarak ayarlıyoruz
        uint256 minAmountOut = 0; // Minimum çıktı miktarı 0 olarak ayarlandı
        
        // Swap işleminden önce onayları yenile
        _approve(address(this), address(metropolisRouter), tokenAmount);
        
        // Gas limitini artır ve deadline'ı uzat
        uint256 deadline = block.timestamp + 3600; // 1 saat
        
        // Başlangıç ETH bakiyesini kaydet
        uint256 initialEthBalance = address(this).balance;
        
        // FARMER -> ETH swap işlemi - FeeOnTransfer fonksiyonu kullanıyoruz
        try metropolisRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            minAmountOut,
            path,
            swapProxy, // ETH'yi proxy kontrata gönder
            deadline
        ) {
            // Swap başarılı oldu, proxy kontratın ETH'yi kontrata göndermesini iste
            try ISwapProxy(swapProxy).sendETHToFarmer() {
                // Kontratın ETH bakiyesini kontrol et
                uint256 contractEthBalance = address(this).balance;
                uint256 ethReceived = contractEthBalance - initialEthBalance;
                
                if (ethReceived > 0) {
                    emit SwapSuccessful(tokenAmount, ethReceived);
                    return ethReceived;
                } else {
                    emit SwapFailed("No ETH received after proxy transfer");
                    return 0;
                }
            } catch Error(string memory reason) {
                emit SwapFailed(string(abi.encodePacked("Proxy ETH transfer failed: ", reason)));
                return 0;
            } catch {
                emit SwapFailed("Proxy ETH transfer failed: unknown error");
                return 0;
            }
        } catch Error(string memory reason) {
            emit SwapFailed(reason);
            return 0;
        } catch {
            emit SwapFailed("Unknown swap error");
            return 0;
        }
    }

    // WETH ile airdrop işlemi
    function _processAirdropWithETH(uint256 amount) private {
        uint256 holdersCount = holders.length;
        if (holdersCount == 0 || amount == 0) return;
        
        // Treasury wallet için %25 pay ayır
        uint256 treasuryAmount = amount * 25 / 100;
        uint256 holderAmount = amount - treasuryAmount;
        
        // Treasury wallet'a ETH gönder
        if (treasuryAmount > 0 && treasuryWallet != address(0)) {
            (bool treasurySuccess, ) = treasuryWallet.call{value: treasuryAmount}("");
            if (!treasurySuccess) {
                emit AirdropFailed("Treasury ETH transfer failed");
                // Treasury transfer başarısız olursa tutar holder'lara eklensin
                holderAmount = amount;
            }
        } else {
            // Treasury wallet ayarlanmamışsa tüm miktarı holder'lara dağıt
            holderAmount = amount;
        }
        
        // Holder'lara ETH dağıt
        if (holdersCount > 0 && holderAmount > 0) {
            uint256 amountPerHolder = holderAmount / holdersCount;
            if (amountPerHolder > 0) {
                for (uint256 i = 0; i < holdersCount; i++) {
                    address holder = holders[i];
                    if (holder != address(0) && holder != address(this) && holder != liquidityPair) {
                        // ETH'yi doğrudan holder'a gönder
                        (bool success, ) = holder.call{value: amountPerHolder}("");
                        if (!success) {
                            emit AirdropFailed("ETH transfer failed");
                        }
                    }
                }
            }
        }
        
        emit AirdropDistributed(amount, holdersCount);
    }

    // View functions
    function getHolderCount() external view returns (uint256) {
        return holders.length;
    }
    
    function getHolders() external view returns (address[] memory) {
        return holders;
    }

    // Initial liquidity function with WSonic
    function addInitialLiquidityWithWSonic(uint256 tokenAmount, uint256 sonicAmount) external onlyOwner {
        require(tokenAmount > 0, "NT");
        require(sonicAmount > 0, "NS");
        
        require(
            IERC20(address(this)).balanceOf(address(this)) >= tokenAmount,
            "IB"
        );
        
        require(
            IERC20(sonicToken).balanceOf(msg.sender) >= sonicAmount,
            "IS"
        );
        
        // WSonic token'ları kontrata transfer et
        require(
            IERC20(sonicToken).transferFrom(msg.sender, address(this), sonicAmount),
            "TF"
        );
        
        // Onayları ver
        _approve(address(this), address(metropolisRouter), tokenAmount);
        IERC20(sonicToken).approve(address(metropolisRouter), sonicAmount);
        
        try metropolisRouter.addLiquidity(
            address(this),
            sonicToken,
            tokenAmount,
            sonicAmount,
            0, // Minimum token miktarı 0 olarak ayarlandı
            0, // Minimum sonic miktarı 0 olarak ayarlandı
            msg.sender,
            block.timestamp + 600 // Deadline'ı artırdık
        ) {
            emit LiquidityAdded(tokenAmount, sonicAmount);
        } catch Error(string memory reason) {
            _approve(address(this), address(metropolisRouter), 0);
            IERC20(sonicToken).approve(address(metropolisRouter), 0);
            
            // WSonic token'ları geri gönder
            IERC20(sonicToken).transfer(msg.sender, sonicAmount);
            
            revert(reason); // Hata mesajını döndür
        } catch {
            _approve(address(this), address(metropolisRouter), 0);
            IERC20(sonicToken).approve(address(metropolisRouter), 0);
            
            // WSonic token'ları geri gönder
            IERC20(sonicToken).transfer(msg.sender, sonicAmount);
            
            revert("FL");
        }
        
        // Kalan WSonic token'ları geri gönder
        uint256 remainingWSonic = IERC20(sonicToken).balanceOf(address(this));
        if (remainingWSonic > 0) {
            IERC20(sonicToken).transfer(msg.sender, remainingWSonic);
        }
    }

    // Tüm FARMER tokenlarını ETH ile likiditeye eklemek için fonksiyon
    function addInitialLiquidityWithAllTokensAndETH() external payable onlyOwner {
        uint256 tokenAmount = IERC20(address(this)).balanceOf(address(this));
        require(tokenAmount > 0, "NT");
        require(msg.value > 0, "NE");
        
        // Onayları ver
        _approve(address(this), address(metropolisRouter), tokenAmount);
        
        try metropolisRouter.addLiquidityETH{value: msg.value}(
            address(this),
            tokenAmount,
            0, // Minimum token miktarı 0 olarak ayarlandı
            0, // Minimum ETH miktarı 0 olarak ayarlandı
            msg.sender,
            block.timestamp + 600 // Deadline'ı artırdık
        ) {
            emit LiquidityAdded(tokenAmount, msg.value);
        } catch Error(string memory reason) {
            _approve(address(this), address(metropolisRouter), 0);
            
            // ETH'yi geri gönder
            payable(msg.sender).transfer(address(this).balance);
            
            revert(reason); // Hata mesajını döndür
        } catch {
            _approve(address(this), address(metropolisRouter), 0);
            
            // ETH'yi geri gönder
            payable(msg.sender).transfer(address(this).balance);
            
            revert("FL");
        }
    }

    function setRouter(address _router) external onlyOwner {
        require(_router != address(0), "IR");
        metropolisRouter = IMetropolisRouter(_router);
    }

    function rescueTokens(address _token, uint256 _amount) external onlyOwner {
        require(_token != address(this), "CF");
        IERC20(_token).transfer(owner(), _amount);
    }

    // View functions for pending amounts
    function getPendingLiquidityTokens() external view returns (uint256) {
        return _pendingLiquidityTokens;
    }

    function getPendingAirdropTokens() external view returns (uint256) {
        return _pendingAirdropTokens;
    }

    // Manual trigger for processing (only owner)
    function triggerProcessing() external onlyOwner {
        require(_pendingLiquidityTokens > 0 || _pendingAirdropTokens > 0, "NP");
        require(holders.length > 0, "NH");
        try this.processLiquidityAndAirdrop() {
            // Process successful
        } catch {
            emit ProcessStarted(_pendingLiquidityTokens, _pendingAirdropTokens);
        }
    }

    // Router için onayları yenile
    function refreshAllApprovals() external onlyOwner {
        // Router için onayları yenile
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        // Sonic token için onayları yenile
        try IERC20(sonicToken).approve(address(metropolisRouter), type(uint256).max) {
            emit ApprovalRefreshed(sonicToken, address(metropolisRouter), type(uint256).max);
        } catch {}
        
        // Likidite çifti için onayları yenile
        if (liquidityPair != address(0)) {
            try IERC20(sonicToken).approve(liquidityPair, type(uint256).max) {
                emit ApprovalRefreshed(sonicToken, liquidityPair, type(uint256).max);
            } catch {}
            
            try IERC20(address(this)).approve(liquidityPair, type(uint256).max) {
                emit ApprovalRefreshed(address(this), liquidityPair, type(uint256).max);
            } catch {}
        }
    }

    // Manuel swap işlemi
    function manualSwap(uint256 tokenAmount) external onlyOwner nonReentrant {
        require(tokenAmount > 0, "Amount must be greater than 0");
        require(tokenAmount <= balanceOf(address(this)), "Insufficient balance");
        require(swapProxySet, "Swap proxy not set");
        
        // Swap işlemi
        uint256 ethReceived = _processSwap(tokenAmount);
        
        // Swap sonucunu kontrol et
        require(ethReceived > 0, "Swap failed, no ETH received");
        
        emit ManualSwapCompleted(tokenAmount, ethReceived);
    }

    // Treasury wallet'ı güncelleme fonksiyonu
    function setTreasuryWallet(address newTreasuryWallet) external onlyOwner {
        require(newTreasuryWallet != address(0), "ZA");
        
        address oldTreasury = treasuryWallet;
        treasuryWallet = newTreasuryWallet;
        
        emit TreasuryWalletUpdated(oldTreasury, newTreasuryWallet);
    }

    // Manuel likidite ve airdrop işlemi
    function manualLiquidityAndAirdrop(uint256 tokenAmount) external onlyOwner {
        require(tokenAmount > 0, "NT");
        require(IERC20(address(this)).balanceOf(address(this)) >= tokenAmount, "IB");
        
        // Refresh approvals
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        // Başlangıç ETH bakiyesini kaydet
        uint256 initialEthBalance = address(this).balance;
        
        // Swap işlemini gerçekleştir
        uint256 ethReceived = _processSwap(tokenAmount);
        
        if (ethReceived == 0) {
            return;
        }
        
        // Kontratın ETH bakiyesini kontrol et
        uint256 contractEthBalance = address(this).balance;
        if (contractEthBalance <= initialEthBalance) {
            emit SwapFailed("No ETH received from swap");
            return;
        }
        
        // Gerçek ETH miktarını hesapla
        uint256 actualEthReceived = contractEthBalance - initialEthBalance;
        
        // Calculate amounts
        uint256 ethForLiquidity = actualEthReceived * LIQUIDITY_TAX / 100;
        uint256 ethForAirdrop = actualEthReceived * AIRDROP_TAX / 100;
        
        // ETH ile likidite ekle
        if (ethForLiquidity > 0) {
            _addLiquidity(ethForLiquidity, tokenAmount * LIQUIDITY_TAX / 100);
        }
        
        // Process airdrop with ETH
        if (ethForAirdrop > 0) {
            _processAirdropWithETH(ethForAirdrop);
        }
    }

    // Kontratın ETH alabilmesi için receive fonksiyonu
    receive() external payable {
        // ETH alındığında event yayınla
        if (msg.value > 0) {
            emit ETHReceived(msg.sender, msg.value);
        }
    }

    // Swap proxy adresini ayarla
    function setSwapProxy(address _swapProxy) external onlyOwner {
        require(!swapProxySet, "Proxy already set");
        require(_swapProxy != address(0), "Invalid proxy address");
        swapProxy = _swapProxy;
        swapProxySet = true;
        emit SwapProxySet(_swapProxy);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"holdersCount","type":"uint256"}],"name":"AirdropDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"AirdropFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ApprovalRefreshed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ETHReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"LiquidityAddFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sonicAmount","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"}],"name":"ManualSwapCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensForLiquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensForAirdrop","type":"uint256"}],"name":"ProcessStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"SwapFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"proxyAddress","type":"address"}],"name":"SwapProxySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wethReceived","type":"uint256"}],"name":"SwapSuccessful","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldTreasury","type":"address"},{"indexed":false,"internalType":"address","name":"newTreasury","type":"address"}],"name":"TreasuryWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WaitingForTreasuryTransfer","type":"event"},{"inputs":[],"name":"addInitialLiquidityWithAllTokensAndETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"sonicAmount","type":"uint256"}],"name":"addInitialLiquidityWithWSonic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHolderCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHolders","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingAirdropTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingLiquidityTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"holders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"manualLiquidityAndAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"metropolisFactory","outputs":[{"internalType":"contract IMetropolisFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metropolisRouter","outputs":[{"internalType":"contract IMetropolisRouter","name":"","type":"address"}],"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":"processLiquidityAndAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refreshAllApprovals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_swapProxy","type":"address"}],"name":"setSwapProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTreasuryWallet","type":"address"}],"name":"setTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sonicToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapProxySet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"triggerProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b5033604051806040016040528060068152602001652320a926a2a960d11b815250604051806040016040528060048152602001634641524d60e01b815250816003908162000060919062000314565b5060046200006f828262000314565b50506001600555506001600160a01b038116620000b85760405162461bcd60e51b81526020600482015260026024820152614f3160f01b60448201526064015b60405180910390fd5b620000c38162000171565b50600780547395a7e403d7cf20f675ff9273d66e94d35ba49fa36001600160a01b0319918216811790925560088054731570300e9cfec66c9fb0c8bc14366c86eb170ad090831681179091556009805473039e2fb66102314ce7b64ce5ce3e5183bc94ad389084168117909155600b80547395503a306cd81e08c0c43c49faae71165937d1759416841790559091620001673069d3c21bcecceda1000000620001c3565b5050505062000408565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620002005760405162461bcd60e51b8152602060048201526002602482015261453360f01b6044820152606401620000af565b8060026000828254620002149190620003e0565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200029b57607f821691505b602082108103620002bc57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200026b57600081815260208120601f850160051c81016020861015620002eb5750805b601f850160051c820191505b818110156200030c57828155600101620002f7565b505050505050565b81516001600160401b0381111562000330576200033062000270565b620003488162000341845462000286565b84620002c2565b602080601f831160018114620003805760008415620003675750858301515b600019600386901b1c1916600185901b1785556200030c565b600085815260208120601f198616915b82811015620003b15788860151825594840194600190910190840162000390565b5085821015620003d05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200040257634e487b7160e01b600052601160045260246000fd5b92915050565b613a9680620004186000396000f3fe6080604052600436106102135760003560e01c8063808a545711610118578063c0d78655116100a0578063dd62ed3e1161006f578063dd62ed3e14610633578063e3a8fa5514610679578063ed9cacfe14610681578063f2fde38b14610696578063fd7c9fab146106b657600080fd5b8063c0d78655146105a3578063c84a705c146105c3578063d4d7b19a146105e3578063d720a2a81461061357600080fd5b8063975b87e8116100e7578063975b87e814610502578063a8602fea14610522578063a9059cbb14610542578063b70143c914610562578063b9276e4b1461058257600080fd5b8063808a54571461049a5780638129fc1c146104ba5780638da5cb5b146104cf57806395d89b41146104ed57600080fd5b80634626402b1161019b57806362b6327a1161016a57806362b6327a1461040a5780636ec4be901461042a57806370a08231146104505780637136982b146104705780637ac84fc11461048557600080fd5b80634626402b1461039357806357376198146103b35780635d76b04c146103d35780635fe8e7cc146103e857600080fd5b806323b872dd116101e257806323b872dd146102ea5780632a11ced01461030a578063313ce56714610342578063397883d21461035e578063461a3a951461037357600080fd5b806306fdde031461025b57806308dee2b414610286578063095ea7b3146102a557806318160ddd146102d557600080fd5b366102565734156102545760405134815233907fbfe611b001dfcd411432f7bf0d79b82b4b2ee81511edac123a3403c357fb972a9060200160405180910390a25b005b600080fd5b34801561026757600080fd5b506102706106d6565b60405161027d919061352c565b60405180910390f35b34801561029257600080fd5b50600e545b60405190815260200161027d565b3480156102b157600080fd5b506102c56102c0366004613574565b610768565b604051901515815260200161027d565b3480156102e157600080fd5b50600254610297565b3480156102f657600080fd5b506102c56103053660046135a0565b610782565b34801561031657600080fd5b5061032a6103253660046135e1565b6107a6565b6040516001600160a01b03909116815260200161027d565b34801561034e57600080fd5b506040516012815260200161027d565b34801561036a57600080fd5b506102546107d0565b34801561037f57600080fd5b5060095461032a906001600160a01b031681565b34801561039f57600080fd5b50600b5461032a906001600160a01b031681565b3480156103bf57600080fd5b506102546103ce366004613574565b6108ee565b3480156103df57600080fd5b50600f54610297565b3480156103f457600080fd5b506103fd6109ba565b60405161027d919061363e565b34801561041657600080fd5b5060075461032a906001600160a01b031681565b34801561043657600080fd5b5060105461032a906201000090046001600160a01b031681565b34801561045c57600080fd5b5061029761046b366004613658565b610a1b565b34801561047c57600080fd5b50600d54610297565b34801561049157600080fd5b50610254610a36565b3480156104a657600080fd5b50600a5461032a906001600160a01b031681565b3480156104c657600080fd5b50610254610da9565b3480156104db57600080fd5b506006546001600160a01b031661032a565b3480156104f957600080fd5b5061027061111f565b34801561050e57600080fd5b5061025461051d366004613675565b61112e565b34801561052e57600080fd5b5061025461053d366004613658565b611871565b34801561054e57600080fd5b506102c561055d366004613574565b611915565b34801561056e57600080fd5b5061025461057d3660046135e1565b611923565b34801561058e57600080fd5b506010546102c590600160b01b900460ff1681565b3480156105af57600080fd5b506102546105be366004613658565b611af0565b3480156105cf57600080fd5b506102546105de366004613658565b611b55565b3480156105ef57600080fd5b506102c56105fe366004613658565b600c6020526000908152604090205460ff1681565b34801561061f57600080fd5b5061025461062e3660046135e1565b611c5e565b34801561063f57600080fd5b5061029761064e366004613697565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610254611e30565b34801561068d57600080fd5b5061025461207e565b3480156106a257600080fd5b506102546106b1366004613658565b6122f7565b3480156106c257600080fd5b5060085461032a906001600160a01b031681565b6060600380546106e5906136d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610711906136d0565b801561075e5780601f106107335761010080835404028352916020019161075e565b820191906000526020600020905b81548152906001019060200180831161074157829003601f168201915b5050505050905090565b600033610776818585612343565b60019150505b92915050565b6000336107908582856123f5565b61079b85858561245d565b506001949350505050565b600d81815481106107b657600080fd5b6000918252602090912001546001600160a01b0316905081565b6107d8612783565b6000600e5411806107eb57506000600f54115b6108215760405162461bcd60e51b815260206004820152600260248201526104e560f41b60448201526064015b60405180910390fd5b600d546108555760405162461bcd60e51b815260206004820152600260248201526109c960f31b6044820152606401610818565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561089057600080fd5b505af19250505080156108a1575060015b6108ec577f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd600e54600f546040516108e3929190918252602082015260400190565b60405180910390a15b565b6108f6612783565b306001600160a01b038316036109335760405162461bcd60e51b815260206004820152600260248201526121a360f11b6044820152606401610818565b816001600160a01b031663a9059cbb6109546006546001600160a01b031690565b836040518363ffffffff1660e01b815260040161097292919061370a565b6020604051808303816000875af1158015610991573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b59190613723565b505050565b6060600d80548060200260200160405190810160405280929190818152602001828054801561075e57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109f4575050505050905090565b6001600160a01b031660009081526020819052604090205490565b600260055403610a6d5760405162461bcd60e51b8152602060048201526002602482015261523160f01b6044820152606401610818565b6002600555601054610100900460ff1615610aaf5760405162461bcd60e51b8152602060048201526002602482015261041560f41b6044820152606401610818565b6010805461ff001916610100179055600e54600f5481158015610ad0575080155b15610ae75750506010805461ff0019169055610da2565b6000610af230610a1b565b90506000610b00838561375b565b905080821015610b7457600080516020613a41833981519152604051610b57906020808252601a908201527f496e73756666696369656e7420746f6b656e2062616c616e6365000000000000604082015260600190565b60405180910390a150506010805461ff001916905550610da29050565b68056bc75e2d631000006000610b8a858761375b565b905081811115610c3657600081610ba984670de0b6b3a764000061376e565b610bb39190613785565b9050670de0b6b3a7640000610bc8828961376e565b610bd29190613785565b9650670de0b6b3a7640000610be7828861376e565b610bf19190613785565b9550610bfd868861375b565b915086600e6000828254610c1191906137a7565b9250508190555085600f6000828254610c2a91906137a7565b90915550610c41915050565b6000600e819055600f555b60408051878152602081018790527f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd910160405180910390a1600754610c949030906001600160a01b0316600019612343565b476000610ca0836127d1565b905080600003610cc35750506010805461ff001916905550610da2945050505050565b47828111610d3657600080516020613a41833981519152604051610d149060208082526019908201527804e6f204554482072656365697665642066726f6d207377617603c1b604082015260600190565b60405180910390a150506010805461ff001916905550610da295505050505050565b6000610d4284836137a7565b9050600085610d518c8461376e565b610d5b9190613785565b90506000610d6982846137a7565b90508115610d7b57610d7b828d612c45565b8015610d8a57610d8a81612ed1565b50506010805461ff0019169055505050505050505050505b6001600555565b610db1612783565b60105460ff1615610de95760405162461bcd60e51b8152602060048201526002602482015261231960f11b6044820152606401610818565b6010805460ff1916600117905560085460095460405163e6a4390560e01b81523060048201526001600160a01b03918216602482015291169063e6a4390590604401602060405180830381865afa158015610e48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6c91906137ba565b600a80546001600160a01b0319166001600160a01b03929092169182179055610f28576008546009546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015610ee3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0791906137ba565b600a80546001600160a01b0319166001600160a01b03929092169190911790555b600a546001600160a01b0316610f655760405162461bcd60e51b8152602060048201526002602482015261463360f01b6044820152606401610818565b600754610f7f9030906001600160a01b0316600019612343565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392610fb7929116906000199060040161370a565b6020604051808303816000875af1158015610fd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffa9190613723565b61102b5760405162461bcd60e51b8152602060048201526002602482015261118d60f21b6044820152606401610818565b600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611063929116906000199060040161370a565b6020604051808303816000875af1158015611082573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a69190613723565b50600a5460405163095ea7b360e01b8152309163095ea7b3916110d9916001600160a01b0316906000199060040161370a565b6020604051808303816000875af11580156110f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111c9190613723565b50565b6060600480546106e5906136d0565b611136612783565b600082116111565760405162461bcd60e51b8152600401610818906137d7565b6000811161118b5760405162461bcd60e51b81526020600482015260026024820152614e5360f01b6044820152606401610818565b6040516370a0823160e01b8152306004820181905283916370a0823190602401602060405180830381865afa1580156111c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ec91906137f3565b101561121f5760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610818565b6009546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015611267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128b91906137f3565b10156112be5760405162461bcd60e51b8152602060048201526002602482015261495360f01b6044820152606401610818565b6009546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906112f29033903090869060040161380c565b6020604051808303816000875af1158015611311573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113359190613723565b6113665760405162461bcd60e51b81526020600482015260026024820152612a2360f11b6044820152606401610818565b60075461137e9030906001600160a01b031684612343565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926113b492911690859060040161370a565b6020604051808303816000875af11580156113d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f79190613723565b506007546009546001600160a01b039182169163e8e33700913091168585600080336114254261025861375b565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af19250505080156114bd575060408051601f3d908101601f191682019092526114ba91810190613830565b60015b611745576114c961385e565b806308c379a00361160c57506114dd6138b5565b806114e8575061160e565b6007546115019030906001600160a01b03166000612343565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926115389291169060009060040161370a565b6020604051808303816000875af1158015611557573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157b9190613723565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906115ae903390869060040161370a565b6020604051808303816000875af11580156115cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f19190613723565b508060405162461bcd60e51b8152600401610818919061352c565b505b6007546116279030906001600160a01b03166000612343565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b39261165e9291169060009060040161370a565b6020604051808303816000875af115801561167d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a19190613723565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906116d4903390859060040161370a565b6020604051808303816000875af11580156116f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117179190613723565b5060405162461bcd60e51b8152602060048201526002602482015261119360f21b6044820152606401610818565b505060408051848152602081018490527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a16009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156117ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ee91906137f3565b905080156109b55760095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611828903390859060040161370a565b6020604051808303816000875af1158015611847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186b9190613723565b50505050565b611879612783565b6001600160a01b0381166118b45760405162461bcd60e51b81526020600482015260026024820152615a4160f01b6044820152606401610818565b600b80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fa982575859d7ad2f390dc12b23f7dab8bbda047f9d0140ac68344b27bf34bfb4910160405180910390a15050565b60003361077681858561245d565b61192b612783565b6002600554036119625760405162461bcd60e51b8152602060048201526002602482015261523160f01b6044820152606401610818565b6002600555806119b45760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610818565b6119bd30610a1b565b811115611a035760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610818565b601054600160b01b900460ff16611a515760405162461bcd60e51b815260206004820152601260248201527114ddd85c081c1c9bde1e481b9bdd081cd95d60721b6044820152606401610818565b6000611a5c826127d1565b905060008111611aae5760405162461bcd60e51b815260206004820152601c60248201527f53776170206661696c65642c206e6f20455448207265636569766564000000006044820152606401610818565b60408051838152602081018390527f83dcf65fd6004d3203d0b493e4d86ef58c3565fa57812dbd28c5a903e247c44f910160405180910390a150506001600555565b611af8612783565b6001600160a01b038116611b335760405162461bcd60e51b815260206004820152600260248201526124a960f11b6044820152606401610818565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b611b5d612783565b601054600160b01b900460ff1615611bab5760405162461bcd60e51b8152602060048201526011602482015270141c9bde1e48185b1c9958591e481cd95d607a1b6044820152606401610818565b6001600160a01b038116611bf95760405162461bcd60e51b8152602060048201526015602482015274496e76616c69642070726f7879206164647265737360581b6044820152606401610818565b6010805460ff60b01b196001600160a01b0384166201000081029190911662010000600160b81b031990921691909117600160b01b179091556040517f65c4b302ff508168aab64a17ebe745806b65caba61b745d8aff18fb69cb0937290600090a250565b611c66612783565b60008111611c865760405162461bcd60e51b8152600401610818906137d7565b6040516370a0823160e01b8152306004820181905282916370a0823190602401602060405180830381865afa158015611cc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce791906137f3565b1015611d1a5760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610818565b600754611d349030906001600160a01b0316600019612343565b476000611d40836127d1565b905080600003611d4f57505050565b47828111611dae57600080516020613a41833981519152604051611da09060208082526019908201527804e6f204554482072656365697665642066726f6d207377617603c1b604082015260600190565b60405180910390a150505050565b6000611dba84836137a7565b905060006064611dcb60198461376e565b611dd59190613785565b905060006064611de660198561376e565b611df09190613785565b90508115611e1857611e18826064611e0960198b61376e565b611e139190613785565b612c45565b8015611e2757611e2781612ed1565b50505050505050565b611e38612783565b6040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa158015611e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9a91906137f3565b905060008111611ebc5760405162461bcd60e51b8152600401610818906137d7565b60003411611ef15760405162461bcd60e51b81526020600482015260026024820152614e4560f01b6044820152606401610818565b600754611f099030906001600160a01b031683612343565b6007546001600160a01b031663f305d71934308460008033611f2d4261025861375b565b6040518863ffffffff1660e01b8152600401611f4e9695949392919061393f565b60606040518083038185885af193505050508015611f89575060408051601f3d908101601f19168201909252611f8691810190613830565b60015b61204057611f9561385e565b806308c379a003611ff95750611fa96138b5565b80611fb45750611ffb565b600754611fcd9030906001600160a01b03166000612343565b60405133904780156108fc02916000818181858888f193505050501580156115f1573d6000803e3d6000fd5b505b6007546120149030906001600160a01b03166000612343565b60405133904780156108fc02916000818181858888f19350505050158015611717573d6000803e3d6000fd5b5050604080518381523460208201527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a150565b612086612783565b6007546120a09030906001600160a01b0316600019612343565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926120d8929116906000199060040161370a565b6020604051808303816000875af1925050508015612113575060408051601f3d908101601f1916820190925261211091810190613723565b60015b1561216957506009546007546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92612160926001600160a01b03918216929116906000199061380c565b60405180910390a15b600a546001600160a01b0316156108ec57600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926121b2929116906000199060040161370a565b6020604051808303816000875af19250505080156121ed575060408051601f3d908101601f191682019092526121ea91810190613723565b60015b156122435750600954600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca9261223a926001600160a01b03918216929116906000199061380c565b60405180910390a15b600a5460405163095ea7b360e01b8152309163095ea7b391612275916001600160a01b0316906000199060040161370a565b6020604051808303816000875af19250505080156122b0575060408051601f3d908101601f191682019092526122ad91810190613723565b60015b156108ec5750600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca916108e39130916001600160a01b0316906000199061380c565b6122ff612783565b6001600160a01b03811661233a5760405162461bcd60e51b81526020600482015260026024820152614f3160f01b6044820152606401610818565b61111c8161319e565b6001600160a01b0383161580159061236357506001600160a01b03821615155b6123945760405162461bcd60e51b8152602060048201526002602482015261114d60f21b6044820152606401610818565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054818110156124505760405162461bcd60e51b8152602060048201526002602482015261453560f01b6044820152606401610818565b61186b8484848403612343565b601054610100900460ff1615801561248357506006546001600160a01b03848116911614155b801561249d57506006546001600160a01b03838116911614155b80156124b257506001600160a01b0383163014155b80156124cb5750600a546001600160a01b038381169116145b1561274c57600060646124df60058461376e565b6124e99190613785565b9050801561274a576000606461250060198461376e565b61250a9190613785565b90506000606461251b60198561376e565b6125259190613785565b9050600061253384866137a7565b90506125408730866131f0565b61254b8787836131f0565b82600e600082825461255d919061375b565b9250508190555081600f6000828254612576919061375b565b9091555050600f54600e5468056bc75e2d63100000916802b5e3af16b1880000916125a1919061375b565b1061270d5780600f54600e546125b7919061375b565b1115612608577f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd600e54600f546040516125fb929190918252602082015260400190565b60405180910390a161270d565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561264357600080fd5b505af1925050508015612654575060015b61270d5761266061385e565b806308c379a0036126aa57506126746138b5565b8061267f57506126ac565b600080516020613a418339815191528160405161269c919061352c565b60405180910390a15061270d565b505b600080516020613a418339815191526040516125fb906020808252602b908201527f556e6b6e6f776e206572726f7220696e2070726f636573734c6971756964697460408201526a079416e6441697264726f760ac1b606082015260800190565b61272a88678ac7230489e800006127238b610a1b565b10156132f5565b61274087678ac7230489e800006127238a610a1b565b5050505050505050565b505b6127578383836131f0565b61276d83678ac7230489e8000061272386610a1b565b6109b582678ac7230489e8000061272385610a1b565b336127966006546001600160a01b031690565b6001600160a01b0316146108ec5760405162461bcd60e51b8152602060048201526002602482015261279960f11b6044820152606401610818565b6000816000036127e357506000919050565b601054600160b01b900460ff166128315760405162461bcd60e51b815260206004820152601260248201527114ddd85c081c1c9bde1e481b9bdd081cd95d60721b6044820152606401610818565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106128665761286661397a565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156128bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e391906137ba565b816001815181106128f6576128f661397a565b6001600160a01b03928316602091820292909201015260075460009161291f9130911686612343565b600061292d42610e1061375b565b60075460105460405163791ac94760e01b815292935047926001600160a01b039283169263791ac94792612976928b9289928b9262010000909104909116908990600401613990565b600060405180830381600087803b15801561299057600080fd5b505af19250505080156129a1575060015b612a56576129ad61385e565b806308c379a0036129fe57506129c16138b5565b806129cc5750612a00565b600080516020613a41833981519152816040516129e9919061352c565b60405180910390a15060009695505050505050565b505b600080516020613a41833981519152604051612a42906020808252601290820152712ab735b737bbb71039bbb0b81032b93937b960711b604082015260600190565b60405180910390a150600095945050505050565b601060029054906101000a90046001600160a01b03166001600160a01b0316636ab2fe586040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612aa657600080fd5b505af1925050508015612ab7575060015b612b7c57612ac361385e565b806308c379a003612b1c5750612ad76138b5565b80612ae25750612b1e565b600080516020613a4183398151915281604051602001612b0291906139cc565b60408051601f19818403018152908290526129e99161352c565b505b600080516020613a41833981519152604051612a429060208082526028908201527f50726f787920455448207472616e73666572206661696c65643a20756e6b6e6f6040820152673bb71032b93937b960c11b606082015260800190565b476000612b8983836137a7565b90508015612bd55760408051898152602081018390527fdd819f6d4da11821175805e17c46b8094c817290420e3de00dee96b4d256dc01910160405180910390a1979650505050505050565b600080516020613a41833981519152604051612c2f9060208082526024908201527f4e6f204554482072656365697665642061667465722070726f7879207472616e60408201526339b332b960e11b606082015260800190565b60405180910390a1506000979650505050505050565b6000612c5030610a1b565b905081811015612cd7577fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad604051612cca9060208082526028908201527f496e73756666696369656e7420746f6b656e2062616c616e636520666f72206c604082015267697175696469747960c01b606082015260800190565b60405180910390a1505050565b60006064612ce581806137a7565b612cef908561376e565b612cf99190613785565b905060006064612d0981806137a7565b612d13908761376e565b612d1d9190613785565b600754909150612d389030906001600160a01b031686612343565b6007546001600160a01b031663f305d719863087868683612d5b42610e1061375b565b6040518863ffffffff1660e01b8152600401612d7c9695949392919061393f565b60606040518083038185885af193505050508015612db7575060408051601f3d908101601f19168201909252612db491810190613830565b60015b612e8d57612dc361385e565b806308c379a003612e1f5750612dd76138b5565b80612de25750612e21565b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad81604051612e11919061352c565b60405180910390a150612eca565b505b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad604051612e80906020808252601b908201527f556e6b6e6f776e206c697175696469747920616464206572726f720000000000604082015260600190565b60405180910390a1612eca565b505060408051868152602081018890527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a15b5050505050565b600d54801580612edf575081155b15612ee8575050565b60006064612ef784601961376e565b612f019190613785565b90506000612f0f82856137a7565b9050600082118015612f2b5750600b546001600160a01b031615155b15612ffc57600b546040516000916001600160a01b03169084908381818185875af1925050503d8060008114612f7d576040519150601f19603f3d011682016040523d82523d6000602084013e612f82565b606091505b5050905080612ff6577fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b11614604051612fea906020808252601c908201527f547265617375727920455448207472616e73666572206661696c656400000000604082015260600190565b60405180910390a18491505b50612fff565b50825b60008311801561300f5750600081115b156131685760006130208483613785565b905080156131665760005b84811015613164576000600d82815481106130485761304861397a565b6000918252602090912001546001600160a01b03169050801580159061307757506001600160a01b0381163014155b80156130915750600a546001600160a01b03828116911614155b15613151576000816001600160a01b03168460405160006040518083038185875af1925050503d80600081146130e3576040519150601f19603f3d011682016040523d82523d6000602084013e6130e8565b606091505b505090508061314f577fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b1161460405161314690602080825260139082015272115512081d1c985b9cd9995c8819985a5b1959606a1b604082015260600190565b60405180910390a15b505b508061315c81613a11565b91505061302b565b505b505b60408051858152602081018590527f6570e65a772d8d30d76e42c8d07c41bf88b28ecf39ca57095a61b4a76584c2179101611da0565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383161580159061321057506001600160a01b03821615155b6132415760405162461bcd60e51b8152602060048201526002602482015261453160f01b6044820152606401610818565b6001600160a01b0383166000908152602081905260409020548181101561328f5760405162461bcd60e51b8152602060048201526002602482015261229960f11b6044820152606401610818565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361186b565b600a546001600160a01b0383811691161480159061331c57506001600160a01b0382163014155b156135045780801561334757506001600160a01b0382166000908152600c602052604090205460ff16155b156133b357506001600160a01b03166000818152600c60205260408120805460ff19166001908117909155600d805491820181559091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319169091179055565b801580156133d957506001600160a01b0382166000908152600c602052604090205460ff165b15613504576001600160a01b0382166000908152600c60205260408120805460ff191690555b600d548110156109b557826001600160a01b0316600d82815481106134265761342661397a565b6000918252602090912001546001600160a01b0316036134f257600d8054613450906001906137a7565b815481106134605761346061397a565b600091825260209091200154600d80546001600160a01b03909216918390811061348c5761348c61397a565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600d8054806134cb576134cb613a2a565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b806134fc81613a11565b9150506133ff565b5050565b60005b8381101561352357818101518382015260200161350b565b50506000910152565b602081526000825180602084015261354b816040850160208701613508565b601f01601f19169190910160400192915050565b6001600160a01b038116811461111c57600080fd5b6000806040838503121561358757600080fd5b82356135928161355f565b946020939093013593505050565b6000806000606084860312156135b557600080fd5b83356135c08161355f565b925060208401356135d08161355f565b929592945050506040919091013590565b6000602082840312156135f357600080fd5b5035919050565b600081518084526020808501945080840160005b838110156136335781516001600160a01b03168752958201959082019060010161360e565b509495945050505050565b60208152600061365160208301846135fa565b9392505050565b60006020828403121561366a57600080fd5b81356136518161355f565b6000806040838503121561368857600080fd5b50508035926020909101359150565b600080604083850312156136aa57600080fd5b82356136b58161355f565b915060208301356136c58161355f565b809150509250929050565b600181811c908216806136e457607f821691505b60208210810361370457634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b03929092168252602082015260400190565b60006020828403121561373557600080fd5b8151801515811461365157600080fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561077c5761077c613745565b808202811582820484141761077c5761077c613745565b6000826137a257634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561077c5761077c613745565b6000602082840312156137cc57600080fd5b81516136518161355f565b602080825260029082015261139560f21b604082015260600190565b60006020828403121561380557600080fd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60008060006060848603121561384557600080fd5b8351925060208401519150604084015190509250925092565b600060033d11156138775760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff811182821017156138ae57634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d10156138c35790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156138f357505050505090565b828501915081518181111561390b5750505050505090565b843d87010160208285010111156139255750505050505090565b6139346020828601018761387a565b509095945050505050565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b634e487b7160e01b600052603260045260246000fd5b85815284602082015260a0604082015260006139af60a08301866135fa565b6001600160a01b0394909416606083015250608001529392505050565b7f50726f787920455448207472616e73666572206661696c65643a200000000000815260008251613a0481601b850160208701613508565b91909101601b0192915050565b600060018201613a2357613a23613745565b5060010190565b634e487b7160e01b600052603160045260246000fdfe4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec0723a2646970667358221220576b7eb94c4c881804a73f6f8e6b06b9e9f8c6a75ccc1d3cb95676af804f5a8c64736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102135760003560e01c8063808a545711610118578063c0d78655116100a0578063dd62ed3e1161006f578063dd62ed3e14610633578063e3a8fa5514610679578063ed9cacfe14610681578063f2fde38b14610696578063fd7c9fab146106b657600080fd5b8063c0d78655146105a3578063c84a705c146105c3578063d4d7b19a146105e3578063d720a2a81461061357600080fd5b8063975b87e8116100e7578063975b87e814610502578063a8602fea14610522578063a9059cbb14610542578063b70143c914610562578063b9276e4b1461058257600080fd5b8063808a54571461049a5780638129fc1c146104ba5780638da5cb5b146104cf57806395d89b41146104ed57600080fd5b80634626402b1161019b57806362b6327a1161016a57806362b6327a1461040a5780636ec4be901461042a57806370a08231146104505780637136982b146104705780637ac84fc11461048557600080fd5b80634626402b1461039357806357376198146103b35780635d76b04c146103d35780635fe8e7cc146103e857600080fd5b806323b872dd116101e257806323b872dd146102ea5780632a11ced01461030a578063313ce56714610342578063397883d21461035e578063461a3a951461037357600080fd5b806306fdde031461025b57806308dee2b414610286578063095ea7b3146102a557806318160ddd146102d557600080fd5b366102565734156102545760405134815233907fbfe611b001dfcd411432f7bf0d79b82b4b2ee81511edac123a3403c357fb972a9060200160405180910390a25b005b600080fd5b34801561026757600080fd5b506102706106d6565b60405161027d919061352c565b60405180910390f35b34801561029257600080fd5b50600e545b60405190815260200161027d565b3480156102b157600080fd5b506102c56102c0366004613574565b610768565b604051901515815260200161027d565b3480156102e157600080fd5b50600254610297565b3480156102f657600080fd5b506102c56103053660046135a0565b610782565b34801561031657600080fd5b5061032a6103253660046135e1565b6107a6565b6040516001600160a01b03909116815260200161027d565b34801561034e57600080fd5b506040516012815260200161027d565b34801561036a57600080fd5b506102546107d0565b34801561037f57600080fd5b5060095461032a906001600160a01b031681565b34801561039f57600080fd5b50600b5461032a906001600160a01b031681565b3480156103bf57600080fd5b506102546103ce366004613574565b6108ee565b3480156103df57600080fd5b50600f54610297565b3480156103f457600080fd5b506103fd6109ba565b60405161027d919061363e565b34801561041657600080fd5b5060075461032a906001600160a01b031681565b34801561043657600080fd5b5060105461032a906201000090046001600160a01b031681565b34801561045c57600080fd5b5061029761046b366004613658565b610a1b565b34801561047c57600080fd5b50600d54610297565b34801561049157600080fd5b50610254610a36565b3480156104a657600080fd5b50600a5461032a906001600160a01b031681565b3480156104c657600080fd5b50610254610da9565b3480156104db57600080fd5b506006546001600160a01b031661032a565b3480156104f957600080fd5b5061027061111f565b34801561050e57600080fd5b5061025461051d366004613675565b61112e565b34801561052e57600080fd5b5061025461053d366004613658565b611871565b34801561054e57600080fd5b506102c561055d366004613574565b611915565b34801561056e57600080fd5b5061025461057d3660046135e1565b611923565b34801561058e57600080fd5b506010546102c590600160b01b900460ff1681565b3480156105af57600080fd5b506102546105be366004613658565b611af0565b3480156105cf57600080fd5b506102546105de366004613658565b611b55565b3480156105ef57600080fd5b506102c56105fe366004613658565b600c6020526000908152604090205460ff1681565b34801561061f57600080fd5b5061025461062e3660046135e1565b611c5e565b34801561063f57600080fd5b5061029761064e366004613697565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610254611e30565b34801561068d57600080fd5b5061025461207e565b3480156106a257600080fd5b506102546106b1366004613658565b6122f7565b3480156106c257600080fd5b5060085461032a906001600160a01b031681565b6060600380546106e5906136d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610711906136d0565b801561075e5780601f106107335761010080835404028352916020019161075e565b820191906000526020600020905b81548152906001019060200180831161074157829003601f168201915b5050505050905090565b600033610776818585612343565b60019150505b92915050565b6000336107908582856123f5565b61079b85858561245d565b506001949350505050565b600d81815481106107b657600080fd5b6000918252602090912001546001600160a01b0316905081565b6107d8612783565b6000600e5411806107eb57506000600f54115b6108215760405162461bcd60e51b815260206004820152600260248201526104e560f41b60448201526064015b60405180910390fd5b600d546108555760405162461bcd60e51b815260206004820152600260248201526109c960f31b6044820152606401610818565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561089057600080fd5b505af19250505080156108a1575060015b6108ec577f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd600e54600f546040516108e3929190918252602082015260400190565b60405180910390a15b565b6108f6612783565b306001600160a01b038316036109335760405162461bcd60e51b815260206004820152600260248201526121a360f11b6044820152606401610818565b816001600160a01b031663a9059cbb6109546006546001600160a01b031690565b836040518363ffffffff1660e01b815260040161097292919061370a565b6020604051808303816000875af1158015610991573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b59190613723565b505050565b6060600d80548060200260200160405190810160405280929190818152602001828054801561075e57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109f4575050505050905090565b6001600160a01b031660009081526020819052604090205490565b600260055403610a6d5760405162461bcd60e51b8152602060048201526002602482015261523160f01b6044820152606401610818565b6002600555601054610100900460ff1615610aaf5760405162461bcd60e51b8152602060048201526002602482015261041560f41b6044820152606401610818565b6010805461ff001916610100179055600e54600f5481158015610ad0575080155b15610ae75750506010805461ff0019169055610da2565b6000610af230610a1b565b90506000610b00838561375b565b905080821015610b7457600080516020613a41833981519152604051610b57906020808252601a908201527f496e73756666696369656e7420746f6b656e2062616c616e6365000000000000604082015260600190565b60405180910390a150506010805461ff001916905550610da29050565b68056bc75e2d631000006000610b8a858761375b565b905081811115610c3657600081610ba984670de0b6b3a764000061376e565b610bb39190613785565b9050670de0b6b3a7640000610bc8828961376e565b610bd29190613785565b9650670de0b6b3a7640000610be7828861376e565b610bf19190613785565b9550610bfd868861375b565b915086600e6000828254610c1191906137a7565b9250508190555085600f6000828254610c2a91906137a7565b90915550610c41915050565b6000600e819055600f555b60408051878152602081018790527f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd910160405180910390a1600754610c949030906001600160a01b0316600019612343565b476000610ca0836127d1565b905080600003610cc35750506010805461ff001916905550610da2945050505050565b47828111610d3657600080516020613a41833981519152604051610d149060208082526019908201527804e6f204554482072656365697665642066726f6d207377617603c1b604082015260600190565b60405180910390a150506010805461ff001916905550610da295505050505050565b6000610d4284836137a7565b9050600085610d518c8461376e565b610d5b9190613785565b90506000610d6982846137a7565b90508115610d7b57610d7b828d612c45565b8015610d8a57610d8a81612ed1565b50506010805461ff0019169055505050505050505050505b6001600555565b610db1612783565b60105460ff1615610de95760405162461bcd60e51b8152602060048201526002602482015261231960f11b6044820152606401610818565b6010805460ff1916600117905560085460095460405163e6a4390560e01b81523060048201526001600160a01b03918216602482015291169063e6a4390590604401602060405180830381865afa158015610e48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6c91906137ba565b600a80546001600160a01b0319166001600160a01b03929092169182179055610f28576008546009546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015610ee3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0791906137ba565b600a80546001600160a01b0319166001600160a01b03929092169190911790555b600a546001600160a01b0316610f655760405162461bcd60e51b8152602060048201526002602482015261463360f01b6044820152606401610818565b600754610f7f9030906001600160a01b0316600019612343565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392610fb7929116906000199060040161370a565b6020604051808303816000875af1158015610fd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffa9190613723565b61102b5760405162461bcd60e51b8152602060048201526002602482015261118d60f21b6044820152606401610818565b600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611063929116906000199060040161370a565b6020604051808303816000875af1158015611082573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a69190613723565b50600a5460405163095ea7b360e01b8152309163095ea7b3916110d9916001600160a01b0316906000199060040161370a565b6020604051808303816000875af11580156110f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111c9190613723565b50565b6060600480546106e5906136d0565b611136612783565b600082116111565760405162461bcd60e51b8152600401610818906137d7565b6000811161118b5760405162461bcd60e51b81526020600482015260026024820152614e5360f01b6044820152606401610818565b6040516370a0823160e01b8152306004820181905283916370a0823190602401602060405180830381865afa1580156111c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ec91906137f3565b101561121f5760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610818565b6009546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015611267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128b91906137f3565b10156112be5760405162461bcd60e51b8152602060048201526002602482015261495360f01b6044820152606401610818565b6009546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906112f29033903090869060040161380c565b6020604051808303816000875af1158015611311573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113359190613723565b6113665760405162461bcd60e51b81526020600482015260026024820152612a2360f11b6044820152606401610818565b60075461137e9030906001600160a01b031684612343565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926113b492911690859060040161370a565b6020604051808303816000875af11580156113d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f79190613723565b506007546009546001600160a01b039182169163e8e33700913091168585600080336114254261025861375b565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af19250505080156114bd575060408051601f3d908101601f191682019092526114ba91810190613830565b60015b611745576114c961385e565b806308c379a00361160c57506114dd6138b5565b806114e8575061160e565b6007546115019030906001600160a01b03166000612343565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926115389291169060009060040161370a565b6020604051808303816000875af1158015611557573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157b9190613723565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906115ae903390869060040161370a565b6020604051808303816000875af11580156115cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f19190613723565b508060405162461bcd60e51b8152600401610818919061352c565b505b6007546116279030906001600160a01b03166000612343565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b39261165e9291169060009060040161370a565b6020604051808303816000875af115801561167d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a19190613723565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906116d4903390859060040161370a565b6020604051808303816000875af11580156116f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117179190613723565b5060405162461bcd60e51b8152602060048201526002602482015261119360f21b6044820152606401610818565b505060408051848152602081018490527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a16009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156117ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ee91906137f3565b905080156109b55760095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611828903390859060040161370a565b6020604051808303816000875af1158015611847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186b9190613723565b50505050565b611879612783565b6001600160a01b0381166118b45760405162461bcd60e51b81526020600482015260026024820152615a4160f01b6044820152606401610818565b600b80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fa982575859d7ad2f390dc12b23f7dab8bbda047f9d0140ac68344b27bf34bfb4910160405180910390a15050565b60003361077681858561245d565b61192b612783565b6002600554036119625760405162461bcd60e51b8152602060048201526002602482015261523160f01b6044820152606401610818565b6002600555806119b45760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610818565b6119bd30610a1b565b811115611a035760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610818565b601054600160b01b900460ff16611a515760405162461bcd60e51b815260206004820152601260248201527114ddd85c081c1c9bde1e481b9bdd081cd95d60721b6044820152606401610818565b6000611a5c826127d1565b905060008111611aae5760405162461bcd60e51b815260206004820152601c60248201527f53776170206661696c65642c206e6f20455448207265636569766564000000006044820152606401610818565b60408051838152602081018390527f83dcf65fd6004d3203d0b493e4d86ef58c3565fa57812dbd28c5a903e247c44f910160405180910390a150506001600555565b611af8612783565b6001600160a01b038116611b335760405162461bcd60e51b815260206004820152600260248201526124a960f11b6044820152606401610818565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b611b5d612783565b601054600160b01b900460ff1615611bab5760405162461bcd60e51b8152602060048201526011602482015270141c9bde1e48185b1c9958591e481cd95d607a1b6044820152606401610818565b6001600160a01b038116611bf95760405162461bcd60e51b8152602060048201526015602482015274496e76616c69642070726f7879206164647265737360581b6044820152606401610818565b6010805460ff60b01b196001600160a01b0384166201000081029190911662010000600160b81b031990921691909117600160b01b179091556040517f65c4b302ff508168aab64a17ebe745806b65caba61b745d8aff18fb69cb0937290600090a250565b611c66612783565b60008111611c865760405162461bcd60e51b8152600401610818906137d7565b6040516370a0823160e01b8152306004820181905282916370a0823190602401602060405180830381865afa158015611cc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce791906137f3565b1015611d1a5760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610818565b600754611d349030906001600160a01b0316600019612343565b476000611d40836127d1565b905080600003611d4f57505050565b47828111611dae57600080516020613a41833981519152604051611da09060208082526019908201527804e6f204554482072656365697665642066726f6d207377617603c1b604082015260600190565b60405180910390a150505050565b6000611dba84836137a7565b905060006064611dcb60198461376e565b611dd59190613785565b905060006064611de660198561376e565b611df09190613785565b90508115611e1857611e18826064611e0960198b61376e565b611e139190613785565b612c45565b8015611e2757611e2781612ed1565b50505050505050565b611e38612783565b6040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa158015611e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9a91906137f3565b905060008111611ebc5760405162461bcd60e51b8152600401610818906137d7565b60003411611ef15760405162461bcd60e51b81526020600482015260026024820152614e4560f01b6044820152606401610818565b600754611f099030906001600160a01b031683612343565b6007546001600160a01b031663f305d71934308460008033611f2d4261025861375b565b6040518863ffffffff1660e01b8152600401611f4e9695949392919061393f565b60606040518083038185885af193505050508015611f89575060408051601f3d908101601f19168201909252611f8691810190613830565b60015b61204057611f9561385e565b806308c379a003611ff95750611fa96138b5565b80611fb45750611ffb565b600754611fcd9030906001600160a01b03166000612343565b60405133904780156108fc02916000818181858888f193505050501580156115f1573d6000803e3d6000fd5b505b6007546120149030906001600160a01b03166000612343565b60405133904780156108fc02916000818181858888f19350505050158015611717573d6000803e3d6000fd5b5050604080518381523460208201527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a150565b612086612783565b6007546120a09030906001600160a01b0316600019612343565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926120d8929116906000199060040161370a565b6020604051808303816000875af1925050508015612113575060408051601f3d908101601f1916820190925261211091810190613723565b60015b1561216957506009546007546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92612160926001600160a01b03918216929116906000199061380c565b60405180910390a15b600a546001600160a01b0316156108ec57600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926121b2929116906000199060040161370a565b6020604051808303816000875af19250505080156121ed575060408051601f3d908101601f191682019092526121ea91810190613723565b60015b156122435750600954600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca9261223a926001600160a01b03918216929116906000199061380c565b60405180910390a15b600a5460405163095ea7b360e01b8152309163095ea7b391612275916001600160a01b0316906000199060040161370a565b6020604051808303816000875af19250505080156122b0575060408051601f3d908101601f191682019092526122ad91810190613723565b60015b156108ec5750600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca916108e39130916001600160a01b0316906000199061380c565b6122ff612783565b6001600160a01b03811661233a5760405162461bcd60e51b81526020600482015260026024820152614f3160f01b6044820152606401610818565b61111c8161319e565b6001600160a01b0383161580159061236357506001600160a01b03821615155b6123945760405162461bcd60e51b8152602060048201526002602482015261114d60f21b6044820152606401610818565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054818110156124505760405162461bcd60e51b8152602060048201526002602482015261453560f01b6044820152606401610818565b61186b8484848403612343565b601054610100900460ff1615801561248357506006546001600160a01b03848116911614155b801561249d57506006546001600160a01b03838116911614155b80156124b257506001600160a01b0383163014155b80156124cb5750600a546001600160a01b038381169116145b1561274c57600060646124df60058461376e565b6124e99190613785565b9050801561274a576000606461250060198461376e565b61250a9190613785565b90506000606461251b60198561376e565b6125259190613785565b9050600061253384866137a7565b90506125408730866131f0565b61254b8787836131f0565b82600e600082825461255d919061375b565b9250508190555081600f6000828254612576919061375b565b9091555050600f54600e5468056bc75e2d63100000916802b5e3af16b1880000916125a1919061375b565b1061270d5780600f54600e546125b7919061375b565b1115612608577f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd600e54600f546040516125fb929190918252602082015260400190565b60405180910390a161270d565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561264357600080fd5b505af1925050508015612654575060015b61270d5761266061385e565b806308c379a0036126aa57506126746138b5565b8061267f57506126ac565b600080516020613a418339815191528160405161269c919061352c565b60405180910390a15061270d565b505b600080516020613a418339815191526040516125fb906020808252602b908201527f556e6b6e6f776e206572726f7220696e2070726f636573734c6971756964697460408201526a079416e6441697264726f760ac1b606082015260800190565b61272a88678ac7230489e800006127238b610a1b565b10156132f5565b61274087678ac7230489e800006127238a610a1b565b5050505050505050565b505b6127578383836131f0565b61276d83678ac7230489e8000061272386610a1b565b6109b582678ac7230489e8000061272385610a1b565b336127966006546001600160a01b031690565b6001600160a01b0316146108ec5760405162461bcd60e51b8152602060048201526002602482015261279960f11b6044820152606401610818565b6000816000036127e357506000919050565b601054600160b01b900460ff166128315760405162461bcd60e51b815260206004820152601260248201527114ddd85c081c1c9bde1e481b9bdd081cd95d60721b6044820152606401610818565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106128665761286661397a565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156128bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e391906137ba565b816001815181106128f6576128f661397a565b6001600160a01b03928316602091820292909201015260075460009161291f9130911686612343565b600061292d42610e1061375b565b60075460105460405163791ac94760e01b815292935047926001600160a01b039283169263791ac94792612976928b9289928b9262010000909104909116908990600401613990565b600060405180830381600087803b15801561299057600080fd5b505af19250505080156129a1575060015b612a56576129ad61385e565b806308c379a0036129fe57506129c16138b5565b806129cc5750612a00565b600080516020613a41833981519152816040516129e9919061352c565b60405180910390a15060009695505050505050565b505b600080516020613a41833981519152604051612a42906020808252601290820152712ab735b737bbb71039bbb0b81032b93937b960711b604082015260600190565b60405180910390a150600095945050505050565b601060029054906101000a90046001600160a01b03166001600160a01b0316636ab2fe586040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612aa657600080fd5b505af1925050508015612ab7575060015b612b7c57612ac361385e565b806308c379a003612b1c5750612ad76138b5565b80612ae25750612b1e565b600080516020613a4183398151915281604051602001612b0291906139cc565b60408051601f19818403018152908290526129e99161352c565b505b600080516020613a41833981519152604051612a429060208082526028908201527f50726f787920455448207472616e73666572206661696c65643a20756e6b6e6f6040820152673bb71032b93937b960c11b606082015260800190565b476000612b8983836137a7565b90508015612bd55760408051898152602081018390527fdd819f6d4da11821175805e17c46b8094c817290420e3de00dee96b4d256dc01910160405180910390a1979650505050505050565b600080516020613a41833981519152604051612c2f9060208082526024908201527f4e6f204554482072656365697665642061667465722070726f7879207472616e60408201526339b332b960e11b606082015260800190565b60405180910390a1506000979650505050505050565b6000612c5030610a1b565b905081811015612cd7577fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad604051612cca9060208082526028908201527f496e73756666696369656e7420746f6b656e2062616c616e636520666f72206c604082015267697175696469747960c01b606082015260800190565b60405180910390a1505050565b60006064612ce581806137a7565b612cef908561376e565b612cf99190613785565b905060006064612d0981806137a7565b612d13908761376e565b612d1d9190613785565b600754909150612d389030906001600160a01b031686612343565b6007546001600160a01b031663f305d719863087868683612d5b42610e1061375b565b6040518863ffffffff1660e01b8152600401612d7c9695949392919061393f565b60606040518083038185885af193505050508015612db7575060408051601f3d908101601f19168201909252612db491810190613830565b60015b612e8d57612dc361385e565b806308c379a003612e1f5750612dd76138b5565b80612de25750612e21565b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad81604051612e11919061352c565b60405180910390a150612eca565b505b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad604051612e80906020808252601b908201527f556e6b6e6f776e206c697175696469747920616464206572726f720000000000604082015260600190565b60405180910390a1612eca565b505060408051868152602081018890527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a15b5050505050565b600d54801580612edf575081155b15612ee8575050565b60006064612ef784601961376e565b612f019190613785565b90506000612f0f82856137a7565b9050600082118015612f2b5750600b546001600160a01b031615155b15612ffc57600b546040516000916001600160a01b03169084908381818185875af1925050503d8060008114612f7d576040519150601f19603f3d011682016040523d82523d6000602084013e612f82565b606091505b5050905080612ff6577fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b11614604051612fea906020808252601c908201527f547265617375727920455448207472616e73666572206661696c656400000000604082015260600190565b60405180910390a18491505b50612fff565b50825b60008311801561300f5750600081115b156131685760006130208483613785565b905080156131665760005b84811015613164576000600d82815481106130485761304861397a565b6000918252602090912001546001600160a01b03169050801580159061307757506001600160a01b0381163014155b80156130915750600a546001600160a01b03828116911614155b15613151576000816001600160a01b03168460405160006040518083038185875af1925050503d80600081146130e3576040519150601f19603f3d011682016040523d82523d6000602084013e6130e8565b606091505b505090508061314f577fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b1161460405161314690602080825260139082015272115512081d1c985b9cd9995c8819985a5b1959606a1b604082015260600190565b60405180910390a15b505b508061315c81613a11565b91505061302b565b505b505b60408051858152602081018590527f6570e65a772d8d30d76e42c8d07c41bf88b28ecf39ca57095a61b4a76584c2179101611da0565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383161580159061321057506001600160a01b03821615155b6132415760405162461bcd60e51b8152602060048201526002602482015261453160f01b6044820152606401610818565b6001600160a01b0383166000908152602081905260409020548181101561328f5760405162461bcd60e51b8152602060048201526002602482015261229960f11b6044820152606401610818565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361186b565b600a546001600160a01b0383811691161480159061331c57506001600160a01b0382163014155b156135045780801561334757506001600160a01b0382166000908152600c602052604090205460ff16155b156133b357506001600160a01b03166000818152600c60205260408120805460ff19166001908117909155600d805491820181559091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319169091179055565b801580156133d957506001600160a01b0382166000908152600c602052604090205460ff165b15613504576001600160a01b0382166000908152600c60205260408120805460ff191690555b600d548110156109b557826001600160a01b0316600d82815481106134265761342661397a565b6000918252602090912001546001600160a01b0316036134f257600d8054613450906001906137a7565b815481106134605761346061397a565b600091825260209091200154600d80546001600160a01b03909216918390811061348c5761348c61397a565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600d8054806134cb576134cb613a2a565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b806134fc81613a11565b9150506133ff565b5050565b60005b8381101561352357818101518382015260200161350b565b50506000910152565b602081526000825180602084015261354b816040850160208701613508565b601f01601f19169190910160400192915050565b6001600160a01b038116811461111c57600080fd5b6000806040838503121561358757600080fd5b82356135928161355f565b946020939093013593505050565b6000806000606084860312156135b557600080fd5b83356135c08161355f565b925060208401356135d08161355f565b929592945050506040919091013590565b6000602082840312156135f357600080fd5b5035919050565b600081518084526020808501945080840160005b838110156136335781516001600160a01b03168752958201959082019060010161360e565b509495945050505050565b60208152600061365160208301846135fa565b9392505050565b60006020828403121561366a57600080fd5b81356136518161355f565b6000806040838503121561368857600080fd5b50508035926020909101359150565b600080604083850312156136aa57600080fd5b82356136b58161355f565b915060208301356136c58161355f565b809150509250929050565b600181811c908216806136e457607f821691505b60208210810361370457634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b03929092168252602082015260400190565b60006020828403121561373557600080fd5b8151801515811461365157600080fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561077c5761077c613745565b808202811582820484141761077c5761077c613745565b6000826137a257634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561077c5761077c613745565b6000602082840312156137cc57600080fd5b81516136518161355f565b602080825260029082015261139560f21b604082015260600190565b60006020828403121561380557600080fd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60008060006060848603121561384557600080fd5b8351925060208401519150604084015190509250925092565b600060033d11156138775760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff811182821017156138ae57634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d10156138c35790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156138f357505050505090565b828501915081518181111561390b5750505050505090565b843d87010160208285010111156139255750505050505090565b6139346020828601018761387a565b509095945050505050565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b634e487b7160e01b600052603260045260246000fd5b85815284602082015260a0604082015260006139af60a08301866135fa565b6001600160a01b0394909416606083015250608001529392505050565b7f50726f787920455448207472616e73666572206661696c65643a200000000000815260008251613a0481601b850160208701613508565b91909101601b0192915050565b600060018201613a2357613a23613745565b5060010190565b634e487b7160e01b600052603160045260246000fdfe4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec0723a2646970667358221220576b7eb94c4c881804a73f6f8e6b06b9e9f8c6a75ccc1d3cb95676af804f5a8c64736f6c63430008110033

Deployed Bytecode Sourcemap

9170:26603:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35344:9;:13;35340:85;;35379:34;;35403:9;160:25:1;;35391:10:0;;35379:34;;148:2:1;133:18;35379:34:0;;;;;;;35340:85;9170:26603;;;;;2801:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30945:118;;;;;;;;;;-1:-1:-1;31032:23:0;;30945:118;;;160:25:1;;;148:2;133:18;30945:118:0;14:177:1;3668:190:0;;;;;;;;;;-1:-1:-1;3668:190:0;;;;;:::i;:::-;;:::i;:::-;;;1473:14:1;;1466:22;1448:41;;1436:2;1421:18;3668:190:0;1308:187:1;3095:99:0;;;;;;;;;;-1:-1:-1;3174:12:0;;3095:99;;3866:250;;;;;;;;;;-1:-1:-1;3866:250:0;;;;;:::i;:::-;;:::i;10273:24::-;;;;;;;;;;-1:-1:-1;10273:24:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2310:32:1;;;2292:51;;2280:2;2265:18;10273:24:0;2146:203:1;3003:84:0;;;;;;;;;;-1:-1:-1;3003:84:0;;3077:2;2496:36:1;;2484:2;2469:18;3003:84:0;2354:184:1;31244:378:0;;;;;;;;;;;;;:::i;10097:25::-;;;;;;;;;;-1:-1:-1;10097:25:0;;;;-1:-1:-1;;;;;10097:25:0;;;10164:29;;;;;;;;;;-1:-1:-1;10164:29:0;;;;-1:-1:-1;;;;;10164:29:0;;;30711:183;;;;;;;;;;-1:-1:-1;30711:183:0;;;;;:::i;:::-;;:::i;31071:114::-;;;;;;;;;;-1:-1:-1;31156:21:0;;31071:114;;26714:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9999:41::-;;;;;;;;;;-1:-1:-1;9999:41:0;;;;-1:-1:-1;;;;;9999:41:0;;;11321:24;;;;;;;;;;-1:-1:-1;11321:24:0;;;;;;;-1:-1:-1;;;;;11321:24:0;;;3202:118;;;;;;;;;;-1:-1:-1;3202:118:0;;;;;:::i;:::-;;:::i;26604:98::-;;;;;;;;;;-1:-1:-1;26680:7:0;:14;26604:98;;17272:3360;;;;;;;;;;;;;:::i;10129:28::-;;;;;;;;;;-1:-1:-1;10129:28:0;;;;-1:-1:-1;;;;;10129:28:0;;;12195:836;;;;;;;;;;;;;:::i;1789:87::-;;;;;;;;;;-1:-1:-1;1862:6:0;;-1:-1:-1;;;;;1862:6:0;1789:87;;2900:95;;;;;;;;;;;;;:::i;26865:2260::-;;;;;;;;;;-1:-1:-1;26865:2260:0;;;;;:::i;:::-;;:::i;33284:319::-;;;;;;;;;;-1:-1:-1;33284:319:0;;;;;:::i;:::-;;:::i;3328:182::-;;;;;;;;;;-1:-1:-1;3328:182:0;;;;;:::i;:::-;;:::i;32662:564::-;;;;;;;;;;-1:-1:-1;32662:564:0;;;;;:::i;:::-;;:::i;11352:24::-;;;;;;;;;;-1:-1:-1;11352:24:0;;;;-1:-1:-1;;;11352:24:0;;;;;;30537:166;;;;;;;;;;-1:-1:-1;30537:166:0;;;;;:::i;:::-;;:::i;35475:295::-;;;;;;;;;;-1:-1:-1;35475:295:0;;;;;:::i;:::-;;:::i;10226:40::-;;;;;;;;;;-1:-1:-1;10226:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;33654:1534;;;;;;;;;;-1:-1:-1;33654:1534:0;;;;;:::i;:::-;;:::i;3518:142::-;;;;;;;;;;-1:-1:-1;3518:142:0;;;;;:::i;:::-;-1:-1:-1;;;;;3625:18:0;;;3598:7;3625:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3518:142;29210:1319;;;:::i;31668:958::-;;;;;;;;;;;;;:::i;1992:165::-;;;;;;;;;;-1:-1:-1;1992:165:0;;;;;:::i;:::-;;:::i;10047:43::-;;;;;;;;;;-1:-1:-1;10047:43:0;;;;-1:-1:-1;;;;;10047:43:0;;;2801:91;2846:13;2879:5;2872:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2801:91;:::o;3668:190::-;3742:4;3775:10;3796:32;3775:10;3812:7;3821:6;3796:8;:32::i;:::-;3846:4;3839:11;;;3668:190;;;;;:::o;3866:250::-;3954:4;3989:10;4010:38;4026:4;3989:10;4041:6;4010:15;:38::i;:::-;4059:27;4069:4;4075:2;4079:6;4059:9;:27::i;:::-;-1:-1:-1;4104:4:0;;3866:250;-1:-1:-1;;;;3866:250:0:o;10273:24::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10273:24:0;;-1:-1:-1;10273:24:0;:::o;31244:378::-;1748:13;:11;:13::i;:::-;31337:1:::1;31311:23;;:27;:56;;;;31366:1;31342:21;;:25;31311:56;31303:71;;;::::0;-1:-1:-1;;;31303:71:0;;5227:2:1;31303:71:0::1;::::0;::::1;5209:21:1::0;5266:1;5246:18;;;5239:29;-1:-1:-1;;;5284:18:1;;;5277:32;5326:18;;31303:71:0::1;;;;;;;;;31393:7;:14:::0;31385:33:::1;;;::::0;-1:-1:-1;;;31385:33:0;;5557:2:1;31385:33:0::1;::::0;::::1;5539:21:1::0;5596:1;5576:18;;;5569:29;-1:-1:-1;;;5614:18:1;;;5607:32;5656:18;;31385:33:0::1;5355:325:1::0;31385:33:0::1;31433:4;-1:-1:-1::0;;;;;31433:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;31429:186;;31541:62;31556:23;;31581:21;;31541:62;;;;;;5859:25:1::0;;;5915:2;5900:18;;5893:34;5847:2;5832:18;;5685:248;31541:62:0::1;;;;;;;;31429:186;31244:378::o:0;30711:183::-;1748:13;:11;:13::i;:::-;30822:4:::1;-1:-1:-1::0;;;;;30804:23:0;::::1;::::0;30796:38:::1;;;::::0;-1:-1:-1;;;30796:38:0;;6140:2:1;30796:38:0::1;::::0;::::1;6122:21:1::0;6179:1;6159:18;;;6152:29;-1:-1:-1;;;6197:18:1;;;6190:32;6239:18;;30796:38:0::1;5938:325:1::0;30796:38:0::1;30852:6;-1:-1:-1::0;;;;;30845:23:0::1;;30869:7;1862:6:::0;;-1:-1:-1;;;;;1862:6:0;;1789:87;30869:7:::1;30878;30845:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30711:183:::0;;:::o;26714:96::-;26759:16;26795:7;26788:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26788:14:0;;;;;;;;;;;;;;;;;;;;;;26714:96;:::o;3202:118::-;-1:-1:-1;;;;;3294:18:0;3267:7;3294:18;;;;;;;;;;;;3202:118::o;17272:3360::-;1042:1;1188:7;;:19;1180:34;;;;-1:-1:-1;;;1180:34:0;;7031:2:1;1180:34:0;;;7013:21:1;7070:1;7050:18;;;7043:29;-1:-1:-1;;;7088:18:1;;;7081:32;7130:18;;1180:34:0;6829:325:1;1180:34:0;1042:1;1225:7;:18;17352:7:::1;::::0;::::1;::::0;::::1;;;17351:8;17343:23;;;::::0;-1:-1:-1;;;17343:23:0;;7361:2:1;17343:23:0::1;::::0;::::1;7343:21:1::0;7400:1;7380:18;;;7373:29;-1:-1:-1;;;7418:18:1;;;7411:32;7460:18;;17343:23:0::1;7159:325:1::0;17343:23:0::1;17377:7;:14:::0;;-1:-1:-1;;17377:14:0::1;;;::::0;;17441:23:::1;::::0;17502:21:::1;::::0;17548:23;;:48;::::1;;;-1:-1:-1::0;17575:21:0;;17548:48:::1;17544:117;;;-1:-1:-1::0;;17613:7:0::1;:15:::0;;-1:-1:-1;;17613:15:0::1;::::0;;17643:7:::1;;17544:117;17732:28;17763:24;17781:4;17763:9;:24::i;:::-;17732:55:::0;-1:-1:-1;17798:28:0::1;17829:37;17850:16:::0;17829:18;:37:::1;:::i;:::-;17798:68;;17914:20;17891;:43;17887:172;;;-1:-1:-1::0;;;;;;;;;;;17956:40:0::1;;;;7953:2:1::0;7935:21;;;7992:2;7972:18;;;7965:30;8031:28;8026:2;8011:18;;8004:56;8092:2;8077:18;;7751:350;17956:40:0::1;;;;;;;;-1:-1:-1::0;;18011:7:0::1;:15:::0;;-1:-1:-1;;18011:15:0::1;::::0;;-1:-1:-1;18041:7:0::1;::::0;-1:-1:-1;18041:7:0::1;17887:172;18156:12;18129:24;18263:37;18284:16:::0;18263:18;:37:::1;:::i;:::-;18235:65;;18434:16;18414:17;:36;18410:694;;;18498:13;18540:17:::0;18514:23:::1;:16:::0;18533:4:::1;18514:23;:::i;:::-;:43;;;;:::i;:::-;18498:59:::0;-1:-1:-1;18622:4:0::1;18593:26;18498:59:::0;18593:18;:26:::1;:::i;:::-;:33;;;;:::i;:::-;18572:54:::0;-1:-1:-1;18687:4:0::1;18660:24;18679:5:::0;18660:16;:24:::1;:::i;:::-;:31;;;;:::i;:::-;18641:50:::0;-1:-1:-1;18726:37:0::1;18641:50:::0;18726:18;:37:::1;:::i;:::-;18706:57;;18866:18;18839:23;;:45;;;;;;;:::i;:::-;;;;;;;;18924:16;18899:21;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;18410:694:0::1;::::0;-1:-1:-1;;18410:694:0::1;;19051:1;19025:23;:27:::0;;;19067:21:::1;:25:::0;18410:694:::1;19129:52;::::0;;5859:25:1;;;5915:2;5900:18;;5893:34;;;19129:52:0::1;::::0;5832:18:1;19129:52:0::1;;;;;;;19264:16;::::0;19232:69:::1;::::0;19249:4:::1;::::0;-1:-1:-1;;;;;19264:16:0::1;-1:-1:-1::0;;19232:8:0::1;:69::i;:::-;19397:21;19369:25;19519:31;19532:17:::0;19519:12:::1;:31::i;:::-;19497:53;;19575:11;19590:1;19575:16:::0;19571:85:::1;;-1:-1:-1::0;;19608:7:0::1;:15:::0;;-1:-1:-1;;19608:15:0::1;::::0;;-1:-1:-1;19638:7:0::1;::::0;-1:-1:-1;;;;;19638:7:0::1;19571:85;19754:21;19790:39:::0;;::::1;19786:167;;-1:-1:-1::0;;;;;;;;;;;19851:39:0::1;;;;8836:2:1::0;8818:21;;;8875:2;8855:18;;;8848:30;-1:-1:-1;;;8909:2:1;8894:18;;8887:55;8974:2;8959:18;;8634:349;19851:39:0::1;;;;;;;;-1:-1:-1::0;;19905:7:0::1;:15:::0;;-1:-1:-1;;19905:15:0::1;::::0;;-1:-1:-1;19935:7:0::1;::::0;-1:-1:-1;;;;;;19935:7:0::1;19786:167;20017:25;20045:38;20066:17:::0;20045:18;:38:::1;:::i;:::-;20017:66:::0;-1:-1:-1;20134:23:0::1;20201:17:::0;20160:38:::1;20180:18:::0;20017:66;20160:38:::1;:::i;:::-;:58;;;;:::i;:::-;20134:84:::0;-1:-1:-1;20229:21:0::1;20253:35;20134:84:::0;20253:17;:35:::1;:::i;:::-;20229:59:::0;-1:-1:-1;20347:19:0;;20343:102:::1;;20383:50;20397:15;20414:18;20383:13;:50::i;:::-;20506:17:::0;;20502:87:::1;;20540:37;20563:13;20540:22;:37::i;:::-;-1:-1:-1::0;;20609:7:0::1;:15:::0;;-1:-1:-1;;20609:15:0::1;::::0;;-1:-1:-1;;;;;;;;;;1254:1:0::1;998::::0;1266:7;:22;17272:3360::o;12195:836::-;1748:13;:11;:13::i;:::-;12256:12:::1;::::0;::::1;;12255:13;12247:28;;;::::0;-1:-1:-1;;;12247:28:0;;9190:2:1;12247:28:0::1;::::0;::::1;9172:21:1::0;9229:1;9209:18;;;9202:29;-1:-1:-1;;;9247:18:1;;;9240:32;9289:18;;12247:28:0::1;8988:325:1::0;12247:28:0::1;12286:12;:19:::0;;-1:-1:-1;;12286:19:0::1;12301:4;12286:19;::::0;;12377:17:::1;::::0;12418:10:::1;::::0;12377:52:::1;::::0;-1:-1:-1;;;12377:52:0;;12411:4:::1;12377:52;::::0;::::1;9530:34:1::0;-1:-1:-1;;;;;12418:10:0;;::::1;9580:18:1::0;;;9573:43;12377:17:0;::::1;::::0;:25:::1;::::0;9465:18:1;;12377:52:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12361:13;:68:::0;;-1:-1:-1;;;;;;12361:68:0::1;-1:-1:-1::0;;;;;12361:68:0;;;::::1;::::0;;::::1;::::0;;12495:131:::1;;12559:17;::::0;12603:10:::1;::::0;12559:55:::1;::::0;-1:-1:-1;;;12559:55:0;;12596:4:::1;12559:55;::::0;::::1;9530:34:1::0;-1:-1:-1;;;;;12603:10:0;;::::1;9580:18:1::0;;;9573:43;12559:17:0;::::1;::::0;:28:::1;::::0;9465:18:1;;12559:55:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12543:13;:71:::0;;-1:-1:-1;;;;;;12543:71:0::1;-1:-1:-1::0;;;;;12543:71:0;;;::::1;::::0;;;::::1;::::0;;12495:131:::1;12654:13;::::0;-1:-1:-1;;;;;12654:13:0::1;12646:42;;;::::0;-1:-1:-1;;;12646:42:0;;10085:2:1;12646:42:0::1;::::0;::::1;10067:21:1::0;10124:1;10104:18;;;10097:29;-1:-1:-1;;;10142:18:1;;;10135:32;10184:18;;12646:42:0::1;9883:325:1::0;12646:42:0::1;12733:16;::::0;12701:69:::1;::::0;12718:4:::1;::::0;-1:-1:-1;;;;;12733:16:0::1;-1:-1:-1::0;;12701:8:0::1;:69::i;:::-;12806:10;::::0;12834:16:::1;::::0;12799:72:::1;::::0;-1:-1:-1;;;12799:72:0;;-1:-1:-1;;;;;12806:10:0;;::::1;::::0;12799:26:::1;::::0;:72:::1;::::0;12834:16;::::1;::::0;-1:-1:-1;;12853:17:0;12799:72:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12791:87;;;::::0;-1:-1:-1;;;12791:87:0;;10415:2:1;12791:87:0::1;::::0;::::1;10397:21:1::0;10454:1;10434:18;;;10427:29;-1:-1:-1;;;10472:18:1;;;10465:32;10514:18;;12791:87:0::1;10213:325:1::0;12791:87:0::1;12896:10;::::0;12916:13:::1;::::0;12889:60:::1;::::0;-1:-1:-1;;;12889:60:0;;-1:-1:-1;;;;;12896:10:0;;::::1;::::0;12889:26:::1;::::0;:60:::1;::::0;12916:13;::::1;::::0;-1:-1:-1;;12931:17:0;12889:60:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;12990:13:0::1;::::0;12960:63:::1;::::0;-1:-1:-1;;;12960:63:0;;12975:4:::1;::::0;12960:29:::1;::::0;:63:::1;::::0;-1:-1:-1;;;;;12990:13:0::1;::::0;-1:-1:-1;;13005:17:0;12960:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12195:836::o:0;2900:95::-;2947:13;2980:7;2973:14;;;;;:::i;26865:2260::-;1748:13;:11;:13::i;:::-;26998:1:::1;26984:11;:15;26976:30;;;;-1:-1:-1::0;;;26976:30:0::1;;;;;;;:::i;:::-;27039:1;27025:11;:15;27017:30;;;::::0;-1:-1:-1;;;27017:30:0;;11075:2:1;27017:30:0::1;::::0;::::1;11057:21:1::0;11114:1;11094:18;;;11087:29;-1:-1:-1;;;11132:18:1;;;11125:32;11174:18;;27017:30:0::1;10873:325:1::0;27017:30:0::1;27090:46;::::0;-1:-1:-1;;;27090:46:0;;27105:4:::1;27090:46;::::0;::::1;2292:51:1::0;;;27140:11:0;;27090:31:::1;::::0;2265:18:1;;27090:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;27068:113;;;::::0;-1:-1:-1;;;27068:113:0;;11594:2:1;27068:113:0::1;::::0;::::1;11576:21:1::0;11633:1;11613:18;;;11606:29;-1:-1:-1;;;11651:18:1;;;11644:32;11693:18;;27068:113:0::1;11392:325:1::0;27068:113:0::1;27231:10;::::0;27224:40:::1;::::0;-1:-1:-1;;;27224:40:0;;27253:10:::1;27224:40;::::0;::::1;2292:51:1::0;27268:11:0;;-1:-1:-1;;;;;27231:10:0::1;::::0;27224:28:::1;::::0;2265:18:1;;27224:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;27202:107;;;::::0;-1:-1:-1;;;27202:107:0;;11924:2:1;27202:107:0::1;::::0;::::1;11906:21:1::0;11963:1;11943:18;;;11936:29;-1:-1:-1;;;11981:18:1;;;11974:32;12023:18;;27202:107:0::1;11722:325:1::0;27202:107:0::1;27411:10;::::0;27404:71:::1;::::0;-1:-1:-1;;;27404:71:0;;-1:-1:-1;;;;;27411:10:0;;::::1;::::0;27404:31:::1;::::0;:71:::1;::::0;27436:10:::1;::::0;27456:4:::1;::::0;27463:11;;27404:71:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27382:123;;;::::0;-1:-1:-1;;;27382:123:0;;12634:2:1;27382:123:0::1;::::0;::::1;12616:21:1::0;12673:1;12653:18;;;12646:29;-1:-1:-1;;;12691:18:1;;;12684:32;12733:18;;27382:123:0::1;12432:325:1::0;27382:123:0::1;27584:16;::::0;27552:63:::1;::::0;27569:4:::1;::::0;-1:-1:-1;;;;;27584:16:0::1;27603:11:::0;27552:8:::1;:63::i;:::-;27633:10;::::0;27661:16:::1;::::0;27626:66:::1;::::0;-1:-1:-1;;;27626:66:0;;-1:-1:-1;;;;;27633:10:0;;::::1;::::0;27626:26:::1;::::0;:66:::1;::::0;27661:16;::::1;::::0;27680:11;;27626:66:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;27717:16:0::1;::::0;27789:10:::1;::::0;-1:-1:-1;;;;;27717:16:0;;::::1;::::0;:29:::1;::::0;27769:4:::1;::::0;27789:10:::1;27814:11:::0;27840;27717:16:::1;::::0;27990:10:::1;28015:21;:15;28033:3;28015:21;:::i;:::-;27717:356;::::0;::::1;::::0;;;-1:-1:-1;;;;;;27717:356:0;;;-1:-1:-1;;;;;13177:15:1;;;27717:356:0::1;::::0;::::1;13159:34:1::0;13229:15;;;13209:18;;;13202:43;13261:18;;;13254:34;;;;13304:18;;;13297:34;;;;13347:19;;;13340:35;;;;13391:19;;;13384:35;13456:15;;;13435:19;;;13428:44;13488:19;;;13481:35;;;;13093:19;;27717:356:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;27717:356:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;27717:356:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;27713:1147;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;28228:16;::::0;28196:53:::1;::::0;28213:4:::1;::::0;-1:-1:-1;;;;;28228:16:0::1;;28196:8;:53::i;:::-;28271:10;::::0;28299:16:::1;::::0;28264:56:::1;::::0;-1:-1:-1;;;28264:56:0;;-1:-1:-1;;;;;28271:10:0;;::::1;::::0;28264:26:::1;::::0;:56:::1;::::0;28299:16;::::1;::::0;28271:10:::1;::::0;28264:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;28404:10:0::1;::::0;28397:52:::1;::::0;-1:-1:-1;;;28397:52:0;;-1:-1:-1;;;;;28404:10:0;;::::1;::::0;28397:27:::1;::::0;:52:::1;::::0;28425:10:::1;::::0;28437:11;;28397:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28485:6;28478:14;;-1:-1:-1::0;;;28478:14:0::1;;;;;;;;:::i;27713:1147::-;;;28586:16;::::0;28554:53:::1;::::0;28571:4:::1;::::0;-1:-1:-1;;;;;28586:16:0::1;;28554:8;:53::i;:::-;28629:10;::::0;28657:16:::1;::::0;28622:56:::1;::::0;-1:-1:-1;;;28622:56:0;;-1:-1:-1;;;;;28629:10:0;;::::1;::::0;28622:26:::1;::::0;:56:::1;::::0;28657:16;::::1;::::0;28629:10:::1;::::0;28622:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;28762:10:0::1;::::0;28755:52:::1;::::0;-1:-1:-1;;;28755:52:0;;-1:-1:-1;;;;;28762:10:0;;::::1;::::0;28755:27:::1;::::0;:52:::1;::::0;28783:10:::1;::::0;28795:11;;28755:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;28836:12:0::1;::::0;-1:-1:-1;;;28836:12:0;;15670:2:1;28836:12:0::1;::::0;::::1;15652:21:1::0;15709:1;15689:18;;;15682:29;-1:-1:-1;;;15727:18:1;;;15720:32;15769:18;;28836:12:0::1;15468:325:1::0;27713:1147:0::1;-1:-1:-1::0;;28094:40:0::1;::::0;;5859:25:1;;;5915:2;5900:18;;5893:34;;;28094:40:0::1;::::0;-1:-1:-1;5832:18:1;28094:40:0::1;;;;;;;28963:10;::::0;28956:43:::1;::::0;-1:-1:-1;;;28956:43:0;;28993:4:::1;28956:43;::::0;::::1;2292:51:1::0;28930:23:0::1;::::0;-1:-1:-1;;;;;28963:10:0::1;::::0;28956:28:::1;::::0;2265:18:1;;28956:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28930:69:::0;-1:-1:-1;29014:19:0;;29010:108:::1;;29057:10;::::0;29050:56:::1;::::0;-1:-1:-1;;;29050:56:0;;-1:-1:-1;;;;;29057:10:0;;::::1;::::0;29050:27:::1;::::0;:56:::1;::::0;29078:10:::1;::::0;29090:15;;29050:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26965:2160;26865:2260:::0;;:::o;33284:319::-;1748:13;:11;:13::i;:::-;-1:-1:-1;;;;;33376:31:0;::::1;33368:46;;;::::0;-1:-1:-1;;;33368:46:0;;16000:2:1;33368:46:0::1;::::0;::::1;15982:21:1::0;16039:1;16019:18;;;16012:29;-1:-1:-1;;;16057:18:1;;;16050:32;16099:18;;33368:46:0::1;15798:325:1::0;33368:46:0::1;33457:14;::::0;;-1:-1:-1;;;;;33482:34:0;;::::1;-1:-1:-1::0;;;;;;33482:34:0;::::1;::::0;::::1;::::0;;;33542:53:::1;::::0;;33457:14;;;::::1;9530:34:1::0;;;9595:2;9580:18;;9573:43;;;;33542:53:0::1;::::0;9465:18:1;33542:53:0::1;;;;;;;33357:246;33284:319:::0;:::o;3328:182::-;3398:4;3431:10;3452:28;3431:10;3469:2;3473:6;3452:9;:28::i;32662:564::-;1748:13;:11;:13::i;:::-;1042:1:::1;1188:7;;:19:::0;1180:34:::1;;;::::0;-1:-1:-1;;;1180:34:0;;7031:2:1;1180:34:0::1;::::0;::::1;7013:21:1::0;7070:1;7050:18;;;7043:29;-1:-1:-1;;;7088:18:1;;;7081:32;7130:18;;1180:34:0::1;6829:325:1::0;1180:34:0::1;1042:1;1225:7;:18:::0;32754:15;32746:57:::2;;;::::0;-1:-1:-1;;;32746:57:0;;16330:2:1;32746:57:0::2;::::0;::::2;16312:21:1::0;16369:2;16349:18;;;16342:30;16408:31;16388:18;;;16381:59;16457:18;;32746:57:0::2;16128:353:1::0;32746:57:0::2;32837:24;32855:4;32837:9;:24::i;:::-;32822:11;:39;;32814:72;;;::::0;-1:-1:-1;;;32814:72:0;;16688:2:1;32814:72:0::2;::::0;::::2;16670:21:1::0;16727:2;16707:18;;;16700:30;-1:-1:-1;;;16746:18:1;;;16739:50;16806:18;;32814:72:0::2;16486:344:1::0;32814:72:0::2;32905:12;::::0;-1:-1:-1;;;32905:12:0;::::2;;;32897:43;;;::::0;-1:-1:-1;;;32897:43:0;;17037:2:1;32897:43:0::2;::::0;::::2;17019:21:1::0;17076:2;17056:18;;;17049:30;-1:-1:-1;;;17095:18:1;;;17088:48;17153:18;;32897:43:0::2;16835:342:1::0;32897:43:0::2;32986:19;33008:25;33021:11;33008:12;:25::i;:::-;32986:47;;33113:1;33099:11;:15;33091:56;;;::::0;-1:-1:-1;;;33091:56:0;;17384:2:1;33091:56:0::2;::::0;::::2;17366:21:1::0;17423:2;17403:18;;;17396:30;17462;17442:18;;;17435:58;17510:18;;33091:56:0::2;17182:352:1::0;33091:56:0::2;33173:45;::::0;;5859:25:1;;;5915:2;5900:18;;5893:34;;;33173:45:0::2;::::0;5832:18:1;33173:45:0::2;;;;;;;-1:-1:-1::0;;998:1:0::1;1266:7;:22:::0;32662:564::o;30537:166::-;1748:13;:11;:13::i;:::-;-1:-1:-1;;;;;30611:21:0;::::1;30603:36;;;::::0;-1:-1:-1;;;30603:36:0;;17741:2:1;30603:36:0::1;::::0;::::1;17723:21:1::0;17780:1;17760:18;;;17753:29;-1:-1:-1;;;17798:18:1;;;17791:32;17840:18;;30603:36:0::1;17539:325:1::0;30603:36:0::1;30650:16;:45:::0;;-1:-1:-1;;;;;;30650:45:0::1;-1:-1:-1::0;;;;;30650:45:0;;;::::1;::::0;;;::::1;::::0;;30537:166::o;35475:295::-;1748:13;:11;:13::i;:::-;35556:12:::1;::::0;-1:-1:-1;;;35556:12:0;::::1;;;35555:13;35547:43;;;::::0;-1:-1:-1;;;35547:43:0;;18071:2:1;35547:43:0::1;::::0;::::1;18053:21:1::0;18110:2;18090:18;;;18083:30;-1:-1:-1;;;18129:18:1;;;18122:47;18186:18;;35547:43:0::1;17869:341:1::0;35547:43:0::1;-1:-1:-1::0;;;;;35609:24:0;::::1;35601:58;;;::::0;-1:-1:-1;;;35601:58:0;;18417:2:1;35601:58:0::1;::::0;::::1;18399:21:1::0;18456:2;18436:18;;;18429:30;-1:-1:-1;;;18475:18:1;;;18468:51;18536:18;;35601:58:0::1;18215:345:1::0;35601:58:0::1;35670:9;:22:::0;;-1:-1:-1;;;;;;;;;35670:22:0;::::1;::::0;;::::1;35703:19:::0;;;;-1:-1:-1;;;;;;35703:19:0;;;;;;;-1:-1:-1;;;35703:19:0::1;::::0;;;35738:24:::1;::::0;::::1;::::0;-1:-1:-1;;35738:24:0::1;35475:295:::0;:::o;33654:1534::-;1748:13;:11;:13::i;:::-;33762:1:::1;33748:11;:15;33740:30;;;;-1:-1:-1::0;;;33740:30:0::1;;;;;;;:::i;:::-;33789:46;::::0;-1:-1:-1;;;33789:46:0;;33804:4:::1;33789:46;::::0;::::1;2292:51:1::0;;;33839:11:0;;33789:31:::1;::::0;2265:18:1;;33789:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;33781:76;;;::::0;-1:-1:-1;;;33781:76:0;;11594:2:1;33781:76:0::1;::::0;::::1;11576:21:1::0;11633:1;11613:18;;;11606:29;-1:-1:-1;;;11651:18:1;;;11644:32;11693:18;;33781:76:0::1;11392:325:1::0;33781:76:0::1;33940:16;::::0;33908:69:::1;::::0;33925:4:::1;::::0;-1:-1:-1;;;;;33940:16:0::1;-1:-1:-1::0;;33908:8:0::1;:69::i;:::-;34073:21;34045:25;34179;34192:11:::0;34179:12:::1;:25::i;:::-;34157:47;;34229:11;34244:1;34229:16:::0;34225:55:::1;;34262:7;;12960:63;12195:836::o:0;34225:55::-:1;34378:21;34414:39:::0;;::::1;34410:137;;-1:-1:-1::0;;;;;;;;;;;34475:39:0::1;;;;8836:2:1::0;8818:21;;;8875:2;8855:18;;;8848:30;-1:-1:-1;;;8909:2:1;8894:18;;8887:55;8974:2;8959:18;;8634:349;34475:39:0::1;;;;;;;;34529:7;;;12960:63;12195:836::o:0;34410:137::-:1;34611:25;34639:38;34660:17:::0;34639:18;:38:::1;:::i;:::-;34611:66:::0;-1:-1:-1;34728:23:0::1;34790:3;34754:33;9402:2;34611:66:::0;34754:33:::1;:::i;:::-;:39;;;;:::i;:::-;34728:65:::0;-1:-1:-1;34804:21:0::1;34862:3;34828:31;9458:2;34828:17:::0;:31:::1;:::i;:::-;:37;;;;:::i;:::-;34804:61:::0;-1:-1:-1;34924:19:0;;34920:117:::1;;34960:65;34974:15:::0;35021:3:::1;34991:27;9402:2;34991:11:::0;:27:::1;:::i;:::-;:33;;;;:::i;:::-;34960:13;:65::i;:::-;35098:17:::0;;35094:87:::1;;35132:37;35155:13;35132:22;:37::i;:::-;33729:1459;;;;;;33654:1534:::0;:::o;29210:1319::-;1748:13;:11;:13::i;:::-;29320:46:::1;::::0;-1:-1:-1;;;29320:46:0;;29335:4:::1;29320:46;::::0;::::1;2292:51:1::0;;;29298:19:0::1;::::0;29320:31:::1;::::0;2265:18:1;;29320:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29298:68;;29399:1;29385:11;:15;29377:30;;;;-1:-1:-1::0;;;29377:30:0::1;;;;;;;:::i;:::-;29438:1;29426:9;:13;29418:28;;;::::0;-1:-1:-1;;;29418:28:0;;18767:2:1;29418:28:0::1;::::0;::::1;18749:21:1::0;18806:1;18786:18;;;18779:29;-1:-1:-1;;;18824:18:1;;;18817:32;18866:18;;29418:28:0::1;18565:325:1::0;29418:28:0::1;29525:16;::::0;29493:63:::1;::::0;29510:4:::1;::::0;-1:-1:-1;;;;;29525:16:0::1;29544:11:::0;29493:8:::1;:63::i;:::-;29581:16;::::0;-1:-1:-1;;;;;29581:16:0::1;:32;29621:9;29654:4;29674:11:::0;29581:16:::1;::::0;29822:10:::1;29847:21;:15;29865:3;29847:21;:::i;:::-;29581:324;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;29581:324:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;29581:324:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;29577:945;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;30058:16;::::0;30026:53:::1;::::0;30043:4:::1;::::0;-1:-1:-1;;;;;30058:16:0::1;;30026:8;:53::i;:::-;30144:51;::::0;30152:10:::1;::::0;30173:21:::1;30144:51:::0;::::1;;;::::0;::::1;::::0;;;30173:21;30152:10;30144:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;29577:945;;;30332:16;::::0;30300:53:::1;::::0;30317:4:::1;::::0;-1:-1:-1;;;;;30332:16:0::1;;30300:8;:53::i;:::-;30418:51;::::0;30426:10:::1;::::0;30447:21:::1;30418:51:::0;::::1;;;::::0;::::1;::::0;;;30447:21;30426:10;30418:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;29577:945;-1:-1:-1::0;;29926:38:0::1;::::0;;5859:25:1;;;29954:9:0::1;5915:2:1::0;5900:18;;5893:34;29926:38:0::1;::::0;-1:-1:-1;5832:18:1;29926:38:0::1;;;;;;;29287:1242;29210:1319::o:0;31668:958::-;1748:13;:11;:13::i;:::-;31803:16:::1;::::0;31771:69:::1;::::0;31788:4:::1;::::0;-1:-1:-1;;;;;31803:16:0::1;-1:-1:-1::0;;31771:8:0::1;:69::i;:::-;31919:10;::::0;31947:16:::1;::::0;31912:72:::1;::::0;-1:-1:-1;;;31912:72:0;;-1:-1:-1;;;;;31919:10:0;;::::1;::::0;31912:26:::1;::::0;:72:::1;::::0;31947:16;::::1;::::0;-1:-1:-1;;31966:17:0;31912:72:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;31912:72:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;31912:72:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;31908:193:::0;::::1;;-1:-1:-1::0;32023:10:0::1;::::0;32043:16:::1;::::0;32005:75:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;32023:10:0;;::::1;::::0;32043:16;::::1;::::0;-1:-1:-1;;32062:17:0;32005:75:::1;:::i;:::-;;;;;;;;31908:193;32176:13;::::0;-1:-1:-1;;;;;32176:13:0::1;:27:::0;32172:447:::1;;32231:10;::::0;32251:13:::1;::::0;32224:60:::1;::::0;-1:-1:-1;;;32224:60:0;;-1:-1:-1;;;;;32231:10:0;;::::1;::::0;32224:26:::1;::::0;:60:::1;::::0;32251:13;::::1;::::0;-1:-1:-1;;32266:17:0;32224:60:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;32224:60:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;32224:60:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;32220:177:::0;::::1;;-1:-1:-1::0;32327:10:0::1;::::0;32339:13:::1;::::0;32309:63:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;32327:10:0;;::::1;::::0;32339:13;::::1;::::0;-1:-1:-1;;32354:17:0;32309:63:::1;:::i;:::-;;;;;;;;32220:177;32459:13;::::0;32429:63:::1;::::0;-1:-1:-1;;;32429:63:0;;32444:4:::1;::::0;32429:29:::1;::::0;:63:::1;::::0;-1:-1:-1;;;;;32459:13:0::1;::::0;-1:-1:-1;;32474:17:0;32429:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;32429:63:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;32429:63:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;32425:183:::0;::::1;;-1:-1:-1::0;32550:13:0::1;::::0;32517:66:::1;::::0;::::1;::::0;::::1;::::0;32543:4:::1;::::0;-1:-1:-1;;;;;32550:13:0::1;::::0;-1:-1:-1;;32565:17:0;32517:66:::1;:::i;1992:165::-:0;1748:13;:11;:13::i;:::-;-1:-1:-1;;;;;2081:22:0;::::1;2073:37;;;::::0;-1:-1:-1;;;2073:37:0;;19709:2:1;2073:37:0::1;::::0;::::1;19691:21:1::0;19748:1;19728:18;;;19721:29;-1:-1:-1;;;19766:18:1;;;19759:32;19808:18;;2073:37:0::1;19507:325:1::0;2073:37:0::1;2121:28;2140:8;2121:18;:28::i;5047:256::-:0;-1:-1:-1;;;;;5149:19:0;;;;;;:44;;-1:-1:-1;;;;;;5172:21:0;;;;5149:44;5141:59;;;;-1:-1:-1;;;5141:59:0;;20039:2:1;5141:59:0;;;20021:21:1;20078:1;20058:18;;;20051:29;-1:-1:-1;;;20096:18:1;;;20089:32;20138:18;;5141:59:0;19837:325:1;5141:59:0;-1:-1:-1;;;;;5211:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;5263:32;;160:25:1;;;5263:32:0;;133:18:1;5263:32:0;;;;;;;5047:256;;;:::o;5311:311::-;-1:-1:-1;;;;;3625:18:0;;;5412:24;3625:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;5483:26;;;;5475:41;;;;-1:-1:-1;;;5475:41:0;;20369:2:1;5475:41:0;;;20351:21:1;20408:1;20388:18;;;20381:29;-1:-1:-1;;;20426:18:1;;;20419:32;20468:18;;5475:41:0;20167:325:1;5475:41:0;5552:51;5561:5;5568:7;5596:6;5577:16;:25;5552:8;:51::i;13039:3438::-;13227:7;;;;;;;13226:8;:41;;;;-1:-1:-1;1862:6:0;;-1:-1:-1;;;;;13252:15:0;;;1862:6;;13252:15;;13226:41;:72;;;;-1:-1:-1;1862:6:0;;-1:-1:-1;;;;;13285:13:0;;;1862:6;;13285:13;;13226:72;:111;;;;-1:-1:-1;;;;;;13316:21:0;;13332:4;13316:21;;13226:111;:148;;;;-1:-1:-1;13361:13:0;;-1:-1:-1;;;;;13355:19:0;;;13361:13;;13355:19;13226:148;13208:3000;;;13431:17;13471:3;13451:17;9347:1;13451:6;:17;:::i;:::-;:23;;;;:::i;:::-;13431:43;-1:-1:-1;13507:13:0;;13503:2694;;13601:23;13655:3;13627:25;9402:2;13627:9;:25;:::i;:::-;:31;;;;:::i;:::-;13601:57;-1:-1:-1;13677:21:0;13727:3;13701:23;9458:2;13701:9;:23;:::i;:::-;:29;;;;:::i;:::-;13677:53;-1:-1:-1;13825:22:0;13850:18;13859:9;13850:6;:18;:::i;:::-;13825:43;;13948:47;13964:4;13978;13985:9;13948:15;:47::i;:::-;14083:41;14099:4;14105:2;14109:14;14083:15;:41::i;:::-;14239:15;14212:23;;:42;;;;;;;:::i;:::-;;;;;;;;14298:13;14273:21;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;;14714:21:0;;14688:23;;14579:12;;9627:11;;14688:47;;14714:21;14688:47;:::i;:::-;:73;14684:1243;;14937:16;14913:21;;14887:23;;:47;;;;:::i;:::-;:66;14883:1025;;;15186:62;15201:23;;15226:21;;15186:62;;;;;;5859:25:1;;;5915:2;5900:18;;5893:34;5847:2;5832:18;;5685:248;15186:62:0;;;;;;;;14883:1025;;;15391:4;-1:-1:-1;;;;;15391:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15387:498;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;15649:6:0;15638:18;;;;;;:::i;:::-;;;;;;;;15506:178;15387:498;;;;;-1:-1:-1;;;;;;;;;;;15800:57:0;;;;20699:2:1;20681:21;;;20738:2;20718:18;;;20711:30;20777:34;20772:2;20757:18;;20750:62;-1:-1:-1;;;20843:2:1;20828:18;;20821:41;20894:3;20879:19;;20497:407;15387:498:0;16009:57;16023:4;9520:11;16029:15;16039:4;16029:9;:15::i;:::-;:36;;16009:13;:57::i;:::-;16085:53;16099:2;9520:11;16103:13;16113:2;16103:9;:13::i;16085:53::-;16175:7;;;;;13039:3438;;;:::o;13503:2694::-;13386:2822;13208:3000;16256:33;16272:4;16278:2;16282:6;16256:15;:33::i;:::-;16348:57;16362:4;9520:11;16368:15;16378:4;16368:9;:15::i;16348:57::-;16416:53;16430:2;9520:11;16434:13;16444:2;16434:9;:13::i;1884:100::-;1959:10;1948:7;1862:6;;-1:-1:-1;;;;;1862:6:0;;1789:87;1948:7;-1:-1:-1;;;;;1948:21:0;;1940:36;;;;-1:-1:-1;;;1940:36:0;;21111:2:1;1940:36:0;;;21093:21:1;21150:1;21130:18;;;21123:29;-1:-1:-1;;;21168:18:1;;;21161:32;21210:18;;1940:36:0;20909:325:1;22256:2497:0;22316:7;22340:11;22355:1;22340:16;22336:30;;-1:-1:-1;22365:1:0;;22256:2497;-1:-1:-1;22256:2497:0:o;22336:30::-;22385:12;;-1:-1:-1;;;22385:12:0;;;;22377:43;;;;-1:-1:-1;;;22377:43:0;;17037:2:1;22377:43:0;;;17019:21:1;17076:2;17056:18;;;17049:30;-1:-1:-1;;;17095:18:1;;;17088:48;17153:18;;22377:43:0;16835:342:1;22377:43:0;22465:16;;;22479:1;22465:16;;;;;;;;22441:21;;22465:16;;;;;;;;;;-1:-1:-1;22465:16:0;22441:40;;22510:4;22492;22497:1;22492:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;22492:23:0;;;:7;;;;;;;;;;:23;;;;22536:16;;:23;;;-1:-1:-1;;;22536:23:0;;;;:16;;;;;:21;;:23;;;;;22492:7;;22536:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22526:4;22531:1;22526:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;22526:33:0;;;:7;;;;;;;;;:33;22928:16;;22750:20;;22896:63;;22913:4;;22928:16;22947:11;22896:8;:63::i;:::-;23032:16;23051:22;:15;23069:4;23051:22;:::i;:::-;23305:16;;23459:9;;23305:230;;-1:-1:-1;;;23305:230:0;;23032:41;;-1:-1:-1;23179:21:0;;-1:-1:-1;;;;;23305:16:0;;;;:67;;:230;;23387:11;;23413:12;;23440:4;;23459:9;;;;;;;;23032:41;;23305:230;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23301:1445;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;24610:6:0;24599:18;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;24639:1:0;;22256:2497;-1:-1:-1;;;;;;22256:2497:0:o;23301:1445::-;;;-1:-1:-1;;;;;;;;;;;24679:32:0;;;;22152:2:1;22134:21;;;22191:2;22171:18;;;22164:30;-1:-1:-1;;;22225:2:1;22210:18;;22203:48;22283:2;22268:18;;21950:342;24679:32:0;;;;;;;;-1:-1:-1;24733:1:0;;22256:2497;-1:-1:-1;;;;;22256:2497:0:o;23301:1445::-;23657:9;;;;;;;;;-1:-1:-1;;;;;23657:9:0;-1:-1:-1;;;;;23646:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23642:891;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;24353:6:0;24305:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;24305:55:0;;;;;;;;;;24287:75;;;:::i;23642:891::-;;;-1:-1:-1;;;;;;;;;;;24436:54:0;;;;22963:2:1;22945:21;;;23002:2;22982:18;;;22975:30;23041:34;23036:2;23021:18;;23014:62;-1:-1:-1;;;23107:2:1;23092:18;;23085:38;23155:3;23140:19;;22761:404;23642:891:0;23791:21;23762:26;23853:38;23874:17;23791:21;23853:38;:::i;:::-;23831:60;-1:-1:-1;23932:15:0;;23928:285;;23977:40;;;5859:25:1;;;5915:2;5900:18;;5893:34;;;23977:40:0;;5832:18:1;23977:40:0;;;;;;;24047:11;22256:2497;-1:-1:-1;;;;;;;22256:2497:0:o;23928:285::-;-1:-1:-1;;;;;;;;;;;24112:50:0;;;;23372:2:1;23354:21;;;23411:2;23391:18;;;23384:30;23450:34;23445:2;23430:18;;23423:62;-1:-1:-1;;;23516:2:1;23501:18;;23494:34;23560:3;23545:19;;23170:400;24112:50:0;;;;;;;;-1:-1:-1;24192:1:0;;22256:2497;-1:-1:-1;;;;;;;22256:2497:0:o;20951:1297::-;21084:28;21115:24;21133:4;21115:9;:24::i;:::-;21084:55;;21177:11;21154:20;:34;21150:155;;;21210:62;;;;;23777:2:1;23759:21;;;23816:2;23796:18;;;23789:30;23855:34;23850:2;23835:18;;23828:62;-1:-1:-1;;;23921:2:1;23906:18;;23899:38;23969:3;23954:19;;23575:404;21210:62:0;;;;;;;;21287:7;20951:1297;;:::o;21150:155::-;21405:22;21467:3;21445:18;21467:3;;21445:18;:::i;:::-;21430:34;;:11;:34;:::i;:::-;:40;;;;:::i;:::-;21405:65;-1:-1:-1;21481:20:0;21539:3;21517:18;21539:3;;21517:18;:::i;:::-;21504:32;;:9;:32;:::i;:::-;:38;;;;:::i;:::-;21662:16;;21481:61;;-1:-1:-1;21630:63:0;;21647:4;;-1:-1:-1;;;;;21662:16:0;21681:11;21630:8;:63::i;:::-;21718:16;;-1:-1:-1;;;;;21718:16:0;:32;21758:9;21791:4;21811:11;21837:14;21866:12;21791:4;21921:22;:15;21939:4;21921:22;:::i;:::-;21718:271;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21718:271:0;;;;;;;;-1:-1:-1;;21718:271:0;;;;;;;;;;;;:::i;:::-;;;21714:527;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;22115:26;22134:6;22115:26;;;;;;:::i;:::-;;;;;;;;22061:92;21714:527;;;;;22180:49;;;;;24782:2:1;24764:21;;;24821:2;24801:18;;;24794:30;24860:29;24855:2;24840:18;;24833:57;24922:2;24907:18;;24580:351;22180:49:0;;;;;;;;21714:527;;;-1:-1:-1;;22010:38:0;;;5859:25:1;;;5915:2;5900:18;;5893:34;;;22010:38:0;;-1:-1:-1;5832:18:1;22010:38:0;;;;;;;21714:527;21022:1226;;;20951:1297;;:::o;24794:1779::-;24884:7;:14;24913:17;;;:32;;-1:-1:-1;24934:11:0;;24913:32;24909:45;;;24947:7;24794:1779;:::o;24909:45::-;25022:22;25061:3;25047:11;:6;25056:2;25047:11;:::i;:::-;:17;;;;:::i;:::-;25022:42;-1:-1:-1;25075:20:0;25098:23;25022:42;25098:6;:23;:::i;:::-;25075:46;;25205:1;25188:14;:18;:50;;;;-1:-1:-1;25210:14:0;;-1:-1:-1;;;;;25210:14:0;:28;;25188:50;25184:539;;;25282:14;;:46;;25256:20;;-1:-1:-1;;;;;25282:14:0;;25309;;25256:20;25282:46;25256:20;25282:46;25309:14;25282;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25255:73;;;25348:15;25343:232;;25389:45;;;;;25348:2:1;25330:21;;;25387:2;25367:18;;;25360:30;25426;25421:2;25406:18;;25399:58;25489:2;25474:18;;25146:352;25389:45:0;;;;;;;;25553:6;25538:21;;25343:232;25240:346;25184:539;;;-1:-1:-1;25705:6:0;25184:539;25798:1;25783:12;:16;:36;;;;;25818:1;25803:12;:16;25783:36;25779:721;;;25836:23;25862:27;25877:12;25862;:27;:::i;:::-;25836:53;-1:-1:-1;25908:19:0;;25904:585;;25953:9;25948:526;25972:12;25968:1;:16;25948:526;;;26014:14;26031:7;26039:1;26031:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;26031:10:0;;-1:-1:-1;26068:20:0;;;;;:47;;-1:-1:-1;;;;;;26092:23:0;;26110:4;26092:23;;26068:47;:74;;;;-1:-1:-1;26129:13:0;;-1:-1:-1;;;;;26119:23:0;;;26129:13;;26119:23;;26068:74;26064:391;;;26234:12;26252:6;-1:-1:-1;;;;;26252:11:0;26271:15;26252:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26233:58;;;26323:7;26318:114;;26368:36;;;;;25705:2:1;25687:21;;;25744:2;25724:18;;;25717:30;-1:-1:-1;;;25778:2:1;25763:18;;25756:49;25837:2;25822:18;;25503:343;26368:36:0;;;;;;;;26318:114;26144:311;26064:391;-1:-1:-1;25986:3:0;;;;:::i;:::-;;;;25948:526;;;;25904:585;25821:679;25779:721;26525:40;;;5859:25:1;;;5915:2;5900:18;;5893:34;;;26525:40:0;;5832:18:1;26525:40:0;5685:248:1;2165:191:0;2258:6;;;-1:-1:-1;;;;;2275:17:0;;;-1:-1:-1;;;;;;2275:17:0;;;;;;;2308:40;;2258:6;;;2275:17;2258:6;;2308:40;;2239:16;;2308:40;2228:128;2165:191;:::o;4124:507::-;-1:-1:-1;;;;;4221:18:0;;;;;;:38;;-1:-1:-1;;;;;;4243:16:0;;;;4221:38;4213:53;;;;-1:-1:-1;;;4213:53:0;;26193:2:1;4213:53:0;;;26175:21:1;26232:1;26212:18;;;26205:29;-1:-1:-1;;;26250:18:1;;;26243:32;26292:18;;4213:53:0;25991:325:1;4213:53:0;-1:-1:-1;;;;;4348:15:0;;4326:19;4348:15;;;;;;;;;;;4382:21;;;;4374:36;;;;-1:-1:-1;;;4374:36:0;;26523:2:1;4374:36:0;;;26505:21:1;26562:1;26542:18;;;26535:29;-1:-1:-1;;;26580:18:1;;;26573:32;26622:18;;4374:36:0;26321:325:1;4374:36:0;-1:-1:-1;;;;;4446:15:0;;;:9;:15;;;;;;;;;;;4464:20;;;4446:38;;4499:13;;;;;;;;;;:23;;;;;;4549:26;;160:25:1;;;4499:13:0;;4549:26;;133:18:1;4549:26:0;;;;;;;4586:37;30711:183;16485:779;16580:13;;-1:-1:-1;;;;;16569:24:0;;;16580:13;;16569:24;;;;:52;;-1:-1:-1;;;;;;16597:24:0;;16616:4;16597:24;;16569:52;16565:692;;;16642:14;:36;;;;-1:-1:-1;;;;;;16661:17:0;;;;;;:8;:17;;;;;;;;16660:18;16642:36;16638:608;;;-1:-1:-1;;;;;;16699:17:0;;;;;:8;:17;;;;;:24;;-1:-1:-1;;16699:24:0;16719:4;16699:24;;;;;;16742:7;:21;;;;;;;;;;;;;;-1:-1:-1;;;;;;16742:21:0;;;;;;16485:779::o;16638:608::-;16790:14;16789:15;:36;;;;-1:-1:-1;;;;;;16808:17:0;;;;;;:8;:17;;;;;;;;16789:36;16785:461;;;-1:-1:-1;;;;;16846:17:0;;16866:5;16846:17;;;:8;:17;;;;;:25;;-1:-1:-1;;16846:25:0;;;16954:277;16978:7;:14;16974:18;;16954:277;;;17040:7;-1:-1:-1;;;;;17026:21:0;:7;17034:1;17026:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;17026:10:0;:21;17022:190;;17089:7;17097:14;;:18;;17114:1;;17097:18;:::i;:::-;17089:27;;;;;;;;:::i;:::-;;;;;;;;;;;17076:7;:10;;-1:-1:-1;;;;;17089:27:0;;;;17084:1;;17076:10;;;;;;:::i;:::-;;;;;;;;;:40;;;;;-1:-1:-1;;;;;17076:40:0;;;;;-1:-1:-1;;;;;17076:40:0;;;;;;17143:7;:13;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;17143:13:0;;;;;-1:-1:-1;;;;;;17143:13:0;;;;;;30845:41:::1;30711:183:::0;;:::o;17022:190::-;16994:3;;;;:::i;:::-;;;;16954:277;;16785:461;16485:779;;:::o;196:250:1:-;281:1;291:113;305:6;302:1;299:13;291:113;;;381:11;;;375:18;362:11;;;355:39;327:2;320:10;291:113;;;-1:-1:-1;;438:1:1;420:16;;413:27;196:250::o;451:396::-;600:2;589:9;582:21;563:4;632:6;626:13;675:6;670:2;659:9;655:18;648:34;691:79;763:6;758:2;747:9;743:18;738:2;730:6;726:15;691:79;:::i;:::-;831:2;810:15;-1:-1:-1;;806:29:1;791:45;;;;838:2;787:54;;451:396;-1:-1:-1;;451:396:1:o;852:131::-;-1:-1:-1;;;;;927:31:1;;917:42;;907:70;;973:1;970;963:12;988:315;1056:6;1064;1117:2;1105:9;1096:7;1092:23;1088:32;1085:52;;;1133:1;1130;1123:12;1085:52;1172:9;1159:23;1191:31;1216:5;1191:31;:::i;:::-;1241:5;1293:2;1278:18;;;;1265:32;;-1:-1:-1;;;988:315:1:o;1500:456::-;1577:6;1585;1593;1646:2;1634:9;1625:7;1621:23;1617:32;1614:52;;;1662:1;1659;1652:12;1614:52;1701:9;1688:23;1720:31;1745:5;1720:31;:::i;:::-;1770:5;-1:-1:-1;1827:2:1;1812:18;;1799:32;1840:33;1799:32;1840:33;:::i;:::-;1500:456;;1892:7;;-1:-1:-1;;;1946:2:1;1931:18;;;;1918:32;;1500:456::o;1961:180::-;2020:6;2073:2;2061:9;2052:7;2048:23;2044:32;2041:52;;;2089:1;2086;2079:12;2041:52;-1:-1:-1;2112:23:1;;1961:180;-1:-1:-1;1961:180:1:o;2543:461::-;2596:3;2634:5;2628:12;2661:6;2656:3;2649:19;2687:4;2716:2;2711:3;2707:12;2700:19;;2753:2;2746:5;2742:14;2774:1;2784:195;2798:6;2795:1;2792:13;2784:195;;;2863:13;;-1:-1:-1;;;;;2859:39:1;2847:52;;2919:12;;;;2954:15;;;;2895:1;2813:9;2784:195;;;-1:-1:-1;2995:3:1;;2543:461;-1:-1:-1;;;;;2543:461:1:o;3009:261::-;3188:2;3177:9;3170:21;3151:4;3208:56;3260:2;3249:9;3245:18;3237:6;3208:56;:::i;:::-;3200:64;3009:261;-1:-1:-1;;;3009:261:1:o;3508:247::-;3567:6;3620:2;3608:9;3599:7;3595:23;3591:32;3588:52;;;3636:1;3633;3626:12;3588:52;3675:9;3662:23;3694:31;3719:5;3694:31;:::i;3760:248::-;3828:6;3836;3889:2;3877:9;3868:7;3864:23;3860:32;3857:52;;;3905:1;3902;3895:12;3857:52;-1:-1:-1;;3928:23:1;;;3998:2;3983:18;;;3970:32;;-1:-1:-1;3760:248:1:o;4013:388::-;4081:6;4089;4142:2;4130:9;4121:7;4117:23;4113:32;4110:52;;;4158:1;4155;4148:12;4110:52;4197:9;4184:23;4216:31;4241:5;4216:31;:::i;:::-;4266:5;-1:-1:-1;4323:2:1;4308:18;;4295:32;4336:33;4295:32;4336:33;:::i;:::-;4388:7;4378:17;;;4013:388;;;;;:::o;4640:380::-;4719:1;4715:12;;;;4762;;;4783:61;;4837:4;4829:6;4825:17;4815:27;;4783:61;4890:2;4882:6;4879:14;4859:18;4856:38;4853:161;;4936:10;4931:3;4927:20;4924:1;4917:31;4971:4;4968:1;4961:15;4999:4;4996:1;4989:15;4853:161;;4640:380;;;:::o;6268:274::-;-1:-1:-1;;;;;6460:32:1;;;;6442:51;;6524:2;6509:18;;6502:34;6430:2;6415:18;;6268:274::o;6547:277::-;6614:6;6667:2;6655:9;6646:7;6642:23;6638:32;6635:52;;;6683:1;6680;6673:12;6635:52;6715:9;6709:16;6768:5;6761:13;6754:21;6747:5;6744:32;6734:60;;6790:1;6787;6780:12;7489:127;7550:10;7545:3;7541:20;7538:1;7531:31;7581:4;7578:1;7571:15;7605:4;7602:1;7595:15;7621:125;7686:9;;;7707:10;;;7704:36;;;7720:18;;:::i;8106:168::-;8179:9;;;8210;;8227:15;;;8221:22;;8207:37;8197:71;;8248:18;;:::i;8279:217::-;8319:1;8345;8335:132;;8389:10;8384:3;8380:20;8377:1;8370:31;8424:4;8421:1;8414:15;8452:4;8449:1;8442:15;8335:132;-1:-1:-1;8481:9:1;;8279:217::o;8501:128::-;8568:9;;;8589:11;;;8586:37;;;8603:18;;:::i;9627:251::-;9697:6;9750:2;9738:9;9729:7;9725:23;9721:32;9718:52;;;9766:1;9763;9756:12;9718:52;9798:9;9792:16;9817:31;9842:5;9817:31;:::i;10543:325::-;10745:2;10727:21;;;10784:1;10764:18;;;10757:29;-1:-1:-1;;;10817:2:1;10802:18;;10795:32;10859:2;10844:18;;10543:325::o;11203:184::-;11273:6;11326:2;11314:9;11305:7;11301:23;11297:32;11294:52;;;11342:1;11339;11332:12;11294:52;-1:-1:-1;11365:16:1;;11203:184;-1:-1:-1;11203:184:1:o;12052:375::-;-1:-1:-1;;;;;12310:15:1;;;12292:34;;12362:15;;;;12357:2;12342:18;;12335:43;12409:2;12394:18;;12387:34;;;;12242:2;12227:18;;12052:375::o;13527:306::-;13615:6;13623;13631;13684:2;13672:9;13663:7;13659:23;13655:32;13652:52;;;13700:1;13697;13690:12;13652:52;13729:9;13723:16;13713:26;;13779:2;13768:9;13764:18;13758:25;13748:35;;13823:2;13812:9;13808:18;13802:25;13792:35;;13527:306;;;;;:::o;13838:179::-;13873:3;13915:1;13897:16;13894:23;13891:120;;;13961:1;13958;13955;13940:23;-1:-1:-1;13998:1:1;13992:8;13987:3;13983:18;13891:120;13838:179;:::o;14154:346::-;14264:2;14245:13;;-1:-1:-1;;14241:27:1;14229:40;;14299:18;14284:34;;14320:22;;;14281:62;14278:185;;;14385:10;14380:3;14376:20;14373:1;14366:31;14420:4;14417:1;14410:15;14448:4;14445:1;14438:15;14278:185;14479:2;14472:22;-1:-1:-1;;14154:346:1:o;14505:671::-;14544:3;14586:4;14568:16;14565:26;14562:39;;;14505:671;:::o;14562:39::-;14628:2;14622:9;-1:-1:-1;;14693:16:1;14689:25;;14686:1;14622:9;14665:50;14744:4;14738:11;14768:16;14803:18;14874:2;14867:4;14859:6;14855:17;14852:25;14847:2;14839:6;14836:14;14833:45;14830:58;;;14881:5;;;;;14505:671;:::o;14830:58::-;14918:6;14912:4;14908:17;14897:28;;14954:3;14948:10;14981:2;14973:6;14970:14;14967:27;;;14987:5;;;;;;14505:671;:::o;14967:27::-;15071:2;15052:16;15046:4;15042:27;15038:36;15031:4;15022:6;15017:3;15013:16;15009:27;15006:69;15003:82;;;15078:5;;;;;;14505:671;:::o;15003:82::-;15094:57;15145:4;15136:6;15128;15124:19;15120:30;15114:4;15094:57;:::i;:::-;-1:-1:-1;15167:3:1;;14505:671;-1:-1:-1;;;;;14505:671:1:o;18895:607::-;-1:-1:-1;;;;;19254:15:1;;;19236:34;;19301:2;19286:18;;19279:34;;;;19344:2;19329:18;;19322:34;;;;19387:2;19372:18;;19365:34;;;;19436:15;;;19430:3;19415:19;;19408:44;19216:3;19468:19;;19461:35;;;;19185:3;19170:19;;18895:607::o;21239:127::-;21300:10;21295:3;21291:20;21288:1;21281:31;21331:4;21328:1;21321:15;21355:4;21352:1;21345:15;21371:574;21662:6;21651:9;21644:25;21705:6;21700:2;21689:9;21685:18;21678:34;21748:3;21743:2;21732:9;21728:18;21721:31;21625:4;21769:57;21821:3;21810:9;21806:19;21798:6;21769:57;:::i;:::-;-1:-1:-1;;;;;21862:32:1;;;;21857:2;21842:18;;21835:60;-1:-1:-1;21926:3:1;21911:19;21904:35;21761:65;21371:574;-1:-1:-1;;;21371:574:1:o;22297:459::-;22559:29;22554:3;22547:42;22529:3;22618:6;22612:13;22634:75;22702:6;22697:2;22692:3;22688:12;22681:4;22673:6;22669:17;22634:75;:::i;:::-;22729:16;;;;22747:2;22725:25;;22297:459;-1:-1:-1;;22297:459:1:o;25851:135::-;25890:3;25911:17;;;25908:43;;25931:18;;:::i;:::-;-1:-1:-1;25978:1:1;25967:13;;25851:135::o;26651:127::-;26712:10;26707:3;26703:20;26700:1;26693:31;26743:4;26740:1;26733:15;26767:4;26764:1;26757:15

Swarm Source

ipfs://576b7eb94c4c881804a73f6f8e6b06b9e9f8c6a75ccc1d3cb95676af804f5a8c
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.