ETH Price: $3,400.35 (-1.29%)
Gas: 2 Gwei

Token

MicroValidator (MICROV)
 

Overview

Max Total Supply

6,000,000 MICROV

Holders

354

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
94.2 MICROV

Value
$0.00
0x408640ef04b35b70de90b9116582f74d3bd7a7d6
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MICROV

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-10
*/

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

interface AggregatorV3Interface {
    function decimals() external view returns (uint8);
    function description() external view returns (string memory);
    function version() external view returns (uint256);
    function getRoundData(uint80 _roundId) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
    function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
}

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

interface IERC721 is IERC165 {
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    function balanceOf(address owner) external view returns (uint256 balance);
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function approve(address to, uint256 tokenId) external;
    function setApprovalForAll(address operator, bool _approved) external;
    function getApproved(uint256 tokenId) external view returns (address operator);
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

interface IERC721Receiver {
    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}

interface IERC721Metadata is IERC721 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

library Address {
    function isContract(address account) internal view returns (bool) {
        return account.code.length > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    function verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    function toString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

abstract contract ERC165 is IERC165 {
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

abstract contract AC {
    address internal owner;
    constructor(address _owner) {
        owner = _owner;
    }
    modifier onlyOwner() {
        require(isOwner(msg.sender), "!OWNER");
        _;
    }
    function isOwner(address account) public view returns (bool) {
        return account == owner;
    }
    function transferOwnership(address payable adr) public onlyOwner {
        owner = adr;
        emit OwnershipTransferred(adr);
    }
    event OwnershipTransferred(address owner);
}

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, AC {
    using Address for address;
    using Strings for uint256;

    string private _name;

    string private _symbol;

    string private _base = "https://cdn.theannuity.io/";

    mapping(uint256 => address) internal _owners;

    mapping(address => uint256) internal _balances;

    mapping(uint256 => address) private _tokenApprovals;

    mapping(address => mapping(address => bool)) private _operatorApprovals;

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

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId);
    }

    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    function _baseURI() internal view virtual returns (string memory) {
        return _base;
    }

    function changeBaseURI(string memory _baseNew) external onlyOwner {
        _base = _baseNew;
    }

    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");
        require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all");
        _approve(to, tokenId);
    }

    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");
        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");
        _balances[to] += 1;
        _owners[tokenId] = to;
    }

    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) internal returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }
}

library Counters {
    struct Counter {
        uint256 _value;
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;
    mapping(uint256 => string) private _tokenURIs;

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");
        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        return super.tokenURI(tokenId);
    }

    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }
}

library SafeMath {
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
    function getOwner() external view returns (address);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address _owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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

interface IUniswapV2Router {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external;
}

interface INetwork {
    function setShare(address shareholder, uint256 amount) external;
    function deposit() external payable;
}

contract Network1 is INetwork, AC {
    using SafeMath for uint256;
    uint256 internal constant max = 2**256 - 1;
    address _token;
    struct Share {
        uint256 amount;
        uint256 totalExcluded;
        uint256 totalRealised;
    }
    IERC20 BASE;
    IUniswapV2Router router;
    address[] shareholders;
    mapping (address => uint256) shareholderIndexes;
    mapping (address => uint256) public totalRewardsDistributed;
    mapping (address => mapping (address => uint256)) public totalRewardsToUser;
    mapping (address => bool) public allowed;
    mapping (address => Share) public shares;
    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 public dividendsPerShare;
    uint256 public dividendsPerShareAccuracyFactor = 10 ** 36;

    modifier onlyToken() {
        require(msg.sender == _token);
        _;
    }

    constructor (address _router, address _owner, address _weth) AC(_owner) {
        router = _router != address(0) ? IUniswapV2Router(_router) : IUniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        _token = msg.sender;
        allowed[_weth] = true;
        BASE = IERC20(_weth);
        BASE.approve(_router, max);
    }

    receive() external payable {}

    function getClaimedDividendsTotal(address token) public view returns (uint256) {
        return totalRewardsDistributed[token];
    }

    function getClaimedDividends(address token, address user) public view returns (uint256) {
        return totalRewardsToUser[token][user];
    }

    function changeRouterVersion(address _router) external onlyOwner {
        IUniswapV2Router _uniswapV2Router = IUniswapV2Router(_router);
        router = _uniswapV2Router;
    }

    function setShare(address shareholder, uint256 amount) external override onlyToken {
        if (amount > 0 && shares[shareholder].amount == 0) addShareholder(shareholder);
        else if (amount == 0 && shares[shareholder].amount > 0) removeShareholder(shareholder);
        totalShares = totalShares.sub(shares[shareholder].amount).add(amount);
        shares[shareholder].amount = amount;
        shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
    }

    function deposit() external payable override onlyToken {
        uint256 amount = msg.value;
        totalDividends = totalDividends.add(amount);
        dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
    }

    function distributeDividend(address shareholder, address rewardAddress) internal {
        require(allowed[rewardAddress], "Invalid reward address!");
        if (shares[shareholder].amount == 0) {
            return;
        }
        uint256 amount = getPendingDividend(shareholder);
        if (amount > 0) {
            totalDistributed = totalDistributed.add(amount);
            shares[shareholder].totalRealised = shares[shareholder].totalRealised.add(amount);
            shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
            if (rewardAddress == address(BASE)) {
                payable(shareholder).transfer(amount);
                totalRewardsDistributed[rewardAddress] = totalRewardsDistributed[rewardAddress].add(amount);  
                totalRewardsToUser[rewardAddress][shareholder] = totalRewardsToUser[rewardAddress][shareholder].add(amount);
            }
        }
    }

    function claimDividend(address claimer, address rewardAddress) external onlyToken {
        distributeDividend(claimer, rewardAddress);
    }

    function getPendingDividend(address shareholder) public view returns (uint256) {
        if (shares[shareholder].amount == 0) return 0;
        uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount);
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded;
        if (shareholderTotalDividends <= shareholderTotalExcluded) return 0;
        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }

    function getCumulativeDividends(uint256 share) internal view returns (uint256) {
        return share.mul(dividendsPerShare).div(dividendsPerShareAccuracyFactor);
    }

    function addShareholder(address shareholder) internal {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }

    function removeShareholder(address shareholder) internal {
        shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length - 1];
        shareholderIndexes[shareholders[shareholders.length - 1]] = shareholderIndexes[shareholder];
        shareholders.pop();
    }

    function changeBASE(address _BASE) external onlyOwner {
        BASE = IERC20(_BASE);
    }

    function drainGas() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function drainToken(address _address, address _to) external onlyOwner {
        IERC20(_address).transfer(_to, IERC20(_address).balanceOf(address(this)));
    }
}

contract Network2 is INetwork, AC {
    using SafeMath for uint256;
    uint256 internal constant max = 2**256 - 1;
    address _token;
    struct Share {
        uint256 amount;
        uint256 totalExcluded;
        uint256 totalRealised;
    }
    IERC20 BASE;
    IUniswapV2Router router;
    address[] shareholders;
    mapping (address => uint256) shareholderIndexes;
    mapping (address => uint256) public totalRewardsDistributed;
    mapping (address => mapping (address => uint256)) public totalRewardsToUser;
    mapping (address => bool) public allowed;
    mapping (address => Share) public shares;
    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 public dividendsPerShare;
    uint256 public dividendsPerShareAccuracyFactor = 10 ** 36;

    modifier onlyToken() {
        require(msg.sender == _token);
        _;
    }

    constructor (address _router, address _owner, address _weth) AC(_owner) {
        router = _router != address(0) ? IUniswapV2Router(_router) : IUniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        _token = msg.sender;
        allowed[_weth] = true;
        BASE = IERC20(_weth);
        BASE.approve(_router, max);
    }

    receive() external payable {}

    function getClaimedDividendsTotal(address token) public view returns (uint256) {
        return totalRewardsDistributed[token];
    }

    function getClaimedDividends(address token, address user) public view returns (uint256) {
        return totalRewardsToUser[token][user];
    }

    function changeRouterVersion(address _router) external onlyOwner {
        IUniswapV2Router _uniswapV2Router = IUniswapV2Router(_router);
        router = _uniswapV2Router;
    }

    function setShare(address shareholder, uint256 amount) external override onlyToken {
        if (amount > 0 && shares[shareholder].amount == 0) addShareholder(shareholder);
        else if (amount == 0 && shares[shareholder].amount > 0) removeShareholder(shareholder);
        totalShares = totalShares.sub(shares[shareholder].amount).add(amount);
        shares[shareholder].amount = amount;
        shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
    }

    function deposit() external payable override onlyToken {
        uint256 amount = msg.value;
        totalDividends = totalDividends.add(amount);
        dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
    }

    function distributeDividend(address shareholder, address rewardAddress) internal {
        require(allowed[rewardAddress], "Invalid reward address!");
        if (shares[shareholder].amount == 0) {
            return;
        }
        uint256 amount = getPendingDividend(shareholder);
        if (amount > 0) {
            totalDistributed = totalDistributed.add(amount);
            shares[shareholder].totalRealised = shares[shareholder].totalRealised.add(amount);
            shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
            if (rewardAddress == address(BASE)) {
                payable(shareholder).transfer(amount);
                totalRewardsDistributed[rewardAddress] = totalRewardsDistributed[rewardAddress].add(amount);  
                totalRewardsToUser[rewardAddress][shareholder] = totalRewardsToUser[rewardAddress][shareholder].add(amount);
            }
        }
    }

    function claimDividend(address claimer, address rewardAddress) external onlyToken {
        distributeDividend(claimer, rewardAddress);
    }

    function getPendingDividend(address shareholder) public view returns (uint256) {
        if (shares[shareholder].amount == 0) return 0;
        uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount);
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded;
        if (shareholderTotalDividends <= shareholderTotalExcluded) return 0;
        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }

    function getCumulativeDividends(uint256 share) internal view returns (uint256) {
        return share.mul(dividendsPerShare).div(dividendsPerShareAccuracyFactor);
    }

    function addShareholder(address shareholder) internal {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }

    function removeShareholder(address shareholder) internal {
        shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length - 1];
        shareholderIndexes[shareholders[shareholders.length - 1]] = shareholderIndexes[shareholder];
        shareholders.pop();
    }

    function changeBASE(address _BASE) external onlyOwner {
        BASE = IERC20(_BASE);
    }

    function drainGas() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function drainToken(address _address, address _to) external onlyOwner {
        IERC20(_address).transfer(_to, IERC20(_address).balanceOf(address(this)));
    }
}

contract Network3 is INetwork, AC {
    using SafeMath for uint256;
    uint256 internal constant max = 2**256 - 1;
    address _token;
    struct Share {
        uint256 amount;
        uint256 totalExcluded;
        uint256 totalRealised;
    }
    IERC20 BASE;
    IUniswapV2Router router;
    address[] shareholders;
    mapping (address => uint256) shareholderIndexes;
    mapping (address => uint256) public totalRewardsDistributed;
    mapping (address => mapping (address => uint256)) public totalRewardsToUser;
    mapping (address => bool) public allowed;
    mapping (address => Share) public shares;
    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 public dividendsPerShare;
    uint256 public dividendsPerShareAccuracyFactor = 10 ** 36;

    modifier onlyToken() {
        require(msg.sender == _token);
        _;
    }

    constructor (address _router, address _owner, address _weth) AC(_owner) {
        router = _router != address(0) ? IUniswapV2Router(_router) : IUniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        _token = msg.sender;
        allowed[_weth] = true;
        BASE = IERC20(_weth);
        BASE.approve(_router, max);
    }

    receive() external payable {}

    function getClaimedDividendsTotal(address token) public view returns (uint256) {
        return totalRewardsDistributed[token];
    }

    function getClaimedDividends(address token, address user) public view returns (uint256) {
        return totalRewardsToUser[token][user];
    }

    function changeRouterVersion(address _router) external onlyOwner {
        IUniswapV2Router _uniswapV2Router = IUniswapV2Router(_router);
        router = _uniswapV2Router;
    }

    function setShare(address shareholder, uint256 amount) external override onlyToken {
        if (amount > 0 && shares[shareholder].amount == 0) addShareholder(shareholder);
        else if (amount == 0 && shares[shareholder].amount > 0) removeShareholder(shareholder);
        totalShares = totalShares.sub(shares[shareholder].amount).add(amount);
        shares[shareholder].amount = amount;
        shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
    }

    function deposit() external payable override onlyToken {
        uint256 amount = msg.value;
        totalDividends = totalDividends.add(amount);
        dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
    }

    function distributeDividend(address shareholder, address rewardAddress) internal {
        require(allowed[rewardAddress], "Invalid reward address!");
        if (shares[shareholder].amount == 0) {
            return;
        }
        uint256 amount = getPendingDividend(shareholder);
        if (amount > 0) {
            totalDistributed = totalDistributed.add(amount);
            shares[shareholder].totalRealised = shares[shareholder].totalRealised.add(amount);
            shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
            if (rewardAddress == address(BASE)) {
                payable(shareholder).transfer(amount);
                totalRewardsDistributed[rewardAddress] = totalRewardsDistributed[rewardAddress].add(amount);  
                totalRewardsToUser[rewardAddress][shareholder] = totalRewardsToUser[rewardAddress][shareholder].add(amount);
            }
        }
    }

    function claimDividend(address claimer, address rewardAddress) external onlyToken {
        distributeDividend(claimer, rewardAddress);
    }

    function getPendingDividend(address shareholder) public view returns (uint256) {
        if (shares[shareholder].amount == 0) return 0;
        uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount);
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded;
        if (shareholderTotalDividends <= shareholderTotalExcluded) return 0;
        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }

    function getCumulativeDividends(uint256 share) internal view returns (uint256) {
        return share.mul(dividendsPerShare).div(dividendsPerShareAccuracyFactor);
    }

    function addShareholder(address shareholder) internal {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }

    function removeShareholder(address shareholder) internal {
        shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length - 1];
        shareholderIndexes[shareholders[shareholders.length - 1]] = shareholderIndexes[shareholder];
        shareholders.pop();
    }

    function changeBASE(address _BASE) external onlyOwner {
        BASE = IERC20(_BASE);
    }

    function drainGas() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function drainToken(address _address, address _to) external onlyOwner {
        IERC20(_address).transfer(_to, IERC20(_address).balanceOf(address(this)));
    }
}

contract Network4 is INetwork, AC {
    using SafeMath for uint256;
    uint256 internal constant max = 2**256 - 1;
    address _token;
    struct Share {
        uint256 amount;
        uint256 totalExcluded;
        uint256 totalRealised;
    }
    IERC20 BASE;
    IUniswapV2Router router;
    address[] shareholders;
    mapping (address => uint256) shareholderIndexes;
    mapping (address => uint256) public totalRewardsDistributed;
    mapping (address => mapping (address => uint256)) public totalRewardsToUser;
    mapping (address => bool) public allowed;
    mapping (address => Share) public shares;
    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 public dividendsPerShare;
    uint256 public dividendsPerShareAccuracyFactor = 10 ** 36;

    modifier onlyToken() {
        require(msg.sender == _token);
        _;
    }

    constructor (address _router, address _owner, address _weth) AC(_owner) {
        router = _router != address(0) ? IUniswapV2Router(_router) : IUniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        _token = msg.sender;
        allowed[_weth] = true;
        BASE = IERC20(_weth);
        BASE.approve(_router, max);
    }

    receive() external payable {}

    function getClaimedDividendsTotal(address token) public view returns (uint256) {
        return totalRewardsDistributed[token];
    }

    function getClaimedDividends(address token, address user) public view returns (uint256) {
        return totalRewardsToUser[token][user];
    }

    function changeRouterVersion(address _router) external onlyOwner {
        IUniswapV2Router _uniswapV2Router = IUniswapV2Router(_router);
        router = _uniswapV2Router;
    }

    function setShare(address shareholder, uint256 amount) external override onlyToken {
        if (amount > 0 && shares[shareholder].amount == 0) addShareholder(shareholder);
        else if (amount == 0 && shares[shareholder].amount > 0) removeShareholder(shareholder);
        totalShares = totalShares.sub(shares[shareholder].amount).add(amount);
        shares[shareholder].amount = amount;
        shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
    }

    function deposit() external payable override onlyToken {
        uint256 amount = msg.value;
        totalDividends = totalDividends.add(amount);
        dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
    }

    function distributeDividend(address shareholder, address rewardAddress) internal {
        require(allowed[rewardAddress], "Invalid reward address!");
        if (shares[shareholder].amount == 0) {
            return;
        }
        uint256 amount = getPendingDividend(shareholder);
        if (amount > 0) {
            totalDistributed = totalDistributed.add(amount);
            shares[shareholder].totalRealised = shares[shareholder].totalRealised.add(amount);
            shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
            if (rewardAddress == address(BASE)) {
                payable(shareholder).transfer(amount);
                totalRewardsDistributed[rewardAddress] = totalRewardsDistributed[rewardAddress].add(amount);  
                totalRewardsToUser[rewardAddress][shareholder] = totalRewardsToUser[rewardAddress][shareholder].add(amount);
            }
        }
    }

    function claimDividend(address claimer, address rewardAddress) external onlyToken {
        distributeDividend(claimer, rewardAddress);
    }

    function getPendingDividend(address shareholder) public view returns (uint256) {
        if (shares[shareholder].amount == 0) return 0;
        uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount);
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded;
        if (shareholderTotalDividends <= shareholderTotalExcluded) return 0;
        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }

    function getCumulativeDividends(uint256 share) internal view returns (uint256) {
        return share.mul(dividendsPerShare).div(dividendsPerShareAccuracyFactor);
    }

    function addShareholder(address shareholder) internal {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }

    function removeShareholder(address shareholder) internal {
        shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length - 1];
        shareholderIndexes[shareholders[shareholders.length - 1]] = shareholderIndexes[shareholder];
        shareholders.pop();
    }

    function changeBASE(address _BASE) external onlyOwner {
        BASE = IERC20(_BASE);
    }

    function drainGas() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function drainToken(address _address, address _to) external onlyOwner {
        IERC20(_address).transfer(_to, IERC20(_address).balanceOf(address(this)));
    }
}

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, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}

contract MicroValidator is AC, ERC721URIStorage, ReentrancyGuard {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;
    address public microvAddress;
    IERC20 microv;
    Network1 private _network1;
    address public network1Address;
    Network2 private _network2;
    address public network2Address;
    Network3 private _network3;
    address public network3Address;
    Network4 private _network4;
    address public network4Address;
    address public renewals = 0xa1ed930901534A5eecCC37fE131362e3054c4a82;
    address public claims = 0xa1ed930901534A5eecCC37fE131362e3054c4a82;
    address public rewards = 0x000000000000000000000000000000000000dEaD;
    address public liquidity = 0x4D939977da7D0d0C3239dd0415F13a35cC1664b4;
    address public reserves = 0xa1ed930901534A5eecCC37fE131362e3054c4a82;
    address public partnerships = 0xFf20C9736ac252014800782692d867B4C70656d1;
    address public dead = 0x000000000000000000000000000000000000dEaD;
    uint256 public rate0 = 700000000000;
    uint256[20] public rates0 = [700000000000, 595000000000, 505750000000, 429887500000, 365404375000, 310593718750, 264004660937, 224403961797, 190743367527, 162131862398, 137812083039, 117140270583, 99569229995, 84633845496, 71938768672, 61147953371, 51975760365, 44179396311, 37552486864, 31919613834];
    uint256 public amount1 = 21759840000000000000;
    uint256 public amount2 = 135999000000000000000;
    uint256 public amount3 = 326397600000000000000;
    uint256 public amount4 = 658017561600000000000;
    uint256 public seconds1 = 31536000;
    uint256 public seconds2 = 94608000;
    uint256 public seconds3 = 157680000;
    uint256 public seconds4 = 504576000;
    uint256 public gracePeriod = 2628000;
    uint256 public gammaPeriod = 5443200;
    uint256 public quarter = 7884000;
    uint256 public month = 2628000;
    uint256 public maxValidatorsPerMinter = 100;
    address public weth = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    struct Validator {
        uint256 id;
        address minter;
        uint256 created;
        uint256 lastClaimMicrov;
        uint256 lastClaimEth;
        uint256 numClaimsMicrov;
        uint256 renewalExpiry;
        uint8 fuseProduct;
        uint256 fuseCreated;
        uint256 fuseUnlocks;
        bool fuseUnlocked;
    }
    mapping (uint256 => Validator) public validators;
    mapping (address => Validator[]) public validatorsByMinter;
    mapping (address => uint256) public numValidatorsByMinter;
    mapping (uint256 => uint256) public positions;
    AggregatorV3Interface internal priceFeed = AggregatorV3Interface(0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419);
    uint256 public renewalFee = 1000 * 1000000;
    uint256 public claimMicrovFee = 6900 * 1000000;
    uint256 public claimEthFee = 639 * 1000000;
    uint256 public mintPrice = 10 * (10 ** 18);
    uint256 public rewardsFee = 6 * (10 ** 18);
    uint256 public liquidityFee = 10 ** 18;
    uint256 public reservesFee = 10 ** 18;
    uint256 public partnershipsFee = 10 ** 18;
    uint256 public deadFee = 10 ** 18;

    constructor(string memory _name, string memory _symbol, address _microvAddress, address _owner, address _priceFeed, address _weth) ERC721(_name, _symbol, _owner) {
        rewards = address(this);
        microvAddress = _microvAddress;
        microv = IERC20(microvAddress);
        address _router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        _network1 = new Network1(_router, _owner, _weth);
        network1Address = address(_network1);
        _network2 = new Network2(_router, _owner, _weth);
        network2Address = address(_network2);
        _network3 = new Network3(_router, _owner, _weth);
        network3Address = address(_network3);
        _network4 = new Network4(_router, _owner, _weth);
        network4Address = address(_network4);
        priceFeed = AggregatorV3Interface(_priceFeed);
        weth = _weth;
    }

    function createToken(uint256 _months) external payable nonReentrant returns (uint) {
        require(numValidatorsByMinter[msg.sender] < maxValidatorsPerMinter, "Too many validators");
        require(_months < 193, "Too many months");
        require(msg.value == getRenewalCost(_months), "Invalid value");
        require(microv.allowance(msg.sender, address(this)) > mintPrice, "Insufficient allowance");
        require(microv.balanceOf(msg.sender) > mintPrice, "Insufficient balance");
        bool _success = microv.transferFrom(msg.sender, address(this), mintPrice);
        require(_success, "Transfer unsuccessful");
        payable(renewals).transfer(msg.value);
        microv.transfer(rewards, rewardsFee);
        microv.transfer(liquidity, liquidityFee);
        microv.transfer(reserves, reservesFee);
        microv.transfer(partnerships, partnershipsFee);
        microv.transfer(dead, deadFee);
        uint256 _newItemId = _tokenIds.current();
        _tokenIds.increment();
        _mint(msg.sender, _newItemId);
        _setTokenURI(_newItemId, string(abi.encodePacked(_newItemId, ".json")));
        Validator memory _validator = Validator(_newItemId, msg.sender, block.timestamp, 0, 0, 0, block.timestamp + (2628000 * _months), 0, 0, 0, false);
        validators[_newItemId] = _validator;
        validatorsByMinter[msg.sender].push(_validator);
        positions[_newItemId] = numValidatorsByMinter[msg.sender];
        numValidatorsByMinter[msg.sender]++;
        return _newItemId;
    }

    function fuseToken(uint256 _id, uint8 _tier) external nonReentrant {
        require(ownerOf(_id) == msg.sender, "Invalid ownership");
        require(_tier == 1 || _tier == 2 || _tier == 3 || _tier == 4, "Invalid product");
        Validator memory _validator = validators[_id];
        require(_validator.fuseProduct == 0 || _validator.fuseUnlocked, "Already fused");
        require(_validator.renewalExpiry > block.timestamp, "Expired");
        uint256 _seconds = seconds1;
        uint256 _balance = 0;
        uint256 _matches = numValidatorsByMinter[msg.sender];
        Validator[] memory _array = validatorsByMinter[msg.sender];
        for (uint256 _i = 0; _i < _matches; _i++) {
            Validator memory _v = _array[_i];
            if (_v.fuseProduct == _tier && !_v.fuseUnlocked && _v.renewalExpiry > block.timestamp && _v.fuseUnlocks < block.timestamp) _balance++;
        }
        if (_tier == 1) {
            try _network1.setShare(msg.sender, _balance + 1) {} catch {}
        } else if (_tier == 2) {
            try _network2.setShare(msg.sender, _balance + 1) {} catch {}
            _seconds = seconds2;
        } else if (_tier == 3) {
            try _network3.setShare(msg.sender, _balance + 1) {} catch {}
            _seconds = seconds3;
        } else if (_tier == 4) {
            try _network4.setShare(msg.sender, _balance + 1) {} catch {}
            _seconds = seconds4;
        }
        Validator memory _validatorNew = Validator(_id, _validator.minter, _validator.created, _validator.lastClaimMicrov, 0, _validator.numClaimsMicrov, _validator.renewalExpiry, _tier, block.timestamp, block.timestamp + _seconds, false);
        validators[_id] = _validatorNew;
        validatorsByMinter[msg.sender][positions[_id]] = _validatorNew;
    }

    function renewToken(uint256 _id, uint256 _months) external payable nonReentrant {
        require(ownerOf(_id) == msg.sender, "Invalid ownership");
        require(_months < 193, "Too many months");
        uint256 _boost = 2628000 * _months;
        require(msg.value == getRenewalCost(_months), "Invalid value");
        Validator memory _validator = validators[_id];
        require(_validator.renewalExpiry + gracePeriod > block.timestamp, "Grace period expired");
        if (_validator.fuseProduct > 0) {
            require(!_validator.fuseUnlocked, "Must be unlocked");
            require(_validator.renewalExpiry + _boost <= _validator.fuseUnlocks + gracePeriod, "Renewing too far");
        }
        payable(renewals).transfer(msg.value);
        Validator memory _validatorNew = Validator(_id, _validator.minter, _validator.created, _validator.lastClaimMicrov, _validator.lastClaimEth, _validator.numClaimsMicrov, _validator.renewalExpiry + _boost, _validator.fuseProduct, _validator.fuseCreated, _validator.fuseUnlocks, false);
        validators[_id] = _validatorNew;
        validatorsByMinter[msg.sender][positions[_id]] = _validatorNew;
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function claimMicrov(uint256 _id) external payable nonReentrant {
        require(ownerOf(_id) == msg.sender, "Invalid ownership");
        Validator memory _validator = validators[_id];
        uint8 _fuseProduct = _validator.fuseProduct;
        require(_fuseProduct == 0, "Must be fused");
        require(_validator.renewalExpiry > block.timestamp, "Expired");
        require(msg.value == getClaimMicrovCost(), "Invalid value");
        payable(claims).transfer(msg.value);
        (, uint256 _amount) = getPendingMicrov(_id);
        microv.transfer(msg.sender, _amount);
        Validator memory _validatorNew = Validator(_id, _validator.minter, _validator.created, block.timestamp, _validator.lastClaimEth, _validator.numClaimsMicrov + 1, _validator.renewalExpiry, _validator.fuseProduct, _validator.fuseCreated, _validator.fuseUnlocks, _validator.fuseUnlocked);
        validators[_id] = _validatorNew;
        validatorsByMinter[msg.sender][positions[_id]] = _validatorNew;
    }

    function claimEth(uint256 _id) external payable nonReentrant {
        require(ownerOf(_id) == msg.sender, "Invalid ownership");
        Validator memory _validator = validators[_id];
        require(_validator.fuseProduct == 1 || _validator.fuseProduct == 2 || _validator.fuseProduct == 3 || _validator.fuseProduct == 4, "Invalid product");
        require(_validator.renewalExpiry > block.timestamp, "Expired");
        require(!_validator.fuseUnlocked, "Already unlocked");
        if (_validator.lastClaimEth == 0) {
            require(_validator.lastClaimEth >= _validator.fuseCreated + quarter, "Too early");
        } else {
            require(_validator.lastClaimEth >= _validator.lastClaimEth + month, "Too early");
        }
        require(msg.value == getClaimEthCost(), "Invalid value");
        payable(claims).transfer(msg.value);
        _refresh(msg.sender, true, _validator.fuseProduct);
        Validator memory _validatorNew = Validator(_id, _validator.minter, _validator.created, _validator.lastClaimMicrov, block.timestamp, _validator.numClaimsMicrov, _validator.renewalExpiry, _validator.fuseProduct, _validator.fuseCreated, _validator.fuseUnlocks, _validator.fuseUnlocked);
        validators[_id] = _validatorNew;
        validatorsByMinter[msg.sender][positions[_id]] = _validatorNew;
    }

    function _refresh(address _address, bool _claim, uint8 _tier) private {
        uint256 _1balance = 0;
        uint256 _2balance = 0;
        uint256 _3balance = 0;
        uint256 _4balance = 0;
        uint256 _matches = numValidatorsByMinter[_address];
        Validator[] memory _array = validatorsByMinter[_address];
        for (uint256 _i = 0; _i < _matches; _i++) {
            if (_array[_i].fuseProduct > 0 && !_array[_i].fuseUnlocked && _array[_i].renewalExpiry > block.timestamp && _array[_i].fuseUnlocks < block.timestamp) {
                uint256 _fuseProduct = _array[_i].fuseProduct;
                if (_fuseProduct == 1) _1balance++;
                else if (_fuseProduct == 2) _2balance++;
                else if (_fuseProduct == 3) _3balance++;
                else if (_fuseProduct == 4) _4balance++;
            }
        }
        if (_claim) {
            if (_tier == 1) try _network1.claimDividend(_address, weth) {} catch {}
            else if (_tier == 2) try _network2.claimDividend(_address, weth) {} catch {}
            else if (_tier == 3) try _network3.claimDividend(_address, weth) {} catch {}
            else if (_tier == 4) try _network4.claimDividend(_address, weth) {} catch {}
        }
        try _network1.setShare(_address, _1balance) {} catch {}
        try _network2.setShare(_address, _2balance) {} catch {}
        try _network3.setShare(_address, _3balance) {} catch {}
        try _network4.setShare(_address, _4balance) {} catch {}
    }

    function unlockMicrov(uint256 _id) external nonReentrant {
        require(ownerOf(_id) == msg.sender, "Invalid ownership");
        Validator memory _validator = validators[_id];
        require(_validator.fuseProduct == 1 || _validator.fuseProduct == 2 || _validator.fuseProduct == 3 || _validator.fuseProduct == 4, "Invalid product");
        require(_validator.renewalExpiry > block.timestamp, "Expired");
        require(_validator.fuseUnlocks >= block.timestamp, "Too early");
        require(!_validator.fuseUnlocked, "Already unlocked");
        _refresh(msg.sender, true, _validator.fuseProduct);
        if (_validator.fuseProduct == 1) microv.transfer(msg.sender, amount1);
        else if (_validator.fuseProduct == 2) microv.transfer(msg.sender, amount2);
        else if (_validator.fuseProduct == 3) microv.transfer(msg.sender, amount3);
        else if (_validator.fuseProduct == 4) microv.transfer(msg.sender, amount4);
        Validator memory _validatorNew = Validator(_id, _validator.minter, _validator.created, _validator.lastClaimMicrov, _validator.lastClaimEth, _validator.numClaimsMicrov, _validator.renewalExpiry, _validator.fuseProduct, _validator.fuseCreated, _validator.fuseUnlocks, true);
        validators[_id] = _validatorNew;
        validatorsByMinter[msg.sender][positions[_id]] = _validatorNew;
    }

    function slash(uint256 _id) external nonReentrant onlyOwner {
        Validator memory _validator = validators[_id];
        require(_validator.fuseProduct == 1 || _validator.fuseProduct == 2 || _validator.fuseProduct == 3 || _validator.fuseProduct == 4, "Invalid product");
        require(_validator.renewalExpiry + gracePeriod <= block.timestamp, "Not expired");
        _refresh(_validator.minter, false, 0);
    }

    function changeRatesAmounts(uint256 _rate0, uint256 _amount1, uint256 _amount2, uint256 _amount3, uint256 _amount4) external nonReentrant onlyOwner {
        rate0 = _rate0;
        amount1 = _amount1;
        amount2 = _amount2;
        amount3 = _amount3;
        amount4 = _amount4;
    }

    function configureMinting(uint256 _mintPrice, uint256 _rewardsFee, uint256 _liquidityFee, uint256 _reservesFee, uint256 _partnershipsFee, uint256 _deadFee) external nonReentrant onlyOwner {
        require(_mintPrice == _rewardsFee + _liquidityFee + _reservesFee + _partnershipsFee + _deadFee, "");
        mintPrice = _mintPrice;
        rewardsFee = _rewardsFee;
        liquidityFee = _liquidityFee;
        reservesFee = _reservesFee;
        partnershipsFee = _partnershipsFee;
        deadFee = _deadFee;
    }

    function changeRenewalFee(uint256 _renewalFee) external nonReentrant onlyOwner {
        renewalFee = _renewalFee;
    }

    function changeClaimMicrovFee(uint256 _claimMicrovFee) external nonReentrant onlyOwner {
        claimMicrovFee = _claimMicrovFee;
    }

    function changeClaimEthFee(uint256 _claimEthFee) external nonReentrant onlyOwner {
        claimEthFee = _claimEthFee;
    }

    function setGracePeriod(uint256 _gracePeriod) external nonReentrant onlyOwner {
        gracePeriod = _gracePeriod;
    }

    function setQuarter(uint256 _quarter) external nonReentrant onlyOwner {
        quarter = _quarter;
    }

    function setMonth(uint256 _month) external nonReentrant onlyOwner {
        month = _month;
    }

    function setMaxValidatorsPerMinter(uint256 _maxValidatorsPerMinter) external nonReentrant onlyOwner {
        maxValidatorsPerMinter = _maxValidatorsPerMinter;
    }

    function changeMicrov(address _microvAddress) external nonReentrant onlyOwner {
        microvAddress = _microvAddress;
        microv = IERC20(microvAddress);
    }

    function changeWeth(address _weth) external nonReentrant onlyOwner {
        weth = _weth;
    }

    function switchPriceFeed(address _priceFeed) external nonReentrant onlyOwner {
        priceFeed = AggregatorV3Interface(_priceFeed);
    }

    function getNetworks() external view returns (address, address, address, address) {
        return (network1Address, network2Address, network3Address, network4Address);
    }

    function getGracePeriod() external view returns (uint256) {
        return gracePeriod;
    }

    function getQuarter() external view returns (uint256) {
        return quarter;
    }

    function getMaxValidatorsPerMinter() external view returns (uint256) {
        return maxValidatorsPerMinter;
    }

    function getClaimMicrovCost() public view returns (uint256) {
        return (claimMicrovFee * (10 ** 18)) / uint(getLatestPrice());
    }

    function getClaimEthCost() public view returns (uint256) {
        return (claimEthFee * (10 ** 18)) / uint(getLatestPrice());
    }

    function getRenewalCost(uint256 _months) public view returns (uint256) {
        return (renewalFee * (10 ** 18)) / uint(getLatestPrice()) * _months;
    }

    function getLatestPrice() public view returns (int256) {
        (, int256 _price, , , ) = priceFeed.latestRoundData();
        return _price;
    }

    function getBlockTimestamp() external view returns (uint256) {
        return block.timestamp;
    }

    function getPendingMicrov(uint256 _id) public view returns (uint256, uint256) {
        Validator memory _validator = validators[_id];
        uint8 _fuseProduct = _validator.fuseProduct;
        require(_fuseProduct == 0, "Must be fused");
        uint256 _newRate = rates0[_validator.numClaimsMicrov];
        uint256 _amount = (block.timestamp - (_validator.numClaimsMicrov > 0 ? _validator.lastClaimMicrov : _validator.created)) * (_newRate);
        if (_validator.created < block.timestamp + gammaPeriod) {
            uint256 _seconds = (block.timestamp + gammaPeriod) - _validator.created;
            uint256 _percent = 100;
            if (_seconds >= 4838400) _percent = 900;
            else if (_seconds >= 4233600) _percent = 800;
            else if (_seconds >= 3628800) _percent = 700;
            else if (_seconds >= 3024000) _percent = 600;
            else if (_seconds >= 2419200) _percent = 500;
            else if (_seconds >= 1814400) _percent = 400;
            else if (_seconds >= 1209600) _percent = 300;
            else if (_seconds >= 604800) _percent = 200;
            uint256 _divisor = _amount * _percent;
            (bool _divisible, ) = tryDiv(_divisor, 10000);
            _amount = _amount - (_divisible ? (_divisor / 10000) : 0);
        }
        return (_newRate, _amount);
    }

    function setRecipients(address _renewals, address _claims, address _rewards, address _liquidity, address _reserves, address _partnerships, address _dead) external onlyOwner {
        renewals = _renewals;
        claims = _claims;
        rewards = _rewards;
        liquidity = _liquidity;
        reserves = _reserves;
        partnerships = _partnerships;
        dead = _dead;
    }

    function getValidator(uint256 _id) external view returns (Validator memory) {
        return validators[_id];
    }

    function getValidatorsByMinter(address _minter) external view returns (Validator[] memory) {
        return validatorsByMinter[_minter];
    }

    function getNumValidatorsByMinter(address _minter) external view returns (uint256) {
        return numValidatorsByMinter[_minter];
    }

    function drainGas() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function drainToken(address _token, address _recipient) external onlyOwner {
        IERC20(_token).transfer(_recipient, IERC20(_token).balanceOf(address(this)));
    }

    function deposit1() external payable onlyOwner {
        if (msg.value > 0) {
            try _network1.deposit{value: msg.value}() {} catch {}
        }
    }

    function deposit2() external payable onlyOwner {
        if (msg.value > 0) {
            try _network2.deposit{value: msg.value}() {} catch {}
        }
    }

    function deposit3() external payable onlyOwner {
        if (msg.value > 0) {
            try _network3.deposit{value: msg.value}() {} catch {}
        }
    }

    function deposit4() external payable onlyOwner {
        if (msg.value > 0) {
            try _network4.deposit{value: msg.value}() {} catch {}
        }
    }

    receive() external payable {}
}

contract MICROV is IERC20, AC {
    using SafeMath for uint256;
    address public BASE = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    address public WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    address public USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
    address public constant DEAD = 0x000000000000000000000000000000000000dEaD;
    string private constant _name = "MicroValidator";
    string private constant _symbol = "MICROV";
    uint8 private constant _decimals = 18;
    uint256 private _totalSupply = 1000000 * (10 ** _decimals);
    uint256 public maxWallet = _totalSupply;
    uint256 public minAmountToTriggerSwap = 0;
    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) public isDisabledExempt;
    mapping (address => bool) public isFeeExempt;
    mapping (address => bool) public isMaxExempt;
    mapping (address => bool) public isUniswapPair;
    uint256 public buyFeeOp = 300;
    uint256 public buyFeeValidator = 0;
    uint256 public buyFeeTotal = 300;
    uint256 public sellFeeOp = 0;
    uint256 public sellFeeValidator = 800;
    uint256 public sellFeeTotal = 800;
    uint256 public bps = 10000;
    uint256 public _opTokensToSwap;
    uint256 public _validatorTokensToSwap;
    address public opFeeRecipient1 = 0xb8d7dA7E64271E274e132001F9865Ad8De5001C8;
    address public opFeeRecipient2 = 0x21CcABc78FC240892a54106bC7a8dC3880536347;
    address public opFeeRecipient3 = 0xd703f7b098262B0751c9A654eea332183D199A69;
    address public validatorFeeRecipient = 0x58917027C0648086f85Cd208E289095731cFDE1B;
    IUniswapV2Router public router;
    address public pair;
    bool public contractSellEnabled = true;
    uint256 public contractSellThreshold = _totalSupply / 5000;
    bool public mintingEnabled = true;
    bool public tradingEnabled = false;
    bool public isContractSelling = false;
    MicroValidator public microvalidator;
    address public microvalidatorAddress;
    bool public swapForETH = true;
    IERC20 public usdt = IERC20(USDT);
    uint256 public taxDistOp = 2700;
    uint256 public taxDistValidator = 7300;
    uint256 public taxDistBps = 10000;

    modifier contractSelling() {
        isContractSelling = true;
        _;
        isContractSelling = false;
    }

    constructor (address _priceFeed) AC(msg.sender) {
        address _router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        router = IUniswapV2Router(_router);
        pair = IUniswapV2Factory(router.factory()).createPair(USDT, address(this));
        _allowances[address(this)][address(router)] = _totalSupply;
        WETH = router.WETH();
        microvalidator = new MicroValidator("Annuity MicroValidators", "MicroValidator", address(this), msg.sender, _priceFeed, WETH);
        microvalidatorAddress = address(microvalidator);
        isDisabledExempt[msg.sender] = true;
        isFeeExempt[msg.sender] = true;
        isMaxExempt[msg.sender] = true;
        isDisabledExempt[microvalidatorAddress] = true;
        isFeeExempt[microvalidatorAddress] = true;
        isMaxExempt[microvalidatorAddress] = true;
        isDisabledExempt[address(0)] = true;
        isFeeExempt[address(0)] = true;
        isMaxExempt[address(0)] = true;
        isDisabledExempt[DEAD] = true;
        isFeeExempt[DEAD] = true;
        isMaxExempt[DEAD] = true;
        isMaxExempt[address(this)] = true;
        isUniswapPair[pair] = true;
        approve(_router, _totalSupply);
        approve(address(pair), _totalSupply);
        uint256 _toEmissions = 237000 * (10 ** _decimals);
        uint256 _toDeployer = _totalSupply - _toEmissions;
        _balances[msg.sender] = _toDeployer;
        emit Transfer(address(0), msg.sender, _toDeployer);
        _balances[microvalidatorAddress] = _toEmissions;
        emit Transfer(address(0), microvalidatorAddress, _toEmissions);
    }

    function mint(uint256 _amount) external onlyOwner {
        require(mintingEnabled, "Minting is disabled");
        _totalSupply += _amount;
        approve(address(router), _totalSupply);
        approve(address(pair), _totalSupply);
        _balances[msg.sender] += _amount;
        emit Transfer(address(0), msg.sender, _amount);
    }

    function burn(uint256 _amount) external onlyOwner {
        require(_balances[msg.sender] >= _amount);
        _totalSupply -= _amount;
        _balances[msg.sender] -= _amount;
        emit Transfer(msg.sender, address(0), _amount);
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    function approveMax(address _spender) external returns (bool) {
        return approve(_spender, _totalSupply);
    }

    function transfer(address recipient, uint256 amount) external override returns (bool) {
        return _transferFrom(msg.sender, recipient, amount);
    }

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        if (_allowances[sender][msg.sender] != _totalSupply) _allowances[sender][msg.sender] = _allowances[sender][msg.sender].sub(amount, "Insufficient Allowance");
        return _transferFrom(sender, recipient, amount);
    }

    function _transferFrom(address _sender, address _recipient, uint256 _amount) private returns (bool) {
        if (isContractSelling) return _simpleTransfer(_sender, _recipient, _amount);
        require(tradingEnabled || isDisabledExempt[_sender], "Trading is currently disabled");
        address _routerAddress = address(router);
        bool _sell = isUniswapPair[_recipient] || _recipient == _routerAddress;
        if (!_sell && !isMaxExempt[_recipient]) require((_balances[_recipient] + _amount) < maxWallet, "Max wallet has been triggered");
        if (_sell && _amount >= minAmountToTriggerSwap) {
            if (!isUniswapPair[msg.sender] && !isContractSelling && contractSellEnabled && _balances[address(this)] >= contractSellThreshold) _contractSell();
        }
        _balances[_sender] = _balances[_sender].sub(_amount, "Insufficient balance");
        uint256 _amountAfterFees = _amount;
        if (((isUniswapPair[_sender] || _sender == _routerAddress) || (isUniswapPair[_recipient]|| _recipient == _routerAddress)) ? !isFeeExempt[_sender] && !isFeeExempt[_recipient] : false) _amountAfterFees = _collectFee(_sender, _recipient, _amount);
        _balances[_recipient] = _balances[_recipient].add(_amountAfterFees);
        emit Transfer(_sender, _recipient, _amountAfterFees);
        return true;
    }

    function _simpleTransfer(address _sender, address _recipient, uint256 _amount) private returns (bool) {
        _balances[_sender] = _balances[_sender].sub(_amount, "Insufficient Balance");
        _balances[_recipient] = _balances[_recipient].add(_amount);
        return true;
    }

    function _collectFee(address _sender, address _recipient, uint256 _amount) private returns (uint256) {
        bool _sell = isUniswapPair[_recipient] || _recipient == address(router);
        uint256 _feeDividend = _sell ? sellFeeTotal : buyFeeTotal;
        uint256 _feeDivisor = _amount.mul(_feeDividend).div(bps);
        if (_feeDividend > 0) {
            if (_sell) {
                if (sellFeeOp > 0) _opTokensToSwap += _feeDivisor * sellFeeOp / _feeDividend;
                if (sellFeeValidator > 0) _validatorTokensToSwap += _feeDivisor * sellFeeValidator / _feeDividend;
            } else {
                if (buyFeeOp > 0) _opTokensToSwap += _feeDivisor * buyFeeOp / _feeDividend;
                if (buyFeeValidator > 0) _validatorTokensToSwap += _feeDivisor * buyFeeValidator / _feeDividend;
            }
        }
        _balances[address(this)] = _balances[address(this)].add(_feeDivisor);
        emit Transfer(_sender, address(this), _feeDivisor);
        return _amount.sub(_feeDivisor);
    }

    function _contractSell() private contractSelling {
        uint256 _tokensTotal = _opTokensToSwap.add(_validatorTokensToSwap);
        if (swapForETH) {
            address[] memory path = new address[](3);
            path[0] = address(this);
            path[1] = USDT;
            path[2] = WETH;
            uint256 _ethBefore = address(this).balance;
            router.swapExactTokensForETHSupportingFeeOnTransferTokens(balanceOf(address(this)), 0, path, address(this), block.timestamp);
            uint256 _ethAfter = address(this).balance.sub(_ethBefore);
            uint256 _ethOp = _ethAfter.mul(_opTokensToSwap).div(_tokensTotal);
            uint256 _ethValidator = _ethAfter.mul(_validatorTokensToSwap).div(_tokensTotal);
            _opTokensToSwap = 0;
            _validatorTokensToSwap = 0;
            if (_ethOp > 0) {
                payable(opFeeRecipient1).transfer((_ethOp * 3400) / 10000);
                payable(opFeeRecipient2).transfer((_ethOp * 3300) / 10000);
                payable(opFeeRecipient3).transfer((_ethOp * 3300) / 10000);
            }
            if (_ethValidator > 0) payable(validatorFeeRecipient).transfer(_ethValidator);
        } else {
            address[] memory path = new address[](2);
            path[0] = address(this);
            path[1] = USDT;
            uint256 _usdtBefore = usdt.balanceOf(address(this));
            router.swapExactTokensForTokensSupportingFeeOnTransferTokens(balanceOf(address(this)), 0, path, address(this), block.timestamp);
            uint256 _usdtAfter = usdt.balanceOf(address(this)).sub(_usdtBefore);
            uint256 _usdtOp = _usdtAfter.mul(taxDistOp).div(taxDistBps);
            uint256 _usdtValidator = _usdtAfter.mul(taxDistValidator).div(taxDistBps);
            _opTokensToSwap = 0;
            _validatorTokensToSwap = 0;
            if (_usdtOp > 0) {
                usdt.transfer(opFeeRecipient1, (_usdtOp * 3400) / 10000);
                usdt.transfer(opFeeRecipient2, (_usdtOp * 3300) / 10000);
                usdt.transfer(opFeeRecipient3, (_usdtOp * 3300) / 10000);
            }
            if (_usdtValidator > 0) usdt.transfer(validatorFeeRecipient, _usdtValidator);
        }
    }

    function changeSwapForETH(bool _swapForETH) external onlyOwner {
        swapForETH = _swapForETH;
    }

    function changeTaxDist(uint256 _taxDistOp, uint256 _taxDistValidator, uint256 _taxDistBps) external onlyOwner {
        taxDistOp = _taxDistOp;
        taxDistValidator = _taxDistValidator;
        taxDistBps = _taxDistBps;
    }

    function changeWETH(address _WETH) external onlyOwner {
        WETH = _WETH;
    }

    function changeUSDT(address _USDT) external onlyOwner {
        USDT = _USDT;
        usdt = IERC20(USDT);
    }

    function setMaxWallet(uint256 _maxWallet) external onlyOwner {
        maxWallet = _maxWallet;
    }

    function setMinAmountToTriggerSwap(uint256 _minAmountToTriggerSwap) external onlyOwner {
        minAmountToTriggerSwap = _minAmountToTriggerSwap;
    }

    function toggleIsDisabledExempt(address _holder, bool _exempt) external onlyOwner {
        isDisabledExempt[_holder] = _exempt;
    }

    function getIsDisabledExempt(address _holder) external view returns (bool) {
        return isDisabledExempt[_holder];
    }

    function toggleIsFeeExempt(address _holder, bool _exempt) external onlyOwner {
        isFeeExempt[_holder] = _exempt;
    }

    function getIsFeeExempt(address _holder) external view returns (bool) {
        return isFeeExempt[_holder];
    }

    function toggleIsMaxExempt(address _holder, bool _exempt) external onlyOwner {
        isMaxExempt[_holder] = _exempt;
    }

    function getIsMaxExempt(address _holder) external view returns (bool) {
        return isMaxExempt[_holder];
    }

    function toggleIsUniswapPair(address _pair, bool _isPair) external onlyOwner {
        isUniswapPair[_pair] = _isPair;
    }

    function getIsUniswapPair(address _pair) external view returns (bool) {
        return isUniswapPair[_pair];
    }

    function configureContractSelling(bool _contractSellEnabled, uint256 _contractSellThreshold) external onlyOwner {
        contractSellEnabled = _contractSellEnabled;
        contractSellThreshold = _contractSellThreshold;
    }

    function setTransferTaxes(uint256 _buyFeeOp, uint256 _buyFeeValidator, uint256 _sellFeeOp, uint256 _sellFeeValidator, uint256 _bps) external onlyOwner {
        buyFeeOp = _buyFeeOp;
        buyFeeValidator = _buyFeeValidator;
        buyFeeTotal = _buyFeeOp.add(_buyFeeValidator);
        sellFeeOp = _sellFeeOp;
        sellFeeValidator = _sellFeeValidator;
        sellFeeTotal = _sellFeeOp.add(_sellFeeValidator);
        bps = _bps;
    }

    function setTransferTaxRecipients(address _opFeeRecipient1, address _opFeeRecipient2, address _opFeeRecipient3, address _validatorFeeRecipient) external onlyOwner {
        opFeeRecipient1 = _opFeeRecipient1;
        opFeeRecipient2 = _opFeeRecipient2;
        opFeeRecipient3 = _opFeeRecipient3;
        validatorFeeRecipient = _validatorFeeRecipient;
    }

    function updateRouting(address _router, address _pair, address _USDT) external onlyOwner {
        router = IUniswapV2Router(_router);
        pair = _pair == address(0) ? IUniswapV2Factory(router.factory()).createPair(address(this), _USDT) : IUniswapV2Factory(router.factory()).getPair(address(this), _USDT);
        _allowances[address(this)][_router] = _totalSupply;
    }

    function permanentlyDisableMinting() external onlyOwner {
        mintingEnabled = false;
    }

    function toggleTrading(bool _enabled) external onlyOwner {
        tradingEnabled = _enabled;
    }

    function drainGas() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function drainToken(address _token, address _recipient) external onlyOwner {
        IERC20(_token).transfer(_recipient, IERC20(_token).balanceOf(address(this)));
    }

    function totalSupply() external view override returns (uint256) {
        return _totalSupply;
    }

    function decimals() external pure override returns (uint8) {
        return _decimals;
    }

    function symbol() external pure override returns (string memory) {
        return _symbol;
    }

    function name() external pure override returns (string memory) {
        return _name;
    }

    function getOwner() external view override returns (address) {
        return owner;
    }

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

    function allowance(address holder, address spender) external view override returns (uint256) {
        return _allowances[holder][spender];
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_priceFeed","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BASE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_opTokensToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_validatorTokensToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","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":"_spender","type":"address"}],"name":"approveMax","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":"bps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyFeeOp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFeeTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFeeValidator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_swapForETH","type":"bool"}],"name":"changeSwapForETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_taxDistOp","type":"uint256"},{"internalType":"uint256","name":"_taxDistValidator","type":"uint256"},{"internalType":"uint256","name":"_taxDistBps","type":"uint256"}],"name":"changeTaxDist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_USDT","type":"address"}],"name":"changeUSDT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_WETH","type":"address"}],"name":"changeWETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_contractSellEnabled","type":"bool"},{"internalType":"uint256","name":"_contractSellThreshold","type":"uint256"}],"name":"configureContractSelling","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractSellEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractSellThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"drainGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"drainToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"getIsDisabledExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"getIsFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"getIsMaxExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"}],"name":"getIsUniswapPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isContractSelling","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDisabledExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMaxExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isUniswapPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"microvalidator","outputs":[{"internalType":"contract MicroValidator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"microvalidatorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minAmountToTriggerSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"opFeeRecipient1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"opFeeRecipient2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"opFeeRecipient3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"permanentlyDisableMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFeeOp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFeeTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFeeValidator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minAmountToTriggerSwap","type":"uint256"}],"name":"setMinAmountToTriggerSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_opFeeRecipient1","type":"address"},{"internalType":"address","name":"_opFeeRecipient2","type":"address"},{"internalType":"address","name":"_opFeeRecipient3","type":"address"},{"internalType":"address","name":"_validatorFeeRecipient","type":"address"}],"name":"setTransferTaxRecipients","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyFeeOp","type":"uint256"},{"internalType":"uint256","name":"_buyFeeValidator","type":"uint256"},{"internalType":"uint256","name":"_sellFeeOp","type":"uint256"},{"internalType":"uint256","name":"_sellFeeValidator","type":"uint256"},{"internalType":"uint256","name":"_bps","type":"uint256"}],"name":"setTransferTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapForETH","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"taxDistBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxDistOp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxDistValidator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"},{"internalType":"bool","name":"_exempt","type":"bool"}],"name":"toggleIsDisabledExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"},{"internalType":"bool","name":"_exempt","type":"bool"}],"name":"toggleIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"},{"internalType":"bool","name":"_exempt","type":"bool"}],"name":"toggleIsMaxExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"},{"internalType":"bool","name":"_isPair","type":"bool"}],"name":"toggleIsUniswapPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"toggleTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"adr","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_pair","type":"address"},{"internalType":"address","name":"_USDT","type":"address"}],"name":"updateRouting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdt","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"validatorFeeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600180546001600160a01b031990811673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29081179092556002805482169092179091556003805490911673dac17f958d2ee523a2206206994597c13d831ec7179055620000686012600a62000886565b6200007790620f424062000945565b600481905560058190556000600681905561012c600d819055600e829055600f556010556103206011819055601255612710601355601680546001600160a01b031990811673b8d7da7e64271e274e132001f9865ad8de5001c8179091556017805482167321ccabc78fc240892a54106bc7a8dc388053634717905560188054821673d703f7b098262b0751c9a654eea332183d199a69179055601980549091167358917027c0648086f85cd208e289095731cfde1b179055601b805460ff60a01b1916600160a01b1790556200015290611388906200081a565b601c55601d805462ffffff19166001179055601e805460ff60a01b1916600160a01b179055600354601f80546001600160a01b0319166001600160a01b03909216919091179055610a8c602055611c84602155612710602255348015620001b857600080fd5b506040516200dcc33803806200dcc3833981016040819052620001db91620007e8565b60008054336001600160a01b031991821617909155601a8054737a250d5630b4cf539739df2c5dacb4c659f2488d9216821790556040805163c45a015560e01b81529051829163c45a0155916004808301926020929190829003018186803b1580156200024757600080fd5b505afa1580156200025c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002829190620007e8565b6003546040516364e329cb60e11b81526001600160a01b03918216600482015230602482015291169063c9c6539690604401602060405180830381600087803b158015620002cf57600080fd5b505af1158015620002e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200030a9190620007e8565b601b80546001600160a01b0319166001600160a01b0392831617905560048054306000908152600860209081526040808320601a8054881685529083529281902093909355905482516315ab88c960e31b8152925194169363ad5c46489383810193829003018186803b1580156200038157600080fd5b505afa15801562000396573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003bc9190620007e8565b600280546001600160a01b0319166001600160a01b0392909216918217905560405130913391859190620003f090620007da565b60c08082526017908201527f416e6e75697479204d6963726f56616c696461746f727300000000000000000060e082015261010060208201819052600e908201526d26b4b1b937ab30b634b230ba37b960911b6101208201526001600160a01b0394851660408201529284166060840152908316608083015290911660a082015261014001604051809103906000f08015801562000492573d6000803e3d6000fd5b50601d80546301000000600160b81b03191663010000006001600160a01b0393841681029190911791829055601e80549190920483166001600160a01b0319909116178155336000908152600960208181526040808420805460ff199081166001908117909255600a8085528387208054831684179055600b808652848820805484168517905588548a16885295855283872080548316841790558754891687528452828620805482168317905595548716855292825280842080548616841790557fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b80548616841790557f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e380548616841790557fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f7680548616841790557f960b1051749987b45b5679007fff577a1c2f763ec21c15a6c5eb19307500378580548616841790557f20677881080440a9b3c87e826370bb5d9c2f74efd4dede686d52d77a6a09f8bb80548616841790557f44433eeeda1d04bdae79f62169cdb2ab0a6af287fa15706d3fafdbac5fac341580548616841790553084528084208054861684179055601b549095168352600c905292902080549091169091179055600454620006819082906200076c565b50601b546004546200069d916001600160a01b0316906200076c565b506000620006ae6012600a62000886565b620006bd9062039dc862000945565b9050600081600454620006d1919062000967565b336000818152600760205260408082208490555192935090916000805160206200dca383398151915290620007099085815260200190565b60405180910390a3601e80546001600160a01b039081166000908152600760205260408082208690559254925192909116916000805160206200dca3833981519152906200075a9086815260200190565b60405180910390a35050505062000997565b3360008181526008602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590620007c89086815260200190565b60405180910390a35060015b92915050565b61a6e780620035bc83390190565b600060208284031215620007fb57600080fd5b81516001600160a01b03811681146200081357600080fd5b9392505050565b6000826200083857634e487b7160e01b600052601260045260246000fd5b500490565b600181815b808511156200087e57816000190482111562000862576200086262000981565b808516156200087057918102915b93841c939080029062000842565b509250929050565b60006200081360ff841683600082620008a257506001620007d4565b81620008b157506000620007d4565b8160018114620008ca5760028114620008d557620008f5565b6001915050620007d4565b60ff841115620008e957620008e962000981565b50506001821b620007d4565b5060208310610133831016604e8410600b84101617156200091a575081810a620007d4565b6200092683836200083d565b80600019048211156200093d576200093d62000981565b029392505050565b600081600019048311821515161562000962576200096262000981565b500290565b6000828210156200097c576200097c62000981565b500390565b634e487b7160e01b600052601160045260246000fd5b612c1580620009a76000396000f3fe6080604052600436106103455760003560e01c8063026ad43f1461035157806303c5d0871461038757806303fd2a45146103ab578063069f22ec146103c157806306fdde03146103d7578063083676de14610417578063095ea7b31461043757806315d61a8214610467578063163d80241461048957806318160ddd146104a957806318903366146104be5780631a13f374146104de57806323b872dd146104ff57806326560be71461051f5780632f48ab7d1461053f5780632f54bf6e1461055f5780632fccc0d71461057f578063313ce567146105955780633f4218e0146105b15780633fc645b5146105e1578063420ab93a1461060157806342966c68146106165780634782e4071461063657806348b98ef5146106565780634ada218b1461067757806354c617511461069657806356c9d840146106b6578063571ac8b0146106dd5780635b329425146106fd5780635d0044ca1461071d57806363423e5e1461073d57806363d001471461075357806365fc75cd1461077357806366c4390d14610789578063670ddf741461079e57806368237329146107d75780636c6c3ccf146107ed57806370a082311461080357806375a2031114610823578063807fb8c51461085c578063893d20e81461088c5780639571a07d146108aa57806395d89b41146108da5780639c1cf33b146109095780639cece12e146109295780639d64bf93146109595780639fd6db121461096f578063a046ecf114610989578063a0712d68146109c2578063a8aa1b31146109e2578063a9059cbb14610a02578063ad5c464814610a22578063ae37021e14610a42578063b30d194c14610a62578063b333a58114610a78578063b3f152dd14610a8e578063be82f56b14610ac7578063c344295614610ae7578063c54e44eb14610afd578063cba4590214610b1d578063d5b5a46a14610b3d578063da7003f114610b5d578063db485f6114610b73578063dd62ed3e14610b89578063e0f8e24314610bcf578063e792573714610bef578063ec342ad014610c0f578063eea1f18314610c2f578063f2fde38b14610c4f578063f3223d9114610c6f578063f37ce00514610c8f578063f887ea4014610caf578063f8b45b0514610ccf578063fc978cb914610ce557600080fd5b3661034c57005b600080fd5b34801561035d57600080fd5b50601e54610371906001600160a01b031681565b60405161037e91906129d3565b60405180910390f35b34801561039357600080fd5b5061039d60205481565b60405190815260200161037e565b3480156103b757600080fd5b5061037161dead81565b3480156103cd57600080fd5b5061039d601c5481565b3480156103e357600080fd5b5060408051808201909152600e81526d26b4b1b937ab30b634b230ba37b960911b60208201525b60405161037e9190612a1a565b34801561042357600080fd5b50601754610371906001600160a01b031681565b34801561044357600080fd5b506104576104523660046128b6565b610cfb565b604051901515815260200161037e565b34801561047357600080fd5b5061048761048236600461293a565b610d67565b005b34801561049557600080fd5b50601654610371906001600160a01b031681565b3480156104b557600080fd5b5060045461039d565b3480156104ca57600080fd5b506104876104d9366004612888565b610d9a565b3480156104ea57600080fd5b50601e5461045790600160a01b900460ff1681565b34801561050b57600080fd5b5061045761051a366004612847565b610dea565b34801561052b57600080fd5b5061048761053a3660046128e2565b610eae565b34801561054b57600080fd5b50601f54610371906001600160a01b031681565b34801561056b57600080fd5b5061045761057a36600461272d565b610eed565b34801561058b57600080fd5b5061039d60115481565b3480156105a157600080fd5b506040516012815260200161037e565b3480156105bd57600080fd5b506104576105cc36600461272d565b600a6020526000908152604090205460ff1681565b3480156105ed57600080fd5b50601d546104579062010000900460ff1681565b34801561060d57600080fd5b50610487610f01565b34801561062257600080fd5b5061048761063136600461293a565b610f55565b34801561064257600080fd5b5061048761065136600461272d565b610ffb565b34801561066257600080fd5b50601b5461045790600160a01b900460ff1681565b34801561068357600080fd5b50601d5461045790610100900460ff1681565b3480156106a257600080fd5b506104876106b136600461296c565b61104c565b3480156106c257600080fd5b50601d5461037190630100000090046001600160a01b031681565b3480156106e957600080fd5b506104576106f836600461272d565b61107f565b34801561070957600080fd5b5061048761071836600461291c565b611093565b34801561072957600080fd5b5061048761073836600461293a565b6110da565b34801561074957600080fd5b5061039d60155481565b34801561075f57600080fd5b5061048761076e3660046127a0565b611104565b34801561077f57600080fd5b5061039d60215481565b34801561079557600080fd5b506104876113a2565b3480156107aa57600080fd5b506104576107b936600461272d565b6001600160a01b03166000908152600b602052604090205460ff1690565b3480156107e357600080fd5b5061039d60135481565b3480156107f957600080fd5b5061039d600f5481565b34801561080f57600080fd5b5061039d61081e36600461272d565b6113d3565b34801561082f57600080fd5b5061045761083e36600461272d565b6001600160a01b03166000908152600a602052604090205460ff1690565b34801561086857600080fd5b5061045761087736600461272d565b600b6020526000908152604090205460ff1681565b34801561089857600080fd5b506000546001600160a01b0316610371565b3480156108b657600080fd5b506104576108c536600461272d565b60096020526000908152604090205460ff1681565b3480156108e657600080fd5b5060408051808201909152600681526526a4a1a927ab60d11b602082015261040a565b34801561091557600080fd5b50601954610371906001600160a01b031681565b34801561093557600080fd5b5061045761094436600461272d565b600c6020526000908152604090205460ff1681565b34801561096557600080fd5b5061039d60065481565b34801561097b57600080fd5b50601d546104579060ff1681565b34801561099557600080fd5b506104576109a436600461272d565b6001600160a01b03166000908152600c602052604090205460ff1690565b3480156109ce57600080fd5b506104876109dd36600461293a565b6113ee565b3480156109ee57600080fd5b50601b54610371906001600160a01b031681565b348015610a0e57600080fd5b50610457610a1d3660046128b6565b6114ed565b348015610a2e57600080fd5b50600254610371906001600160a01b031681565b348015610a4e57600080fd5b50610487610a5d3660046127eb565b6114fa565b348015610a6e57600080fd5b5061039d60125481565b348015610a8457600080fd5b5061039d60105481565b348015610a9a57600080fd5b50610457610aa936600461272d565b6001600160a01b031660009081526009602052604090205460ff1690565b348015610ad357600080fd5b50610487610ae2366004612767565b61156f565b348015610af357600080fd5b5061039d600d5481565b348015610b0957600080fd5b50600354610371906001600160a01b031681565b348015610b2957600080fd5b50610487610b38366004612888565b61168e565b348015610b4957600080fd5b50610487610b58366004612888565b6116de565b348015610b6957600080fd5b5061039d600e5481565b348015610b7f57600080fd5b5061039d60225481565b348015610b9557600080fd5b5061039d610ba4366004612767565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b348015610bdb57600080fd5b50610487610bea36600461272d565b61172e565b348015610bfb57600080fd5b50610487610c0a366004612888565b611775565b348015610c1b57600080fd5b50600154610371906001600160a01b031681565b348015610c3b57600080fd5b50610487610c4a366004612998565b6117c5565b348015610c5b57600080fd5b50610487610c6a36600461272d565b611821565b348015610c7b57600080fd5b50601854610371906001600160a01b031681565b348015610c9b57600080fd5b50610487610caa3660046128e2565b61189c565b348015610cbb57600080fd5b50601a54610371906001600160a01b031681565b348015610cdb57600080fd5b5061039d60055481565b348015610cf157600080fd5b5061039d60145481565b3360008181526008602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610d569086815260200190565b60405180910390a350600192915050565b610d7033610eed565b610d955760405162461bcd60e51b8152600401610d8c90612a6f565b60405180910390fd5b600655565b610da333610eed565b610dbf5760405162461bcd60e51b8152600401610d8c90612a6f565b6001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b6004546001600160a01b0384166000908152600860209081526040808320338452909152812054909114610e99576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b0387166000908152600882528381203382529091529190912054610e749184906118df565b6001600160a01b03851660009081526008602090815260408083203384529091529020555b610ea484848461190b565b90505b9392505050565b610eb733610eed565b610ed35760405162461bcd60e51b8152600401610d8c90612a6f565b601d80549115156101000261ff0019909216919091179055565b6000546001600160a01b0391821691161490565b610f0a33610eed565b610f265760405162461bcd60e51b8152600401610d8c90612a6f565b60405133904780156108fc02916000818181858888f19350505050158015610f52573d6000803e3d6000fd5b50565b610f5e33610eed565b610f7a5760405162461bcd60e51b8152600401610d8c90612a6f565b33600090815260076020526040902054811115610f9657600080fd5b8060046000828254610fa89190612b59565b90915550503360009081526007602052604081208054839290610fcc908490612b59565b90915550506040518181526000903390600080516020612bc0833981519152906020015b60405180910390a350565b61100433610eed565b6110205760405162461bcd60e51b8152600401610d8c90612a6f565b600380546001600160a01b039092166001600160a01b03199283168117909155601f8054909216179055565b61105533610eed565b6110715760405162461bcd60e51b8152600401610d8c90612a6f565b602092909255602155602255565b600061108d82600454610cfb565b92915050565b61109c33610eed565b6110b85760405162461bcd60e51b8152600401610d8c90612a6f565b601b8054921515600160a01b0260ff60a01b1990931692909217909155601c55565b6110e333610eed565b6110ff5760405162461bcd60e51b8152600401610d8c90612a6f565b600555565b61110d33610eed565b6111295760405162461bcd60e51b8152600401610d8c90612a6f565b601a80546001600160a01b0319166001600160a01b038581169190911790915582161561125857601a60009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561119e57600080fd5b505afa1580156111b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d6919061274a565b6001600160a01b031663e6a4390530836040518363ffffffff1660e01b81526004016112039291906129e7565b60206040518083038186803b15801561121b57600080fd5b505afa15801561122f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611253919061274a565b61135d565b601a60009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156112a657600080fd5b505afa1580156112ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112de919061274a565b6001600160a01b031663c9c6539630836040518363ffffffff1660e01b815260040161130b9291906129e7565b602060405180830381600087803b15801561132557600080fd5b505af1158015611339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135d919061274a565b601b80546001600160a01b0319166001600160a01b03928316179055600454306000908152600860209081526040808320979094168252959095529320929092555050565b6113ab33610eed565b6113c75760405162461bcd60e51b8152600401610d8c90612a6f565b601d805460ff19169055565b6001600160a01b031660009081526007602052604090205490565b6113f733610eed565b6114135760405162461bcd60e51b8152600401610d8c90612a6f565b601d5460ff1661145b5760405162461bcd60e51b8152602060048201526013602482015272135a5b9d1a5b99c81a5cc8191a5cd8589b1959606a1b6044820152606401610d8c565b806004600082825461146d9190612b00565b9091555050601a5460045461148b916001600160a01b031690610cfb565b50601b546004546114a5916001600160a01b031690610cfb565b5033600090815260076020526040812080548392906114c5908490612b00565b90915550506040518181523390600090600080516020612bc083398151915290602001610ff0565b6000610ea733848461190b565b61150333610eed565b61151f5760405162461bcd60e51b8152600401610d8c90612a6f565b601680546001600160a01b039586166001600160a01b0319918216179091556017805494861694821694909417909355601880549285169284169290921790915560198054919093169116179055565b61157833610eed565b6115945760405162461bcd60e51b8152600401610d8c90612a6f565b6040516370a0823160e01b81526001600160a01b0383169063a9059cbb90839083906370a08231906115ca9030906004016129d3565b60206040518083038186803b1580156115e257600080fd5b505afa1580156115f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161a9190612953565b6040518363ffffffff1660e01b8152600401611637929190612a01565b602060405180830381600087803b15801561165157600080fd5b505af1158015611665573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168991906128ff565b505050565b61169733610eed565b6116b35760405162461bcd60e51b8152600401610d8c90612a6f565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b6116e733610eed565b6117035760405162461bcd60e51b8152600401610d8c90612a6f565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b61173733610eed565b6117535760405162461bcd60e51b8152600401610d8c90612a6f565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b61177e33610eed565b61179a5760405162461bcd60e51b8152600401610d8c90612a6f565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6117ce33610eed565b6117ea5760405162461bcd60e51b8152600401610d8c90612a6f565b600d859055600e8490556117fe8585611cbb565b600f55601083905560118290556118158383611cbb565b60125560135550505050565b61182a33610eed565b6118465760405162461bcd60e51b8152600401610d8c90612a6f565b600080546001600160a01b0319166001600160a01b0383161790556040517f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163906118919083906129d3565b60405180910390a150565b6118a533610eed565b6118c15760405162461bcd60e51b8152600401610d8c90612a6f565b601e8054911515600160a01b0260ff60a01b19909216919091179055565b600081848411156119035760405162461bcd60e51b8152600401610d8c9190612a1a565b505050900390565b601d5460009062010000900460ff16156119315761192a848484611cc7565b9050610ea7565b601d54610100900460ff168061195f57506001600160a01b03841660009081526009602052604090205460ff165b6119ab5760405162461bcd60e51b815260206004820152601d60248201527f54726164696e672069732063757272656e746c792064697361626c65640000006044820152606401610d8c565b601a546001600160a01b038481166000908152600c602052604081205491909216919060ff16806119ed5750816001600160a01b0316856001600160a01b0316145b905080158015611a1657506001600160a01b0385166000908152600b602052604090205460ff16155b15611a8f576005546001600160a01b038616600090815260076020526040902054611a42908690612b00565b10611a8f5760405162461bcd60e51b815260206004820152601d60248201527f4d61782077616c6c657420686173206265656e207472696767657265640000006044820152606401610d8c565b808015611a9e57506006548410155b15611b0b57336000908152600c602052604090205460ff16158015611acc5750601d5462010000900460ff16155b8015611ae15750601b54600160a01b900460ff165b8015611afe5750601c543060009081526007602052604090205410155b15611b0b57611b0b611d6a565b6040805180820182526014815273496e73756666696369656e742062616c616e636560601b6020808301919091526001600160a01b038916600090815260079091529190912054611b5d9186906118df565b6001600160a01b038716600090815260076020908152604080832093909355600c90522054849060ff1680611ba35750826001600160a01b0316876001600160a01b0316145b80611be157506001600160a01b0386166000908152600c602052604090205460ff1680611be15750826001600160a01b0316866001600160a01b0316145b611bec576000611c2e565b6001600160a01b0387166000908152600a602052604090205460ff16158015611c2e57506001600160a01b0386166000908152600a602052604090205460ff16155b15611c4157611c3e878787612538565b90505b6001600160a01b038616600090815260076020526040902054611c649082611cbb565b6001600160a01b038088166000818152600760205260409081902093909355915190891690600080516020612bc083398151915290611ca69085815260200190565b60405180910390a35060019695505050505050565b6000610ea78284612b00565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0386166000908152600790915291822054611d189184906118df565b6001600160a01b038086166000908152600760205260408082209390935590851681522054611d479083611cbb565b6001600160a01b0384166000908152600760205260409020555060019392505050565b601d805462ff0000191662010000179055601554601454600091611d8e9190611cbb565b601e54909150600160a01b900460ff16156120635760408051600380825260808201909252600091602082016060803683370190505090503081600081518110611dda57611dda612b86565b6001600160a01b039283166020918202929092010152600354825191169082906001908110611e0b57611e0b612b86565b6001600160a01b0392831660209182029290920101526002805483519216918391908110611e3b57611e3b612b86565b6001600160a01b039283166020918202929092010152601a5447911663791ac947611e65306113d3565b60008530426040518663ffffffff1660e01b8152600401611e8a959493929190612a8f565b600060405180830381600087803b158015611ea457600080fd5b505af1158015611eb8573d6000803e3d6000fd5b505050506000611ed1824761270990919063ffffffff16565b90506000611ef485611eee6014548561271590919063ffffffff16565b90612721565b90506000611f1186611eee6015548661271590919063ffffffff16565b6000601481905560155590508115612017576016546001600160a01b03166108fc612710611f4185610d48612b3a565b611f4b9190612b18565b6040518115909202916000818181858888f19350505050158015611f73573d6000803e3d6000fd5b506017546001600160a01b03166108fc612710611f9285610ce4612b3a565b611f9c9190612b18565b6040518115909202916000818181858888f19350505050158015611fc4573d6000803e3d6000fd5b506018546001600160a01b03166108fc612710611fe385610ce4612b3a565b611fed9190612b18565b6040518115909202916000818181858888f19350505050158015612015573d6000803e3d6000fd5b505b8015612059576019546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612057573d6000803e3d6000fd5b505b5050505050612529565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061209857612098612b86565b6001600160a01b0392831660209182029290920101526003548251911690829060019081106120c9576120c9612b86565b6001600160a01b039283166020918202929092010152601f546040516370a0823160e01b815260009291909116906370a082319061210b9030906004016129d3565b60206040518083038186803b15801561212357600080fd5b505afa158015612137573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215b9190612953565b601a549091506001600160a01b0316635c11d795612178306113d3565b60008530426040518663ffffffff1660e01b815260040161219d959493929190612a8f565b600060405180830381600087803b1580156121b757600080fd5b505af11580156121cb573d6000803e3d6000fd5b5050601f546040516370a0823160e01b81526000935061225c925084916001600160a01b0316906370a08231906122069030906004016129d3565b60206040518083038186803b15801561221e57600080fd5b505afa158015612232573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122569190612953565b90612709565b9050600061227b602254611eee6020548561271590919063ffffffff16565b9050600061229a602254611eee6021548661271590919063ffffffff16565b600060148190556015559050811561249357601f546016546001600160a01b039182169163a9059cbb91166127106122d486610d48612b3a565b6122de9190612b18565b6040518363ffffffff1660e01b81526004016122fb929190612a01565b602060405180830381600087803b15801561231557600080fd5b505af1158015612329573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234d91906128ff565b50601f546017546001600160a01b039182169163a9059cbb911661271061237686610ce4612b3a565b6123809190612b18565b6040518363ffffffff1660e01b815260040161239d929190612a01565b602060405180830381600087803b1580156123b757600080fd5b505af11580156123cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ef91906128ff565b50601f546018546001600160a01b039182169163a9059cbb911661271061241886610ce4612b3a565b6124229190612b18565b6040518363ffffffff1660e01b815260040161243f929190612a01565b602060405180830381600087803b15801561245957600080fd5b505af115801561246d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249191906128ff565b505b801561252357601f5460195460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb926124cf929116908590600401612a01565b602060405180830381600087803b1580156124e957600080fd5b505af11580156124fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252191906128ff565b505b50505050505b50601d805462ff000019169055565b6001600160a01b0382166000908152600c6020526040812054819060ff168061256e5750601a546001600160a01b038581169116145b905060008161257f57600f54612583565b6012545b905060006125a0601354611eee848861271590919063ffffffff16565b9050811561269357821561262357601054156125e65781601054826125c59190612b3a565b6125cf9190612b18565b601460008282546125e09190612b00565b90915550505b6011541561261e5781601154826125fd9190612b3a565b6126079190612b18565b601560008282546126189190612b00565b90915550505b612693565b600d541561265b5781600d548261263a9190612b3a565b6126449190612b18565b601460008282546126559190612b00565b90915550505b600e54156126935781600e54826126729190612b3a565b61267c9190612b18565b6015600082825461268d9190612b00565b90915550505b306000908152600760205260409020546126ad9082611cbb565b30600081815260076020526040908190209290925590516001600160a01b03891690600080516020612bc0833981519152906126ec9085815260200190565b60405180910390a36126fe8582612709565b979650505050505050565b6000610ea78284612b59565b6000610ea78284612b3a565b6000610ea78284612b18565b60006020828403121561273f57600080fd5b8135610ea781612b9c565b60006020828403121561275c57600080fd5b8151610ea781612b9c565b6000806040838503121561277a57600080fd5b823561278581612b9c565b9150602083013561279581612b9c565b809150509250929050565b6000806000606084860312156127b557600080fd5b83356127c081612b9c565b925060208401356127d081612b9c565b915060408401356127e081612b9c565b809150509250925092565b6000806000806080858703121561280157600080fd5b843561280c81612b9c565b9350602085013561281c81612b9c565b9250604085013561282c81612b9c565b9150606085013561283c81612b9c565b939692955090935050565b60008060006060848603121561285c57600080fd5b833561286781612b9c565b9250602084013561287781612b9c565b929592945050506040919091013590565b6000806040838503121561289b57600080fd5b82356128a681612b9c565b9150602083013561279581612bb1565b600080604083850312156128c957600080fd5b82356128d481612b9c565b946020939093013593505050565b6000602082840312156128f457600080fd5b8135610ea781612bb1565b60006020828403121561291157600080fd5b8151610ea781612bb1565b6000806040838503121561292f57600080fd5b82356128d481612bb1565b60006020828403121561294c57600080fd5b5035919050565b60006020828403121561296557600080fd5b5051919050565b60008060006060848603121561298157600080fd5b505081359360208301359350604090920135919050565b600080600080600060a086880312156129b057600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b600060208083528351808285015260005b81811015612a4757858101830151858201604001528201612a2b565b81811115612a59576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526006908201526510a7aba722a960d11b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612adf5784516001600160a01b031683529383019391830191600101612aba565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115612b1357612b13612b70565b500190565b600082612b3557634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612b5457612b54612b70565b500290565b600082821015612b6b57612b6b612b70565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114610f5257600080fd5b8015158114610f5257600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220c2f80e3ee4a3632f80132a4985a0074a22307ec07994d9e9f289d33f3acd430564736f6c6343000807003360c0604052601a60808190527f68747470733a2f2f63646e2e746865616e6e756974792e696f2f00000000000060a090815262000040916003919062000590565b50601580546001600160a01b031990811673a1ed930901534a5eeccc37fe131362e3054c4a829081179092556016805482168317905560178054821661dead908117909155601880548316734d939977da7d0d0c3239dd0415f13a35cc1664b4179055601980548316909317909255601a8054821673ff20c9736ac252014800782692d867b4c70656d1179055601b8054909116909117905564a2fb405800601c8190556040805161028081018252918252648a88c37e0060208301526475c10c9180908201526464174aaee06060820152645513cc47d86080820152644850d409de60a0820152643d77e76ec960c082015264343f84b7c560e0820152642c6930cf676101008201526425bfcfe37e6101208201526420163d815f610140820152641b461aadf761016082015264172ec9e0ab6101808201526413b491fef86101a08201526410bfe27f206101c0820152640e3cb3b8db6101e0820152640c19ff29ed610200820152640a494c16d76102208201526408be4d79d061024082015264076e8ea78a610260820152620001de90601d9060146200061f565b5068012dfa7b310156000060315568075f5d81f2485980006032556811b1ad37df140a00006033556823abd3fdf2e0b800006034556301e133806035556305a39a806036556309660180603755631e133800603855622819a0603981905562530e80603a5562784ce0603b55603c556064603d55603e80546001600160a01b031990811673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21790915560438054909116735f4ec3df9cbd43714fe2740f5e3616155c5b8419179055633b9aca0060445564019b45a5006045556326165dc0604655678ac7230489e800006047556753444835ec580000604855670de0b6b3a76400006049819055604a819055604b819055604c55348015620002f357600080fd5b506040516200a6e73803806200a6e783398101604081905262000316916200077c565b600080546001600160a01b0319166001600160a01b03851617905585518690869085906200034c90600190602086019062000590565b5081516200036290600290602085019062000590565b505060016009555050601780546001600160a01b03199081163017909155600b80546001600160a01b0387169083168117909155600c8054909216179055604051737a250d5630b4cf539739df2c5dacb4c659f2488d90819085908490620003ca9062000659565b620003d8939291906200082f565b604051809103906000f080158015620003f5573d6000803e3d6000fd5b50600d80546001600160a01b03929092166001600160a01b03199283168117909155600e8054909216179055604051819085908490620004359062000667565b62000443939291906200082f565b604051809103906000f08015801562000460573d6000803e3d6000fd5b50600f80546001600160a01b03929092166001600160a01b0319928316811790915560108054909216179055604051819085908490620004a09062000675565b620004ae939291906200082f565b604051809103906000f080158015620004cb573d6000803e3d6000fd5b50601180546001600160a01b03929092166001600160a01b03199283168117909155601280549092161790556040518190859084906200050b9062000683565b62000519939291906200082f565b604051809103906000f08015801562000536573d6000803e3d6000fd5b50601380546001600160a01b03199081166001600160a01b0393841690811790925560148054821690921790915560438054821695831695909517909455603e805490941692169190911790915550620008a59350505050565b8280546200059e9062000852565b90600052602060002090601f016020900481019282620005c257600085556200060d565b82601f10620005dd57805160ff19168380011785556200060d565b828001600101855582156200060d579182015b828111156200060d578251825591602001919060010190620005f0565b506200061b92915062000691565b5090565b82601481019282156200060d579160200282015b828111156200060d578251829064ffffffffff1690559160200191906001019062000633565b611067806200654b83390190565b61106780620075b283390190565b611067806200861983390190565b611067806200968083390190565b5b808211156200061b576000815560010162000692565b80516001600160a01b0381168114620006c057600080fd5b919050565b600082601f830112620006d757600080fd5b81516001600160401b0380821115620006f457620006f46200088f565b604051601f8301601f19908116603f011681019082821181831017156200071f576200071f6200088f565b816040528381526020925086838588010111156200073c57600080fd5b600091505b8382101562000760578582018301518183018401529082019062000741565b83821115620007725760008385830101525b9695505050505050565b60008060008060008060c087890312156200079657600080fd5b86516001600160401b0380821115620007ae57600080fd5b620007bc8a838b01620006c5565b97506020890151915080821115620007d357600080fd5b50620007e289828a01620006c5565b955050620007f360408801620006a8565b93506200080360608801620006a8565b92506200081360808801620006a8565b91506200082360a08801620006a8565b90509295509295509295565b6001600160a01b0393841681529183166020830152909116604082015260600190565b600181811c908216806200086757607f821691505b602082108114156200088957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b615c9680620008b56000396000f3fe6080604052600436106104165760003560e01c806301a205201461042257806301f80b771461047457806301ffc9a714610496578063057bfcc7146104c657806306fdde03146104ea578063080b301e1461050c578063081812fc14610522578063095ea7b31461054f57806313fcdce01461056f57806318470a4b1461058f5780631a686502146105a55780631b202cbb146105c55780631ca2e292146105e55780632551fa4114610605578063260c2a981461061b57806326608c211461063b5780632bb14e1d146106515780632c5eca56146106675780632cdf926d146106945780632d571cc4146106aa5780632f54bf6e146106bd57806335aa2e44146106dd578063361faaa7146107c157806336cf7c87146107e157806339a0c6f9146108015780633fc8cef31461082157806341b7cb6814610841578063420ab93a1461085657806343cd16381461086b57806344bea374146108735780634535f5ca1461089357806345bc4d10146108b3578063472fe1c2146108d3578063525593dd146108f3578063531c93af14610908578063539c0f141461091e578063550e1cdd146109265780635792115d1461095357806359118ff2146109735780635c77d1e1146109895780635d6109051461099f5780636352211e146109bf578063663ea5b0146109df57806366c5807c146109ff5780636817c76c14610a1f578063702921f514610a3557806370a0823114610a4b57806375172a8b14610a6b5780637543af9c14610a8b578063796b89b914610aa15780637c47b56214610ab45780637f760fb914610ac95780638e15f47314610ae95780638e657b0c14610afe57806393c19e1814610b1e57806395d89b4114610b3457806398118cb414610b4957806399fbab8814610b5f5780639ab5b61414610b8c5780639ec5a89414610bac578063a06db7dc14610bcc578063a14c80fb14610be2578063a22cb46514610bf8578063a24822f814610c18578063a69ae95b14610c38578063afb2ad9914610c58578063b05b4a2a14610c78578063b232cf8314610c8e578063b5d8962714610cae578063bac00e5314610cdb578063bd0e5d0714610cfb578063bd5b5f7714610d03578063be426bef14610d19578063be82f56b14610d2e578063c0eb342514610d4e578063c87b56dd14610d84578063c8a3bb7b14610da4578063c8f73d9814610db7578063cbd9986814610dbf578063d0bdadf114610dd2578063d2635ca614610de8578063da41b37414610e08578063dbd1838814610e3d578063dcc59b6f14610e52578063e985e9c514610e72578063f2f6596014610e92578063f2fde38b14610eb2578063f33cbd4f14610ed2578063f400fde414610ef2578063f8fd059814610f08578063f98d4a8814610f28578063fa67889214610f3e578063fd6cdf9114610f5157600080fd5b3661041d57005b600080fd5b34801561042e57600080fd5b50600e54601054601254601454604080516001600160a01b0395861681529385166020850152918416918301919091529190911660608201526080015b60405180910390f35b34801561048057600080fd5b5061049461048f366004615678565b610f67565b005b3480156104a257600080fd5b506104b66104b136600461559e565b610fc7565b604051901515815260200161046b565b3480156104d257600080fd5b506104dc60325481565b60405190815260200161046b565b3480156104f657600080fd5b506104ff611019565b60405161046b919061591b565b34801561051857600080fd5b506104dc60445481565b34801561052e57600080fd5b5061054261053d366004615678565b6110ab565b60405161046b9190615885565b34801561055b57600080fd5b5061049461056a366004615555565b611133565b34801561057b57600080fd5b5061049461058a366004615707565b611244565b34801561059b57600080fd5b506104dc604a5481565b3480156105b157600080fd5b50601854610542906001600160a01b031681565b3480156105d157600080fd5b506104946105e036600461574a565b611306565b3480156105f157600080fd5b50610494610600366004615678565b611a43565b34801561061157600080fd5b506104dc60455481565b34801561062757600080fd5b50610494610636366004615678565b612032565b34801561064757600080fd5b506104dc60365481565b34801561065d57600080fd5b506104dc60485481565b34801561067357600080fd5b5061068761068236600461543b565b612089565b60405161046b91906158cc565b3480156106a057600080fd5b506104dc60465481565b6104dc6106b8366004615678565b61217a565b3480156106c957600080fd5b506104b66106d836600461543b565b612adf565b3480156106e957600080fd5b506107616106f8366004615678565b603f60205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a909a015498996001600160a01b03909816989697959694959394929360ff9283169391929091168b565b604080519b8c526001600160a01b03909a1660208c0152988a01979097526060890195909552608088019390935260a087019190915260c086015260ff1660e085015261010084015261012083015215156101408201526101600161046b565b3480156107cd57600080fd5b506104946107dc366004615678565b612af3565b3480156107ed57600080fd5b50601b54610542906001600160a01b031681565b34801561080d57600080fd5b5061049461081c3660046155c8565b612b4a565b34801561082d57600080fd5b50603e54610542906001600160a01b031681565b34801561084d57600080fd5b506104dc612b86565b34801561086257600080fd5b50610494612bb4565b610494612c08565b34801561087f57600080fd5b506104dc61088e366004615678565b612c95565b34801561089f57600080fd5b506104946108ae366004615491565b612cc9565b3480156108bf57600080fd5b506104946108ce366004615678565b612d6c565b3480156108df57600080fd5b506104dc6108ee366004615678565b612f13565b3480156108ff57600080fd5b50603b546104dc565b34801561091457600080fd5b506104dc604b5481565b610494612f2a565b34801561093257600080fd5b506104dc61094136600461543b565b60416020526000908152604090205481565b34801561095f57600080fd5b5061049461096e366004615678565b612fa5565b34801561097f57600080fd5b506104dc60345481565b34801561099557600080fd5b506104dc603d5481565b3480156109ab57600080fd5b506104946109ba366004615678565b612ffc565b3480156109cb57600080fd5b506105426109da366004615678565b613053565b3480156109eb57600080fd5b50601454610542906001600160a01b031681565b348015610a0b57600080fd5b50601554610542906001600160a01b031681565b348015610a2b57600080fd5b506104dc60475481565b348015610a4157600080fd5b506104dc603c5481565b348015610a5757600080fd5b506104dc610a6636600461543b565b6130ca565b348015610a7757600080fd5b50601954610542906001600160a01b031681565b348015610a9757600080fd5b506104dc60335481565b348015610aad57600080fd5b50426104dc565b348015610ac057600080fd5b50603d546104dc565b348015610ad557600080fd5b50600b54610542906001600160a01b031681565b348015610af557600080fd5b506104dc613150565b348015610b0a57600080fd5b50601054610542906001600160a01b031681565b348015610b2a57600080fd5b506104dc601c5481565b348015610b4057600080fd5b506104ff6131e4565b348015610b5557600080fd5b506104dc60495481565b348015610b6b57600080fd5b506104dc610b7a366004615678565b60426020526000908152604090205481565b348015610b9857600080fd5b50600e54610542906001600160a01b031681565b348015610bb857600080fd5b50601754610542906001600160a01b031681565b348015610bd857600080fd5b506104dc60395481565b348015610bee57600080fd5b506104dc604c5481565b348015610c0457600080fd5b50610494610c13366004615527565b6131f3565b348015610c2457600080fd5b50610494610c3336600461543b565b6131fe565b348015610c4457600080fd5b50610494610c533660046156cc565b613272565b348015610c6457600080fd5b50601254610542906001600160a01b031681565b348015610c8457600080fd5b506104dc60385481565b348015610c9a57600080fd5b50610494610ca9366004615678565b6132db565b348015610cba57600080fd5b50610cce610cc9366004615678565b613332565b60405161046b9190615ade565b348015610ce757600080fd5b50601a54610542906001600160a01b031681565b61049461343f565b348015610d0f57600080fd5b506104dc603b5481565b348015610d2557600080fd5b506104dc6134ba565b348015610d3a57600080fd5b50610494610d49366004615458565b6134d9565b348015610d5a57600080fd5b506104dc610d6936600461543b565b6001600160a01b031660009081526041602052604090205490565b348015610d9057600080fd5b506104ff610d9f366004615678565b6135f3565b610494610db23660046156aa565b61375d565b610494613c2b565b610494610dcd366004615678565b613ca6565b348015610dde57600080fd5b506104dc60375481565b348015610df457600080fd5b50610761610e03366004615555565b6140c6565b348015610e1457600080fd5b50610e28610e23366004615678565b61414d565b6040805192835260208301919091520161046b565b348015610e4957600080fd5b506039546104dc565b348015610e5e57600080fd5b50601654610542906001600160a01b031681565b348015610e7e57600080fd5b506104b6610e8d366004615458565b614380565b348015610e9e57600080fd5b50610494610ead366004615678565b6143ae565b348015610ebe57600080fd5b50610494610ecd36600461543b565b614405565b348015610ede57600080fd5b50610494610eed36600461543b565b614480565b348015610efe57600080fd5b506104dc60315481565b348015610f1457600080fd5b50610494610f2336600461543b565b6144f4565b348015610f3457600080fd5b506104dc603a5481565b610494610f4c366004615678565b614572565b348015610f5d57600080fd5b506104dc60355481565b60026009541415610f935760405162461bcd60e51b8152600401610f8a90615a86565b60405180910390fd5b6002600955610fa133612adf565b610fbd5760405162461bcd60e51b8152600401610f8a90615a66565b603b556001600955565b60006001600160e01b03198216630164752f60e61b1480610ff857506001600160e01b03198216635b5e139f60e01b145b8061101357506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461102890615b7b565b80601f016020809104026020016040519081016040528092919081815260200182805461105490615b7b565b80156110a15780601f10611076576101008083540402835291602001916110a1565b820191906000526020600020905b81548152906001019060200180831161108457829003601f168201915b5050505050905090565b60006110b68261494f565b6111175760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610f8a565b506000908152600660205260409020546001600160a01b031690565b600061113e82613053565b9050806001600160a01b0316836001600160a01b031614156111ac5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610f8a565b336001600160a01b03821614806111c857506111c88133614380565b6112355760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b6064820152608401610f8a565b61123f838361496c565b505050565b600260095414156112675760405162461bcd60e51b8152600401610f8a90615a86565b600260095561127533612adf565b6112915760405162461bcd60e51b8152600401610f8a90615a66565b80828461129e8789615aed565b6112a89190615aed565b6112b29190615aed565b6112bc9190615aed565b86146112e45760405162461bcd60e51b81526020600482015260006024820152604401610f8a565b604795909555604893909355604991909155604a55604b55604c556001600955565b600260095414156113295760405162461bcd60e51b8152600401610f8a90615a86565b60026009553361133883613053565b6001600160a01b03161461135e5760405162461bcd60e51b8152600401610f8a9061594e565b8060ff166001148061137357508060ff166002145b8061138157508060ff166003145b8061138f57508060ff166004145b6113ab5760405162461bcd60e51b8152600401610f8a906159a2565b6000828152603f60209081526040918290208251610160810184528154815260018201546001600160a01b0316928101929092526002810154928201929092526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460ff90811660e0830181905260088401546101008401526009840154610120840152600a9093015416151561014082015290158061145857508061014001515b6114945760405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e48199d5cd959609a1b6044820152606401610f8a565b428160c00151116114b75760405162461bcd60e51b8152600401610f8a90615abd565b603554336000908152604160209081526040808320548183528184208054835181860281018601909452808452919385939290849084015b828210156115a05760008481526020908190206040805161016081018252600b8602909201805483526001808201546001600160a01b0316848601526002820154928401929092526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460ff90811660e085015260088201546101008501526009820154610120850152600a9091015416151561014083015290835290920191016114ef565b50505050905060005b828110156116305760008282815181106115c5576115c5615c11565b602002602001015190508760ff168160e0015160ff161480156115eb5750806101400151155b80156115fa5750428160c00151115b801561160a575042816101200151105b1561161d578461161981615bb6565b9550505b508061162881615bb6565b9150506115a9565b508560ff16600114156116b057600d546001600160a01b03166314b6ca963361165a866001615aed565b6040518363ffffffff1660e01b81526004016116779291906158b3565b600060405180830381600087803b15801561169157600080fd5b505af19250505080156116a2575060015b6116ab57611820565b611820565b8560ff166002141561172c57600f546001600160a01b03166314b6ca96336116d9866001615aed565b6040518363ffffffff1660e01b81526004016116f69291906158b3565b600060405180830381600087803b15801561171057600080fd5b505af1925050508015611721575060015b506036549350611820565b8560ff16600314156117a8576011546001600160a01b03166314b6ca9633611755866001615aed565b6040518363ffffffff1660e01b81526004016117729291906158b3565b600060405180830381600087803b15801561178c57600080fd5b505af192505050801561179d575060015b506037549350611820565b8560ff1660041415611820576013546001600160a01b03166314b6ca96336117d1866001615aed565b6040518363ffffffff1660e01b81526004016117ee9291906158b3565b600060405180830381600087803b15801561180857600080fd5b505af1925050508015611819575060015b5060385493505b600060405180610160016040528089815260200187602001516001600160a01b031681526020018760400151815260200187606001518152602001600081526020018760a0015181526020018760c0015181526020018860ff16815260200142815260200186426118919190615aed565b8152600060209182018190528a8152603f8252604080822084518155848401516001820180546001600160a01b039092166001600160a01b0319909216919091179055818501516002820155606085015160038201556080850151600482015560a0850151600582015560c0850151600682015560e085015160078201805460ff90921660ff1992831617905561010086015160088301556101208601516009830155610140860151600a9092018054921515929091169190911790553382528083528082208c8352604290935290205481549293508392811061197757611977615c11565b60009182526020918290208351600b9092020190815590820151600180830180546001600160a01b039093166001600160a01b03199093169290921790915560408301516002830155606083015160038301556080830151600483015560a0830151600583015560c0830151600683015560e083015160078301805460ff90921660ff19928316179055610100840151600884015561012084015160098085019190915561014090940151600a9093018054931515939091169290921790915590555050505050505050565b60026009541415611a665760405162461bcd60e51b8152600401610f8a90615a86565b600260095533611a7582613053565b6001600160a01b031614611a9b5760405162461bcd60e51b8152600401610f8a9061594e565b6000818152603f6020908152604091829020825161016081018452815481526001808301546001600160a01b0316938201939093526002820154938101939093526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460ff90811660e0850181905260088301546101008601526009830154610120860152600a909201541615156101408401521480611b4d57508060e0015160ff166002145b80611b5f57508060e0015160ff166003145b80611b7157508060e0015160ff166004145b611b8d5760405162461bcd60e51b8152600401610f8a906159a2565b428160c0015111611bb05760405162461bcd60e51b8152600401610f8a90615abd565b428161012001511015611bd55760405162461bcd60e51b8152600401610f8a906159f5565b80610140015115611bf85760405162461bcd60e51b8152600401610f8a906159cb565b611c083360018360e001516149da565b8060e0015160ff1660011415611ca457600c5460315460405163a9059cbb60e01b81526001600160a01b039092169163a9059cbb91611c4c913391906004016158b3565b602060405180830381600087803b158015611c6657600080fd5b505af1158015611c7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9e9190615581565b50611dc4565b8060e0015160ff1660021415611ce857600c5460325460405163a9059cbb60e01b81526001600160a01b039092169163a9059cbb91611c4c913391906004016158b3565b8060e0015160ff1660031415611d2c57600c5460335460405163a9059cbb60e01b81526001600160a01b039092169163a9059cbb91611c4c913391906004016158b3565b8060e0015160ff1660041415611dc457600c5460345460405163a9059cbb60e01b81526001600160a01b039092169163a9059cbb91611d70913391906004016158b3565b602060405180830381600087803b158015611d8a57600080fd5b505af1158015611d9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc29190615581565b505b600060405180610160016040528084815260200183602001516001600160a01b031681526020018360400151815260200183606001518152602001836080015181526020018360a0015181526020018360c0015181526020018360e0015160ff1681526020018361010001518152602001836101200151815260200160011515815250905080603f60008581526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070160006101000a81548160ff021916908360ff1602179055506101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff0219169083151502179055509050508060406000336001600160a01b03166001600160a01b03168152602001908152602001600020604260008681526020019081526020016000205481548110611f6b57611f6b615c11565b60009182526020918290208351600b9092020190815590820151600180830180546001600160a01b039093166001600160a01b03199093169290921790915560408301516002830155606083015160038301556080830151600483015560a0830151600583015560c0830151600683015560e083015160078301805460ff90921660ff19928316179055610100840151600884015561012084015160098085019190915561014090940151600a909301805493151593909116929092179091559055505050565b600260095414156120555760405162461bcd60e51b8152600401610f8a90615a86565b600260095561206333612adf565b61207f5760405162461bcd60e51b8152600401610f8a90615a66565b6045556001600955565b6001600160a01b0381166000908152604060208181528183208054835181840281018401909452808452606094919290919084015b8282101561216f5760008481526020908190206040805161016081018252600b8602909201805483526001808201546001600160a01b0316848601526002820154928401929092526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460ff90811660e085015260088201546101008501526009820154610120850152600a9091015416151561014083015290835290920191016120be565b505050509050919050565b60006002600954141561219f5760405162461bcd60e51b8152600401610f8a90615a86565b6002600955603d5433600090815260416020526040902054106121fa5760405162461bcd60e51b8152602060048201526013602482015272546f6f206d616e792076616c696461746f727360681b6044820152606401610f8a565b60c1821061221a5760405162461bcd60e51b8152600401610f8a90615979565b61222382612c95565b34146122415760405162461bcd60e51b8152600401610f8a90615a18565b604754600c54604051636eb1769f60e11b81526001600160a01b039091169063dd62ed3e906122769033903090600401615899565b60206040518083038186803b15801561228e57600080fd5b505afa1580156122a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c69190615691565b1161230c5760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606401610f8a565b604754600c546040516370a0823160e01b81526001600160a01b03909116906370a082319061233f903390600401615885565b60206040518083038186803b15801561235757600080fd5b505afa15801561236b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238f9190615691565b116123d35760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610f8a565b600c546047546040516323b872dd60e01b815233600482015230602482015260448101919091526000916001600160a01b0316906323b872dd90606401602060405180830381600087803b15801561242a57600080fd5b505af115801561243e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124629190615581565b9050806124a95760405162461bcd60e51b8152602060048201526015602482015274151c985b9cd9995c881d5b9cdd58d8d95cdcd99d5b605a1b6044820152606401610f8a565b6015546040516001600160a01b03909116903480156108fc02916000818181858888f193505050501580156124e2573d6000803e3d6000fd5b50600c5460175460485460405163a9059cbb60e01b81526001600160a01b039384169363a9059cbb9361251a939116916004016158b3565b602060405180830381600087803b15801561253457600080fd5b505af1158015612548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256c9190615581565b50600c5460185460495460405163a9059cbb60e01b81526001600160a01b039384169363a9059cbb936125a4939116916004016158b3565b602060405180830381600087803b1580156125be57600080fd5b505af11580156125d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125f69190615581565b50600c54601954604a5460405163a9059cbb60e01b81526001600160a01b039384169363a9059cbb9361262e939116916004016158b3565b602060405180830381600087803b15801561264857600080fd5b505af115801561265c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126809190615581565b50600c54601a54604b5460405163a9059cbb60e01b81526001600160a01b039384169363a9059cbb936126b8939116916004016158b3565b602060405180830381600087803b1580156126d257600080fd5b505af11580156126e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270a9190615581565b50600c54601b54604c5460405163a9059cbb60e01b81526001600160a01b039384169363a9059cbb93612742939116916004016158b3565b602060405180830381600087803b15801561275c57600080fd5b505af1158015612770573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127949190615581565b5060006127a0600a5490565b90506127b0600a80546001019055565b6127ba3382614f21565b6127f381826040516020016127df91815264173539b7b760d91b602082015260250190565b604051602081830303815290604052615028565b6000604051806101600160405280838152602001336001600160a01b0316815260200142815260200160008152602001600081526020016000815260200186622819a06128409190615b19565b61284a9042615aed565b8152602001600060ff168152602001600081526020016000815260200160001515815250905080603f60008481526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070160006101000a81548160ff021916908360ff1602179055506101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff02191690831515021790555090505060406000336001600160a01b03166001600160a01b031681526020019081526020016000208190806001815401808255809150506001900390600052602060002090600b02016000909190919091506000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070160006101000a81548160ff021916908360ff1602179055506101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff021916908315150217905550505060416000336001600160a01b03166001600160a01b0316815260200190815260200160002054604260008481526020019081526020016000208190555060416000336001600160a01b03166001600160a01b031681526020019081526020016000206000815480929190612acd90615bb6565b90915550506001600955509392505050565b6000546001600160a01b0391821691161490565b60026009541415612b165760405162461bcd60e51b8152600401610f8a90615a86565b6002600955612b2433612adf565b612b405760405162461bcd60e51b8152600401610f8a90615a66565b603d556001600955565b612b5333612adf565b612b6f5760405162461bcd60e51b8152600401610f8a90615a66565b8051612b82906003906020840190615386565b5050565b6000612b90613150565b604654612ba590670de0b6b3a7640000615b19565b612baf9190615b05565b905090565b612bbd33612adf565b612bd95760405162461bcd60e51b8152600401610f8a90615a66565b60405133904780156108fc02916000818181858888f19350505050158015612c05573d6000803e3d6000fd5b50565b612c1133612adf565b612c2d5760405162461bcd60e51b8152600401610f8a90615a66565b3415612c9357601160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015612c8357600080fd5b505af193505050508015612c0557505b565b600081612ca0613150565b604454612cb590670de0b6b3a7640000615b19565b612cbf9190615b05565b6110139190615b19565b612cd233612adf565b612cee5760405162461bcd60e51b8152600401610f8a90615a66565b601580546001600160a01b03199081166001600160a01b03998a1617909155601680548216978916979097179096556017805487169588169590951790945560188054861693871693909317909255601980548516918616919091179055601a80548416918516919091179055601b80549092169216919091179055565b60026009541415612d8f5760405162461bcd60e51b8152600401610f8a90615a86565b6002600955612d9d33612adf565b612db95760405162461bcd60e51b8152600401610f8a90615a66565b6000818152603f6020908152604091829020825161016081018452815481526001808301546001600160a01b0316938201939093526002820154938101939093526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460ff90811660e0850181905260088301546101008601526009830154610120860152600a909201541615156101408401521480612e6b57508060e0015160ff166002145b80612e7d57508060e0015160ff166003145b80612e8f57508060e0015160ff166004145b612eab5760405162461bcd60e51b8152600401610f8a906159a2565b426039548260c00151612ebe9190615aed565b1115612efa5760405162461bcd60e51b815260206004820152600b60248201526a139bdd08195e1c1a5c995960aa1b6044820152606401610f8a565b612f0a81602001516000806149da565b50506001600955565b601d8160148110612f2357600080fd5b0154905081565b612f3333612adf565b612f4f5760405162461bcd60e51b8152600401610f8a90615a66565b3415612c9357600f60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015612c8357600080fd5b60026009541415612fc85760405162461bcd60e51b8152600401610f8a90615a86565b6002600955612fd633612adf565b612ff25760405162461bcd60e51b8152600401610f8a90615a66565b603c556001600955565b6002600954141561301f5760405162461bcd60e51b8152600401610f8a90615a86565b600260095561302d33612adf565b6130495760405162461bcd60e51b8152600401610f8a90615a66565b6044556001600955565b6000818152600460205260408120546001600160a01b0316806110135760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610f8a565b60006001600160a01b0382166131345760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610f8a565b506001600160a01b031660009081526005602052604090205490565b600080604360009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156131a157600080fd5b505afa1580156131b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d99190615775565b509195945050505050565b60606002805461102890615b7b565b612b823383836150b3565b600260095414156132215760405162461bcd60e51b8152600401610f8a90615a86565b600260095561322f33612adf565b61324b5760405162461bcd60e51b8152600401610f8a90615a66565b603e80546001600160a01b0319166001600160a01b03929092169190911790556001600955565b600260095414156132955760405162461bcd60e51b8152600401610f8a90615a86565b60026009556132a333612adf565b6132bf5760405162461bcd60e51b8152600401610f8a90615a66565b601c949094556031929092556032556033556034556001600955565b600260095414156132fe5760405162461bcd60e51b8152600401610f8a90615a86565b600260095561330c33612adf565b6133285760405162461bcd60e51b8152600401610f8a90615a66565b6046556001600955565b61339d6040518061016001604052806000815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600060ff16815260200160008152602001600081526020016000151581525090565b506000908152603f60209081526040918290208251610160810184528154815260018201546001600160a01b0316928101929092526002810154928201929092526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460ff90811660e083015260088301546101008301526009830154610120830152600a90920154909116151561014082015290565b61344833612adf565b6134645760405162461bcd60e51b8152600401610f8a90615a66565b3415612c9357601360009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015612c8357600080fd5b60006134c4613150565b604554612ba590670de0b6b3a7640000615b19565b6134e233612adf565b6134fe5760405162461bcd60e51b8152600401610f8a90615a66565b6040516370a0823160e01b81526001600160a01b0383169063a9059cbb90839083906370a0823190613534903090600401615885565b60206040518083038186803b15801561354c57600080fd5b505afa158015613560573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135849190615691565b6040518363ffffffff1660e01b81526004016135a19291906158b3565b602060405180830381600087803b1580156135bb57600080fd5b505af11580156135cf573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123f9190615581565b60606135fe8261494f565b6136645760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610f8a565b6000828152600860205260408120805461367d90615b7b565b80601f01602080910402602001604051908101604052809291908181526020018280546136a990615b7b565b80156136f65780601f106136cb576101008083540402835291602001916136f6565b820191906000526020600020905b8154815290600101906020018083116136d957829003601f168201915b50505050509050600061370761517e565b905080516000141561371a575092915050565b81511561374c578082604051602001613734929190615856565b60405160208183030381529060405292505050919050565b6137558461518d565b949350505050565b600260095414156137805760405162461bcd60e51b8152600401610f8a90615a86565b60026009553361378f83613053565b6001600160a01b0316146137b55760405162461bcd60e51b8152600401610f8a9061594e565b60c181106137d55760405162461bcd60e51b8152600401610f8a90615979565b60006137e482622819a0615b19565b90506137ef82612c95565b341461380d5760405162461bcd60e51b8152600401610f8a90615a18565b6000838152603f60209081526040918290208251610160810184528154815260018201546001600160a01b0316928101929092526002810154928201929092526003820154606082015260048201546080820152600582015460a0820152600682015460c08201819052600783015460ff90811660e084015260088401546101008401526009840154610120840152600a909301549092161515610140820152603954909142916138bd91615aed565b116139015760405162461bcd60e51b815260206004820152601460248201527311dc9858d9481c195c9a5bd908195e1c1a5c995960621b6044820152606401610f8a565b60e081015160ff16156139b857806101400151156139545760405162461bcd60e51b815260206004820152601060248201526f135d5cdd081899481d5b9b1bd8dad95960821b6044820152606401610f8a565b6039548161012001516139679190615aed565b828260c001516139779190615aed565b11156139b85760405162461bcd60e51b815260206004820152601060248201526f2932b732bbb4b733903a37b7903330b960811b6044820152606401610f8a565b6015546040516001600160a01b03909116903480156108fc02916000818181858888f193505050501580156139f1573d6000803e3d6000fd5b50600060405180610160016040528086815260200183602001516001600160a01b031681526020018360400151815260200183606001518152602001836080015181526020018360a001518152602001848460c00151613a519190615aed565b815260e08481015160ff90811660208085019190915261010080880151604080870191909152610120808a0151606080890191909152600060809889018190528e8152603f86528381208a5181558a8701516001820180546001600160a01b0319166001600160a01b039092169190911790558a8501516002820155918a0151600383015597890151600482015560a0890151600582015560c089015160068201559588015160078701805460ff1990811692909716919091179055918701516008860155908601516009850155610140860151600a9094018054909316931515939093179091553383528181528183208984526042909152912054815492935083928110613b6257613b62615c11565b60009182526020918290208351600b9092020190815590820151600180830180546001600160a01b039093166001600160a01b03199093169290921790915560408301516002830155606083015160038301556080830151600483015560a0830151600583015560c0830151600683015560e083015160078301805460ff90921660ff19928316179055610100840151600884015561012084015160098085019190915561014090940151600a9093018054931515939091169290921790915590555050505050565b613c3433612adf565b613c505760405162461bcd60e51b8152600401610f8a90615a66565b3415612c9357600d60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015612c8357600080fd5b60026009541415613cc95760405162461bcd60e51b8152600401610f8a90615a86565b600260095533613cd882613053565b6001600160a01b031614613cfe5760405162461bcd60e51b8152600401610f8a9061594e565b6000818152603f6020908152604091829020825161016081018452815481526001808301546001600160a01b0316938201939093526002820154938101939093526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460ff90811660e0850181905260088301546101008601526009830154610120860152600a909201541615156101408401521480613db057508060e0015160ff166002145b80613dc257508060e0015160ff166003145b80613dd457508060e0015160ff166004145b613df05760405162461bcd60e51b8152600401610f8a906159a2565b428160c0015111613e135760405162461bcd60e51b8152600401610f8a90615abd565b80610140015115613e365760405162461bcd60e51b8152600401610f8a906159cb565b6080810151613e7a57603b54816101000151613e529190615aed565b81608001511015613e755760405162461bcd60e51b8152600401610f8a906159f5565b613eaf565b603c548160800151613e8c9190615aed565b81608001511015613eaf5760405162461bcd60e51b8152600401610f8a906159f5565b613eb7612b86565b3414613ed55760405162461bcd60e51b8152600401610f8a90615a18565b6016546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015613f0e573d6000803e3d6000fd5b50613f1f3360018360e001516149da565b600060405180610160016040528084815260200183602001516001600160a01b0316815260200183604001518152602001836060015181526020014281526020018360a0015181526020018360c0015181526020018360e0015160ff168152602001836101000151815260200183610120015181526020018361014001511515815250905080603f60008581526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070160006101000a81548160ff021916908360ff1602179055506101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff0219169083151502179055509050508060406000336001600160a01b03166001600160a01b03168152602001908152602001600020604260008681526020019081526020016000205481548110611f6b57611f6b615c11565b604060205281600052604060002081815481106140e257600080fd5b60009182526020909120600b9091020180546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a909a0154989b506001600160a01b0390971699509497939692959194909360ff918216939091168b565b6000818152603f602090815260408083208151610160810183528154815260018201546001600160a01b0316938101939093526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460ff90811660e0840181905260088301546101008501526009830154610120850152600a90920154161515610140830152829190801561420b5760405162461bcd60e51b8152600401610f8a90615a3f565b6000601d8360a001516014811061422457614224615c11565b0154905060008160008560a0015111614241578460400151614247565b84606001515b6142519042615b38565b61425b9190615b19565b9050603a544261426b9190615aed565b846040015110156143745760008460400151603a544261428b9190615aed565b6142959190615b38565b905060646249d40082106142ac575061038461432c565b6240998082106142bf575061032061432c565b62375f0082106142d257506102bc61432c565b622e248082106142e5575061025861432c565b6224ea0082106142f857506101f461432c565b621baf80821061430b575061019061432c565b62127500821061431e575061012c61432c565b62093a80821061432c575060c85b60006143388285615b19565b9050600061434882612710615258565b50905080614357576000614363565b61436361271083615b05565b61436d9086615b38565b9450505050505b90969095509350505050565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b600260095414156143d15760405162461bcd60e51b8152600401610f8a90615a86565b60026009556143df33612adf565b6143fb5760405162461bcd60e51b8152600401610f8a90615a66565b6039556001600955565b61440e33612adf565b61442a5760405162461bcd60e51b8152600401610f8a90615a66565b600080546001600160a01b0319166001600160a01b0383161790556040517f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc68616390614475908390615885565b60405180910390a150565b600260095414156144a35760405162461bcd60e51b8152600401610f8a90615a86565b60026009556144b133612adf565b6144cd5760405162461bcd60e51b8152600401610f8a90615a66565b604380546001600160a01b0319166001600160a01b03929092169190911790556001600955565b600260095414156145175760405162461bcd60e51b8152600401610f8a90615a86565b600260095561452533612adf565b6145415760405162461bcd60e51b8152600401610f8a90615a66565b600b80546001600160a01b039092166001600160a01b03199283168117909155600c80549092161790556001600955565b600260095414156145955760405162461bcd60e51b8152600401610f8a90615a86565b6002600955336145a482613053565b6001600160a01b0316146145ca5760405162461bcd60e51b8152600401610f8a9061594e565b6000818152603f60209081526040918290208251610160810184528154815260018201546001600160a01b0316928101929092526002810154928201929092526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460ff90811660e0830181905260088401546101008401526009840154610120840152600a909301541615156101408201529080156146875760405162461bcd60e51b8152600401610f8a90615a3f565b428260c00151116146aa5760405162461bcd60e51b8152600401610f8a90615abd565b6146b26134ba565b34146146d05760405162461bcd60e51b8152600401610f8a90615a18565b6016546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015614709573d6000803e3d6000fd5b5060006147158461414d565b600c5460405163a9059cbb60e01b81529193506001600160a01b0316915063a9059cbb9061474990339085906004016158b3565b602060405180830381600087803b15801561476357600080fd5b505af1158015614777573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061479b9190615581565b50600060405180610160016040528086815260200185602001516001600160a01b0316815260200185604001518152602001428152602001856080015181526020018560a0015160016147ee9190615aed565b81526020018560c0015181526020018560e0015160ff168152602001856101000151815260200185610120015181526020018561014001511515815250905080603f60008781526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070160006101000a81548160ff021916908360ff1602179055506101008201518160080155610120820151816009015561014082015181600a0160006101000a81548160ff0219169083151502179055509050508060406000336001600160a01b03166001600160a01b03168152602001908152602001600020604260008881526020019081526020016000205481548110613b6257613b62615c11565b6000908152600460205260409020546001600160a01b0316151590565b600081815260066020526040902080546001600160a01b0319166001600160a01b03841690811790915581906149a182613053565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6001600160a01b03831660009081526041602090815260408083205481835281842080548351818602810186019094528084528594859485949385939192909190849084015b82821015614ad15760008481526020908190206040805161016081018252600b8602909201805483526001808201546001600160a01b0316848601526002820154928401929092526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460ff90811660e085015260088201546101008501526009820154610120850152600a909101541615156101408301529083529092019101614a20565b50505050905060005b82811015614c25576000828281518110614af657614af6615c11565b602002602001015160e0015160ff16118015614b2e5750818181518110614b1f57614b1f615c11565b60200260200101516101400151155b8015614b56575042828281518110614b4857614b48615c11565b602002602001015160c00151115b8015614b7f575042828281518110614b7057614b70615c11565b60200260200101516101200151105b15614c13576000828281518110614b9857614b98615c11565b602002602001015160e0015160ff1690508060011415614bc45787614bbc81615bb6565b985050614c11565b8060021415614bdf5786614bd781615bb6565b975050614c11565b8060031415614bfa5785614bf281615bb6565b965050614c11565b8060041415614c115784614c0d81615bb6565b9550505b505b80614c1d81615bb6565b915050614ada565b508715614d9e578660ff1660011415614ca857600d54603e54604051637c329d7160e11b81526001600160a01b039283169263f8653ae292614c6f928e9290911690600401615899565b600060405180830381600087803b158015614c8957600080fd5b505af1925050508015614c9a575060015b614ca357614d9e565b614d9e565b8660ff1660021415614ceb57600f54603e54604051637c329d7160e11b81526001600160a01b039283169263f8653ae292614c6f928e9290911690600401615899565b8660ff1660031415614d2e57601154603e54604051637c329d7160e11b81526001600160a01b039283169263f8653ae292614c6f928e9290911690600401615899565b8660ff1660041415614d9e57601354603e54604051637c329d7160e11b81526001600160a01b039283169263f8653ae292614d71928e9290911690600401615899565b600060405180830381600087803b158015614d8b57600080fd5b505af1925050508015614d9c575060015b505b600d54604051630a5b654b60e11b81526001600160a01b03909116906314b6ca9690614dd0908c908a906004016158b3565b600060405180830381600087803b158015614dea57600080fd5b505af1925050508015614dfb575060015b50600f54604051630a5b654b60e11b81526001600160a01b03909116906314b6ca9690614e2e908c9089906004016158b3565b600060405180830381600087803b158015614e4857600080fd5b505af1925050508015614e59575060015b50601154604051630a5b654b60e11b81526001600160a01b03909116906314b6ca9690614e8c908c9088906004016158b3565b600060405180830381600087803b158015614ea657600080fd5b505af1925050508015614eb7575060015b50601354604051630a5b654b60e11b81526001600160a01b03909116906314b6ca9690614eea908c9087906004016158b3565b600060405180830381600087803b158015614f0457600080fd5b505af1925050508015614f15575060015b50505050505050505050565b6001600160a01b038216614f775760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610f8a565b614f808161494f565b15614fcc5760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b6044820152606401610f8a565b6001600160a01b0382166000908152600560205260408120805460019290614ff5908490615aed565b9091555050600090815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6150318261494f565b6150945760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610f8a565b6000828152600860209081526040909120825161123f92840190615386565b816001600160a01b0316836001600160a01b031614156151115760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610f8a565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60606003805461102890615b7b565b60606151988261494f565b6151fc5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610f8a565b600061520661517e565b905060008151116152265760405180602001604052806000815250615251565b8061523084615289565b604051602001615241929190615856565b6040516020818303038152906040525b9392505050565b6000808261526b57506000905080615282565b600183858161527c5761527c615bfb565b04915091505b9250929050565b6060816152ad5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156152d757806152c181615bb6565b91506152d09050600a83615b05565b91506152b1565b6000816001600160401b038111156152f1576152f1615c27565b6040519080825280601f01601f19166020018201604052801561531b576020820181803683370190505b5090505b841561375557615330600183615b38565b915061533d600a86615bd1565b615348906030615aed565b60f81b81838151811061535d5761535d615c11565b60200101906001600160f81b031916908160001a90535061537f600a86615b05565b945061531f565b82805461539290615b7b565b90600052602060002090601f0160209004810192826153b457600085556153fa565b82601f106153cd57805160ff19168380011785556153fa565b828001600101855582156153fa579182015b828111156153fa5782518255916020019190600101906153df565b5061540692915061540a565b5090565b5b80821115615406576000815560010161540b565b80516001600160501b038116811461543657600080fd5b919050565b60006020828403121561544d57600080fd5b813561525181615c3d565b6000806040838503121561546b57600080fd5b823561547681615c3d565b9150602083013561548681615c3d565b809150509250929050565b600080600080600080600060e0888a0312156154ac57600080fd5b87356154b781615c3d565b965060208801356154c781615c3d565b955060408801356154d781615c3d565b945060608801356154e781615c3d565b935060808801356154f781615c3d565b925060a088013561550781615c3d565b915060c088013561551781615c3d565b8091505092959891949750929550565b6000806040838503121561553a57600080fd5b823561554581615c3d565b9150602083013561548681615c52565b6000806040838503121561556857600080fd5b823561557381615c3d565b946020939093013593505050565b60006020828403121561559357600080fd5b815161525181615c52565b6000602082840312156155b057600080fd5b81356001600160e01b03198116811461525157600080fd5b6000602082840312156155da57600080fd5b81356001600160401b03808211156155f157600080fd5b818401915084601f83011261560557600080fd5b81358181111561561757615617615c27565b604051601f8201601f19908116603f0116810190838211818310171561563f5761563f615c27565b8160405282815287602084870101111561565857600080fd5b826020860160208301376000928101602001929092525095945050505050565b60006020828403121561568a57600080fd5b5035919050565b6000602082840312156156a357600080fd5b5051919050565b600080604083850312156156bd57600080fd5b50508035926020909101359150565b600080600080600060a086880312156156e457600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60008060008060008060c0878903121561572057600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b6000806040838503121561575d57600080fd5b82359150602083013560ff8116811461548657600080fd5b600080600080600060a0868803121561578d57600080fd5b6157968661541f565b94506020860151935060408601519250606086015191506157b96080870161541f565b90509295509295909350565b8051825260208101516157e360208401826001600160a01b03169052565b5060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015161582a60e084018260ff169052565b506101008181015190830152610120808201519083015261014080820151801515828501525b50505050565b60008351615868818460208801615b4f565b83519083019061587c818360208801615b4f565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b8181101561590f576158fb8385516157c5565b9284019261016092909201916001016158e8565b50909695505050505050565b602081526000825180602084015261593a816040850160208701615b4f565b601f01601f19169190910160400192915050565b6020808252601190820152700496e76616c6964206f776e65727368697607c1b604082015260600190565b6020808252600f908201526e546f6f206d616e79206d6f6e74687360881b604082015260600190565b6020808252600f908201526e125b9d985b1a59081c1c9bd91d58dd608a1b604082015260600190565b60208082526010908201526f105b1c9958591e481d5b9b1bd8dad95960821b604082015260600190565b602080825260099082015268546f6f206561726c7960b81b604082015260600190565b6020808252600d908201526c496e76616c69642076616c756560981b604082015260600190565b6020808252600d908201526c135d5cdd08189948199d5cd959609a1b604082015260600190565b60208082526006908201526510a7aba722a960d11b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b602080825260079082015266115e1c1a5c995960ca1b604082015260600190565b610160810161101382846157c5565b60008219821115615b0057615b00615be5565b500190565b600082615b1457615b14615bfb565b500490565b6000816000190483118215151615615b3357615b33615be5565b500290565b600082821015615b4a57615b4a615be5565b500390565b60005b83811015615b6a578181015183820152602001615b52565b838111156158505750506000910152565b600181811c90821680615b8f57607f821691505b60208210811415615bb057634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615bca57615bca615be5565b5060010190565b600082615be057615be0615bfb565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612c0557600080fd5b8015158114612c0557600080fdfea2646970667358221220ba2e9a1826150a628ba9445542f765ec37285e39667839896cfc5b7184118d4064736f6c6343000807003360806040526ec097ce7bc90715b34b9f1000000000600e553480156200002457600080fd5b506040516200106738038062001067833981016040819052620000479162000181565b600080546001600160a01b0319166001600160a01b038481169190911790915583166200008957737a250d5630b4cf539739df2c5dacb4c659f2488d6200008b565b825b600380546001600160a01b039283166001600160a01b0319918216179091556001805482163317815583831660008181526008602052604090819020805460ff19169093179092556002805490931681179092555163095ea7b360e01b8152918516600483015260001960248301529063095ea7b390604401602060405180830381600087803b1580156200011f57600080fd5b505af115801562000134573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200015a9190620001cb565b50505050620001f6565b80516001600160a01b03811681146200017c57600080fd5b919050565b6000806000606084860312156200019757600080fd5b620001a28462000164565b9250620001b26020850162000164565b9150620001c26040850162000164565b90509250925092565b600060208284031215620001de57600080fd5b81518015158114620001ef57600080fd5b9392505050565b610e6180620002066000396000f3fe6080604052600436106100fe5760003560e01c8063022c299b1461010a5780630300f9251461016357806311ce023d1461019b57806314b6ca96146101b15780632f54bf6e146101d35780633a98ef3914610203578063420ab93a1461021957806343bf95481461022e5780635881f3ef14610264578063845610ee14610284578063997664d7146102a4578063a5978c66146102ba578063be82f56b146102da578063ca89b899146102fa578063ce7c2ac214610327578063d0e30db01461037e578063d63a8e1114610386578063e2d2e219146103b6578063efca2eed146103cc578063f2fde38b146103e2578063f8653ae21461040257600080fd5b3661010557005b600080fd5b34801561011657600080fd5b50610150610125366004610c90565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b6040519081526020015b60405180910390f35b34801561016f57600080fd5b5061015061017e366004610c90565b600760209081526000928352604080842090915290825290205481565b3480156101a757600080fd5b50610150600e5481565b3480156101bd57600080fd5b506101d16101cc366004610cc9565b610422565b005b3480156101df57600080fd5b506101f36101ee366004610c73565b610573565b604051901515815260200161015a565b34801561020f57600080fd5b50610150600a5481565b34801561022557600080fd5b506101d1610587565b34801561023a57600080fd5b50610150610249366004610c73565b6001600160a01b031660009081526006602052604090205490565b34801561027057600080fd5b506101d161027f366004610c73565b6105e4565b34801561029057600080fd5b506101d161029f366004610c73565b61062b565b3480156102b057600080fd5b50610150600b5481565b3480156102c657600080fd5b506101506102d5366004610c73565b610672565b3480156102e657600080fd5b506101d16102f5366004610c90565b6106fb565b34801561030657600080fd5b50610150610315366004610c73565b60066020526000908152604090205481565b34801561033357600080fd5b50610363610342366004610c73565b60096020526000908152604090208054600182015460029092015490919083565b6040805193845260208401929092529082015260600161015a565b6101d1610829565b34801561039257600080fd5b506101f36103a1366004610c73565b60086020526000908152604090205460ff1681565b3480156103c257600080fd5b50610150600d5481565b3480156103d857600080fd5b50610150600c5481565b3480156103ee57600080fd5b506101d16103fd366004610c73565b61087f565b34801561040e57600080fd5b506101d161041d366004610c90565b6108fa565b6001546001600160a01b0316331461043957600080fd5b60008111801561045f57506001600160a01b038216600090815260096020526040902054155b156104c557600480546001600160a01b0384166000818152600560205260408120839055600183018455929092527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b03191690911790556104f8565b801580156104ea57506001600160a01b03821660009081526009602052604090205415155b156104f8576104f88261091f565b6001600160a01b038216600090815260096020526040902054600a5461052991839161052391610a34565b90610a47565b600a556001600160a01b038216600090815260096020526040902081905561055081610a53565b6001600160a01b0390921660009081526009602052604090206001019190915550565b6000546001600160a01b0391821691161490565b61059033610573565b6105b55760405162461bcd60e51b81526004016105ac90610d44565b60405180910390fd5b60405133904780156108fc02916000818181858888f193505050501580156105e1573d6000803e3d6000fd5b50565b6105ed33610573565b6106095760405162461bcd60e51b81526004016105ac90610d44565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b61063433610573565b6106505760405162461bcd60e51b81526004016105ac90610d44565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526009602052604081205461069757506000919050565b6001600160a01b0382166000908152600960205260408120546106b990610a53565b6001600160a01b0384166000908152600960205260409020600101549091508082116106e9575060009392505050565b6106f38282610a34565b949350505050565b61070433610573565b6107205760405162461bcd60e51b81526004016105ac90610d44565b6040516370a0823160e01b81526001600160a01b0383169063a9059cbb90839083906370a0823190610756903090600401610d30565b60206040518083038186803b15801561076e57600080fd5b505afa158015610782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a69190610d17565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156107ec57600080fd5b505af1158015610800573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108249190610cf5565b505050565b6001546001600160a01b0316331461084057600080fd5b600b54349061084f9082610a47565b600b55600a54600e54610879916108709161086a9085610a76565b90610a82565b600d5490610a47565b600d5550565b61088833610573565b6108a45760405162461bcd60e51b81526004016105ac90610d44565b600080546001600160a01b0319166001600160a01b0383161790556040517f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163906108ef908390610d30565b60405180910390a150565b6001546001600160a01b0316331461091157600080fd5b61091b8282610a8e565b5050565b6004805461092f90600190610dbd565b8154811061093f5761093f610e00565b60009182526020808320909101546001600160a01b038481168452600590925260409092205460048054929093169291811061097d5761097d610e00565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559183168152600591829052604081205460048054919392916109c990600190610dbd565b815481106109d9576109d9610e00565b60009182526020808320909101546001600160a01b031683528201929092526040019020556004805480610a0f57610a0f610dea565b600082815260209020810160001990810180546001600160a01b031916905501905550565b6000610a408284610dbd565b9392505050565b6000610a408284610d64565b6000610a70600e5461086a600d5485610a7690919063ffffffff16565b92915050565b6000610a408284610d9e565b6000610a408284610d7c565b6001600160a01b03811660009081526008602052604090205460ff16610af05760405162461bcd60e51b8152602060048201526017602482015276496e76616c69642072657761726420616464726573732160481b60448201526064016105ac565b6001600160a01b038216600090815260096020526040902054610b11575050565b6000610b1c83610672565b9050801561082457600c54610b319082610a47565b600c556001600160a01b038316600090815260096020526040902060020154610b5a9082610a47565b6001600160a01b0384166000908152600960205260409020600281019190915554610b8490610a53565b6001600160a01b0380851660009081526009602052604090206001019190915560025483821691161415610824576040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015610be8573d6000803e3d6000fd5b506001600160a01b038216600090815260066020526040902054610c0c9082610a47565b6001600160a01b03808416600090815260066020908152604080832094909455600781528382209287168252919091522054610c489082610a47565b6001600160a01b03808416600090815260076020908152604080832093881683529290522055505050565b600060208284031215610c8557600080fd5b8135610a4081610e16565b60008060408385031215610ca357600080fd5b8235610cae81610e16565b91506020830135610cbe81610e16565b809150509250929050565b60008060408385031215610cdc57600080fd5b8235610ce781610e16565b946020939093013593505050565b600060208284031215610d0757600080fd5b81518015158114610a4057600080fd5b600060208284031215610d2957600080fd5b5051919050565b6001600160a01b0391909116815260200190565b60208082526006908201526510a7aba722a960d11b604082015260600190565b60008219821115610d7757610d77610dd4565b500190565b600082610d9957634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615610db857610db8610dd4565b500290565b600082821015610dcf57610dcf610dd4565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146105e157600080fdfea26469706673582212205b50f0ad8f384d6fc7bb235b034a12bb2bc0d2d9ffa942748614b2bf8a48ea5f64736f6c6343000807003360806040526ec097ce7bc90715b34b9f1000000000600e553480156200002457600080fd5b506040516200106738038062001067833981016040819052620000479162000181565b600080546001600160a01b0319166001600160a01b038481169190911790915583166200008957737a250d5630b4cf539739df2c5dacb4c659f2488d6200008b565b825b600380546001600160a01b039283166001600160a01b0319918216179091556001805482163317815583831660008181526008602052604090819020805460ff19169093179092556002805490931681179092555163095ea7b360e01b8152918516600483015260001960248301529063095ea7b390604401602060405180830381600087803b1580156200011f57600080fd5b505af115801562000134573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200015a9190620001cb565b50505050620001f6565b80516001600160a01b03811681146200017c57600080fd5b919050565b6000806000606084860312156200019757600080fd5b620001a28462000164565b9250620001b26020850162000164565b9150620001c26040850162000164565b90509250925092565b600060208284031215620001de57600080fd5b81518015158114620001ef57600080fd5b9392505050565b610e6180620002066000396000f3fe6080604052600436106100fe5760003560e01c8063022c299b1461010a5780630300f9251461016357806311ce023d1461019b57806314b6ca96146101b15780632f54bf6e146101d35780633a98ef3914610203578063420ab93a1461021957806343bf95481461022e5780635881f3ef14610264578063845610ee14610284578063997664d7146102a4578063a5978c66146102ba578063be82f56b146102da578063ca89b899146102fa578063ce7c2ac214610327578063d0e30db01461037e578063d63a8e1114610386578063e2d2e219146103b6578063efca2eed146103cc578063f2fde38b146103e2578063f8653ae21461040257600080fd5b3661010557005b600080fd5b34801561011657600080fd5b50610150610125366004610c90565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b6040519081526020015b60405180910390f35b34801561016f57600080fd5b5061015061017e366004610c90565b600760209081526000928352604080842090915290825290205481565b3480156101a757600080fd5b50610150600e5481565b3480156101bd57600080fd5b506101d16101cc366004610cc9565b610422565b005b3480156101df57600080fd5b506101f36101ee366004610c73565b610573565b604051901515815260200161015a565b34801561020f57600080fd5b50610150600a5481565b34801561022557600080fd5b506101d1610587565b34801561023a57600080fd5b50610150610249366004610c73565b6001600160a01b031660009081526006602052604090205490565b34801561027057600080fd5b506101d161027f366004610c73565b6105e4565b34801561029057600080fd5b506101d161029f366004610c73565b61062b565b3480156102b057600080fd5b50610150600b5481565b3480156102c657600080fd5b506101506102d5366004610c73565b610672565b3480156102e657600080fd5b506101d16102f5366004610c90565b6106fb565b34801561030657600080fd5b50610150610315366004610c73565b60066020526000908152604090205481565b34801561033357600080fd5b50610363610342366004610c73565b60096020526000908152604090208054600182015460029092015490919083565b6040805193845260208401929092529082015260600161015a565b6101d1610829565b34801561039257600080fd5b506101f36103a1366004610c73565b60086020526000908152604090205460ff1681565b3480156103c257600080fd5b50610150600d5481565b3480156103d857600080fd5b50610150600c5481565b3480156103ee57600080fd5b506101d16103fd366004610c73565b61087f565b34801561040e57600080fd5b506101d161041d366004610c90565b6108fa565b6001546001600160a01b0316331461043957600080fd5b60008111801561045f57506001600160a01b038216600090815260096020526040902054155b156104c557600480546001600160a01b0384166000818152600560205260408120839055600183018455929092527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b03191690911790556104f8565b801580156104ea57506001600160a01b03821660009081526009602052604090205415155b156104f8576104f88261091f565b6001600160a01b038216600090815260096020526040902054600a5461052991839161052391610a34565b90610a47565b600a556001600160a01b038216600090815260096020526040902081905561055081610a53565b6001600160a01b0390921660009081526009602052604090206001019190915550565b6000546001600160a01b0391821691161490565b61059033610573565b6105b55760405162461bcd60e51b81526004016105ac90610d44565b60405180910390fd5b60405133904780156108fc02916000818181858888f193505050501580156105e1573d6000803e3d6000fd5b50565b6105ed33610573565b6106095760405162461bcd60e51b81526004016105ac90610d44565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b61063433610573565b6106505760405162461bcd60e51b81526004016105ac90610d44565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526009602052604081205461069757506000919050565b6001600160a01b0382166000908152600960205260408120546106b990610a53565b6001600160a01b0384166000908152600960205260409020600101549091508082116106e9575060009392505050565b6106f38282610a34565b949350505050565b61070433610573565b6107205760405162461bcd60e51b81526004016105ac90610d44565b6040516370a0823160e01b81526001600160a01b0383169063a9059cbb90839083906370a0823190610756903090600401610d30565b60206040518083038186803b15801561076e57600080fd5b505afa158015610782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a69190610d17565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156107ec57600080fd5b505af1158015610800573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108249190610cf5565b505050565b6001546001600160a01b0316331461084057600080fd5b600b54349061084f9082610a47565b600b55600a54600e54610879916108709161086a9085610a76565b90610a82565b600d5490610a47565b600d5550565b61088833610573565b6108a45760405162461bcd60e51b81526004016105ac90610d44565b600080546001600160a01b0319166001600160a01b0383161790556040517f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163906108ef908390610d30565b60405180910390a150565b6001546001600160a01b0316331461091157600080fd5b61091b8282610a8e565b5050565b6004805461092f90600190610dbd565b8154811061093f5761093f610e00565b60009182526020808320909101546001600160a01b038481168452600590925260409092205460048054929093169291811061097d5761097d610e00565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559183168152600591829052604081205460048054919392916109c990600190610dbd565b815481106109d9576109d9610e00565b60009182526020808320909101546001600160a01b031683528201929092526040019020556004805480610a0f57610a0f610dea565b600082815260209020810160001990810180546001600160a01b031916905501905550565b6000610a408284610dbd565b9392505050565b6000610a408284610d64565b6000610a70600e5461086a600d5485610a7690919063ffffffff16565b92915050565b6000610a408284610d9e565b6000610a408284610d7c565b6001600160a01b03811660009081526008602052604090205460ff16610af05760405162461bcd60e51b8152602060048201526017602482015276496e76616c69642072657761726420616464726573732160481b60448201526064016105ac565b6001600160a01b038216600090815260096020526040902054610b11575050565b6000610b1c83610672565b9050801561082457600c54610b319082610a47565b600c556001600160a01b038316600090815260096020526040902060020154610b5a9082610a47565b6001600160a01b0384166000908152600960205260409020600281019190915554610b8490610a53565b6001600160a01b0380851660009081526009602052604090206001019190915560025483821691161415610824576040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015610be8573d6000803e3d6000fd5b506001600160a01b038216600090815260066020526040902054610c0c9082610a47565b6001600160a01b03808416600090815260066020908152604080832094909455600781528382209287168252919091522054610c489082610a47565b6001600160a01b03808416600090815260076020908152604080832093881683529290522055505050565b600060208284031215610c8557600080fd5b8135610a4081610e16565b60008060408385031215610ca357600080fd5b8235610cae81610e16565b91506020830135610cbe81610e16565b809150509250929050565b60008060408385031215610cdc57600080fd5b8235610ce781610e16565b946020939093013593505050565b600060208284031215610d0757600080fd5b81518015158114610a4057600080fd5b600060208284031215610d2957600080fd5b5051919050565b6001600160a01b0391909116815260200190565b60208082526006908201526510a7aba722a960d11b604082015260600190565b60008219821115610d7757610d77610dd4565b500190565b600082610d9957634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615610db857610db8610dd4565b500290565b600082821015610dcf57610dcf610dd4565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146105e157600080fdfea2646970667358221220636db417b20273e3ce38840529ea2cbbe2dfc0b5f6d8c911b5fa04d6cc28ae2664736f6c6343000807003360806040526ec097ce7bc90715b34b9f1000000000600e553480156200002457600080fd5b506040516200106738038062001067833981016040819052620000479162000181565b600080546001600160a01b0319166001600160a01b038481169190911790915583166200008957737a250d5630b4cf539739df2c5dacb4c659f2488d6200008b565b825b600380546001600160a01b039283166001600160a01b0319918216179091556001805482163317815583831660008181526008602052604090819020805460ff19169093179092556002805490931681179092555163095ea7b360e01b8152918516600483015260001960248301529063095ea7b390604401602060405180830381600087803b1580156200011f57600080fd5b505af115801562000134573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200015a9190620001cb565b50505050620001f6565b80516001600160a01b03811681146200017c57600080fd5b919050565b6000806000606084860312156200019757600080fd5b620001a28462000164565b9250620001b26020850162000164565b9150620001c26040850162000164565b90509250925092565b600060208284031215620001de57600080fd5b81518015158114620001ef57600080fd5b9392505050565b610e6180620002066000396000f3fe6080604052600436106100fe5760003560e01c8063022c299b1461010a5780630300f9251461016357806311ce023d1461019b57806314b6ca96146101b15780632f54bf6e146101d35780633a98ef3914610203578063420ab93a1461021957806343bf95481461022e5780635881f3ef14610264578063845610ee14610284578063997664d7146102a4578063a5978c66146102ba578063be82f56b146102da578063ca89b899146102fa578063ce7c2ac214610327578063d0e30db01461037e578063d63a8e1114610386578063e2d2e219146103b6578063efca2eed146103cc578063f2fde38b146103e2578063f8653ae21461040257600080fd5b3661010557005b600080fd5b34801561011657600080fd5b50610150610125366004610c90565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b6040519081526020015b60405180910390f35b34801561016f57600080fd5b5061015061017e366004610c90565b600760209081526000928352604080842090915290825290205481565b3480156101a757600080fd5b50610150600e5481565b3480156101bd57600080fd5b506101d16101cc366004610cc9565b610422565b005b3480156101df57600080fd5b506101f36101ee366004610c73565b610573565b604051901515815260200161015a565b34801561020f57600080fd5b50610150600a5481565b34801561022557600080fd5b506101d1610587565b34801561023a57600080fd5b50610150610249366004610c73565b6001600160a01b031660009081526006602052604090205490565b34801561027057600080fd5b506101d161027f366004610c73565b6105e4565b34801561029057600080fd5b506101d161029f366004610c73565b61062b565b3480156102b057600080fd5b50610150600b5481565b3480156102c657600080fd5b506101506102d5366004610c73565b610672565b3480156102e657600080fd5b506101d16102f5366004610c90565b6106fb565b34801561030657600080fd5b50610150610315366004610c73565b60066020526000908152604090205481565b34801561033357600080fd5b50610363610342366004610c73565b60096020526000908152604090208054600182015460029092015490919083565b6040805193845260208401929092529082015260600161015a565b6101d1610829565b34801561039257600080fd5b506101f36103a1366004610c73565b60086020526000908152604090205460ff1681565b3480156103c257600080fd5b50610150600d5481565b3480156103d857600080fd5b50610150600c5481565b3480156103ee57600080fd5b506101d16103fd366004610c73565b61087f565b34801561040e57600080fd5b506101d161041d366004610c90565b6108fa565b6001546001600160a01b0316331461043957600080fd5b60008111801561045f57506001600160a01b038216600090815260096020526040902054155b156104c557600480546001600160a01b0384166000818152600560205260408120839055600183018455929092527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b03191690911790556104f8565b801580156104ea57506001600160a01b03821660009081526009602052604090205415155b156104f8576104f88261091f565b6001600160a01b038216600090815260096020526040902054600a5461052991839161052391610a34565b90610a47565b600a556001600160a01b038216600090815260096020526040902081905561055081610a53565b6001600160a01b0390921660009081526009602052604090206001019190915550565b6000546001600160a01b0391821691161490565b61059033610573565b6105b55760405162461bcd60e51b81526004016105ac90610d44565b60405180910390fd5b60405133904780156108fc02916000818181858888f193505050501580156105e1573d6000803e3d6000fd5b50565b6105ed33610573565b6106095760405162461bcd60e51b81526004016105ac90610d44565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b61063433610573565b6106505760405162461bcd60e51b81526004016105ac90610d44565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526009602052604081205461069757506000919050565b6001600160a01b0382166000908152600960205260408120546106b990610a53565b6001600160a01b0384166000908152600960205260409020600101549091508082116106e9575060009392505050565b6106f38282610a34565b949350505050565b61070433610573565b6107205760405162461bcd60e51b81526004016105ac90610d44565b6040516370a0823160e01b81526001600160a01b0383169063a9059cbb90839083906370a0823190610756903090600401610d30565b60206040518083038186803b15801561076e57600080fd5b505afa158015610782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a69190610d17565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156107ec57600080fd5b505af1158015610800573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108249190610cf5565b505050565b6001546001600160a01b0316331461084057600080fd5b600b54349061084f9082610a47565b600b55600a54600e54610879916108709161086a9085610a76565b90610a82565b600d5490610a47565b600d5550565b61088833610573565b6108a45760405162461bcd60e51b81526004016105ac90610d44565b600080546001600160a01b0319166001600160a01b0383161790556040517f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163906108ef908390610d30565b60405180910390a150565b6001546001600160a01b0316331461091157600080fd5b61091b8282610a8e565b5050565b6004805461092f90600190610dbd565b8154811061093f5761093f610e00565b60009182526020808320909101546001600160a01b038481168452600590925260409092205460048054929093169291811061097d5761097d610e00565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559183168152600591829052604081205460048054919392916109c990600190610dbd565b815481106109d9576109d9610e00565b60009182526020808320909101546001600160a01b031683528201929092526040019020556004805480610a0f57610a0f610dea565b600082815260209020810160001990810180546001600160a01b031916905501905550565b6000610a408284610dbd565b9392505050565b6000610a408284610d64565b6000610a70600e5461086a600d5485610a7690919063ffffffff16565b92915050565b6000610a408284610d9e565b6000610a408284610d7c565b6001600160a01b03811660009081526008602052604090205460ff16610af05760405162461bcd60e51b8152602060048201526017602482015276496e76616c69642072657761726420616464726573732160481b60448201526064016105ac565b6001600160a01b038216600090815260096020526040902054610b11575050565b6000610b1c83610672565b9050801561082457600c54610b319082610a47565b600c556001600160a01b038316600090815260096020526040902060020154610b5a9082610a47565b6001600160a01b0384166000908152600960205260409020600281019190915554610b8490610a53565b6001600160a01b0380851660009081526009602052604090206001019190915560025483821691161415610824576040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015610be8573d6000803e3d6000fd5b506001600160a01b038216600090815260066020526040902054610c0c9082610a47565b6001600160a01b03808416600090815260066020908152604080832094909455600781528382209287168252919091522054610c489082610a47565b6001600160a01b03808416600090815260076020908152604080832093881683529290522055505050565b600060208284031215610c8557600080fd5b8135610a4081610e16565b60008060408385031215610ca357600080fd5b8235610cae81610e16565b91506020830135610cbe81610e16565b809150509250929050565b60008060408385031215610cdc57600080fd5b8235610ce781610e16565b946020939093013593505050565b600060208284031215610d0757600080fd5b81518015158114610a4057600080fd5b600060208284031215610d2957600080fd5b5051919050565b6001600160a01b0391909116815260200190565b60208082526006908201526510a7aba722a960d11b604082015260600190565b60008219821115610d7757610d77610dd4565b500190565b600082610d9957634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615610db857610db8610dd4565b500290565b600082821015610dcf57610dcf610dd4565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146105e157600080fdfea2646970667358221220707aaa7daefceda57cb86ec996b85c13bf8dfc4fc534c4ea20d638af06ebc2b564736f6c6343000807003360806040526ec097ce7bc90715b34b9f1000000000600e553480156200002457600080fd5b506040516200106738038062001067833981016040819052620000479162000181565b600080546001600160a01b0319166001600160a01b038481169190911790915583166200008957737a250d5630b4cf539739df2c5dacb4c659f2488d6200008b565b825b600380546001600160a01b039283166001600160a01b0319918216179091556001805482163317815583831660008181526008602052604090819020805460ff19169093179092556002805490931681179092555163095ea7b360e01b8152918516600483015260001960248301529063095ea7b390604401602060405180830381600087803b1580156200011f57600080fd5b505af115801562000134573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200015a9190620001cb565b50505050620001f6565b80516001600160a01b03811681146200017c57600080fd5b919050565b6000806000606084860312156200019757600080fd5b620001a28462000164565b9250620001b26020850162000164565b9150620001c26040850162000164565b90509250925092565b600060208284031215620001de57600080fd5b81518015158114620001ef57600080fd5b9392505050565b610e6180620002066000396000f3fe6080604052600436106100fe5760003560e01c8063022c299b1461010a5780630300f9251461016357806311ce023d1461019b57806314b6ca96146101b15780632f54bf6e146101d35780633a98ef3914610203578063420ab93a1461021957806343bf95481461022e5780635881f3ef14610264578063845610ee14610284578063997664d7146102a4578063a5978c66146102ba578063be82f56b146102da578063ca89b899146102fa578063ce7c2ac214610327578063d0e30db01461037e578063d63a8e1114610386578063e2d2e219146103b6578063efca2eed146103cc578063f2fde38b146103e2578063f8653ae21461040257600080fd5b3661010557005b600080fd5b34801561011657600080fd5b50610150610125366004610c90565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b6040519081526020015b60405180910390f35b34801561016f57600080fd5b5061015061017e366004610c90565b600760209081526000928352604080842090915290825290205481565b3480156101a757600080fd5b50610150600e5481565b3480156101bd57600080fd5b506101d16101cc366004610cc9565b610422565b005b3480156101df57600080fd5b506101f36101ee366004610c73565b610573565b604051901515815260200161015a565b34801561020f57600080fd5b50610150600a5481565b34801561022557600080fd5b506101d1610587565b34801561023a57600080fd5b50610150610249366004610c73565b6001600160a01b031660009081526006602052604090205490565b34801561027057600080fd5b506101d161027f366004610c73565b6105e4565b34801561029057600080fd5b506101d161029f366004610c73565b61062b565b3480156102b057600080fd5b50610150600b5481565b3480156102c657600080fd5b506101506102d5366004610c73565b610672565b3480156102e657600080fd5b506101d16102f5366004610c90565b6106fb565b34801561030657600080fd5b50610150610315366004610c73565b60066020526000908152604090205481565b34801561033357600080fd5b50610363610342366004610c73565b60096020526000908152604090208054600182015460029092015490919083565b6040805193845260208401929092529082015260600161015a565b6101d1610829565b34801561039257600080fd5b506101f36103a1366004610c73565b60086020526000908152604090205460ff1681565b3480156103c257600080fd5b50610150600d5481565b3480156103d857600080fd5b50610150600c5481565b3480156103ee57600080fd5b506101d16103fd366004610c73565b61087f565b34801561040e57600080fd5b506101d161041d366004610c90565b6108fa565b6001546001600160a01b0316331461043957600080fd5b60008111801561045f57506001600160a01b038216600090815260096020526040902054155b156104c557600480546001600160a01b0384166000818152600560205260408120839055600183018455929092527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b03191690911790556104f8565b801580156104ea57506001600160a01b03821660009081526009602052604090205415155b156104f8576104f88261091f565b6001600160a01b038216600090815260096020526040902054600a5461052991839161052391610a34565b90610a47565b600a556001600160a01b038216600090815260096020526040902081905561055081610a53565b6001600160a01b0390921660009081526009602052604090206001019190915550565b6000546001600160a01b0391821691161490565b61059033610573565b6105b55760405162461bcd60e51b81526004016105ac90610d44565b60405180910390fd5b60405133904780156108fc02916000818181858888f193505050501580156105e1573d6000803e3d6000fd5b50565b6105ed33610573565b6106095760405162461bcd60e51b81526004016105ac90610d44565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b61063433610573565b6106505760405162461bcd60e51b81526004016105ac90610d44565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526009602052604081205461069757506000919050565b6001600160a01b0382166000908152600960205260408120546106b990610a53565b6001600160a01b0384166000908152600960205260409020600101549091508082116106e9575060009392505050565b6106f38282610a34565b949350505050565b61070433610573565b6107205760405162461bcd60e51b81526004016105ac90610d44565b6040516370a0823160e01b81526001600160a01b0383169063a9059cbb90839083906370a0823190610756903090600401610d30565b60206040518083038186803b15801561076e57600080fd5b505afa158015610782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a69190610d17565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156107ec57600080fd5b505af1158015610800573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108249190610cf5565b505050565b6001546001600160a01b0316331461084057600080fd5b600b54349061084f9082610a47565b600b55600a54600e54610879916108709161086a9085610a76565b90610a82565b600d5490610a47565b600d5550565b61088833610573565b6108a45760405162461bcd60e51b81526004016105ac90610d44565b600080546001600160a01b0319166001600160a01b0383161790556040517f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163906108ef908390610d30565b60405180910390a150565b6001546001600160a01b0316331461091157600080fd5b61091b8282610a8e565b5050565b6004805461092f90600190610dbd565b8154811061093f5761093f610e00565b60009182526020808320909101546001600160a01b038481168452600590925260409092205460048054929093169291811061097d5761097d610e00565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559183168152600591829052604081205460048054919392916109c990600190610dbd565b815481106109d9576109d9610e00565b60009182526020808320909101546001600160a01b031683528201929092526040019020556004805480610a0f57610a0f610dea565b600082815260209020810160001990810180546001600160a01b031916905501905550565b6000610a408284610dbd565b9392505050565b6000610a408284610d64565b6000610a70600e5461086a600d5485610a7690919063ffffffff16565b92915050565b6000610a408284610d9e565b6000610a408284610d7c565b6001600160a01b03811660009081526008602052604090205460ff16610af05760405162461bcd60e51b8152602060048201526017602482015276496e76616c69642072657761726420616464726573732160481b60448201526064016105ac565b6001600160a01b038216600090815260096020526040902054610b11575050565b6000610b1c83610672565b9050801561082457600c54610b319082610a47565b600c556001600160a01b038316600090815260096020526040902060020154610b5a9082610a47565b6001600160a01b0384166000908152600960205260409020600281019190915554610b8490610a53565b6001600160a01b0380851660009081526009602052604090206001019190915560025483821691161415610824576040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015610be8573d6000803e3d6000fd5b506001600160a01b038216600090815260066020526040902054610c0c9082610a47565b6001600160a01b03808416600090815260066020908152604080832094909455600781528382209287168252919091522054610c489082610a47565b6001600160a01b03808416600090815260076020908152604080832093881683529290522055505050565b600060208284031215610c8557600080fd5b8135610a4081610e16565b60008060408385031215610ca357600080fd5b8235610cae81610e16565b91506020830135610cbe81610e16565b809150509250929050565b60008060408385031215610cdc57600080fd5b8235610ce781610e16565b946020939093013593505050565b600060208284031215610d0757600080fd5b81518015158114610a4057600080fd5b600060208284031215610d2957600080fd5b5051919050565b6001600160a01b0391909116815260200190565b60208082526006908201526510a7aba722a960d11b604082015260600190565b60008219821115610d7757610d77610dd4565b500190565b600082610d9957634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615610db857610db8610dd4565b500290565b600082821015610dcf57610dcf610dd4565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146105e157600080fdfea264697066735822122018c9bac039f90ae20a1c6368660439fb9066ec07a14e63d067c9586bb4d6199a64736f6c63430008070033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419

Deployed Bytecode

0x6080604052600436106103455760003560e01c8063026ad43f1461035157806303c5d0871461038757806303fd2a45146103ab578063069f22ec146103c157806306fdde03146103d7578063083676de14610417578063095ea7b31461043757806315d61a8214610467578063163d80241461048957806318160ddd146104a957806318903366146104be5780631a13f374146104de57806323b872dd146104ff57806326560be71461051f5780632f48ab7d1461053f5780632f54bf6e1461055f5780632fccc0d71461057f578063313ce567146105955780633f4218e0146105b15780633fc645b5146105e1578063420ab93a1461060157806342966c68146106165780634782e4071461063657806348b98ef5146106565780634ada218b1461067757806354c617511461069657806356c9d840146106b6578063571ac8b0146106dd5780635b329425146106fd5780635d0044ca1461071d57806363423e5e1461073d57806363d001471461075357806365fc75cd1461077357806366c4390d14610789578063670ddf741461079e57806368237329146107d75780636c6c3ccf146107ed57806370a082311461080357806375a2031114610823578063807fb8c51461085c578063893d20e81461088c5780639571a07d146108aa57806395d89b41146108da5780639c1cf33b146109095780639cece12e146109295780639d64bf93146109595780639fd6db121461096f578063a046ecf114610989578063a0712d68146109c2578063a8aa1b31146109e2578063a9059cbb14610a02578063ad5c464814610a22578063ae37021e14610a42578063b30d194c14610a62578063b333a58114610a78578063b3f152dd14610a8e578063be82f56b14610ac7578063c344295614610ae7578063c54e44eb14610afd578063cba4590214610b1d578063d5b5a46a14610b3d578063da7003f114610b5d578063db485f6114610b73578063dd62ed3e14610b89578063e0f8e24314610bcf578063e792573714610bef578063ec342ad014610c0f578063eea1f18314610c2f578063f2fde38b14610c4f578063f3223d9114610c6f578063f37ce00514610c8f578063f887ea4014610caf578063f8b45b0514610ccf578063fc978cb914610ce557600080fd5b3661034c57005b600080fd5b34801561035d57600080fd5b50601e54610371906001600160a01b031681565b60405161037e91906129d3565b60405180910390f35b34801561039357600080fd5b5061039d60205481565b60405190815260200161037e565b3480156103b757600080fd5b5061037161dead81565b3480156103cd57600080fd5b5061039d601c5481565b3480156103e357600080fd5b5060408051808201909152600e81526d26b4b1b937ab30b634b230ba37b960911b60208201525b60405161037e9190612a1a565b34801561042357600080fd5b50601754610371906001600160a01b031681565b34801561044357600080fd5b506104576104523660046128b6565b610cfb565b604051901515815260200161037e565b34801561047357600080fd5b5061048761048236600461293a565b610d67565b005b34801561049557600080fd5b50601654610371906001600160a01b031681565b3480156104b557600080fd5b5060045461039d565b3480156104ca57600080fd5b506104876104d9366004612888565b610d9a565b3480156104ea57600080fd5b50601e5461045790600160a01b900460ff1681565b34801561050b57600080fd5b5061045761051a366004612847565b610dea565b34801561052b57600080fd5b5061048761053a3660046128e2565b610eae565b34801561054b57600080fd5b50601f54610371906001600160a01b031681565b34801561056b57600080fd5b5061045761057a36600461272d565b610eed565b34801561058b57600080fd5b5061039d60115481565b3480156105a157600080fd5b506040516012815260200161037e565b3480156105bd57600080fd5b506104576105cc36600461272d565b600a6020526000908152604090205460ff1681565b3480156105ed57600080fd5b50601d546104579062010000900460ff1681565b34801561060d57600080fd5b50610487610f01565b34801561062257600080fd5b5061048761063136600461293a565b610f55565b34801561064257600080fd5b5061048761065136600461272d565b610ffb565b34801561066257600080fd5b50601b5461045790600160a01b900460ff1681565b34801561068357600080fd5b50601d5461045790610100900460ff1681565b3480156106a257600080fd5b506104876106b136600461296c565b61104c565b3480156106c257600080fd5b50601d5461037190630100000090046001600160a01b031681565b3480156106e957600080fd5b506104576106f836600461272d565b61107f565b34801561070957600080fd5b5061048761071836600461291c565b611093565b34801561072957600080fd5b5061048761073836600461293a565b6110da565b34801561074957600080fd5b5061039d60155481565b34801561075f57600080fd5b5061048761076e3660046127a0565b611104565b34801561077f57600080fd5b5061039d60215481565b34801561079557600080fd5b506104876113a2565b3480156107aa57600080fd5b506104576107b936600461272d565b6001600160a01b03166000908152600b602052604090205460ff1690565b3480156107e357600080fd5b5061039d60135481565b3480156107f957600080fd5b5061039d600f5481565b34801561080f57600080fd5b5061039d61081e36600461272d565b6113d3565b34801561082f57600080fd5b5061045761083e36600461272d565b6001600160a01b03166000908152600a602052604090205460ff1690565b34801561086857600080fd5b5061045761087736600461272d565b600b6020526000908152604090205460ff1681565b34801561089857600080fd5b506000546001600160a01b0316610371565b3480156108b657600080fd5b506104576108c536600461272d565b60096020526000908152604090205460ff1681565b3480156108e657600080fd5b5060408051808201909152600681526526a4a1a927ab60d11b602082015261040a565b34801561091557600080fd5b50601954610371906001600160a01b031681565b34801561093557600080fd5b5061045761094436600461272d565b600c6020526000908152604090205460ff1681565b34801561096557600080fd5b5061039d60065481565b34801561097b57600080fd5b50601d546104579060ff1681565b34801561099557600080fd5b506104576109a436600461272d565b6001600160a01b03166000908152600c602052604090205460ff1690565b3480156109ce57600080fd5b506104876109dd36600461293a565b6113ee565b3480156109ee57600080fd5b50601b54610371906001600160a01b031681565b348015610a0e57600080fd5b50610457610a1d3660046128b6565b6114ed565b348015610a2e57600080fd5b50600254610371906001600160a01b031681565b348015610a4e57600080fd5b50610487610a5d3660046127eb565b6114fa565b348015610a6e57600080fd5b5061039d60125481565b348015610a8457600080fd5b5061039d60105481565b348015610a9a57600080fd5b50610457610aa936600461272d565b6001600160a01b031660009081526009602052604090205460ff1690565b348015610ad357600080fd5b50610487610ae2366004612767565b61156f565b348015610af357600080fd5b5061039d600d5481565b348015610b0957600080fd5b50600354610371906001600160a01b031681565b348015610b2957600080fd5b50610487610b38366004612888565b61168e565b348015610b4957600080fd5b50610487610b58366004612888565b6116de565b348015610b6957600080fd5b5061039d600e5481565b348015610b7f57600080fd5b5061039d60225481565b348015610b9557600080fd5b5061039d610ba4366004612767565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b348015610bdb57600080fd5b50610487610bea36600461272d565b61172e565b348015610bfb57600080fd5b50610487610c0a366004612888565b611775565b348015610c1b57600080fd5b50600154610371906001600160a01b031681565b348015610c3b57600080fd5b50610487610c4a366004612998565b6117c5565b348015610c5b57600080fd5b50610487610c6a36600461272d565b611821565b348015610c7b57600080fd5b50601854610371906001600160a01b031681565b348015610c9b57600080fd5b50610487610caa3660046128e2565b61189c565b348015610cbb57600080fd5b50601a54610371906001600160a01b031681565b348015610cdb57600080fd5b5061039d60055481565b348015610cf157600080fd5b5061039d60145481565b3360008181526008602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610d569086815260200190565b60405180910390a350600192915050565b610d7033610eed565b610d955760405162461bcd60e51b8152600401610d8c90612a6f565b60405180910390fd5b600655565b610da333610eed565b610dbf5760405162461bcd60e51b8152600401610d8c90612a6f565b6001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b6004546001600160a01b0384166000908152600860209081526040808320338452909152812054909114610e99576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b0387166000908152600882528381203382529091529190912054610e749184906118df565b6001600160a01b03851660009081526008602090815260408083203384529091529020555b610ea484848461190b565b90505b9392505050565b610eb733610eed565b610ed35760405162461bcd60e51b8152600401610d8c90612a6f565b601d80549115156101000261ff0019909216919091179055565b6000546001600160a01b0391821691161490565b610f0a33610eed565b610f265760405162461bcd60e51b8152600401610d8c90612a6f565b60405133904780156108fc02916000818181858888f19350505050158015610f52573d6000803e3d6000fd5b50565b610f5e33610eed565b610f7a5760405162461bcd60e51b8152600401610d8c90612a6f565b33600090815260076020526040902054811115610f9657600080fd5b8060046000828254610fa89190612b59565b90915550503360009081526007602052604081208054839290610fcc908490612b59565b90915550506040518181526000903390600080516020612bc0833981519152906020015b60405180910390a350565b61100433610eed565b6110205760405162461bcd60e51b8152600401610d8c90612a6f565b600380546001600160a01b039092166001600160a01b03199283168117909155601f8054909216179055565b61105533610eed565b6110715760405162461bcd60e51b8152600401610d8c90612a6f565b602092909255602155602255565b600061108d82600454610cfb565b92915050565b61109c33610eed565b6110b85760405162461bcd60e51b8152600401610d8c90612a6f565b601b8054921515600160a01b0260ff60a01b1990931692909217909155601c55565b6110e333610eed565b6110ff5760405162461bcd60e51b8152600401610d8c90612a6f565b600555565b61110d33610eed565b6111295760405162461bcd60e51b8152600401610d8c90612a6f565b601a80546001600160a01b0319166001600160a01b038581169190911790915582161561125857601a60009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561119e57600080fd5b505afa1580156111b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d6919061274a565b6001600160a01b031663e6a4390530836040518363ffffffff1660e01b81526004016112039291906129e7565b60206040518083038186803b15801561121b57600080fd5b505afa15801561122f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611253919061274a565b61135d565b601a60009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156112a657600080fd5b505afa1580156112ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112de919061274a565b6001600160a01b031663c9c6539630836040518363ffffffff1660e01b815260040161130b9291906129e7565b602060405180830381600087803b15801561132557600080fd5b505af1158015611339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135d919061274a565b601b80546001600160a01b0319166001600160a01b03928316179055600454306000908152600860209081526040808320979094168252959095529320929092555050565b6113ab33610eed565b6113c75760405162461bcd60e51b8152600401610d8c90612a6f565b601d805460ff19169055565b6001600160a01b031660009081526007602052604090205490565b6113f733610eed565b6114135760405162461bcd60e51b8152600401610d8c90612a6f565b601d5460ff1661145b5760405162461bcd60e51b8152602060048201526013602482015272135a5b9d1a5b99c81a5cc8191a5cd8589b1959606a1b6044820152606401610d8c565b806004600082825461146d9190612b00565b9091555050601a5460045461148b916001600160a01b031690610cfb565b50601b546004546114a5916001600160a01b031690610cfb565b5033600090815260076020526040812080548392906114c5908490612b00565b90915550506040518181523390600090600080516020612bc083398151915290602001610ff0565b6000610ea733848461190b565b61150333610eed565b61151f5760405162461bcd60e51b8152600401610d8c90612a6f565b601680546001600160a01b039586166001600160a01b0319918216179091556017805494861694821694909417909355601880549285169284169290921790915560198054919093169116179055565b61157833610eed565b6115945760405162461bcd60e51b8152600401610d8c90612a6f565b6040516370a0823160e01b81526001600160a01b0383169063a9059cbb90839083906370a08231906115ca9030906004016129d3565b60206040518083038186803b1580156115e257600080fd5b505afa1580156115f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161a9190612953565b6040518363ffffffff1660e01b8152600401611637929190612a01565b602060405180830381600087803b15801561165157600080fd5b505af1158015611665573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168991906128ff565b505050565b61169733610eed565b6116b35760405162461bcd60e51b8152600401610d8c90612a6f565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b6116e733610eed565b6117035760405162461bcd60e51b8152600401610d8c90612a6f565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b61173733610eed565b6117535760405162461bcd60e51b8152600401610d8c90612a6f565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b61177e33610eed565b61179a5760405162461bcd60e51b8152600401610d8c90612a6f565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6117ce33610eed565b6117ea5760405162461bcd60e51b8152600401610d8c90612a6f565b600d859055600e8490556117fe8585611cbb565b600f55601083905560118290556118158383611cbb565b60125560135550505050565b61182a33610eed565b6118465760405162461bcd60e51b8152600401610d8c90612a6f565b600080546001600160a01b0319166001600160a01b0383161790556040517f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163906118919083906129d3565b60405180910390a150565b6118a533610eed565b6118c15760405162461bcd60e51b8152600401610d8c90612a6f565b601e8054911515600160a01b0260ff60a01b19909216919091179055565b600081848411156119035760405162461bcd60e51b8152600401610d8c9190612a1a565b505050900390565b601d5460009062010000900460ff16156119315761192a848484611cc7565b9050610ea7565b601d54610100900460ff168061195f57506001600160a01b03841660009081526009602052604090205460ff165b6119ab5760405162461bcd60e51b815260206004820152601d60248201527f54726164696e672069732063757272656e746c792064697361626c65640000006044820152606401610d8c565b601a546001600160a01b038481166000908152600c602052604081205491909216919060ff16806119ed5750816001600160a01b0316856001600160a01b0316145b905080158015611a1657506001600160a01b0385166000908152600b602052604090205460ff16155b15611a8f576005546001600160a01b038616600090815260076020526040902054611a42908690612b00565b10611a8f5760405162461bcd60e51b815260206004820152601d60248201527f4d61782077616c6c657420686173206265656e207472696767657265640000006044820152606401610d8c565b808015611a9e57506006548410155b15611b0b57336000908152600c602052604090205460ff16158015611acc5750601d5462010000900460ff16155b8015611ae15750601b54600160a01b900460ff165b8015611afe5750601c543060009081526007602052604090205410155b15611b0b57611b0b611d6a565b6040805180820182526014815273496e73756666696369656e742062616c616e636560601b6020808301919091526001600160a01b038916600090815260079091529190912054611b5d9186906118df565b6001600160a01b038716600090815260076020908152604080832093909355600c90522054849060ff1680611ba35750826001600160a01b0316876001600160a01b0316145b80611be157506001600160a01b0386166000908152600c602052604090205460ff1680611be15750826001600160a01b0316866001600160a01b0316145b611bec576000611c2e565b6001600160a01b0387166000908152600a602052604090205460ff16158015611c2e57506001600160a01b0386166000908152600a602052604090205460ff16155b15611c4157611c3e878787612538565b90505b6001600160a01b038616600090815260076020526040902054611c649082611cbb565b6001600160a01b038088166000818152600760205260409081902093909355915190891690600080516020612bc083398151915290611ca69085815260200190565b60405180910390a35060019695505050505050565b6000610ea78284612b00565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0386166000908152600790915291822054611d189184906118df565b6001600160a01b038086166000908152600760205260408082209390935590851681522054611d479083611cbb565b6001600160a01b0384166000908152600760205260409020555060019392505050565b601d805462ff0000191662010000179055601554601454600091611d8e9190611cbb565b601e54909150600160a01b900460ff16156120635760408051600380825260808201909252600091602082016060803683370190505090503081600081518110611dda57611dda612b86565b6001600160a01b039283166020918202929092010152600354825191169082906001908110611e0b57611e0b612b86565b6001600160a01b0392831660209182029290920101526002805483519216918391908110611e3b57611e3b612b86565b6001600160a01b039283166020918202929092010152601a5447911663791ac947611e65306113d3565b60008530426040518663ffffffff1660e01b8152600401611e8a959493929190612a8f565b600060405180830381600087803b158015611ea457600080fd5b505af1158015611eb8573d6000803e3d6000fd5b505050506000611ed1824761270990919063ffffffff16565b90506000611ef485611eee6014548561271590919063ffffffff16565b90612721565b90506000611f1186611eee6015548661271590919063ffffffff16565b6000601481905560155590508115612017576016546001600160a01b03166108fc612710611f4185610d48612b3a565b611f4b9190612b18565b6040518115909202916000818181858888f19350505050158015611f73573d6000803e3d6000fd5b506017546001600160a01b03166108fc612710611f9285610ce4612b3a565b611f9c9190612b18565b6040518115909202916000818181858888f19350505050158015611fc4573d6000803e3d6000fd5b506018546001600160a01b03166108fc612710611fe385610ce4612b3a565b611fed9190612b18565b6040518115909202916000818181858888f19350505050158015612015573d6000803e3d6000fd5b505b8015612059576019546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612057573d6000803e3d6000fd5b505b5050505050612529565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061209857612098612b86565b6001600160a01b0392831660209182029290920101526003548251911690829060019081106120c9576120c9612b86565b6001600160a01b039283166020918202929092010152601f546040516370a0823160e01b815260009291909116906370a082319061210b9030906004016129d3565b60206040518083038186803b15801561212357600080fd5b505afa158015612137573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215b9190612953565b601a549091506001600160a01b0316635c11d795612178306113d3565b60008530426040518663ffffffff1660e01b815260040161219d959493929190612a8f565b600060405180830381600087803b1580156121b757600080fd5b505af11580156121cb573d6000803e3d6000fd5b5050601f546040516370a0823160e01b81526000935061225c925084916001600160a01b0316906370a08231906122069030906004016129d3565b60206040518083038186803b15801561221e57600080fd5b505afa158015612232573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122569190612953565b90612709565b9050600061227b602254611eee6020548561271590919063ffffffff16565b9050600061229a602254611eee6021548661271590919063ffffffff16565b600060148190556015559050811561249357601f546016546001600160a01b039182169163a9059cbb91166127106122d486610d48612b3a565b6122de9190612b18565b6040518363ffffffff1660e01b81526004016122fb929190612a01565b602060405180830381600087803b15801561231557600080fd5b505af1158015612329573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234d91906128ff565b50601f546017546001600160a01b039182169163a9059cbb911661271061237686610ce4612b3a565b6123809190612b18565b6040518363ffffffff1660e01b815260040161239d929190612a01565b602060405180830381600087803b1580156123b757600080fd5b505af11580156123cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ef91906128ff565b50601f546018546001600160a01b039182169163a9059cbb911661271061241886610ce4612b3a565b6124229190612b18565b6040518363ffffffff1660e01b815260040161243f929190612a01565b602060405180830381600087803b15801561245957600080fd5b505af115801561246d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249191906128ff565b505b801561252357601f5460195460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb926124cf929116908590600401612a01565b602060405180830381600087803b1580156124e957600080fd5b505af11580156124fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252191906128ff565b505b50505050505b50601d805462ff000019169055565b6001600160a01b0382166000908152600c6020526040812054819060ff168061256e5750601a546001600160a01b038581169116145b905060008161257f57600f54612583565b6012545b905060006125a0601354611eee848861271590919063ffffffff16565b9050811561269357821561262357601054156125e65781601054826125c59190612b3a565b6125cf9190612b18565b601460008282546125e09190612b00565b90915550505b6011541561261e5781601154826125fd9190612b3a565b6126079190612b18565b601560008282546126189190612b00565b90915550505b612693565b600d541561265b5781600d548261263a9190612b3a565b6126449190612b18565b601460008282546126559190612b00565b90915550505b600e54156126935781600e54826126729190612b3a565b61267c9190612b18565b6015600082825461268d9190612b00565b90915550505b306000908152600760205260409020546126ad9082611cbb565b30600081815260076020526040908190209290925590516001600160a01b03891690600080516020612bc0833981519152906126ec9085815260200190565b60405180910390a36126fe8582612709565b979650505050505050565b6000610ea78284612b59565b6000610ea78284612b3a565b6000610ea78284612b18565b60006020828403121561273f57600080fd5b8135610ea781612b9c565b60006020828403121561275c57600080fd5b8151610ea781612b9c565b6000806040838503121561277a57600080fd5b823561278581612b9c565b9150602083013561279581612b9c565b809150509250929050565b6000806000606084860312156127b557600080fd5b83356127c081612b9c565b925060208401356127d081612b9c565b915060408401356127e081612b9c565b809150509250925092565b6000806000806080858703121561280157600080fd5b843561280c81612b9c565b9350602085013561281c81612b9c565b9250604085013561282c81612b9c565b9150606085013561283c81612b9c565b939692955090935050565b60008060006060848603121561285c57600080fd5b833561286781612b9c565b9250602084013561287781612b9c565b929592945050506040919091013590565b6000806040838503121561289b57600080fd5b82356128a681612b9c565b9150602083013561279581612bb1565b600080604083850312156128c957600080fd5b82356128d481612b9c565b946020939093013593505050565b6000602082840312156128f457600080fd5b8135610ea781612bb1565b60006020828403121561291157600080fd5b8151610ea781612bb1565b6000806040838503121561292f57600080fd5b82356128d481612bb1565b60006020828403121561294c57600080fd5b5035919050565b60006020828403121561296557600080fd5b5051919050565b60008060006060848603121561298157600080fd5b505081359360208301359350604090920135919050565b600080600080600060a086880312156129b057600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b600060208083528351808285015260005b81811015612a4757858101830151858201604001528201612a2b565b81811115612a59576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526006908201526510a7aba722a960d11b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612adf5784516001600160a01b031683529383019391830191600101612aba565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115612b1357612b13612b70565b500190565b600082612b3557634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612b5457612b54612b70565b500290565b600082821015612b6b57612b6b612b70565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114610f5257600080fd5b8015158114610f5257600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220c2f80e3ee4a3632f80132a4985a0074a22307ec07994d9e9f289d33f3acd430564736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419

-----Decoded View---------------
Arg [0] : _priceFeed (address): 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419


Deployed Bytecode Sourcemap

61277:15108:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63311:36;;;;;;;;;;-1:-1:-1;63311:36:0;;;;-1:-1:-1;;;;;63311:36:0;;;;;;;;;;:::i;:::-;;;;;;;;63430:31;;;;;;;;;;;;;;;;;;;9562:25:1;;;9550:2;9535:18;63430:31:0;9416:177:1;61560:73:0;;;;;;;;;;;;61591:42;61560:73;;63078:58;;;;;;;;;;;;;;;;75869:94;;;;;;;;;;-1:-1:-1;75950:5:0;;;;;;;;;;;;-1:-1:-1;;;75950:5:0;;;;75869:94;;;;;;;:::i;62718:75::-;;;;;;;;;;-1:-1:-1;62718:75:0;;;;-1:-1:-1;;;;;62718:75:0;;;65899:216;;;;;;;;;;-1:-1:-1;65899:216:0;;;;;:::i;:::-;;:::i;:::-;;;6694:14:1;;6687:22;6669:41;;6657:2;6642:18;65899:216:0;6529:187:1;72373:154:0;;;;;;;;;;-1:-1:-1;72373:154:0;;;;;:::i;:::-;;:::i;:::-;;62636:75;;;;;;;;;;-1:-1:-1;62636:75:0;;;;-1:-1:-1;;;;;62636:75:0;;;75551:102;;;;;;;;;;-1:-1:-1;75633:12:0;;75551:102;;73071:126;;;;;;;;;;-1:-1:-1;73071:126:0;;;;;:::i;:::-;;:::i;63354:29::-;;;;;;;;;;-1:-1:-1;63354:29:0;;;;-1:-1:-1;;;63354:29:0;;;;;;66414:339;;;;;;;;;;-1:-1:-1;66414:339:0;;;;;:::i;:::-;;:::i;75147:101::-;;;;;;;;;;-1:-1:-1;75147:101:0;;;;;:::i;:::-;;:::i;63390:33::-;;;;;;;;;;-1:-1:-1;63390:33:0;;;;-1:-1:-1;;;;;63390:33:0;;;7359:103;;;;;;;;;;-1:-1:-1;7359:103:0;;;;;:::i;:::-;;:::i;62438:37::-;;;;;;;;;;;;;;;;75661:94;;;;;;;;;;-1:-1:-1;75661:94:0;;61779:2;10725:36:1;;10713:2;10698:18;75661:94:0;10583:184:1;62132:44:0;;;;;;;;;;-1:-1:-1;62132:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;63224:37;;;;;;;;;;-1:-1:-1;63224:37:0;;;;;;;;;;;75256:109;;;;;;;;;;;;;:::i;65647:244::-;;;;;;;;;;-1:-1:-1;65647:244:0;;;;;:::i;:::-;;:::i;72140:115::-;;;;;;;;;;-1:-1:-1;72140:115:0;;;;;:::i;:::-;;:::i;63033:38::-;;;;;;;;;;-1:-1:-1;63033:38:0;;;;-1:-1:-1;;;63033:38:0;;;;;;63183:34;;;;;;;;;;-1:-1:-1;63183:34:0;;;;;;;;;;;71806:233;;;;;;;;;;-1:-1:-1;71806:233:0;;;;;:::i;:::-;;:::i;63268:36::-;;;;;;;;;;-1:-1:-1;63268:36:0;;;;;;;-1:-1:-1;;;;;63268:36:0;;;66123:119;;;;;;;;;;-1:-1:-1;66123:119:0;;;;;:::i;:::-;;:::i;73587:230::-;;;;;;;;;;-1:-1:-1;73587:230:0;;;;;:::i;:::-;;:::i;72263:102::-;;;;;;;;;;-1:-1:-1;72263:102:0;;;;;:::i;:::-;;:::i;62592:37::-;;;;;;;;;;;;;;;;74655:379;;;;;;;;;;-1:-1:-1;74655:379:0;;;;;:::i;:::-;;:::i;63468:38::-;;;;;;;;;;;;;;;;75042:97;;;;;;;;;;;;;:::i;73205:116::-;;;;;;;;;;-1:-1:-1;73205:116:0;;;;;:::i;:::-;-1:-1:-1;;;;;73293:20:0;73269:4;73293:20;;;:11;:20;;;;;;;;;73205:116;62522:26;;;;;;;;;;;;;;;;62364:32;;;;;;;;;;;;;;;;76071:119;;;;;;;;;;-1:-1:-1;76071:119:0;;;;;:::i;:::-;;:::i;72947:116::-;;;;;;;;;;-1:-1:-1;72947:116:0;;;;;:::i;:::-;-1:-1:-1;;;;;73035:20:0;73011:4;73035:20;;;:11;:20;;;;;;;;;72947:116;62183:44;;;;;;;;;;-1:-1:-1;62183:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;75971:92;;;;;;;;;;-1:-1:-1;76023:7:0;76050:5;-1:-1:-1;;;;;76050:5:0;75971:92;;62076:49;;;;;;;;;;-1:-1:-1;62076:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;75763:98;;;;;;;;;;-1:-1:-1;75846:7:0;;;;;;;;;;;;-1:-1:-1;;;75846:7:0;;;;75763:98;;62882:81;;;;;;;;;;-1:-1:-1;62882:81:0;;;;-1:-1:-1;;;;;62882:81:0;;;62234:46;;;;;;;;;;-1:-1:-1;62234:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;61899:41;;;;;;;;;;;;;;;;63143:33;;;;;;;;;;-1:-1:-1;63143:33:0;;;;;;;;73463:116;;;;;;;;;;-1:-1:-1;73463:116:0;;;;;:::i;:::-;-1:-1:-1;;;;;73551:20:0;73527:4;73551:20;;;:13;:20;;;;;;;;;73463:116;65294:345;;;;;;;;;;-1:-1:-1;65294:345:0;;;;;:::i;:::-;;:::i;63007:19::-;;;;;;;;;;-1:-1:-1;63007:19:0;;;;-1:-1:-1;;;;;63007:19:0;;;66250:156;;;;;;;;;;-1:-1:-1;66250:156:0;;;;;:::i;:::-;;:::i;61418:64::-;;;;;;;;;;-1:-1:-1;61418:64:0;;;;-1:-1:-1;;;;;61418:64:0;;;74284:363;;;;;;;;;;-1:-1:-1;74284:363:0;;;;;:::i;:::-;;:::i;62482:33::-;;;;;;;;;;;;;;;;62403:28;;;;;;;;;;;;;;;;72679:126;;;;;;;;;;-1:-1:-1;72679:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;72772:25:0;72748:4;72772:25;;;:16;:25;;;;;;;;;72679:126;75373:170;;;;;;;;;;-1:-1:-1;75373:170:0;;;;;:::i;:::-;;:::i;62287:29::-;;;;;;;;;;;;;;;;61489:64;;;;;;;;;;-1:-1:-1;61489:64:0;;;;-1:-1:-1;;;;;61489:64:0;;;73329:126;;;;;;;;;;-1:-1:-1;73329:126:0;;;;;:::i;:::-;;:::i;72813:::-;;;;;;;;;;-1:-1:-1;72813:126:0;;;;;:::i;:::-;;:::i;62323:34::-;;;;;;;;;;;;;;;;63513:33;;;;;;;;;;;;;;;;76198:147;;;;;;;;;;-1:-1:-1;76198:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;76309:19:0;;;76282:7;76309:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;76198:147;72047:85;;;;;;;;;;-1:-1:-1;72047:85:0;;;;;:::i;:::-;;:::i;72535:136::-;;;;;;;;;;-1:-1:-1;72535:136:0;;;;;:::i;:::-;;:::i;61347:64::-;;;;;;;;;;-1:-1:-1;61347:64:0;;;;-1:-1:-1;;;;;61347:64:0;;;73825:451;;;;;;;;;;-1:-1:-1;73825:451:0;;;;;:::i;:::-;;:::i;7468:136::-;;;;;;;;;;-1:-1:-1;7468:136:0;;;;;:::i;:::-;;:::i;62800:75::-;;;;;;;;;;-1:-1:-1;62800:75:0;;;;-1:-1:-1;;;;;62800:75:0;;;71692:106;;;;;;;;;;-1:-1:-1;71692:106:0;;;;;:::i;:::-;;:::i;62970:30::-;;;;;;;;;;-1:-1:-1;62970:30:0;;;;-1:-1:-1;;;;;62970:30:0;;;61853:39;;;;;;;;;;;;;;;;62555:30;;;;;;;;;;;;;;;;65899:216;66003:10;65974:4;65991:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;65991:32:0;;;;;;;;;;:41;;;66048:37;65974:4;;65991:32;;66048:37;;;;66026:6;9562:25:1;;9550:2;9535:18;;9416:177;66048:37:0;;;;;;;;-1:-1:-1;66103:4:0;65899:216;;;;:::o;72373:154::-;7303:19;7311:10;7303:7;:19::i;:::-;7295:38;;;;-1:-1:-1;;;7295:38:0;;;;;;;:::i;:::-;;;;;;;;;72471:22:::1;:48:::0;72373:154::o;73071:126::-;7303:19;7311:10;7303:7;:19::i;:::-;7295:38;;;;-1:-1:-1;;;7295:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;73159:20:0;;;::::1;;::::0;;;:11:::1;:20;::::0;;;;:30;;-1:-1:-1;;73159:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;73071:126::o;66414:339::-;66570:12;;-1:-1:-1;;;;;66535:19:0;;66514:4;66535:19;;;:11;:19;;;;;;;;66555:10;66535:31;;;;;;;;66514:4;;66535:47;66531:156;;66618:69;;;;;;;;;;;-1:-1:-1;;;66618:69:0;;;;;;;;-1:-1:-1;;;;;66618:19:0;;-1:-1:-1;66618:19:0;;;:11;:19;;;;;66638:10;66618:31;;;;;;;;;;:69;;66654:6;;66618:35;:69::i;:::-;-1:-1:-1;;;;;66584:19:0;;;;;;:11;:19;;;;;;;;66604:10;66584:31;;;;;;;:103;66531:156;66705:40;66719:6;66727:9;66738:6;66705:13;:40::i;:::-;66698:47;;66414:339;;;;;;:::o;75147:101::-;7303:19;7311:10;7303:7;:19::i;:::-;7295:38;;;;-1:-1:-1;;;7295:38:0;;;;;;;:::i;:::-;75215:14:::1;:25:::0;;;::::1;;;;-1:-1:-1::0;;75215:25:0;;::::1;::::0;;;::::1;::::0;;75147:101::o;7359:103::-;7414:4;7449:5;-1:-1:-1;;;;;7438:16:0;;;7449:5;;7438:16;;7359:103::o;75256:109::-;7303:19;7311:10;7303:7;:19::i;:::-;7295:38;;;;-1:-1:-1;;;7295:38:0;;;;;;;:::i;:::-;75306:51:::1;::::0;75314:10:::1;::::0;75335:21:::1;75306:51:::0;::::1;;;::::0;::::1;::::0;;;75335:21;75314:10;75306:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;75256:109::o:0;65647:244::-;7303:19;7311:10;7303:7;:19::i;:::-;7295:38;;;;-1:-1:-1;;;7295:38:0;;;;;;;:::i;:::-;65726:10:::1;65716:21;::::0;;;:9:::1;:21;::::0;;;;;:32;-1:-1:-1;65716:32:0::1;65708:41;;;::::0;::::1;;65776:7;65760:12;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;65804:10:0::1;65794:21;::::0;;;:9:::1;:21;::::0;;;;:32;;65819:7;;65794:21;:32:::1;::::0;65819:7;;65794:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;65842:41:0::1;::::0;9562:25:1;;;65871:1:0::1;::::0;65851:10:::1;::::0;-1:-1:-1;;;;;;;;;;;65842:41:0;9550:2:1;9535:18;65842:41:0::1;;;;;;;;65647:244:::0;:::o;72140:115::-;7303:19;7311:10;7303:7;:19::i;:::-;7295:38;;;;-1:-1:-1;;;7295:38:0;;;;;;;:::i;:::-;72205:4:::1;:12:::0;;-1:-1:-1;;;;;72205:12:0;;::::1;-1:-1:-1::0;;;;;;72205:12:0;;::::1;::::0;::::1;::::0;;;72228:4:::1;:19:::0;;;;::::1;;::::0;;72140:115::o;71806:233::-;7303:19;7311:10;7303:7;:19::i;:::-;7295:38;;;;-1:-1:-1;;;7295:38:0;;;;;;;:::i;:::-;71927:9:::1;:22:::0;;;;71960:16:::1;:36:::0;72007:10:::1;:24:::0;71806:233::o;66123:119::-;66179:4;66203:31;66211:8;66221:12;;66203:7;:31::i;:::-;66196:38;66123:119;-1:-1:-1;;66123:119:0:o;73587:230::-;7303:19;7311:10;7303:7;:19::i;:::-;7295:38;;;;-1:-1:-1;;;7295:38:0;;;;;;;:::i;:::-;73710:19:::1;:42:::0;;;::::1;;-1:-1:-1::0;;;73710:42:0::1;-1:-1:-1::0;;;;73710:42:0;;::::1;::::0;;;::::1;::::0;;;73763:21:::1;:46:::0;73587:230::o;72263:102::-;7303:19;7311:10;7303:7;:19::i;:::-;7295:38;;;;-1:-1:-1;;;7295:38:0;;;;;;;:::i;:::-;72335:9:::1;:22:::0;72263:102::o;74655:379::-;7303:19;7311:10;7303:7;:19::i;:::-;7295:38;;;;-1:-1:-1;;;7295:38:0;;;;;;;:::i;:::-;74755:6:::1;:34:::0;;-1:-1:-1;;;;;;74755:34:0::1;-1:-1:-1::0;;;;;74755:34:0;;::::1;::::0;;;::::1;::::0;;;74807:19;::::1;::::0;:158:::1;;74918:6;;;;;;;;;-1:-1:-1::0;;;;;74918:6:0::1;-1:-1:-1::0;;;;;74918:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;74900:43:0::1;;74952:4;74959:5;74900:65;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74807:158;;;74847:6;;;;;;;;;-1:-1:-1::0;;;;;74847:6:0::1;-1:-1:-1::0;;;;;74847:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;74829:46:0::1;;74884:4;74891:5;74829:68;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74800:4;:165:::0;;-1:-1:-1;;;;;;74800:165:0::1;-1:-1:-1::0;;;;;74800:165:0;;::::1;;::::0;;75014:12:::1;::::0;74996:4:::1;-1:-1:-1::0;74976:26:0;;;:11:::1;:26;::::0;;;;;;;:35;;;::::1;::::0;;;;;;;;:50;;;;-1:-1:-1;;74655:379:0:o;75042:97::-;7303:19;7311:10;7303:7;:19::i;:::-;7295:38;;;;-1:-1:-1;;;7295:38:0;;;;;;;:::i;:::-;75109:14:::1;:22:::0;;-1:-1:-1;;75109:22:0::1;::::0;;75042:97::o;76071:119::-;-1:-1:-1;;;;;76164:18:0;76137:7;76164:18;;;:9;:18;;;;;;;76071:119::o;65294:345::-;7303:19;7311:10;7303:7;:19::i;:::-;7295:38;;;;-1:-1:-1;;;7295:38:0;;;;;;;:::i;:::-;65363:14:::1;::::0;::::1;;65355:46;;;::::0;-1:-1:-1;;;65355:46:0;;8578:2:1;65355:46:0::1;::::0;::::1;8560:21:1::0;8617:2;8597:18;;;8590:30;-1:-1:-1;;;8636:18:1;;;8629:49;8695:18;;65355:46:0::1;8376:343:1::0;65355:46:0::1;65428:7;65412:12;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;65462:6:0::1;::::0;65471:12:::1;::::0;65446:38:::1;::::0;-1:-1:-1;;;;;65462:6:0::1;::::0;65446:7:::1;:38::i;:::-;-1:-1:-1::0;65511:4:0::1;::::0;65518:12:::1;::::0;65495:36:::1;::::0;-1:-1:-1;;;;;65511:4:0::1;::::0;65495:7:::1;:36::i;:::-;-1:-1:-1::0;65552:10:0::1;65542:21;::::0;;;:9:::1;:21;::::0;;;;:32;;65567:7;;65542:21;:32:::1;::::0;65567:7;;65542:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;65590:41:0::1;::::0;9562:25:1;;;65611:10:0::1;::::0;65607:1:::1;::::0;-1:-1:-1;;;;;;;;;;;65590:41:0;9550:2:1;9535:18;65590:41:0::1;9416:177:1::0;66250:156:0;66330:4;66354:44;66368:10;66380:9;66391:6;66354:13;:44::i;74284:363::-;7303:19;7311:10;7303:7;:19::i;:::-;7295:38;;;;-1:-1:-1;;;7295:38:0;;;;;;;:::i;:::-;74458:15:::1;:34:::0;;-1:-1:-1;;;;;74458:34:0;;::::1;-1:-1:-1::0;;;;;;74458:34:0;;::::1;;::::0;;;74503:15:::1;:34:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;74548:15:::1;:34:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;74593:21:::1;:46:::0;;;;;::::1;::::0;::::1;;::::0;;74284:363::o;75373:170::-;7303:19;7311:10;7303:7;:19::i;:::-;7295:38;;;;-1:-1:-1;;;7295:38:0;;;;;;;:::i;:::-;75495:39:::1;::::0;-1:-1:-1;;;75495:39:0;;-1:-1:-1;;;;;75459:23:0;::::1;::::0;::::1;::::0;75483:10;;75459:23;;75495:24:::1;::::0;:39:::1;::::0;75528:4:::1;::::0;75495:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75459:76;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;75373:170:::0;;:::o;73329:126::-;7303:19;7311:10;7303:7;:19::i;:::-;7295:38;;;;-1:-1:-1;;;7295:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;73417:20:0;;;::::1;;::::0;;;:13:::1;:20;::::0;;;;:30;;-1:-1:-1;;73417:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;73329:126::o;72813:::-;7303:19;7311:10;7303:7;:19::i;:::-;7295:38;;;;-1:-1:-1;;;7295:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;72901:20:0;;;::::1;;::::0;;;:11:::1;:20;::::0;;;;:30;;-1:-1:-1;;72901:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;72813:126::o;72047:85::-;7303:19;7311:10;7303:7;:19::i;:::-;7295:38;;;;-1:-1:-1;;;7295:38:0;;;;;;;:::i;:::-;72112:4:::1;:12:::0;;-1:-1:-1;;;;;;72112:12:0::1;-1:-1:-1::0;;;;;72112:12:0;;;::::1;::::0;;;::::1;::::0;;72047:85::o;72535:136::-;7303:19;7311:10;7303:7;:19::i;:::-;7295:38;;;;-1:-1:-1;;;7295:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;72628:25:0;;;::::1;;::::0;;;:16:::1;:25;::::0;;;;:35;;-1:-1:-1;;72628:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;72535:136::o;73825:451::-;7303:19;7311:10;7303:7;:19::i;:::-;7295:38;;;;-1:-1:-1;;;7295:38:0;;;;;;;:::i;:::-;73987:8:::1;:20:::0;;;74018:15:::1;:34:::0;;;74077:31:::1;73998:9:::0;74036:16;74077:13:::1;:31::i;:::-;74063:11;:45:::0;74119:9:::1;:22:::0;;;74152:16:::1;:36:::0;;;74214:33:::1;74131:10:::0;74171:17;74214:14:::1;:33::i;:::-;74199:12;:48:::0;74258:3:::1;:10:::0;-1:-1:-1;;;;73825:451:0:o;7468:136::-;7303:19;7311:10;7303:7;:19::i;:::-;7295:38;;;;-1:-1:-1;;;7295:38:0;;;;;;;:::i;:::-;7544:5:::1;:11:::0;;-1:-1:-1;;;;;;7544:11:0::1;-1:-1:-1::0;;;;;7544:11:0;::::1;;::::0;;7571:25:::1;::::0;::::1;::::0;::::1;::::0;7544:11;;7571:25:::1;:::i;:::-;;;;;;;;7468:136:::0;:::o;71692:106::-;7303:19;7311:10;7303:7;:19::i;:::-;7295:38;;;;-1:-1:-1;;;7295:38:0;;;;;;;:::i;:::-;71766:10:::1;:24:::0;;;::::1;;-1:-1:-1::0;;;71766:24:0::1;-1:-1:-1::0;;;;71766:24:0;;::::1;::::0;;;::::1;::::0;;71692:106::o;16360:206::-;16446:7;16507:12;16499:6;;;;16491:29;;;;-1:-1:-1;;;16491:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;16542:5:0;;;16360:206::o;66761:1339::-;66876:17;;66855:4;;66876:17;;;;;66872:75;;;66902:45;66918:7;66927:10;66939:7;66902:15;:45::i;:::-;66895:52;;;;66872:75;66966:14;;;;;;;;:43;;-1:-1:-1;;;;;;66984:25:0;;;;;;:16;:25;;;;;;;;66966:43;66958:85;;;;-1:-1:-1;;;66958:85:0;;9260:2:1;66958:85:0;;;9242:21:1;9299:2;9279:18;;;9272:30;9338:31;9318:18;;;9311:59;9387:18;;66958:85:0;9058:353:1;66958:85:0;67087:6;;-1:-1:-1;;;;;67118:25:0;;;67054:22;67118:25;;;:13;:25;;;;;;67087:6;;;;;67054:22;67118:25;;;:57;;;67161:14;-1:-1:-1;;;;;67147:28:0;:10;-1:-1:-1;;;;;67147:28:0;;67118:57;67105:70;;67191:5;67190:6;:34;;;;-1:-1:-1;;;;;;67201:23:0;;;;;;:11;:23;;;;;;;;67200:24;67190:34;67186:127;;;67270:9;;-1:-1:-1;;;;;67235:21:0;;;;;;:9;:21;;;;;;:31;;67259:7;;67235:31;:::i;:::-;67234:45;67226:87;;;;-1:-1:-1;;;67226:87:0;;8220:2:1;67226:87:0;;;8202:21:1;8259:2;8239:18;;;8232:30;8298:31;8278:18;;;8271:59;8347:18;;67226:87:0;8018:353:1;67226:87:0;67328:5;:42;;;;;67348:22;;67337:7;:33;;67328:42;67324:220;;;67406:10;67392:25;;;;:13;:25;;;;;;;;67391:26;:48;;;;-1:-1:-1;67422:17:0;;;;;;;67421:18;67391:48;:71;;;;-1:-1:-1;67443:19:0;;-1:-1:-1;;;67443:19:0;;;;67391:71;:124;;;;-1:-1:-1;67494:21:0;;67484:4;67466:24;;;;:9;:24;;;;;;:49;;67391:124;67387:145;;;67517:15;:13;:15::i;:::-;67575:55;;;;;;;;;;;-1:-1:-1;;;67575:55:0;;;;;;;;-1:-1:-1;;;;;67575:18:0;;-1:-1:-1;67575:18:0;;;:9;:18;;;;;;;;:55;;67598:7;;67575:22;:55::i;:::-;-1:-1:-1;;;;;67554:18:0;;;;;;:9;:18;;;;;;;;:76;;;;67692:13;:22;;;;67668:7;;67692:22;;;:51;;;67729:14;-1:-1:-1;;;;;67718:25:0;:7;-1:-1:-1;;;;;67718:25:0;;67692:51;67691:115;;;-1:-1:-1;;;;;;67749:25:0;;;;;;:13;:25;;;;;;;;;:56;;;67791:14;-1:-1:-1;;;;;67777:28:0;:10;-1:-1:-1;;;;;67777:28:0;;67749:56;67690:177;;67862:5;67690:177;;;-1:-1:-1;;;;;67811:20:0;;;;;;:11;:20;;;;;;;;67810:21;:49;;;;-1:-1:-1;;;;;;67836:23:0;;;;;;:11;:23;;;;;;;;67835:24;67810:49;67686:243;;;67888:41;67900:7;67909:10;67921:7;67888:11;:41::i;:::-;67869:60;;67686:243;-1:-1:-1;;;;;67964:21:0;;;;;;:9;:21;;;;;;:43;;67990:16;67964:25;:43::i;:::-;-1:-1:-1;;;;;67940:21:0;;;;;;;:9;:21;;;;;;;:67;;;;68023:47;;;;;;-1:-1:-1;;;;;;;;;;;68023:47:0;;;68053:16;9562:25:1;;9550:2;9535:18;;9416:177;68023:47:0;;;;;;;;-1:-1:-1;68088:4:0;;66761:1339;-1:-1:-1;;;;;;66761:1339:0:o;15840:98::-;15898:7;15925:5;15929:1;15925;:5;:::i;68108:288::-;68242:55;;;;;;;;;;;-1:-1:-1;;;68242:55:0;;;;;;;;-1:-1:-1;;;;;68242:18:0;;68204:4;68242:18;;;:9;:18;;;;;;;:55;;68265:7;;68242:22;:55::i;:::-;-1:-1:-1;;;;;68221:18:0;;;;;;;:9;:18;;;;;;:76;;;;68332:21;;;;;;;:34;;68358:7;68332:25;:34::i;:::-;-1:-1:-1;;;;;68308:21:0;;;;;;:9;:21;;;;;:58;-1:-1:-1;68384:4:0;68108:288;;;;;:::o;69445:2239::-;63593:17;:24;;-1:-1:-1;;63593:24:0;;;;;69548:22:::1;::::0;69528:15:::1;::::0;63593:24;;69528:43:::1;::::0;:15;:19:::1;:43::i;:::-;69586:10;::::0;69505:66;;-1:-1:-1;;;;69586:10:0;::::1;;;69582:2095;;;69637:16;::::0;;69651:1:::1;69637:16:::0;;;;;::::1;::::0;;;69613:21:::1;::::0;69637:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;69637:16:0::1;69613:40;;69686:4;69668;69673:1;69668:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;69668:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;69716:4:::1;::::0;69706:7;;69716:4;::::1;::::0;69706;;69716;;69706:7;::::1;;;;;:::i;:::-;-1:-1:-1::0;;;;;69706:14:0;;::::1;:7;::::0;;::::1;::::0;;;;;:14;69745:4:::1;::::0;;69735:7;;69745:4;::::1;::::0;69735;;69745;69735:7;::::1;;;;;:::i;:::-;-1:-1:-1::0;;;;;69735:14:0;;::::1;:7;::::0;;::::1;::::0;;;;;:14;69821:6:::1;::::0;69785:21:::1;::::0;69821:6:::1;:57;69879:24;69897:4;69879:9;:24::i;:::-;69905:1;69908:4;69922;69929:15;69821:124;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;69960:17;69980:37;70006:10;69980:21;:25;;:37;;;;:::i;:::-;69960:57;;70032:14;70049:48;70084:12;70049:30;70063:15;;70049:9;:13;;:30;;;;:::i;:::-;:34:::0;::::1;:48::i;:::-;70032:65;;70112:21;70136:55;70178:12;70136:37;70150:22;;70136:9;:13;;:37;;;;:::i;:55::-;70224:1;70206:15;:19:::0;;;70240:22:::1;:26:::0;70112:79;-1:-1:-1;70285:10:0;;70281:263:::1;;70324:15;::::0;-1:-1:-1;;;;;70324:15:0::1;70316:58;70368:5;70351:13;:6:::0;70360:4:::1;70351:13;:::i;:::-;70350:23;;;;:::i;:::-;70316:58;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;70401:15:0::1;::::0;-1:-1:-1;;;;;70401:15:0::1;70393:58;70445:5;70428:13;:6:::0;70437:4:::1;70428:13;:::i;:::-;70427:23;;;;:::i;:::-;70393:58;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;70478:15:0::1;::::0;-1:-1:-1;;;;;70478:15:0::1;70470:58;70522:5;70505:13;:6:::0;70514:4:::1;70505:13;:::i;:::-;70504:23;;;;:::i;:::-;70470:58;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;70281:263;70562:17:::0;;70558:77:::1;;70589:21;::::0;70581:54:::1;::::0;-1:-1:-1;;;;;70589:21:0;;::::1;::::0;70581:54;::::1;;;::::0;70621:13;;70589:21:::1;70581:54:::0;70589:21;70581:54;70621:13;70589:21;70581:54;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;70558:77;69598:1049;;;;;69582:2095;;;70692:16;::::0;;70706:1:::1;70692:16:::0;;;;;::::1;::::0;;70668:21:::1;::::0;70692:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;70692:16:0::1;70668:40;;70741:4;70723;70728:1;70723:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;70723:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;70771:4:::1;::::0;70761:7;;70771:4;::::1;::::0;70761;;70771;;70761:7;::::1;;;;;:::i;:::-;-1:-1:-1::0;;;;;70761:14:0;;::::1;:7;::::0;;::::1;::::0;;;;;:14;70812:4:::1;::::0;:29:::1;::::0;-1:-1:-1;;;70812:29:0;;70790:19:::1;::::0;70812:4;;;::::1;::::0;:14:::1;::::0;:29:::1;::::0;70835:4:::1;::::0;70812:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70856:6;::::0;70790:51;;-1:-1:-1;;;;;;70856:6:0::1;:60;70917:24;70935:4;70917:9;:24::i;:::-;70943:1;70946:4;70960;70967:15;70856:127;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;71019:4:0::1;::::0;:29:::1;::::0;-1:-1:-1;;;71019:29:0;;70998:18:::1;::::0;-1:-1:-1;71019:46:0::1;::::0;-1:-1:-1;71053:11:0;;-1:-1:-1;;;;;71019:4:0::1;::::0;:14:::1;::::0;:29:::1;::::0;71042:4:::1;::::0;71019:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33:::0;::::1;:46::i;:::-;70998:67;;71080:15;71098:41;71128:10;;71098:25;71113:9;;71098:10;:14;;:25;;;;:::i;:41::-;71080:59;;71154:22;71179:48;71216:10;;71179:32;71194:16;;71179:10;:14;;:32;;;;:::i;:48::-;71260:1;71242:15;:19:::0;;;71276:22:::1;:26:::0;71154:73;-1:-1:-1;71321:11:0;;71317:258:::1;;71353:4;::::0;71367:15:::1;::::0;-1:-1:-1;;;;;71353:4:0;;::::1;::::0;:13:::1;::::0;71367:15:::1;71403:5;71385:14;:7:::0;71395:4:::1;71385:14;:::i;:::-;71384:24;;;;:::i;:::-;71353:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;71428:4:0::1;::::0;71442:15:::1;::::0;-1:-1:-1;;;;;71428:4:0;;::::1;::::0;:13:::1;::::0;71442:15:::1;71478:5;71460:14;:7:::0;71470:4:::1;71460:14;:::i;:::-;71459:24;;;;:::i;:::-;71428:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;71503:4:0::1;::::0;71517:15:::1;::::0;-1:-1:-1;;;;;71503:4:0;;::::1;::::0;:13:::1;::::0;71517:15:::1;71553:5;71535:14;:7:::0;71545:4:::1;71535:14;:::i;:::-;71534:24;;;;:::i;:::-;71503:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;71317:258;71593:18:::0;;71589:76:::1;;71613:4;::::0;71627:21:::1;::::0;71613:52:::1;::::0;-1:-1:-1;;;71613:52:0;;-1:-1:-1;;;;;71613:4:0;;::::1;::::0;:13:::1;::::0;:52:::1;::::0;71627:21;::::1;::::0;71650:14;;71613:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;71589:76;70653:1024;;;;;69582:2095;-1:-1:-1::0;63640:17:0;:25;;-1:-1:-1;;63640:25:0;;;69445:2239::o;68404:1033::-;-1:-1:-1;;;;;68529:25:0;;68496:7;68529:25;;;:13;:25;;;;;;68496:7;;68529:25;;;:58;;-1:-1:-1;68580:6:0;;-1:-1:-1;;;;;68558:29:0;;;68580:6;;68558:29;68529:58;68516:71;;68598:20;68621:5;:34;;68644:11;;68621:34;;;68629:12;;68621:34;68598:57;;68666:19;68688:34;68718:3;;68688:25;68700:12;68688:7;:11;;:25;;;;:::i;:34::-;68666:56;-1:-1:-1;68737:16:0;;68733:515;;68774:5;68770:467;;;68804:9;;:13;68800:76;;68864:12;68852:9;;68838:11;:23;;;;:::i;:::-;:38;;;;:::i;:::-;68819:15;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;68800:76:0;68899:16;;:20;68895:97;;68980:12;68961:16;;68947:11;:30;;;;:::i;:::-;:45;;;;:::i;:::-;68921:22;;:71;;;;;;;:::i;:::-;;;;-1:-1:-1;;68895:97:0;68770:467;;;69037:8;;:12;69033:74;;69095:12;69084:8;;69070:11;:22;;;;:::i;:::-;:37;;;;:::i;:::-;69051:15;;:56;;;;;;;:::i;:::-;;;;-1:-1:-1;;69033:74:0;69130:15;;:19;69126:95;;69209:12;69191:15;;69177:11;:29;;;;:::i;:::-;:44;;;;:::i;:::-;69151:22;;:70;;;;;;;:::i;:::-;;;;-1:-1:-1;;69126:95:0;69303:4;69285:24;;;;:9;:24;;;;;;:41;;69314:11;69285:28;:41::i;:::-;69276:4;69258:24;;;;:9;:24;;;;;;;:68;;;;69342:45;;-1:-1:-1;;;;;69342:45:0;;;-1:-1:-1;;;;;;;;;;;69342:45:0;;;69375:11;9562:25:1;;9550:2;9535:18;;9416:177;69342:45:0;;;;;;;;69405:24;:7;69417:11;69405;:24::i;:::-;69398:31;68404:1033;-1:-1:-1;;;;;;;68404:1033:0:o;15944:98::-;16002:7;16029:5;16033:1;16029;:5;:::i;16048:98::-;16106:7;16133:5;16137:1;16133;:5;:::i;16152:98::-;16210:7;16237:5;16241:1;16237;:5;:::i;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;782:388::-;850:6;858;911:2;899:9;890:7;886:23;882:32;879:52;;;927:1;924;917:12;879:52;966:9;953:23;985:31;1010:5;985:31;:::i;:::-;1035:5;-1:-1:-1;1092:2:1;1077:18;;1064:32;1105:33;1064:32;1105:33;:::i;:::-;1157:7;1147:17;;;782:388;;;;;:::o;1175:529::-;1252:6;1260;1268;1321:2;1309:9;1300:7;1296:23;1292:32;1289:52;;;1337:1;1334;1327:12;1289:52;1376:9;1363:23;1395:31;1420:5;1395:31;:::i;:::-;1445:5;-1:-1:-1;1502:2:1;1487:18;;1474:32;1515:33;1474:32;1515:33;:::i;:::-;1567:7;-1:-1:-1;1626:2:1;1611:18;;1598:32;1639:33;1598:32;1639:33;:::i;:::-;1691:7;1681:17;;;1175:529;;;;;:::o;1709:671::-;1795:6;1803;1811;1819;1872:3;1860:9;1851:7;1847:23;1843:33;1840:53;;;1889:1;1886;1879:12;1840:53;1928:9;1915:23;1947:31;1972:5;1947:31;:::i;:::-;1997:5;-1:-1:-1;2054:2:1;2039:18;;2026:32;2067:33;2026:32;2067:33;:::i;:::-;2119:7;-1:-1:-1;2178:2:1;2163:18;;2150:32;2191:33;2150:32;2191:33;:::i;:::-;2243:7;-1:-1:-1;2302:2:1;2287:18;;2274:32;2315:33;2274:32;2315:33;:::i;:::-;1709:671;;;;-1:-1:-1;1709:671:1;;-1:-1:-1;;1709:671:1:o;2385:456::-;2462:6;2470;2478;2531:2;2519:9;2510:7;2506:23;2502:32;2499:52;;;2547:1;2544;2537:12;2499:52;2586:9;2573:23;2605:31;2630:5;2605:31;:::i;:::-;2655:5;-1:-1:-1;2712:2:1;2697:18;;2684:32;2725:33;2684:32;2725:33;:::i;:::-;2385:456;;2777:7;;-1:-1:-1;;;2831:2:1;2816:18;;;;2803:32;;2385:456::o;2846:382::-;2911:6;2919;2972:2;2960:9;2951:7;2947:23;2943:32;2940:52;;;2988:1;2985;2978:12;2940:52;3027:9;3014:23;3046:31;3071:5;3046:31;:::i;:::-;3096:5;-1:-1:-1;3153:2:1;3138:18;;3125:32;3166:30;3125:32;3166:30;:::i;3233:315::-;3301:6;3309;3362:2;3350:9;3341:7;3337:23;3333:32;3330:52;;;3378:1;3375;3368:12;3330:52;3417:9;3404:23;3436:31;3461:5;3436:31;:::i;:::-;3486:5;3538:2;3523:18;;;;3510:32;;-1:-1:-1;;;3233:315:1:o;3553:241::-;3609:6;3662:2;3650:9;3641:7;3637:23;3633:32;3630:52;;;3678:1;3675;3668:12;3630:52;3717:9;3704:23;3736:28;3758:5;3736:28;:::i;3799:245::-;3866:6;3919:2;3907:9;3898:7;3894:23;3890:32;3887:52;;;3935:1;3932;3925:12;3887:52;3967:9;3961:16;3986:28;4008:5;3986:28;:::i;4049:309::-;4114:6;4122;4175:2;4163:9;4154:7;4150:23;4146:32;4143:52;;;4191:1;4188;4181:12;4143:52;4230:9;4217:23;4249:28;4271:5;4249:28;:::i;4363:180::-;4422:6;4475:2;4463:9;4454:7;4450:23;4446:32;4443:52;;;4491:1;4488;4481:12;4443:52;-1:-1:-1;4514:23:1;;4363:180;-1:-1:-1;4363:180:1:o;4548:184::-;4618:6;4671:2;4659:9;4650:7;4646:23;4642:32;4639:52;;;4687:1;4684;4677:12;4639:52;-1:-1:-1;4710:16:1;;4548:184;-1:-1:-1;4548:184:1:o;4737:316::-;4814:6;4822;4830;4883:2;4871:9;4862:7;4858:23;4854:32;4851:52;;;4899:1;4896;4889:12;4851:52;-1:-1:-1;;4922:23:1;;;4992:2;4977:18;;4964:32;;-1:-1:-1;5043:2:1;5028:18;;;5015:32;;4737:316;-1:-1:-1;4737:316:1:o;5058:454::-;5153:6;5161;5169;5177;5185;5238:3;5226:9;5217:7;5213:23;5209:33;5206:53;;;5255:1;5252;5245:12;5206:53;-1:-1:-1;;5278:23:1;;;5348:2;5333:18;;5320:32;;-1:-1:-1;5399:2:1;5384:18;;5371:32;;5450:2;5435:18;;5422:32;;-1:-1:-1;5501:3:1;5486:19;5473:33;;-1:-1:-1;5058:454:1;-1:-1:-1;5058:454:1:o;5517:203::-;-1:-1:-1;;;;;5681:32:1;;;;5663:51;;5651:2;5636:18;;5517:203::o;5941:304::-;-1:-1:-1;;;;;6171:15:1;;;6153:34;;6223:15;;6218:2;6203:18;;6196:43;6103:2;6088:18;;5941:304::o;6250:274::-;-1:-1:-1;;;;;6442:32:1;;;;6424:51;;6506:2;6491:18;;6484:34;6412:2;6397:18;;6250:274::o;7416:597::-;7528:4;7557:2;7586;7575:9;7568:21;7618:6;7612:13;7661:6;7656:2;7645:9;7641:18;7634:34;7686:1;7696:140;7710:6;7707:1;7704:13;7696:140;;;7805:14;;;7801:23;;7795:30;7771:17;;;7790:2;7767:26;7760:66;7725:10;;7696:140;;;7854:6;7851:1;7848:13;7845:91;;;7924:1;7919:2;7910:6;7899:9;7895:22;7891:31;7884:42;7845:91;-1:-1:-1;7997:2:1;7976:15;-1:-1:-1;;7972:29:1;7957:45;;;;8004:2;7953:54;;7416:597;-1:-1:-1;;;7416:597:1:o;8724:329::-;8926:2;8908:21;;;8965:1;8945:18;;;8938:29;-1:-1:-1;;;8998:2:1;8983:18;;8976:36;9044:2;9029:18;;8724:329::o;9598:980::-;9860:4;9908:3;9897:9;9893:19;9939:6;9928:9;9921:25;9965:2;10003:6;9998:2;9987:9;9983:18;9976:34;10046:3;10041:2;10030:9;10026:18;10019:31;10070:6;10105;10099:13;10136:6;10128;10121:22;10174:3;10163:9;10159:19;10152:26;;10213:2;10205:6;10201:15;10187:29;;10234:1;10244:195;10258:6;10255:1;10252:13;10244:195;;;10323:13;;-1:-1:-1;;;;;10319:39:1;10307:52;;10414:15;;;;10379:12;;;;10355:1;10273:9;10244:195;;;-1:-1:-1;;;;;;;10495:32:1;;;;10490:2;10475:18;;10468:60;-1:-1:-1;;;10559:3:1;10544:19;10537:35;10456:3;9598:980;-1:-1:-1;;;9598:980:1:o;10772:128::-;10812:3;10843:1;10839:6;10836:1;10833:13;10830:39;;;10849:18;;:::i;:::-;-1:-1:-1;10885:9:1;;10772:128::o;10905:217::-;10945:1;10971;10961:132;;11015:10;11010:3;11006:20;11003:1;10996:31;11050:4;11047:1;11040:15;11078:4;11075:1;11068:15;10961:132;-1:-1:-1;11107:9:1;;10905:217::o;11127:168::-;11167:7;11233:1;11229;11225:6;11221:14;11218:1;11215:21;11210:1;11203:9;11196:17;11192:45;11189:71;;;11240:18;;:::i;:::-;-1:-1:-1;11280:9:1;;11127:168::o;11300:125::-;11340:4;11368:1;11365;11362:8;11359:34;;;11373:18;;:::i;:::-;-1:-1:-1;11410:9:1;;11300:125::o;11430:127::-;11491:10;11486:3;11482:20;11479:1;11472:31;11522:4;11519:1;11512:15;11546:4;11543:1;11536:15;11562:127;11623:10;11618:3;11614:20;11611:1;11604:31;11654:4;11651:1;11644:15;11678:4;11675:1;11668:15;11826:131;-1:-1:-1;;;;;11901:31:1;;11891:42;;11881:70;;11947:1;11944;11937:12;11962:118;12048:5;12041:13;12034:21;12027:5;12024:32;12014:60;;12070:1;12067;12060:12

Swarm Source

ipfs://18c9bac039f90ae20a1c6368660439fb9066ec07a14e63d067c9586bb4d6199a
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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