ETH Price: $3,501.81 (+3.88%)
Gas: 4 Gwei

Token

HangryBirds (HANGRY)
 

Overview

Max Total Supply

1,000,000,000,000 HANGRY

Holders

469

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
928,663,012.64428069 HANGRY

Value
$0.00
0xa3bfb884b78b9210008c1f6652b9cb0183c9b681
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:
HangryBirds

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 6 of 15: HangryBirds.sol
pragma solidity 0.8.10;

// SPDX-License-Identifier: MIT

import "./IERC20.sol";
import "./Ownable.sol";
import "./Address.sol";
import "./Context.sol";
import "./IDEXRouter.sol";
import "./IDEXFactory.sol";
import "./BuybackTreasury.sol";
import "./IUnicryptLiquidityLocker.sol";
import "./IAntiSnipe.sol";

contract HangryBirds is Context, IERC20, Ownable {
	using Address for address payable;

	string constant NAME = "HangryBirds";
	string constant SYMBOL = "HANGRY";
	uint8 constant DECIMALS = 9;

	uint256 constant MAX_UINT = 2 ** 256 - 1;
	address constant ROUTER_ADDRESS = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
	address constant UNICRYPT_LIQUIDITY_LOCKER_ADDRESS = 0x663A5C229c09b049E36dCc11a9B0d4a8Eb9db214;
	address constant ZERO_ADDRESS = address(0);
	address constant DEAD_ADDRESS = address(57005);

	mapping(address => uint256) rOwned;
	mapping(address => uint256) tOwned;

	mapping(address => mapping(address => uint256)) allowances;

	mapping(address => bool) public isExcludedFromFees;
	mapping(address => bool) public isExcludedFromRewards;
	mapping(address => bool) public isExcludedFromMaxWallet;
	address[] excluded;

	uint256 tTotal = 10 ** 12 * 10 ** DECIMALS;
	uint256 rTotal = (MAX_UINT - (MAX_UINT % tTotal));

	uint256 public maxWalletAmount = tTotal / 100;
	uint256 public maxTxAmountBuy = maxWalletAmount / 2;
	uint256 public maxTxAmountSell = maxWalletAmount / 2;

	address payable marketingWalletAddress;

	mapping(address => bool) automatedMarketMakerPairs;

	bool areFeesBeingProcessed = false;
	bool public isFeeProcessingEnabled = true;
	uint256 public feeProcessingThreshold = tTotal / 500;

	IDEXRouter router;
	BuybackTreasury public treasury;
	IAntiSnipe antiSnipe;

	mapping(address => bool) snipers;

	bool hasLaunched;
	uint256 launchedAt;

	FeeSet public buyFees = FeeSet({
		reflectFee: 5,
		marketingFee: 5,
		treasuryFee: 2
	});

	FeeSet public sellFees = FeeSet({
		reflectFee: 8,
		marketingFee: 2,
		treasuryFee: 5
	});

	struct FeeSet {
		uint256 reflectFee;
		uint256 marketingFee;
		uint256 treasuryFee;
	}

	struct ReflectValueSet {
		uint256 rAmount;
		uint256 rTransferAmount;
		uint256 rReflectFee;
		uint256 rOtherFee;
		uint256 tTransferAmount;
		uint256 tReflectFee;
		uint256 tOtherFee;
	}

	event FeesProcessed(uint256 amount);
	event Launched();
	event SniperAdded(address sniper);
	event SniperPunished(address sniper);
	event SniperRemoved(address sniper);

	constructor() {
		address self = address(this);

		rOwned[owner()] = rTotal;

		router = IDEXRouter(ROUTER_ADDRESS);
		treasury = new BuybackTreasury(address(router), self, owner());

		marketingWalletAddress = payable(msg.sender);

		isExcludedFromFees[owner()] = true;
		isExcludedFromFees[marketingWalletAddress] = true;
		isExcludedFromFees[address(treasury)] = true;
		isExcludedFromFees[self] = true;
		isExcludedFromFees[DEAD_ADDRESS] = true;

		isExcludedFromMaxWallet[owner()] = true;
		isExcludedFromMaxWallet[marketingWalletAddress] = true;
		isExcludedFromMaxWallet[address(treasury)] = true;
		isExcludedFromMaxWallet[self] = true;
		isExcludedFromMaxWallet[DEAD_ADDRESS] = true;

		emit Transfer(ZERO_ADDRESS, owner(), tTotal);
	}

	function name() public pure returns (string memory) {
		return NAME;
	}

	function symbol() public pure returns (string memory) {
		return SYMBOL;
	}

	function decimals() public pure returns (uint8) {
		return DECIMALS;
	}

	function totalSupply() public view override returns (uint256) {
		return tTotal;
	}

	function balanceOf(address account) public view override returns (uint256) {
		if (isExcludedFromRewards[account]) return tOwned[account];
		return tokenFromReflection(rOwned[account]);
	}

	function transfer(address recipient, uint256 amount) public override returns (bool) {
		_transfer(_msgSender(), recipient, amount);
		return true;
	}

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

	function approve(address spender, uint256 amount) public override returns (bool) {
		_approve(_msgSender(), spender, amount);
		return true;
	}

	function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
		_transfer(sender, recipient, amount);

		uint256 currentAllowance = allowances[sender][_msgSender()];
		require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");

		unchecked {
			_approve(sender, _msgSender(), currentAllowance - amount);
		}

		return true;
	}

	function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
		_approve(_msgSender(), spender, allowances[_msgSender()][spender] + addedValue);
		return true;
	}

	function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
		uint256 currentAllowance = allowances[_msgSender()][spender];
		require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");

		unchecked {
			_approve(_msgSender(), spender, currentAllowance - subtractedValue);
		}

		return true;
	}

	function tokenFromReflection(uint256 rAmount) public view returns (uint256) {
		require(rAmount <= rTotal, "Amount must be less than total reflections");
		uint256 currentRate = _getRate();
		return rAmount / currentRate;
	}

	function _getValues(uint256 tAmount, bool isBuying, bool takeFee) private view returns (ReflectValueSet memory set) {
		set = _getTValues(tAmount, isBuying, takeFee);
		(set.rAmount, set.rTransferAmount, set.rReflectFee, set.rOtherFee) = _getRValues(set, tAmount, takeFee, _getRate());
		return set;
	}

	function _getTValues(uint256 tAmount, bool isBuying, bool takeFee) private view returns (ReflectValueSet memory set) {
		if (!takeFee) {
			set.tTransferAmount = tAmount;
			return set;
		}

		FeeSet memory fees = isBuying ? buyFees : sellFees;

		set.tReflectFee = tAmount * fees.reflectFee / 100;
		set.tOtherFee = tAmount * (fees.marketingFee + fees.treasuryFee) / 100;
		set.tTransferAmount = tAmount - set.tReflectFee - set.tOtherFee;

		return set;
	}

	function _getRValues(ReflectValueSet memory set, uint256 tAmount, bool takeFee, uint256 currentRate) private pure returns (uint256 rAmount, uint256 rTransferAmount, uint256 rReflectFee, uint256 rOtherFee) {
		rAmount = tAmount * currentRate;

		if (!takeFee) {
			return (rAmount, rAmount, 0, 0);
		}

		rReflectFee = set.tReflectFee * currentRate;
		rOtherFee = set.tOtherFee * currentRate;
		rTransferAmount = rAmount - rReflectFee - rOtherFee;
		return (rAmount, rTransferAmount, rReflectFee, rOtherFee);
	}

	function _getRate() private view returns (uint256) {
		(uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
		return rSupply / tSupply;
	}

	function _getCurrentSupply() private view returns (uint256, uint256) {
		uint256 rSupply = rTotal;
		uint256 tSupply = tTotal;

		for (uint256 i = 0; i < excluded.length; i++) {
			if (rOwned[excluded[i]] > rSupply || tOwned[excluded[i]] > tSupply) return (rTotal, tTotal);
			rSupply -= rOwned[excluded[i]];
			tSupply -= tOwned[excluded[i]];
		}

		if (rSupply < rTotal / tTotal) return (rTotal, tTotal);
		return (rSupply, tSupply);
	}

	function _approve(address owner, address spender, uint256 amount) private {
		require(owner != ZERO_ADDRESS, "ERC20: approve from the zero address");
		require(spender != ZERO_ADDRESS, "ERC20: approve to the zero address");

		allowances[owner][spender] = amount;

		emit Approval(owner, spender, amount);
	}

	function _transfer(address from, address to, uint256 amount) private {
		require(from != ZERO_ADDRESS, "ERC20: transfer from the zero address");
		require(to != ZERO_ADDRESS, "ERC20: transfer to the zero address");
		require(amount > 0, "Transfer amount must be greater than zero");
		require(amount <= balanceOf(from), "You are trying to transfer more than your balance");
		require(!snipers[from], "Sniper no sniping!");

		bool isBuying = automatedMarketMakerPairs[from];
		bool shouldTakeFees = hasLaunched && !isExcludedFromFees[from] && !isExcludedFromFees[to];

		if (hasLaunched) {
			// validate max wallet
			if (!automatedMarketMakerPairs[to] && !isExcludedFromMaxWallet[to]) {
				require((balanceOf(to) + amount) <= maxWalletAmount, "Cannot transfer more than the max wallet amount");
			}

			// validate max buy/sell
			if (shouldTakeFees) {
				require(amount <= (isBuying ? maxTxAmountBuy : maxTxAmountSell), "Cannot transfer more than the max buy or sell");
			}

			// anti-snipe mechanism
			if (block.number <= (launchedAt + 1)) {
				antiSnipe.process(from, to);
			}

			// process fees
			uint256 balance = balanceOf(address(this));
			if (isFeeProcessingEnabled && !areFeesBeingProcessed && balance >= feeProcessingThreshold && !automatedMarketMakerPairs[from]) {
				areFeesBeingProcessed = true;
				_processFees(balance > maxTxAmountSell ? maxTxAmountSell : balance);
				areFeesBeingProcessed = false;
			}
		}

		_tokenTransfer(from, to, amount, isBuying, shouldTakeFees);
	}

	function _takeReflectFees(uint256 rReflectFee) private {
		rTotal -= rReflectFee;
	}

	function _takeOtherFees(uint256 rOtherFee, uint256 tOtherFee) private {
		address self = address(this);

		rOwned[self] += rOtherFee;

		if (isExcludedFromRewards[self]) {
			tOwned[self] += tOtherFee;
		}
	}

	function _tokenTransfer(address sender, address recipient, uint256 tAmount, bool isBuying, bool shouldTakeFees) private {
		ReflectValueSet memory set = _getValues(tAmount, isBuying, shouldTakeFees);

		if (isExcludedFromRewards[sender]) {
			tOwned[sender] -= tAmount;
		}

		if (isExcludedFromRewards[recipient]) {
			tOwned[recipient] += set.tTransferAmount;
		}

		rOwned[sender] -= set.rAmount;
		rOwned[recipient] += set.rTransferAmount;

		if (shouldTakeFees) {
			_takeReflectFees(set.rReflectFee);
			_takeOtherFees(set.rOtherFee, set.tOtherFee);

			emit Transfer(sender, address(this), set.tOtherFee);
		}

		emit Transfer(sender, recipient, set.tTransferAmount);
	}

	function _processFees(uint256 amount) private {
		uint256 feeSum = buyFees.marketingFee + buyFees.treasuryFee;
		if (feeSum == 0) return;

		// swap fee tokens to ETH
		_swapExactTokensForETH(amount);

		// calculate correct amounts to send out
		uint256 amountEth = address(this).balance;
		uint256 amountForMarketing = amountEth * buyFees.marketingFee / feeSum;
		uint256 amountForTreasury = amountEth - amountForMarketing;

		// send out fees
		if (amountForMarketing > 0) {
			marketingWalletAddress.transfer(amountForMarketing);
		}

		if (amountForTreasury > 0) {
			treasury.deposit{value : amountForTreasury}();
		}

		emit FeesProcessed(amount);
	}

	function _swapExactTokensForETH(uint256 amountIn) private {
		address self = address(this);

		address[] memory path = new address[](2);
		path[0] = self;
		path[1] = router.WETH();

		_approve(self, address(router), amountIn);
		router.swapExactTokensForETHSupportingFeeOnTransferTokens(amountIn, 0, path, self, block.timestamp);
	}

	function _excludeFromRewards(address account) private {
		require(!isExcludedFromRewards[account], "Account is already excluded from rewards");

		if (rOwned[account] > 0) {
			tOwned[account] = tokenFromReflection(rOwned[account]);
		}

		isExcludedFromRewards[account] = true;
		excluded.push(account);
	}

	function _includeInRewards(address account) private {
		require(isExcludedFromRewards[account], "Account is not excluded from rewards");

		for (uint256 i = 0; i < excluded.length; i++) {
			if (excluded[i] == account) {
				excluded[i] = excluded[excluded.length - 1];
				tOwned[account] = 0;
				isExcludedFromRewards[account] = false;
				excluded.pop();
				break;
			}
		}
	}

	function launch(uint256 daysToLock) external payable onlyOwner {
		address self = address(this);

		require(!hasLaunched, "Already launched");
		require(daysToLock >= 30, "Must lock liquidity for a minimum of 30 days");

		uint256 tokensForLiquidity = balanceOf(self);
		require(tokensForLiquidity >= (tTotal / 4), "Initial liquidity must be at least 25% of total token supply");

		IUnicryptLiquidityLocker locker = IUnicryptLiquidityLocker(UNICRYPT_LIQUIDITY_LOCKER_ADDRESS);

		// calculate and validate ETH amounts for liquidity and locker
		(uint256 lockFee,,,,,,,,) = locker.gFees();
		require(msg.value > lockFee, "Insufficient ETH for liquidity lock fee");

		uint256 ethForLiquidity = msg.value - lockFee;
		require(ethForLiquidity >= 0.1 ether, "Insufficient ETH for liquidity");

		// create pair
		address pairAddress = IDEXFactory(router.factory()).createPair(self, router.WETH());
		automatedMarketMakerPairs[pairAddress] = true;
		isExcludedFromMaxWallet[pairAddress] = true;

		if (!isExcludedFromRewards[pairAddress]) {
			_excludeFromRewards(pairAddress);
		}

		// add liquidity
		_approve(self, address(router), tokensForLiquidity);
		router.addLiquidityETH{value : ethForLiquidity}(self, tokensForLiquidity, 0, 0, self, block.timestamp);

		// lock liquidity
		IERC20 lpToken = IERC20(pairAddress);

		uint256 balance = lpToken.balanceOf(self);
		require(lpToken.approve(address(locker), balance), "Liquidity token approval failed");

		locker.lockLPToken{value : lockFee}(address(lpToken), balance, block.timestamp + (daysToLock * (1 days)), payable(0), true, payable(owner()));

		// set up anti-snipe
		antiSnipe.launch(pairAddress);

		// set appropriate launch flags
		hasLaunched = true;
		launchedAt = block.number;

		emit Launched();
	}

	function recoverLaunchedTokens() external onlyOwner {
		require(!hasLaunched, "Already launched");

		// this is used as an emergency mechanism in the case of an incorrect amount of liquidity tokens being accidentally sent.
		// it is only possible to call this method before launch, and its indended use is to recover tokens which would otherwise
		// result in a failed launch 
		_transfer(address(this), owner(), balanceOf(address(this)));
	}

	function buyback(uint256 amount) external onlyOwner {
		treasury.buyback(amount);
	}

	function addSniper(address account) external {
		require(msg.sender == address(antiSnipe), "Snipers can only be added by the anti-snipe contract");

		// ensure that snipers can only be added on the launch block plus the block after
		if (block.timestamp <= (launchedAt + 1)) {
			snipers[account] = true;
			emit SniperAdded(account);
		}
	}

	function punishSniper(address account) external onlyOwner {
		require(snipers[account], "This account is not a sniper");

		uint256 balance = balanceOf(account);
		require(balance > 0, "Insufficient token balance");

		_transfer(account, address(this), balance);

		emit SniperPunished(account);
	}

	function removeSniper(address account) external onlyOwner {
		require(snipers[account], "This account is not a sniper");
		snipers[account] = false;
		emit SniperRemoved(account);
	}

	function setAntiSnipe(address value) external onlyOwner {
		require(value != ZERO_ADDRESS, "Antisnipe cannot be the zero address");
		require(value != address(antiSnipe), "Antisnipe is already set to this value");
		antiSnipe = IAntiSnipe(value);
	}

	function setFees(bool areBuyFees, uint256 reflectFee, uint256 marketingFee, uint256 treasuryFee) external onlyOwner {
		require((reflectFee + marketingFee + treasuryFee) <= 25, "Cannot set fees to above a combined total of 25%");

		FeeSet memory fees = FeeSet({
			reflectFee: reflectFee,
			marketingFee: marketingFee,
			treasuryFee: treasuryFee
		});

		if (areBuyFees) {
			buyFees = fees;
		} else {
			sellFees = fees;
		}
	}

	function setIsFeeProcessingEnabled(bool value) external onlyOwner {
		isFeeProcessingEnabled = value;
	}

	function setFeeProcessingThreshold(uint256 value) external onlyOwner {
		feeProcessingThreshold = value;
	}

	function setMaxTransactionAmounts(uint256 maxBuy, uint256 maxSell) external onlyOwner {
		require(maxBuy >= (tTotal / 400), "Must set max buy to at least 0.25% of total supply");
		require(maxSell >= (tTotal / 400), "Must set max sell to at least 0.25% of total supply");

		maxTxAmountBuy = maxBuy;
		maxTxAmountSell = maxSell;
	}

	function setMarketingWalletAddress(address payable value) external onlyOwner {
		require(marketingWalletAddress != value, "Marketing wallet address is already set to this value");
		marketingWalletAddress = value;
	}

	function setMaxWalletAmount(uint256 value) external onlyOwner {
		require(value >= (tTotal / 200), "Must set max wallet to at least 0.5% of total supply");
		maxWalletAmount = value;
	}

	function setIsExcludedFromFees(address account, bool value) external onlyOwner {
		require(isExcludedFromFees[account] != value, "Account is already set to this value");
		isExcludedFromFees[account] = value;
	}

	function setIsExcludedFromMaxWallet(address account, bool value) external onlyOwner {
		require(isExcludedFromMaxWallet[account] != value, "Account is already set to this value");
		isExcludedFromMaxWallet[account] = value;
	}

	function excludeFromRewards(address account) external onlyOwner {
		_excludeFromRewards(account);
	}

	function includeInRewards(address account) external onlyOwner {
		_includeInRewards(account);
	}

	receive() external payable {}
}

File 1 of 15: AccessControl.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (access/AccessControl.sol)

pragma solidity ^0.8.0;

import "./IAccessControl.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

File 2 of 15: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 3 of 15: BuybackTreasury.sol
pragma solidity 0.8.10;

// SPDX-License-Identifier: MIT

import "./AccessControl.sol";
import "./IERC20.sol";
import "./IDEXRouter.sol";

contract BuybackTreasury is AccessControl {
	uint256 constant MAX_UINT = 2 ^ 256 - 1;
	address constant DEAD_ADDRESS = address(57005);
	IERC20 constant USDT = IERC20(0xdAC17F958D2ee523a2206206994597C13D831ec7);

	IDEXRouter router;
	IERC20 token;

	uint256 public totalEthDeposited;
	uint256 public totalEthBoughtBack;
	uint256 public totalValueBoughtBack;

	event Deposit(uint256 amount);
	event Buyback(uint256 amount, uint256 value);

	constructor(address routerAddress, address tokenAddress, address ownerAddress) {
		router = IDEXRouter(routerAddress);
		token = IERC20(tokenAddress);

		_grantRole(DEFAULT_ADMIN_ROLE, address(token));
		_grantRole(DEFAULT_ADMIN_ROLE, ownerAddress);
	}

	function _getValueOfEthAmount(uint256 amount) private view returns (uint256) {
		address[] memory path = new address[](2);
		path[0] = router.WETH();
		path[1] = address(USDT);

		return router.getAmountsOut(amount, path)[1];
	}

	function _approveRouter(uint256 amount) private {
		require(token.approve(address(router), amount), "Router approval failed");
	}

	function _buy(uint256 amountIn) private returns (uint256) {
		address[] memory path = new address[](2);
		path[0] = router.WETH();
		path[1] = address(token);

		uint256 previousBalance = token.balanceOf(address(this));

		_approveRouter(amountIn);
		router.swapExactETHForTokensSupportingFeeOnTransferTokens{value : amountIn}(0, path, address(this), block.timestamp);

		return token.balanceOf(address(this)) - previousBalance;
	}

	function _addLiquidity(uint256 amountIn) private {
		uint256 ethForLiquidity = amountIn / 2;
		uint256 tokensForLiquidity = _buy(amountIn - ethForLiquidity);

		_approveRouter(tokensForLiquidity);
		router.addLiquidityETH{value : ethForLiquidity}(address(token), tokensForLiquidity, 0, 0, DEAD_ADDRESS, block.timestamp);
	}

	function buyback(uint256 amountIn) external onlyRole(DEFAULT_ADMIN_ROLE) {
		require(amountIn > 0, "Insufficient value sent");
		require(address(this).balance >= amountIn, "Insufficient balance");

		uint256 value = _getValueOfEthAmount(amountIn);

		_addLiquidity(amountIn);

		totalEthBoughtBack += amountIn;
		totalValueBoughtBack += value;

		emit Buyback(amountIn, value);
	}

	function deposit() external payable onlyRole(DEFAULT_ADMIN_ROLE) {
		totalEthDeposited += msg.value;
		emit Deposit(msg.value);
	}

	function setToken(address value) external onlyRole(DEFAULT_ADMIN_ROLE) {
		token = IERC20(value);
		_grantRole(DEFAULT_ADMIN_ROLE, address(token));
	}

	receive() external payable {}
}

File 4 of 15: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

File 5 of 15: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 7 of 15: IAccessControl.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

File 8 of 15: IAntiSnipe.sol
pragma solidity 0.8.10;

// SPDX-License-Identifier: MIT

interface IAntiSnipe {
	function process(address from, address to) external;

	function launch(address pairAddress) external;
}

File 9 of 15: IDEXFactory.sol
pragma solidity 0.8.10;

// SPDX-License-Identifier: MIT

interface IDEXFactory {
	event PairCreated(address indexed token0, address indexed token1, address pair, uint);

	function feeTo() external view returns (address);

	function feeToSetter() external view returns (address);

	function getPair(address tokenA, address tokenB) external view returns (address pair);

	function allPairs(uint) external view returns (address pair);

	function allPairsLength() external view returns (uint);

	function createPair(address tokenA, address tokenB) external returns (address pair);

	function setFeeTo(address) external;

	function setFeeToSetter(address) external;
}

File 10 of 15: IDEXRouter.sol
pragma solidity 0.8.10;

// SPDX-License-Identifier: MIT

interface IDEXRouter {
	function factory() external pure returns (address);

	function WETH() external pure returns (address);

	function addLiquidity(
		address tokenA,
		address tokenB,
		uint amountADesired,
		uint amountBDesired,
		uint amountAMin,
		uint amountBMin,
		address to,
		uint deadline
	) external returns (uint amountA, uint amountB, uint liquidity);

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

	function removeLiquidity(
		address tokenA,
		address tokenB,
		uint liquidity,
		uint amountAMin,
		uint amountBMin,
		address to,
		uint deadline
	) external returns (uint amountA, uint amountB);

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

	function removeLiquidityWithPermit(
		address tokenA,
		address tokenB,
		uint liquidity,
		uint amountAMin,
		uint amountBMin,
		address to,
		uint deadline,
		bool approveMax, uint8 v, bytes32 r, bytes32 s
	) external returns (uint amountA, uint amountB);

	function removeLiquidityETHWithPermit(
		address token,
		uint liquidity,
		uint amountTokenMin,
		uint amountETHMin,
		address to,
		uint deadline,
		bool approveMax, uint8 v, bytes32 r, bytes32 s
	) external returns (uint amountToken, uint amountETH);

	function swapExactTokensForTokens(
		uint amountIn,
		uint amountOutMin,
		address[] calldata path,
		address to,
		uint deadline
	) external returns (uint[] memory amounts);

	function swapTokensForExactTokens(
		uint amountOut,
		uint amountInMax,
		address[] calldata path,
		address to,
		uint deadline
	) external returns (uint[] memory amounts);

	function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
	external
	payable
	returns (uint[] memory amounts);

	function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
	external
	returns (uint[] memory amounts);

	function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
	external
	returns (uint[] memory amounts);

	function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
	external
	payable
	returns (uint[] memory amounts);

	function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);

	function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);

	function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);

	function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);

	function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);

	function removeLiquidityETHSupportingFeeOnTransferTokens(
		address token,
		uint liquidity,
		uint amountTokenMin,
		uint amountETHMin,
		address to,
		uint deadline
	) external returns (uint amountETH);

	function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
		address token,
		uint liquidity,
		uint amountTokenMin,
		uint amountETHMin,
		address to,
		uint deadline,
		bool approveMax, uint8 v, bytes32 r, bytes32 s
	) external returns (uint amountETH);

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

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

	function swapExactTokensForETHSupportingFeeOnTransferTokens(
		uint amountIn,
		uint amountOutMin,
		address[] calldata path,
		address to,
		uint deadline
	) external;
}

File 11 of 15: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 12 of 15: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 13 of 15: IUnicryptLiquidityLocker.sol
pragma solidity 0.8.10;

// SPDX-License-Identifier: MIT

interface IUnicryptLiquidityLocker {
	function gFees() external view returns (
		uint256 ethFee,
		address secondaryFeeToken,
		uint256 secondaryTokenFee,
		uint256 secondaryTokenDiscount,
		uint256 liquidityFee,
		uint256 referralPercent,
		address referralToken,
		uint256 referralHold,
		uint256 referralDiscount
	);

	function lockLPToken(
		address _lpToken,
		uint256 _amount,
		uint256 _unlock_date,
		address payable _referral,
		bool _fee_in_eth,
		address payable _withdrawer
	) external payable;
}

File 14 of 15: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 15 of 15: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        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);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    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);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed 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);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FeesProcessed","type":"event"},{"anonymous":false,"inputs":[],"name":"Launched","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sniper","type":"address"}],"name":"SniperAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sniper","type":"address"}],"name":"SniperPunished","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sniper","type":"address"}],"name":"SniperRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFees","outputs":[{"internalType":"uint256","name":"reflectFee","type":"uint256"},{"internalType":"uint256","name":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"treasuryFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buyback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeProcessingThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromMaxWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isFeeProcessingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"daysToLock","type":"uint256"}],"name":"launch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"maxTxAmountBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmountSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"punishSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recoverLaunchedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFees","outputs":[{"internalType":"uint256","name":"reflectFee","type":"uint256"},{"internalType":"uint256","name":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"treasuryFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"value","type":"address"}],"name":"setAntiSnipe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setFeeProcessingThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"areBuyFees","type":"bool"},{"internalType":"uint256","name":"reflectFee","type":"uint256"},{"internalType":"uint256","name":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"treasuryFee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setIsExcludedFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setIsExcludedFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setIsFeeProcessingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"value","type":"address"}],"name":"setMarketingWalletAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxBuy","type":"uint256"},{"internalType":"uint256","name":"maxSell","type":"uint256"}],"name":"setMaxTransactionAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"contract BuybackTreasury","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052620000126009600a6200053b565b620000239064e8d4a5100062000553565b600881905562000036906000196200058b565b6200004490600019620005a2565b6009556064600854620000589190620005bc565b600a556002600a546200006c9190620005bc565b600b556002600a54620000809190620005bc565b600c55600f805461ffff1916610100179055600854620000a4906101f490620005bc565b601055604080516060808201835260058083526020808401829052600293850184905260178290556018829055601984905584519283018552600880845290830184905291909301839052601a55601b55601c553480156200010557600080fd5b506200011133620003c8565b6009543090600160006200012d6000546001600160a01b031690565b6001600160a01b03168152602081019190915260400160002055601180546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d90811790915581620001846000546001600160a01b031690565b604051620001929062000418565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f080158015620001cf573d6000803e3d6000fd5b50601280546001600160a01b03929092166001600160a01b0319928316179055600d805490911633179055600160046000620002136000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600d548216815260049093528183208054851660019081179091556012548216845282842080548616821790559085168352908220805484168217905561dead82527f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd80549093168117909255600690620002c46000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600d548216815260069093528183208054851660019081179091556012548216845282842080548616821790559085168352908220805484168217905561dead9091527f1aecba4ebe7a4e0673e4891b2b092b2228e4322380b579fb494fad3da8586e228054909216179055620003716000546001600160a01b031690565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600854604051620003b991815260200190565b60405180910390a350620005d3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61139b8062003aba83390190565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200047d57816000190482111562000461576200046162000426565b808516156200046f57918102915b93841c939080029062000441565b509250929050565b600082620004965750600162000535565b81620004a55750600062000535565b8160018114620004be5760028114620004c957620004e9565b600191505062000535565b60ff841115620004dd57620004dd62000426565b50506001821b62000535565b5060208310610133831016604e8410600b84101617156200050e575081810a62000535565b6200051a83836200043c565b806000190482111562000531576200053162000426565b0290505b92915050565b60006200054c60ff84168362000485565b9392505050565b600081600019048311821515161562000570576200057062000426565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826200059d576200059d62000575565b500690565b600082821015620005b757620005b762000426565b500390565b600082620005ce57620005ce62000575565b500490565b6134d780620005e36000396000f3fe6080604052600436106102605760003560e01c8063715018a611610144578063adf18693116100b6578063d6c180bf1161007a578063d6c180bf14610756578063dd62ed3e1461076c578063e0f3ccf5146107b2578063e4748b9e146107ec578063f2fde38b1461080b578063f97f33ce1461082b57600080fd5b8063adf18693146106c1578063b609995e146106e1578063b6f7f68114610701578063bfb693fe14610721578063d44e586e1461074057600080fd5b80638da5cb5b116101085780638da5cb5b146105fe57806395d89b411461061c578063a457c2d71461064b578063a9059cbb1461066b578063aa4bde281461068b578063aaa867a0146106a157600080fd5b8063715018a61461057657806379a9fa1c1461058b57806385791c97146105ab57806385b12c7c146105cb5780638737978e146105de57600080fd5b8063313ce567116101dd5780634fbee193116101a15780634fbee1931461047e57806355724b87146104ae57806361d027b3146104ce578063637930dd146105065780636dd3d39f1461052657806370a082311461055657600080fd5b8063313ce567146103e257806333251a0b146103fe578063395093511461041e5780633e3e95981461043e5780634cb80fd51461045e57600080fd5b806318160ddd1161022457806318160ddd1461035857806323b872dd1461036d57806327a14fc21461038d5780632d838119146103ad5780632d95d468146103cd57600080fd5b806306fdde031461026c578063095ea7b3146102b25780630e832273146102e2578063111e037614610312578063131447441461033457600080fd5b3661026757005b600080fd5b34801561027857600080fd5b5060408051808201909152600b81526a48616e677279426972647360a81b60208201525b6040516102a99190612fee565b60405180910390f35b3480156102be57600080fd5b506102d26102cd366004613058565b61084b565b60405190151581526020016102a9565b3480156102ee57600080fd5b506102d26102fd366004613084565b60056020526000908152604090205460ff1681565b34801561031e57600080fd5b5061033261032d366004613084565b610861565b005b34801561034057600080fd5b5061034a60105481565b6040519081526020016102a9565b34801561036457600080fd5b5060085461034a565b34801561037957600080fd5b506102d26103883660046130a1565b6108a0565b34801561039957600080fd5b506103326103a83660046130e2565b61094c565b3480156103b957600080fd5b5061034a6103c83660046130e2565b6109f6565b3480156103d957600080fd5b50610332610a73565b3480156103ee57600080fd5b50604051600981526020016102a9565b34801561040a57600080fd5b50610332610419366004613084565b610b09565b34801561042a57600080fd5b506102d2610439366004613058565b610bf3565b34801561044a57600080fd5b50610332610459366004613084565b610c2f565b34801561046a57600080fd5b50610332610479366004613084565b610d0e565b34801561048a57600080fd5b506102d2610499366004613084565b60046020526000908152604090205460ff1681565b3480156104ba57600080fd5b506103326104c9366004613109565b610dd6565b3480156104da57600080fd5b506012546104ee906001600160a01b031681565b6040516001600160a01b0390911681526020016102a9565b34801561051257600080fd5b506103326105213660046130e2565b610e1a565b34801561053257600080fd5b506102d2610541366004613084565b60066020526000908152604090205460ff1681565b34801561056257600080fd5b5061034a610571366004613084565b610e49565b34801561058257600080fd5b50610332610eae565b34801561059757600080fd5b506103326105a63660046130e2565b610ee2565b3480156105b757600080fd5b506103326105c6366004613084565b610f6d565b6103326105d93660046130e2565b611088565b3480156105ea57600080fd5b506103326105f9366004613126565b61183f565b34801561060a57600080fd5b506000546001600160a01b03166104ee565b34801561062857600080fd5b5060408051808201909152600681526548414e47525960d01b602082015261029c565b34801561065757600080fd5b506102d2610666366004613058565b61193b565b34801561067757600080fd5b506102d2610686366004613058565b6119d4565b34801561069757600080fd5b5061034a600a5481565b3480156106ad57600080fd5b506103326106bc366004613161565b6119e1565b3480156106cd57600080fd5b506103326106dc366004613161565b611a75565b3480156106ed57600080fd5b506103326106fc366004613084565b611b09565b34801561070d57600080fd5b5061033261071c36600461319a565b611b3c565b34801561072d57600080fd5b50600f546102d290610100900460ff1681565b34801561074c57600080fd5b5061034a600c5481565b34801561076257600080fd5b5061034a600b5481565b34801561077857600080fd5b5061034a6107873660046131bc565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b3480156107be57600080fd5b50601a54601b54601c546107d192919083565b604080519384526020840192909252908201526060016102a9565b3480156107f857600080fd5b506017546018546019546107d192919083565b34801561081757600080fd5b50610332610826366004613084565b611c66565b34801561083757600080fd5b50610332610846366004613084565b611cfe565b6000610858338484611e38565b50600192915050565b6000546001600160a01b031633146108945760405162461bcd60e51b815260040161088b906131ea565b60405180910390fd5b61089d81611f5c565b50565b60006108ad848484612096565b6001600160a01b0384166000908152600360209081526040808320338452909152902054828110156109325760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b606482015260840161088b565b61093f8533858403611e38565b60019150505b9392505050565b6000546001600160a01b031633146109765760405162461bcd60e51b815260040161088b906131ea565b60c86008546109859190613235565b8110156109f15760405162461bcd60e51b815260206004820152603460248201527f4d75737420736574206d61782077616c6c657420746f206174206c6561737420604482015273302e3525206f6620746f74616c20737570706c7960601b606482015260840161088b565b600a55565b6000600954821115610a5d5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b606482015260840161088b565b6000610a67612568565b90506109458184613235565b6000546001600160a01b03163314610a9d5760405162461bcd60e51b815260040161088b906131ea565b60155460ff1615610ae35760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481b185d5b98da195960821b604482015260640161088b565b610b0730610af96000546001600160a01b031690565b610b0230610e49565b612096565b565b6000546001600160a01b03163314610b335760405162461bcd60e51b815260040161088b906131ea565b6001600160a01b03811660009081526014602052604090205460ff16610b9b5760405162461bcd60e51b815260206004820152601c60248201527f54686973206163636f756e74206973206e6f74206120736e6970657200000000604482015260640161088b565b6001600160a01b038116600081815260146020908152604091829020805460ff1916905590519182527fa957ba3a52f05ac246d413f37460b13ee4b8281799a6b8365c8d227bb376567391015b60405180910390a150565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610858918590610c2a908690613257565b611e38565b6013546001600160a01b03163314610ca65760405162461bcd60e51b815260206004820152603460248201527f536e69706572732063616e206f6e6c792062652061646465642062792074686560448201527308185b9d1a4b5cdb9a5c194818dbdb9d1c9858dd60621b606482015260840161088b565b601654610cb4906001613257565b421161089d576001600160a01b038116600081815260146020908152604091829020805460ff1916600117905590519182527fcc4ae0ff8ee98f3dd9b279b0d57bbb4b58cfec1468181febfd424b956b9f6c809101610be8565b6000546001600160a01b03163314610d385760405162461bcd60e51b815260040161088b906131ea565b600d546001600160a01b0382811691161415610db45760405162461bcd60e51b815260206004820152603560248201527f4d61726b6574696e672077616c6c6574206164647265737320697320616c72656044820152746164792073657420746f20746869732076616c756560581b606482015260840161088b565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610e005760405162461bcd60e51b815260040161088b906131ea565b600f80549115156101000261ff0019909216919091179055565b6000546001600160a01b03163314610e445760405162461bcd60e51b815260040161088b906131ea565b601055565b6001600160a01b03811660009081526005602052604081205460ff1615610e8657506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610ea8906109f6565b92915050565b6000546001600160a01b03163314610ed85760405162461bcd60e51b815260040161088b906131ea565b610b07600061258b565b6000546001600160a01b03163314610f0c5760405162461bcd60e51b815260040161088b906131ea565b601254604051631e6a7e8760e21b8152600481018390526001600160a01b03909116906379a9fa1c90602401600060405180830381600087803b158015610f5257600080fd5b505af1158015610f66573d6000803e3d6000fd5b5050505050565b6000546001600160a01b03163314610f975760405162461bcd60e51b815260040161088b906131ea565b6001600160a01b038116610ff95760405162461bcd60e51b8152602060048201526024808201527f416e7469736e6970652063616e6e6f7420626520746865207a65726f206164646044820152637265737360e01b606482015260840161088b565b6013546001600160a01b03828116911614156110665760405162461bcd60e51b815260206004820152602660248201527f416e7469736e69706520697320616c72656164792073657420746f20746869736044820152652076616c756560d01b606482015260840161088b565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146110b25760405162461bcd60e51b815260040161088b906131ea565b601554309060ff16156110fa5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481b185d5b98da195960821b604482015260640161088b565b601e8210156111605760405162461bcd60e51b815260206004820152602c60248201527f4d757374206c6f636b206c697175696469747920666f722061206d696e696d7560448201526b6d206f66203330206461797360a01b606482015260840161088b565b600061116b82610e49565b9050600460085461117c9190613235565b8110156111f15760405162461bcd60e51b815260206004820152603c60248201527f496e697469616c206c6971756964697479206d757374206265206174206c656160448201527f737420323525206f6620746f74616c20746f6b656e20737570706c7900000000606482015260840161088b565b600073663a5c229c09b049e36dcc11a9b0d4a8eb9db21490506000816001600160a01b03166390e1a0036040518163ffffffff1660e01b815260040161012060405180830381865afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061326f565b505050505050505090508034116112d85760405162461bcd60e51b815260206004820152602760248201527f496e73756666696369656e742045544820666f72206c6971756964697479206c6044820152666f636b2066656560c81b606482015260840161088b565b60006112e482346132ee565b905067016345785d8a000081101561133e5760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e742045544820666f72206c69717569646974790000604482015260640161088b565b6011546040805163c45a015560e01b815290516000926001600160a01b03169163c45a01559160048083019260209291908290030181865afa158015611388573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ac9190613305565b6001600160a01b031663c9c6539687601160009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561140e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114329190613305565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801561147f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a39190613305565b6001600160a01b0381166000908152600e602090815260408083208054600160ff1991821681179092556006845282852080549091169091179055600590915290205490915060ff166114f9576114f981611f5c565b6011546115119087906001600160a01b031687611e38565b60115460405163f305d71960e01b81526001600160a01b038881166004830181905260248301899052600060448401819052606484015260848301524260a48301529091169063f305d71990849060c40160606040518083038185885af1158015611580573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906115a59190613322565b50506040516370a0823160e01b81526001600160a01b038881166004830152839250600091908316906370a0823190602401602060405180830381865afa1580156115f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116189190613350565b60405163095ea7b360e01b81526001600160a01b038881166004830152602482018390529192509083169063095ea7b3906044016020604051808303816000875af115801561166b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168f9190613369565b6116db5760405162461bcd60e51b815260206004820152601f60248201527f4c697175696469747920746f6b656e20617070726f76616c206661696c656400604482015260640161088b565b6001600160a01b038616638af416f68684846116fa8e62015180613386565b6117049042613257565b6000600161171a6000546001600160a01b031690565b60405160e089901b6001600160e01b03191681526001600160a01b0396871660048201526024810195909552604485019390935290841660648401521515608483015290911660a482015260c4016000604051808303818588803b15801561178157600080fd5b505af1158015611795573d6000803e3d6000fd5b50506013546040516310a009e560e11b81526001600160a01b038881166004830152909116935063214013ca92506024019050600060405180830381600087803b1580156117e257600080fd5b505af11580156117f6573d6000803e3d6000fd5b50506015805460ff191660011790555050436016556040517fba61a96074b3d636edeee92caddc86293c917d5b6818b7d3698bb52e02ec86c890600090a1505050505050505050565b6000546001600160a01b031633146118695760405162461bcd60e51b815260040161088b906131ea565b6019816118768486613257565b6118809190613257565b11156118e75760405162461bcd60e51b815260206004820152603060248201527f43616e6e6f7420736574206665657320746f2061626f7665206120636f6d626960448201526f6e656420746f74616c206f662032352560801b606482015260840161088b565b6040805160608101825284815260208101849052908101829052841561192157805160175560208101516018556040810151601955610f66565b8051601a556020810151601b5560400151601c5550505050565b3360009081526003602090815260408083206001600160a01b0386168452909152812054828110156119bd5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161088b565b6119ca3385858403611e38565b5060019392505050565b6000610858338484612096565b6000546001600160a01b03163314611a0b5760405162461bcd60e51b815260040161088b906131ea565b6001600160a01b03821660009081526006602052604090205460ff1615158115151415611a4a5760405162461bcd60e51b815260040161088b906133a5565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611a9f5760405162461bcd60e51b815260040161088b906131ea565b6001600160a01b03821660009081526004602052604090205460ff1615158115151415611ade5760405162461bcd60e51b815260040161088b906133a5565b6001600160a01b03919091166000908152600460205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611b335760405162461bcd60e51b815260040161088b906131ea565b61089d816125db565b6000546001600160a01b03163314611b665760405162461bcd60e51b815260040161088b906131ea565b610190600854611b769190613235565b821015611be05760405162461bcd60e51b815260206004820152603260248201527f4d75737420736574206d61782062757920746f206174206c6561737420302e326044820152713525206f6620746f74616c20737570706c7960701b606482015260840161088b565b610190600854611bf09190613235565b811015611c5b5760405162461bcd60e51b815260206004820152603360248201527f4d75737420736574206d61782073656c6c20746f206174206c6561737420302e604482015272323525206f6620746f74616c20737570706c7960681b606482015260840161088b565b600b91909155600c55565b6000546001600160a01b03163314611c905760405162461bcd60e51b815260040161088b906131ea565b6001600160a01b038116611cf55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161088b565b61089d8161258b565b6000546001600160a01b03163314611d285760405162461bcd60e51b815260040161088b906131ea565b6001600160a01b03811660009081526014602052604090205460ff16611d905760405162461bcd60e51b815260206004820152601c60248201527f54686973206163636f756e74206973206e6f74206120736e6970657200000000604482015260640161088b565b6000611d9b82610e49565b905060008111611ded5760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e7420746f6b656e2062616c616e6365000000000000604482015260640161088b565b611df8823083612096565b6040516001600160a01b03831681527f2c9a2f22ec353ff99e4269300828505b40661e7f7a4f6df6327a04a1a1963b4e9060200160405180910390a15050565b6001600160a01b038316611e9a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161088b565b6001600160a01b038216611efb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161088b565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03811660009081526005602052604090205460ff1615611fd65760405162461bcd60e51b815260206004820152602860248201527f4163636f756e7420697320616c7265616479206578636c756465642066726f6d604482015267207265776172647360c01b606482015260840161088b565b6001600160a01b03811660009081526001602052604090205415612030576001600160a01b038116600090815260016020526040902054612016906109f6565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600560205260408120805460ff191660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319169091179055565b6001600160a01b0383166120fa5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161088b565b6001600160a01b03821661215c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161088b565b600081116121be5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161088b565b6121c783610e49565b8111156122305760405162461bcd60e51b815260206004820152603160248201527f596f752061726520747279696e6720746f207472616e73666572206d6f7265206044820152707468616e20796f75722062616c616e636560781b606482015260840161088b565b6001600160a01b03831660009081526014602052604090205460ff161561228e5760405162461bcd60e51b8152602060048201526012602482015271536e69706572206e6f20736e6970696e672160701b604482015260640161088b565b6001600160a01b0383166000908152600e602052604081205460155460ff91821692911680156122d757506001600160a01b03851660009081526004602052604090205460ff16155b80156122fc57506001600160a01b03841660009081526004602052604090205460ff16155b60155490915060ff161561255b576001600160a01b0384166000908152600e602052604090205460ff1615801561234c57506001600160a01b03841660009081526006602052604090205460ff16155b156123ce57600a548361235e86610e49565b6123689190613257565b11156123ce5760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f74207472616e73666572206d6f7265207468616e20746865206d6160448201526e1e081dd85b1b195d08185b5bdd5b9d608a1b606482015260840161088b565b801561244a57816123e157600c546123e5565b600b545b83111561244a5760405162461bcd60e51b815260206004820152602d60248201527f43616e6e6f74207472616e73666572206d6f7265207468616e20746865206d6160448201526c1e08189d5e481bdc881cd95b1b609a1b606482015260840161088b565b601654612458906001613257565b43116124c657601354604051630ab1e96760e11b81526001600160a01b038781166004830152868116602483015290911690631563d2ce90604401600060405180830381600087803b1580156124ad57600080fd5b505af11580156124c1573d6000803e3d6000fd5b505050505b60006124d130610e49565b600f54909150610100900460ff1680156124ee5750600f5460ff16155b80156124fc57506010548110155b801561252157506001600160a01b0386166000908152600e602052604090205460ff16155b1561255957600f805460ff19166001179055600c5461254e9082116125465781612774565b600c54612774565b600f805460ff191690555b505b610f6685858585856128b4565b6000806000612575612a9a565b90925090506125848183613235565b9250505090565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811660009081526005602052604090205460ff1661264f5760405162461bcd60e51b8152602060048201526024808201527f4163636f756e74206973206e6f74206578636c756465642066726f6d207265776044820152636172647360e01b606482015260840161088b565b60005b60075481101561277057816001600160a01b031660078281548110612679576126796133e9565b6000918252602090912001546001600160a01b0316141561275e57600780546126a4906001906132ee565b815481106126b4576126b46133e9565b600091825260209091200154600780546001600160a01b0390921691839081106126e0576126e06133e9565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600590925220805460ff191690556007805480612738576127386133ff565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b8061276881613415565b915050612652565b5050565b60195460185460009161278691613257565b905080612791575050565b61279a82612c1d565b601854479060009083906127ae9084613386565b6127b89190613235565b905060006127c682846132ee565b9050811561280a57600d546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015612808573d6000803e3d6000fd5b505b801561287a57601260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b50505050505b6040518581527fd9cfd3c17aa5eead9ffc8208c88b064edcb903b0ec624c5e83df13761d6c93409060200160405180910390a15050505050565b60006128c1848484612d7c565b6001600160a01b03871660009081526005602052604090205490915060ff1615612913576001600160a01b0386166000908152600260205260408120805486929061290d9084906132ee565b90915550505b6001600160a01b03851660009081526005602052604090205460ff16156129675760808101516001600160a01b03861660009081526002602052604081208054909190612961908490613257565b90915550505b80516001600160a01b038716600090815260016020526040812080549091906129919084906132ee565b90915550506020808201516001600160a01b03871660009081526001909252604082208054919290916129c5908490613257565b90915550508115612a41576129dd8160400151612df4565b6129ef81606001518260c00151612e0e565b306001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360c00151604051612a3891815260200190565b60405180910390a35b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360800151604051612a8a91815260200190565b60405180910390a3505050505050565b6009546008546000918291825b600754811015612bec57826001600060078481548110612ac957612ac96133e9565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612b345750816002600060078481548110612b0d57612b0d6133e9565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612b4a57600954600854945094505050509091565b6001600060078381548110612b6157612b616133e9565b60009182526020808320909101546001600160a01b03168352820192909252604001902054612b9090846132ee565b92506002600060078381548110612ba957612ba96133e9565b60009182526020808320909101546001600160a01b03168352820192909252604001902054612bd890836132ee565b915080612be481613415565b915050612aa7565b50600854600954612bfd9190613235565b821015612c14576009546008549350935050509091565b90939092509050565b604080516002808252606082018352309260009291906020830190803683370190505090508181600081518110612c5657612c566133e9565b6001600160a01b03928316602091820292909201810191909152601154604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612caf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd39190613305565b81600181518110612ce657612ce66133e9565b6001600160a01b039283166020918202929092010152601154612d0c9184911685611e38565b60115460405163791ac94760e01b81526001600160a01b039091169063791ac94790612d45908690600090869088904290600401613430565b600060405180830381600087803b158015612d5f57600080fd5b505af1158015612d73573d6000803e3d6000fd5b50505050505050565b612dbc6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b612dc7848484612e86565b9050612ddc818584612dd7612568565b612f83565b60608501526040840152602083015281529392505050565b8060096000828254612e0691906132ee565b909155505050565b3060008181526001602052604081208054859290612e2d908490613257565b90915550506001600160a01b03811660009081526005602052604090205460ff1615612e81576001600160a01b03811660009081526002602052604081208054849290612e7b908490613257565b90915550505b505050565b612ec66040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b81612ed75760808101849052610945565b600083612ee557601a612ee8565b60175b60408051606081018252825480825260018401546020830152600290930154918101919091529150606490612f1d9087613386565b612f279190613235565b60a083015260408101516020820151606491612f4291613257565b612f4c9087613386565b612f569190613235565b60c0830181905260a0830151612f6c90876132ee565b612f7691906132ee565b6080830152509392505050565b6000808080612f928588613386565b935085612fa757508291506000905080612fe3565b848860a00151612fb79190613386565b9150848860c00151612fc99190613386565b905080612fd683866132ee565b612fe091906132ee565b92505b945094509450949050565b600060208083528351808285015260005b8181101561301b57858101830151858201604001528201612fff565b8181111561302d576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461089d57600080fd5b6000806040838503121561306b57600080fd5b823561307681613043565b946020939093013593505050565b60006020828403121561309657600080fd5b813561094581613043565b6000806000606084860312156130b657600080fd5b83356130c181613043565b925060208401356130d181613043565b929592945050506040919091013590565b6000602082840312156130f457600080fd5b5035919050565b801515811461089d57600080fd5b60006020828403121561311b57600080fd5b8135610945816130fb565b6000806000806080858703121561313c57600080fd5b8435613147816130fb565b966020860135965060408601359560600135945092505050565b6000806040838503121561317457600080fd5b823561317f81613043565b9150602083013561318f816130fb565b809150509250929050565b600080604083850312156131ad57600080fd5b50508035926020909101359150565b600080604083850312156131cf57600080fd5b82356131da81613043565b9150602083013561318f81613043565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008261325257634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111561326a5761326a61321f565b500190565b60008060008060008060008060006101208a8c03121561328e57600080fd5b8951985060208a01516132a081613043565b8098505060408a0151965060608a0151955060808a0151945060a08a0151935060c08a01516132ce81613043565b8093505060e08a015191506101008a015190509295985092959850929598565b6000828210156133005761330061321f565b500390565b60006020828403121561331757600080fd5b815161094581613043565b60008060006060848603121561333757600080fd5b8351925060208401519150604084015190509250925092565b60006020828403121561336257600080fd5b5051919050565b60006020828403121561337b57600080fd5b8151610945816130fb565b60008160001904831182151516156133a0576133a061321f565b500290565b60208082526024908201527f4163636f756e7420697320616c72656164792073657420746f20746869732076604082015263616c756560e01b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60006000198214156134295761342961321f565b5060010190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156134805784516001600160a01b03168352938301939183019160010161345b565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220845ca846ade59173faad213fe5322bc74dc02afd525ddb82fe9e01c7a120dc5964736f6c634300080a003360806040523480156200001157600080fd5b506040516200139b3803806200139b833981016040819052620000349162000144565b600180546001600160a01b038086166001600160a01b031992831617909255600280549285169290911682179055620000709060009062000086565b6200007d60008262000086565b5050506200018e565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000123576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620000e23390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b80516001600160a01b03811681146200013f57600080fd5b919050565b6000806000606084860312156200015a57600080fd5b620001658462000127565b9250620001756020850162000127565b9150620001856040850162000127565b90509250925092565b6111fd806200019e6000396000f3fe6080604052600436106100c65760003560e01c8063391f72b51161007f578063a217fddf11610059578063a217fddf14610213578063d0e30db014610228578063d547741f14610230578063eae6754a1461025057600080fd5b8063391f72b5146101bd57806379a9fa1c146101d357806391d14854146101f357600080fd5b806301ffc9a7146100d2578063144fa6d714610107578063146ec00714610129578063248a9ca31461014d5780632f2ff15d1461017d57806336568abe1461019d57600080fd5b366100cd57005b600080fd5b3480156100de57600080fd5b506100f26100ed366004610dab565b610266565b60405190151581526020015b60405180910390f35b34801561011357600080fd5b50610127610122366004610dea565b61029d565b005b34801561013557600080fd5b5061013f60045481565b6040519081526020016100fe565b34801561015957600080fd5b5061013f610168366004610e07565b60009081526020819052604090206001015490565b34801561018957600080fd5b50610127610198366004610e20565b6102d7565b3480156101a957600080fd5b506101276101b8366004610e20565b610302565b3480156101c957600080fd5b5061013f60055481565b3480156101df57600080fd5b506101276101ee366004610e07565b610381565b3480156101ff57600080fd5b506100f261020e366004610e20565b6104a8565b34801561021f57600080fd5b5061013f600081565b6101276104d1565b34801561023c57600080fd5b5061012761024b366004610e20565b61052a565b34801561025c57600080fd5b5061013f60035481565b60006001600160e01b03198216637965db0b60e01b148061029757506301ffc9a760e01b6001600160e01b03198316145b92915050565b60006102a98133610550565b600280546001600160a01b0319166001600160a01b0384169081179091556102d3906000906105b4565b5050565b6000828152602081905260409020600101546102f38133610550565b6102fd83836105b4565b505050565b6001600160a01b03811633146103775760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6102d38282610638565b600061038d8133610550565b600082116103dd5760405162461bcd60e51b815260206004820152601760248201527f496e73756666696369656e742076616c75652073656e74000000000000000000604482015260640161036e565b814710156104245760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015260640161036e565b600061042f8361069d565b905061043a83610830565b826004600082825461044c9190610e66565b9250508190555080600560008282546104659190610e66565b909155505060408051848152602081018390527f4e57162cf2059954fd33f1ecaaf1832e379957714070ad171bc5382b18c98d3c910160405180910390a1505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60006104dd8133610550565b34600360008282546104ef9190610e66565b90915550506040513481527f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e384269060200160405180910390a150565b6000828152602081905260409020600101546105468133610550565b6102fd8383610638565b61055a82826104a8565b6102d357610572816001600160a01b031660146108fd565b61057d8360206108fd565b60405160200161058e929190610eae565b60408051601f198184030181529082905262461bcd60e51b825261036e91600401610f23565b6105be82826104a8565b6102d3576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556105f43390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61064282826104a8565b156102d3576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b604080516002808252606082018352600092839291906020830190803683375050600154604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa15801561070b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072f9190610f6c565b8160008151811061074257610742610f89565b60200260200101906001600160a01b031690816001600160a01b03168152505073dac17f958d2ee523a2206206994597c13d831ec78160018151811061078a5761078a610f89565b6001600160a01b03928316602091820292909201015260015460405163d06ca61f60e01b815291169063d06ca61f906107c99086908590600401610fe3565b600060405180830381865afa1580156107e6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261080e9190810190610ffc565b60018151811061082057610820610f89565b6020026020010151915050919050565b600061083d6002836110ba565b9050600061085361084e83856110dc565b610aa0565b905061085e81610cea565b60015460025460405163f305d71960e01b81526001600160a01b03918216600482015260248101849052600060448201819052606482015261dead60848201524260a482015291169063f305d71990849060c40160606040518083038185885af11580156108d0573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906108f591906110f3565b505050505050565b6060600061090c836002611121565b610917906002610e66565b67ffffffffffffffff81111561092f5761092f610f56565b6040519080825280601f01601f191660200182016040528015610959576020820181803683370190505b509050600360fc1b8160008151811061097457610974610f89565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106109a3576109a3610f89565b60200101906001600160f81b031916908160001a90535060006109c7846002611121565b6109d2906001610e66565b90505b6001811115610a4a576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610a0657610a06610f89565b1a60f81b828281518110610a1c57610a1c610f89565b60200101906001600160f81b031916908160001a90535060049490941c93610a4381611140565b90506109d5565b508315610a995760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161036e565b9392505050565b604080516002808252606082018352600092839291906020830190803683375050600154604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015610b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b329190610f6c565b81600081518110610b4557610b45610f89565b6001600160a01b039283166020918202929092010152600254825191169082906001908110610b7657610b76610f89565b6001600160a01b0392831660209182029290920101526002546040516370a0823160e01b815230600482015260009291909116906370a0823190602401602060405180830381865afa158015610bd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf49190611157565b9050610bff84610cea565b60015460405163b6f9de9560e01b81526001600160a01b039091169063b6f9de95908690610c3890600090879030904290600401611170565b6000604051808303818588803b158015610c5157600080fd5b505af1158015610c65573d6000803e3d6000fd5b50506002546040516370a0823160e01b81523060048201528594506001600160a01b0390911692506370a082319150602401602060405180830381865afa158015610cb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd89190611157565b610ce291906110dc565b949350505050565b60025460015460405163095ea7b360e01b81526001600160a01b0391821660048201526024810184905291169063095ea7b3906044016020604051808303816000875af1158015610d3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6391906111a5565b610da85760405162461bcd60e51b8152602060048201526016602482015275149bdd5d195c88185c1c1c9bdd985b0819985a5b195960521b604482015260640161036e565b50565b600060208284031215610dbd57600080fd5b81356001600160e01b031981168114610a9957600080fd5b6001600160a01b0381168114610da857600080fd5b600060208284031215610dfc57600080fd5b8135610a9981610dd5565b600060208284031215610e1957600080fd5b5035919050565b60008060408385031215610e3357600080fd5b823591506020830135610e4581610dd5565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b60008219821115610e7957610e79610e50565b500190565b60005b83811015610e99578181015183820152602001610e81565b83811115610ea8576000848401525b50505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351610ee6816017850160208801610e7e565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351610f17816028840160208801610e7e565b01602801949350505050565b6020815260008251806020840152610f42816040850160208701610e7e565b601f01601f19169190910160400192915050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215610f7e57600080fd5b8151610a9981610dd5565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015610fd85781516001600160a01b031687529582019590820190600101610fb3565b509495945050505050565b828152604060208201526000610ce26040830184610f9f565b6000602080838503121561100f57600080fd5b825167ffffffffffffffff8082111561102757600080fd5b818501915085601f83011261103b57600080fd5b81518181111561104d5761104d610f56565b8060051b604051601f19603f8301168101818110858211171561107257611072610f56565b60405291825284820192508381018501918883111561109057600080fd5b938501935b828510156110ae57845184529385019392850192611095565b98975050505050505050565b6000826110d757634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156110ee576110ee610e50565b500390565b60008060006060848603121561110857600080fd5b8351925060208401519150604084015190509250925092565b600081600019048311821515161561113b5761113b610e50565b500290565b60008161114f5761114f610e50565b506000190190565b60006020828403121561116957600080fd5b5051919050565b8481526080602082015260006111896080830186610f9f565b6001600160a01b03949094166040830152506060015292915050565b6000602082840312156111b757600080fd5b81518015158114610a9957600080fdfea26469706673582212202b41243493cdec11484c2098149d3d141f911ac8e50ac0d139682ad8c69bffd564736f6c634300080a0033

Deployed Bytecode

0x6080604052600436106102605760003560e01c8063715018a611610144578063adf18693116100b6578063d6c180bf1161007a578063d6c180bf14610756578063dd62ed3e1461076c578063e0f3ccf5146107b2578063e4748b9e146107ec578063f2fde38b1461080b578063f97f33ce1461082b57600080fd5b8063adf18693146106c1578063b609995e146106e1578063b6f7f68114610701578063bfb693fe14610721578063d44e586e1461074057600080fd5b80638da5cb5b116101085780638da5cb5b146105fe57806395d89b411461061c578063a457c2d71461064b578063a9059cbb1461066b578063aa4bde281461068b578063aaa867a0146106a157600080fd5b8063715018a61461057657806379a9fa1c1461058b57806385791c97146105ab57806385b12c7c146105cb5780638737978e146105de57600080fd5b8063313ce567116101dd5780634fbee193116101a15780634fbee1931461047e57806355724b87146104ae57806361d027b3146104ce578063637930dd146105065780636dd3d39f1461052657806370a082311461055657600080fd5b8063313ce567146103e257806333251a0b146103fe578063395093511461041e5780633e3e95981461043e5780634cb80fd51461045e57600080fd5b806318160ddd1161022457806318160ddd1461035857806323b872dd1461036d57806327a14fc21461038d5780632d838119146103ad5780632d95d468146103cd57600080fd5b806306fdde031461026c578063095ea7b3146102b25780630e832273146102e2578063111e037614610312578063131447441461033457600080fd5b3661026757005b600080fd5b34801561027857600080fd5b5060408051808201909152600b81526a48616e677279426972647360a81b60208201525b6040516102a99190612fee565b60405180910390f35b3480156102be57600080fd5b506102d26102cd366004613058565b61084b565b60405190151581526020016102a9565b3480156102ee57600080fd5b506102d26102fd366004613084565b60056020526000908152604090205460ff1681565b34801561031e57600080fd5b5061033261032d366004613084565b610861565b005b34801561034057600080fd5b5061034a60105481565b6040519081526020016102a9565b34801561036457600080fd5b5060085461034a565b34801561037957600080fd5b506102d26103883660046130a1565b6108a0565b34801561039957600080fd5b506103326103a83660046130e2565b61094c565b3480156103b957600080fd5b5061034a6103c83660046130e2565b6109f6565b3480156103d957600080fd5b50610332610a73565b3480156103ee57600080fd5b50604051600981526020016102a9565b34801561040a57600080fd5b50610332610419366004613084565b610b09565b34801561042a57600080fd5b506102d2610439366004613058565b610bf3565b34801561044a57600080fd5b50610332610459366004613084565b610c2f565b34801561046a57600080fd5b50610332610479366004613084565b610d0e565b34801561048a57600080fd5b506102d2610499366004613084565b60046020526000908152604090205460ff1681565b3480156104ba57600080fd5b506103326104c9366004613109565b610dd6565b3480156104da57600080fd5b506012546104ee906001600160a01b031681565b6040516001600160a01b0390911681526020016102a9565b34801561051257600080fd5b506103326105213660046130e2565b610e1a565b34801561053257600080fd5b506102d2610541366004613084565b60066020526000908152604090205460ff1681565b34801561056257600080fd5b5061034a610571366004613084565b610e49565b34801561058257600080fd5b50610332610eae565b34801561059757600080fd5b506103326105a63660046130e2565b610ee2565b3480156105b757600080fd5b506103326105c6366004613084565b610f6d565b6103326105d93660046130e2565b611088565b3480156105ea57600080fd5b506103326105f9366004613126565b61183f565b34801561060a57600080fd5b506000546001600160a01b03166104ee565b34801561062857600080fd5b5060408051808201909152600681526548414e47525960d01b602082015261029c565b34801561065757600080fd5b506102d2610666366004613058565b61193b565b34801561067757600080fd5b506102d2610686366004613058565b6119d4565b34801561069757600080fd5b5061034a600a5481565b3480156106ad57600080fd5b506103326106bc366004613161565b6119e1565b3480156106cd57600080fd5b506103326106dc366004613161565b611a75565b3480156106ed57600080fd5b506103326106fc366004613084565b611b09565b34801561070d57600080fd5b5061033261071c36600461319a565b611b3c565b34801561072d57600080fd5b50600f546102d290610100900460ff1681565b34801561074c57600080fd5b5061034a600c5481565b34801561076257600080fd5b5061034a600b5481565b34801561077857600080fd5b5061034a6107873660046131bc565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b3480156107be57600080fd5b50601a54601b54601c546107d192919083565b604080519384526020840192909252908201526060016102a9565b3480156107f857600080fd5b506017546018546019546107d192919083565b34801561081757600080fd5b50610332610826366004613084565b611c66565b34801561083757600080fd5b50610332610846366004613084565b611cfe565b6000610858338484611e38565b50600192915050565b6000546001600160a01b031633146108945760405162461bcd60e51b815260040161088b906131ea565b60405180910390fd5b61089d81611f5c565b50565b60006108ad848484612096565b6001600160a01b0384166000908152600360209081526040808320338452909152902054828110156109325760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b606482015260840161088b565b61093f8533858403611e38565b60019150505b9392505050565b6000546001600160a01b031633146109765760405162461bcd60e51b815260040161088b906131ea565b60c86008546109859190613235565b8110156109f15760405162461bcd60e51b815260206004820152603460248201527f4d75737420736574206d61782077616c6c657420746f206174206c6561737420604482015273302e3525206f6620746f74616c20737570706c7960601b606482015260840161088b565b600a55565b6000600954821115610a5d5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b606482015260840161088b565b6000610a67612568565b90506109458184613235565b6000546001600160a01b03163314610a9d5760405162461bcd60e51b815260040161088b906131ea565b60155460ff1615610ae35760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481b185d5b98da195960821b604482015260640161088b565b610b0730610af96000546001600160a01b031690565b610b0230610e49565b612096565b565b6000546001600160a01b03163314610b335760405162461bcd60e51b815260040161088b906131ea565b6001600160a01b03811660009081526014602052604090205460ff16610b9b5760405162461bcd60e51b815260206004820152601c60248201527f54686973206163636f756e74206973206e6f74206120736e6970657200000000604482015260640161088b565b6001600160a01b038116600081815260146020908152604091829020805460ff1916905590519182527fa957ba3a52f05ac246d413f37460b13ee4b8281799a6b8365c8d227bb376567391015b60405180910390a150565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610858918590610c2a908690613257565b611e38565b6013546001600160a01b03163314610ca65760405162461bcd60e51b815260206004820152603460248201527f536e69706572732063616e206f6e6c792062652061646465642062792074686560448201527308185b9d1a4b5cdb9a5c194818dbdb9d1c9858dd60621b606482015260840161088b565b601654610cb4906001613257565b421161089d576001600160a01b038116600081815260146020908152604091829020805460ff1916600117905590519182527fcc4ae0ff8ee98f3dd9b279b0d57bbb4b58cfec1468181febfd424b956b9f6c809101610be8565b6000546001600160a01b03163314610d385760405162461bcd60e51b815260040161088b906131ea565b600d546001600160a01b0382811691161415610db45760405162461bcd60e51b815260206004820152603560248201527f4d61726b6574696e672077616c6c6574206164647265737320697320616c72656044820152746164792073657420746f20746869732076616c756560581b606482015260840161088b565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610e005760405162461bcd60e51b815260040161088b906131ea565b600f80549115156101000261ff0019909216919091179055565b6000546001600160a01b03163314610e445760405162461bcd60e51b815260040161088b906131ea565b601055565b6001600160a01b03811660009081526005602052604081205460ff1615610e8657506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610ea8906109f6565b92915050565b6000546001600160a01b03163314610ed85760405162461bcd60e51b815260040161088b906131ea565b610b07600061258b565b6000546001600160a01b03163314610f0c5760405162461bcd60e51b815260040161088b906131ea565b601254604051631e6a7e8760e21b8152600481018390526001600160a01b03909116906379a9fa1c90602401600060405180830381600087803b158015610f5257600080fd5b505af1158015610f66573d6000803e3d6000fd5b5050505050565b6000546001600160a01b03163314610f975760405162461bcd60e51b815260040161088b906131ea565b6001600160a01b038116610ff95760405162461bcd60e51b8152602060048201526024808201527f416e7469736e6970652063616e6e6f7420626520746865207a65726f206164646044820152637265737360e01b606482015260840161088b565b6013546001600160a01b03828116911614156110665760405162461bcd60e51b815260206004820152602660248201527f416e7469736e69706520697320616c72656164792073657420746f20746869736044820152652076616c756560d01b606482015260840161088b565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146110b25760405162461bcd60e51b815260040161088b906131ea565b601554309060ff16156110fa5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481b185d5b98da195960821b604482015260640161088b565b601e8210156111605760405162461bcd60e51b815260206004820152602c60248201527f4d757374206c6f636b206c697175696469747920666f722061206d696e696d7560448201526b6d206f66203330206461797360a01b606482015260840161088b565b600061116b82610e49565b9050600460085461117c9190613235565b8110156111f15760405162461bcd60e51b815260206004820152603c60248201527f496e697469616c206c6971756964697479206d757374206265206174206c656160448201527f737420323525206f6620746f74616c20746f6b656e20737570706c7900000000606482015260840161088b565b600073663a5c229c09b049e36dcc11a9b0d4a8eb9db21490506000816001600160a01b03166390e1a0036040518163ffffffff1660e01b815260040161012060405180830381865afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f919061326f565b505050505050505090508034116112d85760405162461bcd60e51b815260206004820152602760248201527f496e73756666696369656e742045544820666f72206c6971756964697479206c6044820152666f636b2066656560c81b606482015260840161088b565b60006112e482346132ee565b905067016345785d8a000081101561133e5760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e742045544820666f72206c69717569646974790000604482015260640161088b565b6011546040805163c45a015560e01b815290516000926001600160a01b03169163c45a01559160048083019260209291908290030181865afa158015611388573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ac9190613305565b6001600160a01b031663c9c6539687601160009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561140e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114329190613305565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801561147f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a39190613305565b6001600160a01b0381166000908152600e602090815260408083208054600160ff1991821681179092556006845282852080549091169091179055600590915290205490915060ff166114f9576114f981611f5c565b6011546115119087906001600160a01b031687611e38565b60115460405163f305d71960e01b81526001600160a01b038881166004830181905260248301899052600060448401819052606484015260848301524260a48301529091169063f305d71990849060c40160606040518083038185885af1158015611580573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906115a59190613322565b50506040516370a0823160e01b81526001600160a01b038881166004830152839250600091908316906370a0823190602401602060405180830381865afa1580156115f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116189190613350565b60405163095ea7b360e01b81526001600160a01b038881166004830152602482018390529192509083169063095ea7b3906044016020604051808303816000875af115801561166b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168f9190613369565b6116db5760405162461bcd60e51b815260206004820152601f60248201527f4c697175696469747920746f6b656e20617070726f76616c206661696c656400604482015260640161088b565b6001600160a01b038616638af416f68684846116fa8e62015180613386565b6117049042613257565b6000600161171a6000546001600160a01b031690565b60405160e089901b6001600160e01b03191681526001600160a01b0396871660048201526024810195909552604485019390935290841660648401521515608483015290911660a482015260c4016000604051808303818588803b15801561178157600080fd5b505af1158015611795573d6000803e3d6000fd5b50506013546040516310a009e560e11b81526001600160a01b038881166004830152909116935063214013ca92506024019050600060405180830381600087803b1580156117e257600080fd5b505af11580156117f6573d6000803e3d6000fd5b50506015805460ff191660011790555050436016556040517fba61a96074b3d636edeee92caddc86293c917d5b6818b7d3698bb52e02ec86c890600090a1505050505050505050565b6000546001600160a01b031633146118695760405162461bcd60e51b815260040161088b906131ea565b6019816118768486613257565b6118809190613257565b11156118e75760405162461bcd60e51b815260206004820152603060248201527f43616e6e6f7420736574206665657320746f2061626f7665206120636f6d626960448201526f6e656420746f74616c206f662032352560801b606482015260840161088b565b6040805160608101825284815260208101849052908101829052841561192157805160175560208101516018556040810151601955610f66565b8051601a556020810151601b5560400151601c5550505050565b3360009081526003602090815260408083206001600160a01b0386168452909152812054828110156119bd5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161088b565b6119ca3385858403611e38565b5060019392505050565b6000610858338484612096565b6000546001600160a01b03163314611a0b5760405162461bcd60e51b815260040161088b906131ea565b6001600160a01b03821660009081526006602052604090205460ff1615158115151415611a4a5760405162461bcd60e51b815260040161088b906133a5565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611a9f5760405162461bcd60e51b815260040161088b906131ea565b6001600160a01b03821660009081526004602052604090205460ff1615158115151415611ade5760405162461bcd60e51b815260040161088b906133a5565b6001600160a01b03919091166000908152600460205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611b335760405162461bcd60e51b815260040161088b906131ea565b61089d816125db565b6000546001600160a01b03163314611b665760405162461bcd60e51b815260040161088b906131ea565b610190600854611b769190613235565b821015611be05760405162461bcd60e51b815260206004820152603260248201527f4d75737420736574206d61782062757920746f206174206c6561737420302e326044820152713525206f6620746f74616c20737570706c7960701b606482015260840161088b565b610190600854611bf09190613235565b811015611c5b5760405162461bcd60e51b815260206004820152603360248201527f4d75737420736574206d61782073656c6c20746f206174206c6561737420302e604482015272323525206f6620746f74616c20737570706c7960681b606482015260840161088b565b600b91909155600c55565b6000546001600160a01b03163314611c905760405162461bcd60e51b815260040161088b906131ea565b6001600160a01b038116611cf55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161088b565b61089d8161258b565b6000546001600160a01b03163314611d285760405162461bcd60e51b815260040161088b906131ea565b6001600160a01b03811660009081526014602052604090205460ff16611d905760405162461bcd60e51b815260206004820152601c60248201527f54686973206163636f756e74206973206e6f74206120736e6970657200000000604482015260640161088b565b6000611d9b82610e49565b905060008111611ded5760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e7420746f6b656e2062616c616e6365000000000000604482015260640161088b565b611df8823083612096565b6040516001600160a01b03831681527f2c9a2f22ec353ff99e4269300828505b40661e7f7a4f6df6327a04a1a1963b4e9060200160405180910390a15050565b6001600160a01b038316611e9a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161088b565b6001600160a01b038216611efb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161088b565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03811660009081526005602052604090205460ff1615611fd65760405162461bcd60e51b815260206004820152602860248201527f4163636f756e7420697320616c7265616479206578636c756465642066726f6d604482015267207265776172647360c01b606482015260840161088b565b6001600160a01b03811660009081526001602052604090205415612030576001600160a01b038116600090815260016020526040902054612016906109f6565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600560205260408120805460ff191660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319169091179055565b6001600160a01b0383166120fa5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161088b565b6001600160a01b03821661215c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161088b565b600081116121be5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161088b565b6121c783610e49565b8111156122305760405162461bcd60e51b815260206004820152603160248201527f596f752061726520747279696e6720746f207472616e73666572206d6f7265206044820152707468616e20796f75722062616c616e636560781b606482015260840161088b565b6001600160a01b03831660009081526014602052604090205460ff161561228e5760405162461bcd60e51b8152602060048201526012602482015271536e69706572206e6f20736e6970696e672160701b604482015260640161088b565b6001600160a01b0383166000908152600e602052604081205460155460ff91821692911680156122d757506001600160a01b03851660009081526004602052604090205460ff16155b80156122fc57506001600160a01b03841660009081526004602052604090205460ff16155b60155490915060ff161561255b576001600160a01b0384166000908152600e602052604090205460ff1615801561234c57506001600160a01b03841660009081526006602052604090205460ff16155b156123ce57600a548361235e86610e49565b6123689190613257565b11156123ce5760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f74207472616e73666572206d6f7265207468616e20746865206d6160448201526e1e081dd85b1b195d08185b5bdd5b9d608a1b606482015260840161088b565b801561244a57816123e157600c546123e5565b600b545b83111561244a5760405162461bcd60e51b815260206004820152602d60248201527f43616e6e6f74207472616e73666572206d6f7265207468616e20746865206d6160448201526c1e08189d5e481bdc881cd95b1b609a1b606482015260840161088b565b601654612458906001613257565b43116124c657601354604051630ab1e96760e11b81526001600160a01b038781166004830152868116602483015290911690631563d2ce90604401600060405180830381600087803b1580156124ad57600080fd5b505af11580156124c1573d6000803e3d6000fd5b505050505b60006124d130610e49565b600f54909150610100900460ff1680156124ee5750600f5460ff16155b80156124fc57506010548110155b801561252157506001600160a01b0386166000908152600e602052604090205460ff16155b1561255957600f805460ff19166001179055600c5461254e9082116125465781612774565b600c54612774565b600f805460ff191690555b505b610f6685858585856128b4565b6000806000612575612a9a565b90925090506125848183613235565b9250505090565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811660009081526005602052604090205460ff1661264f5760405162461bcd60e51b8152602060048201526024808201527f4163636f756e74206973206e6f74206578636c756465642066726f6d207265776044820152636172647360e01b606482015260840161088b565b60005b60075481101561277057816001600160a01b031660078281548110612679576126796133e9565b6000918252602090912001546001600160a01b0316141561275e57600780546126a4906001906132ee565b815481106126b4576126b46133e9565b600091825260209091200154600780546001600160a01b0390921691839081106126e0576126e06133e9565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600590925220805460ff191690556007805480612738576127386133ff565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b8061276881613415565b915050612652565b5050565b60195460185460009161278691613257565b905080612791575050565b61279a82612c1d565b601854479060009083906127ae9084613386565b6127b89190613235565b905060006127c682846132ee565b9050811561280a57600d546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015612808573d6000803e3d6000fd5b505b801561287a57601260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b50505050505b6040518581527fd9cfd3c17aa5eead9ffc8208c88b064edcb903b0ec624c5e83df13761d6c93409060200160405180910390a15050505050565b60006128c1848484612d7c565b6001600160a01b03871660009081526005602052604090205490915060ff1615612913576001600160a01b0386166000908152600260205260408120805486929061290d9084906132ee565b90915550505b6001600160a01b03851660009081526005602052604090205460ff16156129675760808101516001600160a01b03861660009081526002602052604081208054909190612961908490613257565b90915550505b80516001600160a01b038716600090815260016020526040812080549091906129919084906132ee565b90915550506020808201516001600160a01b03871660009081526001909252604082208054919290916129c5908490613257565b90915550508115612a41576129dd8160400151612df4565b6129ef81606001518260c00151612e0e565b306001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360c00151604051612a3891815260200190565b60405180910390a35b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360800151604051612a8a91815260200190565b60405180910390a3505050505050565b6009546008546000918291825b600754811015612bec57826001600060078481548110612ac957612ac96133e9565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612b345750816002600060078481548110612b0d57612b0d6133e9565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612b4a57600954600854945094505050509091565b6001600060078381548110612b6157612b616133e9565b60009182526020808320909101546001600160a01b03168352820192909252604001902054612b9090846132ee565b92506002600060078381548110612ba957612ba96133e9565b60009182526020808320909101546001600160a01b03168352820192909252604001902054612bd890836132ee565b915080612be481613415565b915050612aa7565b50600854600954612bfd9190613235565b821015612c14576009546008549350935050509091565b90939092509050565b604080516002808252606082018352309260009291906020830190803683370190505090508181600081518110612c5657612c566133e9565b6001600160a01b03928316602091820292909201810191909152601154604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612caf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd39190613305565b81600181518110612ce657612ce66133e9565b6001600160a01b039283166020918202929092010152601154612d0c9184911685611e38565b60115460405163791ac94760e01b81526001600160a01b039091169063791ac94790612d45908690600090869088904290600401613430565b600060405180830381600087803b158015612d5f57600080fd5b505af1158015612d73573d6000803e3d6000fd5b50505050505050565b612dbc6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b612dc7848484612e86565b9050612ddc818584612dd7612568565b612f83565b60608501526040840152602083015281529392505050565b8060096000828254612e0691906132ee565b909155505050565b3060008181526001602052604081208054859290612e2d908490613257565b90915550506001600160a01b03811660009081526005602052604090205460ff1615612e81576001600160a01b03811660009081526002602052604081208054849290612e7b908490613257565b90915550505b505050565b612ec66040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b81612ed75760808101849052610945565b600083612ee557601a612ee8565b60175b60408051606081018252825480825260018401546020830152600290930154918101919091529150606490612f1d9087613386565b612f279190613235565b60a083015260408101516020820151606491612f4291613257565b612f4c9087613386565b612f569190613235565b60c0830181905260a0830151612f6c90876132ee565b612f7691906132ee565b6080830152509392505050565b6000808080612f928588613386565b935085612fa757508291506000905080612fe3565b848860a00151612fb79190613386565b9150848860c00151612fc99190613386565b905080612fd683866132ee565b612fe091906132ee565b92505b945094509450949050565b600060208083528351808285015260005b8181101561301b57858101830151858201604001528201612fff565b8181111561302d576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461089d57600080fd5b6000806040838503121561306b57600080fd5b823561307681613043565b946020939093013593505050565b60006020828403121561309657600080fd5b813561094581613043565b6000806000606084860312156130b657600080fd5b83356130c181613043565b925060208401356130d181613043565b929592945050506040919091013590565b6000602082840312156130f457600080fd5b5035919050565b801515811461089d57600080fd5b60006020828403121561311b57600080fd5b8135610945816130fb565b6000806000806080858703121561313c57600080fd5b8435613147816130fb565b966020860135965060408601359560600135945092505050565b6000806040838503121561317457600080fd5b823561317f81613043565b9150602083013561318f816130fb565b809150509250929050565b600080604083850312156131ad57600080fd5b50508035926020909101359150565b600080604083850312156131cf57600080fd5b82356131da81613043565b9150602083013561318f81613043565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008261325257634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111561326a5761326a61321f565b500190565b60008060008060008060008060006101208a8c03121561328e57600080fd5b8951985060208a01516132a081613043565b8098505060408a0151965060608a0151955060808a0151945060a08a0151935060c08a01516132ce81613043565b8093505060e08a015191506101008a015190509295985092959850929598565b6000828210156133005761330061321f565b500390565b60006020828403121561331757600080fd5b815161094581613043565b60008060006060848603121561333757600080fd5b8351925060208401519150604084015190509250925092565b60006020828403121561336257600080fd5b5051919050565b60006020828403121561337b57600080fd5b8151610945816130fb565b60008160001904831182151516156133a0576133a061321f565b500290565b60208082526024908201527f4163636f756e7420697320616c72656164792073657420746f20746869732076604082015263616c756560e01b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60006000198214156134295761342961321f565b5060010190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156134805784516001600160a01b03168352938301939183019160010161345b565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220845ca846ade59173faad213fe5322bc74dc02afd525ddb82fe9e01c7a120dc5964736f6c634300080a0033

Deployed Bytecode Sourcemap

314:17326:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3286:73;;;;;;;;;;-1:-1:-1;3350:4:5;;;;;;;;;;;;-1:-1:-1;;;3350:4:5;;;;3286:73;;;;;;;:::i;:::-;;;;;;;;4105:146;;;;;;;;;;-1:-1:-1;4105:146:5;;;;;:::i;:::-;;:::i;:::-;;;1237:14:15;;1230:22;1212:41;;1200:2;1185:18;4105:146:5;1072:187:15;1033:53:5;;;;;;;;;;-1:-1:-1;1033:53:5;;;;;:::i;:::-;;;;;;;;;;;;;;;;17398:102;;;;;;;;;;-1:-1:-1;17398:102:5;;;;;:::i;:::-;;:::i;:::-;;1619:52;;;;;;;;;;;;;;;;;;;1662:25:15;;;1650:2;1635:18;1619:52:5;1516:177:15;3524:85:5;;;;;;;;;;-1:-1:-1;3598:6:5;;3524:85;;4256:403;;;;;;;;;;-1:-1:-1;4256:403:5;;;;;:::i;:::-;;:::i;16752:188::-;;;;;;;;;;-1:-1:-1;16752:188:5;;;;;:::i;:::-;;:::i;5245:228::-;;;;;;;;;;-1:-1:-1;5245:228:5;;;;;:::i;:::-;;:::i;13846:452::-;;;;;;;;;;;;;:::i;3446:73::-;;;;;;;;;;-1:-1:-1;3446:73:5;;509:1;2486:36:15;;2474:2;2459:18;3446:73:5;2344:184:15;15061:186:5;;;;;;;;;;-1:-1:-1;15061:186:5;;;;;:::i;:::-;;:::i;4664:199::-;;;;;;;;;;-1:-1:-1;4664:199:5;;;;;:::i;:::-;;:::i;14394:350::-;;;;;;;;;;-1:-1:-1;14394:350:5;;;;;:::i;:::-;;:::i;16528:219::-;;;;;;;;;;-1:-1:-1;16528:219:5;;;;;:::i;:::-;;:::i;979:50::-;;;;;;;;;;-1:-1:-1;979:50:5;;;;;:::i;:::-;;;;;;;;;;;;;;;;15961:106;;;;;;;;;;-1:-1:-1;15961:106:5;;;;;:::i;:::-;;:::i;1698:31::-;;;;;;;;;;-1:-1:-1;1698:31:5;;;;-1:-1:-1;;;;;1698:31:5;;;;;;-1:-1:-1;;;;;3357:32:15;;;3339:51;;3327:2;3312:18;1698:31:5;3162:234:15;16072:109:5;;;;;;;;;;-1:-1:-1;16072:109:5;;;;;:::i;:::-;;:::i;1090:55::-;;;;;;;;;;-1:-1:-1;1090:55:5;;;;;:::i;:::-;;;;;;;;;;;;;;;;3614:191;;;;;;;;;;-1:-1:-1;3614:191:5;;;;;:::i;:::-;;:::i;1661:101:13:-;;;;;;;;;;;;;:::i;14303:86:5:-;;;;;;;;;;-1:-1:-1;14303:86:5;;;;;:::i;:::-;;:::i;15252:253::-;;;;;;;;;;-1:-1:-1;15252:253:5;;;;;:::i;:::-;;:::i;12028:1813::-;;;;;;:::i;:::-;;:::i;15510:446::-;;;;;;;;;;-1:-1:-1;15510:446:5;;;;;:::i;:::-;;:::i;1029:85:13:-;;;;;;;;;;-1:-1:-1;1075:7:13;1101:6;-1:-1:-1;;;;;1101:6:13;1029:85;;3364:77:5;;;;;;;;;;-1:-1:-1;3430:6:5;;;;;;;;;;;;-1:-1:-1;;;3430:6:5;;;;3364:77;;4868:372;;;;;;;;;;-1:-1:-1;4868:372:5;;;;;:::i;:::-;;:::i;3810:152::-;;;;;;;;;;-1:-1:-1;3810:152:5;;;;;:::i;:::-;;:::i;1274:45::-;;;;;;;;;;;;;;;;17164:229;;;;;;;;;;-1:-1:-1;17164:229:5;;;;;:::i;:::-;;:::i;16945:214::-;;;;;;;;;;-1:-1:-1;16945:214:5;;;;;:::i;:::-;;:::i;17505:98::-;;;;;;;;;;-1:-1:-1;17505:98:5;;;;;:::i;:::-;;:::i;16186:337::-;;;;;;;;;;-1:-1:-1;16186:337:5;;;;;:::i;:::-;;:::i;1574:41::-;;;;;;;;;;-1:-1:-1;1574:41:5;;;;;;;;;;;1378:52;;;;;;;;;;;;;;;;1323:51;;;;;;;;;;;;;;;;3967:133;;;;;;;;;;-1:-1:-1;3967:133:5;;;;;:::i;:::-;-1:-1:-1;;;;;4069:17:5;;;4048:7;4069:17;;;:10;:17;;;;;;;;:26;;;;;;;;;;;;;3967:133;1940:94;;;;;;;;;;-1:-1:-1;1940:94:5;;;;;;;;;;;;;;;;5295:25:15;;;5351:2;5336:18;;5329:34;;;;5379:18;;;5372:34;5283:2;5268:18;1940:94:5;5093:319:15;1841:93:5;;;;;;;;;;-1:-1:-1;1841:93:5;;;;;;;;;;;;1911:198:13;;;;;;;;;;-1:-1:-1;1911:198:13;;;;;:::i;:::-;;:::i;14749:307:5:-;;;;;;;;;;-1:-1:-1;14749:307:5;;;;;:::i;:::-;;:::i;4105:146::-;4180:4;4191:39;719:10:3;4214:7:5;4223:6;4191:8;:39::i;:::-;-1:-1:-1;4242:4:5;4105:146;;;;:::o;17398:102::-;1075:7:13;1101:6;-1:-1:-1;;;;;1101:6:13;719:10:3;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;;;;;;;;;17467:28:5::1;17487:7;17467:19;:28::i;:::-;17398:102:::0;:::o;4256:403::-;4354:4;4365:36;4375:6;4383:9;4394:6;4365:9;:36::i;:::-;-1:-1:-1;;;;;4435:18:5;;4408:24;4435:18;;;:10;:18;;;;;;;;719:10:3;4435:32:5;;;;;;;;4480:26;;;;4472:79;;;;-1:-1:-1;;;4472:79:5;;5980:2:15;4472:79:5;;;5962:21:15;6019:2;5999:18;;;5992:30;6058:34;6038:18;;;6031:62;-1:-1:-1;;;6109:18:15;;;6102:38;6157:19;;4472:79:5;5778:404:15;4472:79:5;4574:57;4583:6;719:10:3;4624:6:5;4605:16;:25;4574:8;:57::i;:::-;4650:4;4643:11;;;4256:403;;;;;;:::o;16752:188::-;1075:7:13;1101:6;-1:-1:-1;;;;;1101:6:13;719:10:3;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;16846:3:5::1;16837:6;;:12;;;;:::i;:::-;16827:5;:23;;16819:88;;;::::0;-1:-1:-1;;;16819:88:5;;6743:2:15;16819:88:5::1;::::0;::::1;6725:21:15::0;6782:2;6762:18;;;6755:30;6821:34;6801:18;;;6794:62;-1:-1:-1;;;6872:18:15;;;6865:50;6932:19;;16819:88:5::1;6541:416:15::0;16819:88:5::1;16912:15;:23:::0;16752:188::o;5245:228::-;5312:7;5345:6;;5334:7;:17;;5326:72;;;;-1:-1:-1;;;5326:72:5;;7164:2:15;5326:72:5;;;7146:21:15;7203:2;7183:18;;;7176:30;7242:34;7222:18;;;7215:62;-1:-1:-1;;;7293:18:15;;;7286:40;7343:19;;5326:72:5;6962:406:15;5326:72:5;5403:19;5425:10;:8;:10::i;:::-;5403:32;-1:-1:-1;5447:21:5;5403:32;5447:7;:21;:::i;13846:452::-;1075:7:13;1101:6;-1:-1:-1;;;;;1101:6:13;719:10:3;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;13912:11:5::1;::::0;::::1;;13911:12;13903:41;;;::::0;-1:-1:-1;;;13903:41:5;;7575:2:15;13903:41:5::1;::::0;::::1;7557:21:15::0;7614:2;7594:18;;;7587:30;-1:-1:-1;;;7633:18:15;;;7626:46;7689:18;;13903:41:5::1;7373:340:15::0;13903:41:5::1;14234:59;14252:4;14259:7;1075::13::0;1101:6;-1:-1:-1;;;;;1101:6:13;;1029:85;14259:7:5::1;14268:24;14286:4;14268:9;:24::i;:::-;14234:9;:59::i;:::-;13846:452::o:0;15061:186::-;1075:7:13;1101:6;-1:-1:-1;;;;;1101:6:13;719:10:3;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;-1:-1:-1;;;;;15132:16:5;::::1;;::::0;;;:7:::1;:16;::::0;;;;;::::1;;15124:57;;;::::0;-1:-1:-1;;;15124:57:5;;7920:2:15;15124:57:5::1;::::0;::::1;7902:21:15::0;7959:2;7939:18;;;7932:30;7998;7978:18;;;7971:58;8046:18;;15124:57:5::1;7718:352:15::0;15124:57:5::1;-1:-1:-1::0;;;;;15186:16:5;::::1;15205:5;15186:16:::0;;;:7:::1;:16;::::0;;;;;;;;:24;;-1:-1:-1;;15186:24:5::1;::::0;;15220:22;;3339:51:15;;;15220:22:5::1;::::0;3312:18:15;15220:22:5::1;;;;;;;;15061:186:::0;:::o;4664:199::-;719:10:3;4752:4:5;4795:24;;;:10;:24;;;;;;;;-1:-1:-1;;;;;4795:33:5;;;;;;;;;;4752:4;;4763:79;;4786:7;;4795:46;;4831:10;;4795:46;:::i;:::-;4763:8;:79::i;14394:350::-;14474:9;;-1:-1:-1;;;;;14474:9:5;14452:10;:32;14444:97;;;;-1:-1:-1;;;14444:97:5;;8410:2:15;14444:97:5;;;8392:21:15;8449:2;8429:18;;;8422:30;8488:34;8468:18;;;8461:62;-1:-1:-1;;;8539:18:15;;;8532:50;8599:19;;14444:97:5;8208:416:15;14444:97:5;14657:10;;:14;;14670:1;14657:14;:::i;:::-;14637:15;:35;14633:107;;-1:-1:-1;;;;;14680:16:5;;;;;;:7;:16;;;;;;;;;:23;;-1:-1:-1;;14680:23:5;14699:4;14680:23;;;14714:20;;3339:51:15;;;14714:20:5;;3312:18:15;14714:20:5;3162:234:15;16528:219:5;1075:7:13;1101:6;-1:-1:-1;;;;;1101:6:13;719:10:3;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;16618:22:5::1;::::0;-1:-1:-1;;;;;16618:31:5;;::::1;:22:::0;::::1;:31;;16610:97;;;::::0;-1:-1:-1;;;16610:97:5;;8831:2:15;16610:97:5::1;::::0;::::1;8813:21:15::0;8870:2;8850:18;;;8843:30;8909:34;8889:18;;;8882:62;-1:-1:-1;;;8960:18:15;;;8953:51;9021:19;;16610:97:5::1;8629:417:15::0;16610:97:5::1;16712:22;:30:::0;;-1:-1:-1;;;;;;16712:30:5::1;-1:-1:-1::0;;;;;16712:30:5;;;::::1;::::0;;;::::1;::::0;;16528:219::o;15961:106::-;1075:7:13;1101:6;-1:-1:-1;;;;;1101:6:13;719:10:3;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;16032:22:5::1;:30:::0;;;::::1;;;;-1:-1:-1::0;;16032:30:5;;::::1;::::0;;;::::1;::::0;;15961:106::o;16072:109::-;1075:7:13;1101:6;-1:-1:-1;;;;;1101:6:13;719:10:3;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;16146:22:5::1;:30:::0;16072:109::o;3614:191::-;-1:-1:-1;;;;;3698:30:5;;3680:7;3698:30;;;:21;:30;;;;;;;;3694:58;;;-1:-1:-1;;;;;;3737:15:5;;;;;:6;:15;;;;;;;3614:191::o;3694:58::-;-1:-1:-1;;;;;3784:15:5;;;;;;:6;:15;;;;;;3764:36;;:19;:36::i;:::-;3757:43;3614:191;-1:-1:-1;;3614:191:5:o;1661:101:13:-;1075:7;1101:6;-1:-1:-1;;;;;1101:6:13;719:10:3;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;1725:30:::1;1752:1;1725:18;:30::i;14303:86:5:-:0;1075:7:13;1101:6;-1:-1:-1;;;;;1101:6:13;719:10:3;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;14360:8:5::1;::::0;:24:::1;::::0;-1:-1:-1;;;14360:24:5;;::::1;::::0;::::1;1662:25:15::0;;;-1:-1:-1;;;;;14360:8:5;;::::1;::::0;:16:::1;::::0;1635:18:15;;14360:24:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;14303:86:::0;:::o;15252:253::-;1075:7:13;1101:6;-1:-1:-1;;;;;1101:6:13;719:10:3;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;-1:-1:-1;;;;;15321:21:5;::::1;15313:70;;;::::0;-1:-1:-1;;;15313:70:5;;9253:2:15;15313:70:5::1;::::0;::::1;9235:21:15::0;9292:2;9272:18;;;9265:30;9331:34;9311:18;;;9304:62;-1:-1:-1;;;9382:18:15;;;9375:34;9426:19;;15313:70:5::1;9051:400:15::0;15313:70:5::1;15413:9;::::0;-1:-1:-1;;;;;15396:27:5;;::::1;15413:9:::0;::::1;15396:27;;15388:78;;;::::0;-1:-1:-1;;;15388:78:5;;9658:2:15;15388:78:5::1;::::0;::::1;9640:21:15::0;9697:2;9677:18;;;9670:30;9736:34;9716:18;;;9709:62;-1:-1:-1;;;9787:18:15;;;9780:36;9833:19;;15388:78:5::1;9456:402:15::0;15388:78:5::1;15471:9;:29:::0;;-1:-1:-1;;;;;;15471:29:5::1;-1:-1:-1::0;;;;;15471:29:5;;;::::1;::::0;;;::::1;::::0;;15252:253::o;12028:1813::-;1075:7:13;1101:6;-1:-1:-1;;;;;1101:6:13;719:10:3;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;12140:11:5::1;::::0;12119:4:::1;::::0;12140:11:::1;;12139:12;12131:41;;;::::0;-1:-1:-1;;;12131:41:5;;7575:2:15;12131:41:5::1;::::0;::::1;7557:21:15::0;7614:2;7594:18;;;7587:30;-1:-1:-1;;;7633:18:15;;;7626:46;7689:18;;12131:41:5::1;7373:340:15::0;12131:41:5::1;12199:2;12185:10;:16;;12177:73;;;::::0;-1:-1:-1;;;12177:73:5;;10065:2:15;12177:73:5::1;::::0;::::1;10047:21:15::0;10104:2;10084:18;;;10077:30;10143:34;10123:18;;;10116:62;-1:-1:-1;;;10194:18:15;;;10187:42;10246:19;;12177:73:5::1;9863:408:15::0;12177:73:5::1;12257:26;12286:15;12296:4;12286:9;:15::i;:::-;12257:44;;12346:1;12337:6;;:10;;;;:::i;:::-;12314:18;:34;;12306:107;;;::::0;-1:-1:-1;;;12306:107:5;;10478:2:15;12306:107:5::1;::::0;::::1;10460:21:15::0;10517:2;10497:18;;;10490:30;10556:34;10536:18;;;10529:62;10627:30;10607:18;;;10600:58;10675:19;;12306:107:5::1;10276:424:15::0;12306:107:5::1;12420:31;693:42;12420:93;;12587:15;12614:6;-1:-1:-1::0;;;;;12614:12:5::1;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12586:42;;;;;;;;;;12653:7;12641:9;:19;12633:71;;;::::0;-1:-1:-1;;;12633:71:5;;11730:2:15;12633:71:5::1;::::0;::::1;11712:21:15::0;11769:2;11749:18;;;11742:30;11808:34;11788:18;;;11781:62;-1:-1:-1;;;11859:18:15;;;11852:37;11906:19;;12633:71:5::1;11528:403:15::0;12633:71:5::1;12711:23;12737:19;12749:7:::0;12737:9:::1;:19;:::i;:::-;12711:45;;12788:9;12769:15;:28;;12761:71;;;::::0;-1:-1:-1;;;12761:71:5;;12268:2:15;12761:71:5::1;::::0;::::1;12250:21:15::0;12307:2;12287:18;;;12280:30;12346:32;12326:18;;;12319:60;12396:18;;12761:71:5::1;12066:354:15::0;12761:71:5::1;12891:6;::::0;:16:::1;::::0;;-1:-1:-1;;;12891:16:5;;;;12857:19:::1;::::0;-1:-1:-1;;;;;12891:6:5::1;::::0;:14:::1;::::0;:16:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:6;:16:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;12879:40:5::1;;12920:4;12926:6;;;;;;;;;-1:-1:-1::0;;;;;12926:6:5::1;-1:-1:-1::0;;;;;12926:11:5::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12879:61;::::0;-1:-1:-1;;;;;;12879:61:5::1;::::0;;;;;;-1:-1:-1;;;;;12911:15:15;;;12879:61:5::1;::::0;::::1;12893:34:15::0;12963:15;;12943:18;;;12936:43;12828:18;;12879:61:5::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;12945:38:5;::::1;;::::0;;;:25:::1;:38;::::0;;;;;;;:45;;12986:4:::1;-1:-1:-1::0;;12945:45:5;;::::1;::::0;::::1;::::0;;;12995:23:::1;:36:::0;;;;;:43;;;;::::1;::::0;;::::1;::::0;;13050:21:::1;:34:::0;;;;;;12945:38;;-1:-1:-1;12945:45:5::1;13050:34;13045:85;;13092:32;13112:11;13092:19;:32::i;:::-;13179:6;::::0;13156:51:::1;::::0;13165:4;;-1:-1:-1;;;;;13179:6:5::1;13188:18:::0;13156:8:::1;:51::i;:::-;13212:6;::::0;:102:::1;::::0;-1:-1:-1;;;13212:102:5;;-1:-1:-1;;;;;13349:15:15;;;13212:102:5::1;::::0;::::1;13331:34:15::0;;;13381:18;;;13374:34;;;13212:6:5::1;13424:18:15::0;;;13417:34;;;13467:18;;;13460:34;13510:19;;;13503:44;13298:15:5::1;13563:19:15::0;;;13556:35;13212:6:5;;::::1;::::0;:22:::1;::::0;13243:15;;13265:19:15;;13212:102:5::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;13403:23:5::1;::::0;-1:-1:-1;;;13403:23:5;;-1:-1:-1;;;;;3357:32:15;;;13403:23:5::1;::::0;::::1;3339:51:15::0;13366:11:5;;-1:-1:-1;13342:14:5::1;::::0;13403:17;;::::1;::::0;::::1;::::0;3312:18:15;;13403:23:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13439:41;::::0;-1:-1:-1;;;13439:41:5;;-1:-1:-1;;;;;14294:32:15;;;13439:41:5::1;::::0;::::1;14276:51:15::0;14343:18;;;14336:34;;;13385:41:5;;-1:-1:-1;13439:15:5;;::::1;::::0;::::1;::::0;14249:18:15;;13439:41:5::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13431:85;;;::::0;-1:-1:-1;;;13431:85:5;;14833:2:15;13431:85:5::1;::::0;::::1;14815:21:15::0;14872:2;14852:18;;;14845:30;14911:33;14891:18;;;14884:61;14962:18;;13431:85:5::1;14631:355:15::0;13431:85:5::1;-1:-1:-1::0;;;;;13523:18:5;::::1;;13550:7:::0;13567;13577;13605:21:::1;:10:::0;13619:6:::1;13605:21;:::i;:::-;13586:41;::::0;:15:::1;:41;:::i;:::-;13637:1;13641:4;13655:7;1075::13::0;1101:6;-1:-1:-1;;;;;1101:6:13;;1029:85;13655:7:5::1;13523:141;::::0;::::1;::::0;;;-1:-1:-1;;;;;;13523:141:5;;;-1:-1:-1;;;;;15533:15:15;;;13523:141:5::1;::::0;::::1;15515:34:15::0;15565:18;;;15558:34;;;;15608:18;;;15601:34;;;;15671:15;;;15651:18;;;15644:43;15731:14;15724:22;15703:19;;;15696:51;15784:15;;;15763:19;;;15756:44;15449:19;;13523:141:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;13695:9:5::1;::::0;:29:::1;::::0;-1:-1:-1;;;13695:29:5;;-1:-1:-1;;;;;3357:32:15;;;13695:29:5::1;::::0;::::1;3339:51:15::0;13695:9:5;;::::1;::::0;-1:-1:-1;13695:16:5::1;::::0;-1:-1:-1;3312:18:15;;;-1:-1:-1;13695:29:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;13766:11:5::1;:18:::0;;-1:-1:-1;;13766:18:5::1;13780:4;13766:18;::::0;;-1:-1:-1;;13802:12:5::1;13789:10;:25:::0;13826:10:::1;::::0;::::1;::::0;13766:11:::1;::::0;13826:10:::1;12091:1750;;;;;;;;12028:1813:::0;:::o;15510:446::-;1075:7:13;1101:6;-1:-1:-1;;;;;1101:6:13;719:10:3;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;15684:2:5::1;15668:11:::0;15640:25:::1;15653:12:::0;15640:10;:25:::1;:::i;:::-;:39;;;;:::i;:::-;15639:47;;15631:108;;;::::0;-1:-1:-1;;;15631:108:5;;16013:2:15;15631:108:5::1;::::0;::::1;15995:21:15::0;16052:2;16032:18;;;16025:30;16091:34;16071:18;;;16064:62;-1:-1:-1;;;16142:18:15;;;16135:46;16198:19;;15631:108:5::1;15811:412:15::0;15631:108:5::1;15767:103;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;15877:75;::::1;;;15899:14:::0;;:7:::1;:14:::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;15877:75:::1;;;15931:15:::0;;:8:::1;:15:::0;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;-1:-1:-1;;;;15510:446:5:o;4868:372::-;719:10:3;4961:4:5;4999:24;;;:10;:24;;;;;;;;-1:-1:-1;;;;;4999:33:5;;;;;;;;;;5045:35;;;;5037:85;;;;-1:-1:-1;;;5037:85:5;;16430:2:15;5037:85:5;;;16412:21:15;16469:2;16449:18;;;16442:30;16508:34;16488:18;;;16481:62;-1:-1:-1;;;16559:18:15;;;16552:35;16604:19;;5037:85:5;16228:401:15;5037:85:5;5145:67;719:10:3;5168:7:5;5196:15;5177:16;:34;5145:8;:67::i;:::-;-1:-1:-1;5231:4:5;;4868:372;-1:-1:-1;;;4868:372:5:o;3810:152::-;3888:4;3899:42;719:10:3;3923:9:5;3934:6;3899:9;:42::i;17164:229::-;1075:7:13;1101:6;-1:-1:-1;;;;;1101:6:13;719:10:3;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;-1:-1:-1;;;;;17261:32:5;::::1;;::::0;;;:23:::1;:32;::::0;;;;;::::1;;:41;;::::0;::::1;;;;17253:90;;;;-1:-1:-1::0;;;17253:90:5::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;17348:32:5;;;::::1;;::::0;;;:23:::1;:32;::::0;;;;:40;;-1:-1:-1;;17348:40:5::1;::::0;::::1;;::::0;;;::::1;::::0;;17164:229::o;16945:214::-;1075:7:13;1101:6;-1:-1:-1;;;;;1101:6:13;719:10:3;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;-1:-1:-1;;;;;17037:27:5;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;:36;;::::0;::::1;;;;17029:85;;;;-1:-1:-1::0;;;17029:85:5::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;17119:27:5;;;::::1;;::::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;17119:35:5::1;::::0;::::1;;::::0;;;::::1;::::0;;16945:214::o;17505:98::-;1075:7:13;1101:6;-1:-1:-1;;;;;1101:6:13;719:10:3;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;17572:26:5::1;17590:7;17572:17;:26::i;16186:337::-:0;1075:7:13;1101:6;-1:-1:-1;;;;;1101:6:13;719:10:3;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;16305:3:5::1;16296:6;;:12;;;;:::i;:::-;16285:6;:24;;16277:87;;;::::0;-1:-1:-1;;;16277:87:5;;17241:2:15;16277:87:5::1;::::0;::::1;17223:21:15::0;17280:2;17260:18;;;17253:30;17319:34;17299:18;;;17292:62;-1:-1:-1;;;17370:18:15;;;17363:48;17428:19;;16277:87:5::1;17039:414:15::0;16277:87:5::1;16398:3;16389:6;;:12;;;;:::i;:::-;16377:7;:25;;16369:89;;;::::0;-1:-1:-1;;;16369:89:5;;17660:2:15;16369:89:5::1;::::0;::::1;17642:21:15::0;17699:2;17679:18;;;17672:30;17738:34;17718:18;;;17711:62;-1:-1:-1;;;17789:18:15;;;17782:49;17848:19;;16369:89:5::1;17458:415:15::0;16369:89:5::1;16465:14;:23:::0;;;;16493:15:::1;:25:::0;16186:337::o;1911:198:13:-;1075:7;1101:6;-1:-1:-1;;;;;1101:6:13;719:10:3;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;-1:-1:-1;;;;;1999:22:13;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:13;;18080:2:15;1991:73:13::1;::::0;::::1;18062:21:15::0;18119:2;18099:18;;;18092:30;18158:34;18138:18;;;18131:62;-1:-1:-1;;;18209:18:15;;;18202:36;18255:19;;1991:73:13::1;17878:402:15::0;1991:73:13::1;2074:28;2093:8;2074:18;:28::i;14749:307:5:-:0;1075:7:13;1101:6;-1:-1:-1;;;;;1101:6:13;719:10:3;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;;;;;;:::i;:::-;-1:-1:-1;;;;;14820:16:5;::::1;;::::0;;;:7:::1;:16;::::0;;;;;::::1;;14812:57;;;::::0;-1:-1:-1;;;14812:57:5;;7920:2:15;14812:57:5::1;::::0;::::1;7902:21:15::0;7959:2;7939:18;;;7932:30;7998;7978:18;;;7971:58;8046:18;;14812:57:5::1;7718:352:15::0;14812:57:5::1;14876:15;14894:18;14904:7;14894:9;:18::i;:::-;14876:36;;14935:1;14925:7;:11;14917:50;;;::::0;-1:-1:-1;;;14917:50:5;;18487:2:15;14917:50:5::1;::::0;::::1;18469:21:15::0;18526:2;18506:18;;;18499:30;18565:28;18545:18;;;18538:56;18611:18;;14917:50:5::1;18285:350:15::0;14917:50:5::1;14974:42;14984:7;15001:4;15008:7;14974:9;:42::i;:::-;15028:23;::::0;-1:-1:-1;;;;;3357:32:15;;3339:51;;15028:23:5::1;::::0;3327:2:15;3312:18;15028:23:5::1;;;;;;;14807:249;14749:307:::0;:::o;7396:315::-;-1:-1:-1;;;;;7483:21:5;;7475:70;;;;-1:-1:-1;;;7475:70:5;;18842:2:15;7475:70:5;;;18824:21:15;18881:2;18861:18;;;18854:30;18920:34;18900:18;;;18893:62;-1:-1:-1;;;18971:18:15;;;18964:34;19015:19;;7475:70:5;18640:400:15;7475:70:5;-1:-1:-1;;;;;7558:23:5;;7550:70;;;;-1:-1:-1;;;7550:70:5;;19247:2:15;7550:70:5;;;19229:21:15;19286:2;19266:18;;;19259:30;19325:34;19305:18;;;19298:62;-1:-1:-1;;;19376:18:15;;;19369:32;19418:19;;7550:70:5;19045:398:15;7550:70:5;-1:-1:-1;;;;;7627:17:5;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;;;;;:35;;;7674:32;;1662:25:15;;;7674:32:5;;1635:18:15;7674:32:5;;;;;;;7396:315;;;:::o;11309:316::-;-1:-1:-1;;;;;11377:30:5;;;;;;:21;:30;;;;;;;;11376:31;11368:84;;;;-1:-1:-1;;;11368:84:5;;19650:2:15;11368:84:5;;;19632:21:15;19689:2;19669:18;;;19662:30;19728:34;19708:18;;;19701:62;-1:-1:-1;;;19779:18:15;;;19772:38;19827:19;;11368:84:5;19448:404:15;11368:84:5;-1:-1:-1;;;;;11463:15:5;;11481:1;11463:15;;;:6;:15;;;;;;:19;11459:91;;-1:-1:-1;;;;;11528:15:5;;;;;;:6;:15;;;;;;11508:36;;:19;:36::i;:::-;-1:-1:-1;;;;;11490:15:5;;;;;;:6;:15;;;;;:54;11459:91;-1:-1:-1;;;;;11556:30:5;;;;;:21;:30;;;;;:37;;-1:-1:-1;;11556:37:5;11589:4;11556:37;;;;;;11598:8;:22;;;;;;;;;;;;;;-1:-1:-1;;;;;;11598:22:5;;;;;;11309:316::o;7716:1541::-;-1:-1:-1;;;;;7798:20:5;;7790:70;;;;-1:-1:-1;;;7790:70:5;;20059:2:15;7790:70:5;;;20041:21:15;20098:2;20078:18;;;20071:30;20137:34;20117:18;;;20110:62;-1:-1:-1;;;20188:18:15;;;20181:35;20233:19;;7790:70:5;19857:401:15;7790:70:5;-1:-1:-1;;;;;7873:18:5;;7865:66;;;;-1:-1:-1;;;7865:66:5;;20465:2:15;7865:66:5;;;20447:21:15;20504:2;20484:18;;;20477:30;20543:34;20523:18;;;20516:62;-1:-1:-1;;;20594:18:15;;;20587:33;20637:19;;7865:66:5;20263:399:15;7865:66:5;7953:1;7944:6;:10;7936:64;;;;-1:-1:-1;;;7936:64:5;;20869:2:15;7936:64:5;;;20851:21:15;20908:2;20888:18;;;20881:30;20947:34;20927:18;;;20920:62;-1:-1:-1;;;20998:18:15;;;20991:39;21047:19;;7936:64:5;20667:405:15;7936:64:5;8023:15;8033:4;8023:9;:15::i;:::-;8013:6;:25;;8005:87;;;;-1:-1:-1;;;8005:87:5;;21279:2:15;8005:87:5;;;21261:21:15;21318:2;21298:18;;;21291:30;21357:34;21337:18;;;21330:62;-1:-1:-1;;;21408:18:15;;;21401:47;21465:19;;8005:87:5;21077:413:15;8005:87:5;-1:-1:-1;;;;;8106:13:5;;;;;;:7;:13;;;;;;;;8105:14;8097:45;;;;-1:-1:-1;;;8097:45:5;;21697:2:15;8097:45:5;;;21679:21:15;21736:2;21716:18;;;21709:30;-1:-1:-1;;;21755:18:15;;;21748:48;21813:18;;8097:45:5;21495:342:15;8097:45:5;-1:-1:-1;;;;;8165:31:5;;8149:13;8165:31;;;:25;:31;;;;;;8223:11;;8165:31;;;;;8149:13;8223:11;:40;;;;-1:-1:-1;;;;;;8239:24:5;;;;;;:18;:24;;;;;;;;8238:25;8223:40;:67;;;;-1:-1:-1;;;;;;8268:22:5;;;;;;:18;:22;;;;;;;;8267:23;8223:67;8301:11;;8201:89;;-1:-1:-1;8301:11:5;;8297:891;;;-1:-1:-1;;;;;8352:29:5;;;;;;:25;:29;;;;;;;;8351:30;:62;;;;-1:-1:-1;;;;;;8386:27:5;;;;;;:23;:27;;;;;;;;8385:28;8351:62;8347:185;;;8458:15;;8447:6;8431:13;8441:2;8431:9;:13::i;:::-;:22;;;;:::i;:::-;8430:43;;8422:103;;;;-1:-1:-1;;;8422:103:5;;22044:2:15;8422:103:5;;;22026:21:15;22083:2;22063:18;;;22056:30;22122:34;22102:18;;;22095:62;-1:-1:-1;;;22173:18:15;;;22166:45;22228:19;;8422:103:5;21842:411:15;8422:103:5;8572:14;8568:147;;;8614:8;:43;;8642:15;;8614:43;;;8625:14;;8614:43;8603:6;:55;;8595:113;;;;-1:-1:-1;;;8595:113:5;;22460:2:15;8595:113:5;;;22442:21:15;22499:2;22479:18;;;22472:30;22538:34;22518:18;;;22511:62;-1:-1:-1;;;22589:18:15;;;22582:43;22642:19;;8595:113:5;22258:409:15;8595:113:5;8771:10;;:14;;8784:1;8771:14;:::i;:::-;8754:12;:32;8750:79;;8795:9;;:27;;-1:-1:-1;;;8795:27:5;;-1:-1:-1;;;;;12911:15:15;;;8795:27:5;;;12893:34:15;12963:15;;;12943:18;;;12936:43;8795:9:5;;;;:17;;12828:18:15;;8795:27:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8750:79;8856:15;8874:24;8892:4;8874:9;:24::i;:::-;8908:22;;8856:42;;-1:-1:-1;8908:22:5;;;;;:48;;;;-1:-1:-1;8935:21:5;;;;8934:22;8908:48;:85;;;;;8971:22;;8960:7;:33;;8908:85;:121;;;;-1:-1:-1;;;;;;8998:31:5;;;;;;:25;:31;;;;;;;;8997:32;8908:121;8904:279;;;9038:21;:28;;-1:-1:-1;;9038:28:5;9062:4;9038:28;;;9096:15;;9073:67;;9086:25;;:53;;9132:7;9073:12;:67::i;9086:53::-;9114:15;;9073:12;:67::i;:::-;9147:21;:29;;-1:-1:-1;;9147:29:5;;;8904:279;8314:874;8297:891;9194:58;9209:4;9215:2;9219:6;9227:8;9237:14;9194;:58::i;6790:146::-;6832:7;6847:15;6864;6883:19;:17;:19::i;:::-;6846:56;;-1:-1:-1;6846:56:5;-1:-1:-1;6914:17:5;6846:56;;6914:17;:::i;:::-;6907:24;;;;6790:146;:::o;2263:187:13:-;2336:16;2355:6;;-1:-1:-1;;;;;2371:17:13;;;-1:-1:-1;;;;;;2371:17:13;;;;;;2403:40;;2355:6;;;;;;;2403:40;;2336:16;2403:40;2326:124;2263:187;:::o;11630:393:5:-;-1:-1:-1;;;;;11695:30:5;;;;;;:21;:30;;;;;;;;11687:79;;;;-1:-1:-1;;;11687:79:5;;22874:2:15;11687:79:5;;;22856:21:15;22913:2;22893:18;;;22886:30;22952:34;22932:18;;;22925:62;-1:-1:-1;;;23003:18:15;;;22996:34;23047:19;;11687:79:5;22672:400:15;11687:79:5;11778:9;11773:246;11797:8;:15;11793:19;;11773:246;;;11844:7;-1:-1:-1;;;;;11829:22:5;:8;11838:1;11829:11;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;11829:11:5;:22;11825:189;;;11874:8;11883:15;;:19;;11901:1;;11883:19;:::i;:::-;11874:29;;;;;;;;:::i;:::-;;;;;;;;;;;11860:8;:11;;-1:-1:-1;;;;;11874:29:5;;;;11869:1;;11860:11;;;;;;:::i;:::-;;;;;;;;;;;;;:43;;-1:-1:-1;;;;;;11860:43:5;-1:-1:-1;;;;;11860:43:5;;;;;;11910:15;;;;;:6;:15;;;;;;:19;;;11936:21;:30;;;;:38;;-1:-1:-1;;11936:38:5;;;11981:8;:14;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;11981:14:5;;;;;-1:-1:-1;;;;;;11981:14:5;;;;;;11773:246;11630:393;:::o;11825:189::-;11814:3;;;;:::i;:::-;;;;11773:246;;;;11630:393;:::o;10278:679::-;10369:19;;10346:20;;10329:14;;10346:42;;;:::i;:::-;10329:59;-1:-1:-1;10397:11:5;10393:24;;10410:7;10278:679;:::o;10393:24::-;10452:30;10475:6;10452:22;:30::i;:::-;10620:20;;10553:21;;10533:17;;10643:6;;10608:32;;10553:21;10608:32;:::i;:::-;:41;;;;:::i;:::-;10579:70;-1:-1:-1;10654:25:5;10682:30;10579:70;10682:9;:30;:::i;:::-;10654:58;-1:-1:-1;10743:22:5;;10739:91;;10773:22;;:51;;-1:-1:-1;;;;;10773:22:5;;;;:51;;;;;10805:18;;10773:22;:51;:22;:51;10805:18;10773:22;:51;;;;;;;;;;;;;;;;;;;;;10739:91;10840:21;;10836:84;;10869:8;;;;;;;;;-1:-1:-1;;;;;10869:8:5;-1:-1:-1;;;;;10869:16:5;;10894:17;10869:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10836:84;10931:21;;1662:25:15;;;10931:21:5;;1650:2:15;1635:18;10931:21:5;;;;;;;10324:633;;;;10278:679;:::o;9574:699::-;9699:26;9728:45;9739:7;9748:8;9758:14;9728:10;:45::i;:::-;-1:-1:-1;;;;;9784:29:5;;;;;;:21;:29;;;;;;9699:74;;-1:-1:-1;9784:29:5;;9780:72;;;-1:-1:-1;;;;;9821:14:5;;;;;;:6;:14;;;;;:25;;9839:7;;9821:14;:25;;9839:7;;9821:25;:::i;:::-;;;;-1:-1:-1;;9780:72:5;-1:-1:-1;;;;;9862:32:5;;;;;;:21;:32;;;;;;;;9858:90;;;9923:19;;;;-1:-1:-1;;;;;9902:17:5;;;;;;:6;:17;;;;;:40;;:17;;;:40;;9923:19;;9902:40;:::i;:::-;;;;-1:-1:-1;;9858:90:5;9972:11;;-1:-1:-1;;;;;9954:14:5;;9972:11;9954:14;;;:6;:14;;;;;:29;;:14;;9972:11;9954:29;;9972:11;;9954:29;:::i;:::-;;;;-1:-1:-1;;10009:19:5;;;;;-1:-1:-1;;;;;9988:17:5;;;;;;:6;:17;;;;;;:40;;10009:19;;9988:17;;:40;;10009:19;;9988:40;:::i;:::-;;;;-1:-1:-1;;10035:174:5;;;;10061:33;10078:3;:15;;;10061:16;:33::i;:::-;10100:44;10115:3;:13;;;10130:3;:13;;;10100:14;:44::i;:::-;10182:4;-1:-1:-1;;;;;10157:46:5;10166:6;-1:-1:-1;;;;;10157:46:5;;10189:3;:13;;;10157:46;;;;1662:25:15;;1650:2;1635:18;;1516:177;10157:46:5;;;;;;;;10035:174;10237:9;-1:-1:-1;;;;;10220:48:5;10229:6;-1:-1:-1;;;;;10220:48:5;;10248:3;:19;;;10220:48;;;;1662:25:15;;1650:2;1635:18;;1516:177;10220:48:5;;;;;;;;9694:579;9574:699;;;;;:::o;6941:450::-;7033:6;;7062;;6992:7;;;;;7075:221;7099:8;:15;7095:19;;7075:221;;;7153:7;7131:6;:19;7138:8;7147:1;7138:11;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;7138:11:5;7131:19;;;;;;;;;;;;;:29;;:62;;;7186:7;7164:6;:19;7171:8;7180:1;7171:11;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;7171:11:5;7164:19;;;;;;;;;;;;;:29;7131:62;7127:91;;;7203:6;;7211;;7195:23;;;;;;;6941:450;;:::o;7127:91::-;7235:6;:19;7242:8;7251:1;7242:11;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;7242:11:5;7235:19;;;;;;;;;;;;;7224:30;;;;:::i;:::-;;;7271:6;:19;7278:8;7287:1;7278:11;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;7278:11:5;7271:19;;;;;;;;;;;;;7260:30;;;;:::i;:::-;;-1:-1:-1;7116:3:5;;;;:::i;:::-;;;;7075:221;;;;7325:6;;7316;;:15;;;;:::i;:::-;7306:7;:25;7302:54;;;7341:6;;7349;;7333:23;;;;;;6941:450;;:::o;7302:54::-;7369:7;;7378;;-1:-1:-1;6941:450:5;-1:-1:-1;6941:450:5:o;10962:342::-;11084:16;;;11098:1;11084:16;;;;;;;;11048:4;;11025:12;;11084:16;11098:1;11084:16;;;;;;;;;;-1:-1:-1;11084:16:5;11060:40;;11115:4;11105;11110:1;11105:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11105:14:5;;;:7;;;;;;;;;;:14;;;;11134:6;;:13;;;-1:-1:-1;;;11134:13:5;;;;:6;;;;;:11;;:13;;;;;11105:7;;11134:13;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11124:4;11129:1;11124:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11124:23:5;;;:7;;;;;;;;;:23;11177:6;;11154:41;;11163:4;;11177:6;11186:8;11154;:41::i;:::-;11200:6;;:99;;-1:-1:-1;;;11200:99:5;;-1:-1:-1;;;;;11200:6:5;;;;:57;;:99;;11258:8;;11200:6;;11271:4;;11277;;11283:15;;11200:99;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11020:284;;10962:342;:::o;5478:306::-;5566:26;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5566:26:5;5605:39;5617:7;5626:8;5636:7;5605:11;:39::i;:::-;5599:45;;5718:46;5730:3;5735:7;5744;5753:10;:8;:10::i;:::-;5718:11;:46::i;:::-;5701:13;;;5649:115;5684:15;;;5649:115;5663:19;;;5649:115;;;5478:306;;;;;:::o;9262:86::-;9332:11;9322:6;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;9262:86:5:o;9353:216::-;9451:4;9428:12;9463;;;:6;:12;;;;;:25;;9479:9;;9428:12;9463:25;;9479:9;;9463:25;:::i;:::-;;;;-1:-1:-1;;;;;;;9499:27:5;;;;;;:21;:27;;;;;;;;9495:70;;;-1:-1:-1;;;;;9534:12:5;;;;;;:6;:12;;;;;:25;;9550:9;;9534:12;:25;;9550:9;;9534:25;:::i;:::-;;;;-1:-1:-1;;9495:70:5;9423:146;9353:216;;:::o;5789:470::-;5878:26;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5878:26:5;5916:7;5911:71;;5931:19;;;:29;;;5966:10;;5911:71;5988:18;6009:8;:29;;6030:8;6009:29;;;6020:7;6009:29;5988:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6091:3:5;;6063:25;;:7;:25;:::i;:::-;:31;;;;:::i;:::-;6045:15;;;:49;6146:16;;;;6126:17;;;;6166:3;;6126:36;;;:::i;:::-;6115:48;;:7;:48;:::i;:::-;:54;;;;:::i;:::-;6099:13;;;:70;;;6206:15;;;;6196:25;;:7;:25;:::i;:::-;:41;;;;:::i;:::-;6174:19;;;:63;-1:-1:-1;5789:470:5;;;;;:::o;6264:521::-;6387:15;;;;6484:21;6494:11;6484:7;:21;:::i;:::-;6474:31;;6517:7;6512:57;;-1:-1:-1;6540:7:5;;-1:-1:-1;6558:1:5;;-1:-1:-1;6558:1:5;6532:31;;6512:57;6607:11;6589:3;:15;;;:29;;;;:::i;:::-;6575:43;;6651:11;6635:3;:13;;;:27;;;;:::i;:::-;6623:39;-1:-1:-1;6623:39:5;6685:21;6695:11;6685:7;:21;:::i;:::-;:33;;;;:::i;:::-;6667:51;;6264:521;;;;;;;;;;:::o;14:597:15:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:15;574:15;-1:-1:-1;;570:29:15;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:15:o;616:131::-;-1:-1:-1;;;;;691:31:15;;681:42;;671:70;;737:1;734;727:12;752:315;820:6;828;881:2;869:9;860:7;856:23;852:32;849:52;;;897:1;894;887:12;849:52;936:9;923:23;955:31;980:5;955:31;:::i;:::-;1005:5;1057:2;1042:18;;;;1029:32;;-1:-1:-1;;;752:315:15:o;1264:247::-;1323:6;1376:2;1364:9;1355:7;1351:23;1347:32;1344:52;;;1392:1;1389;1382:12;1344:52;1431:9;1418:23;1450:31;1475:5;1450:31;:::i;1698:456::-;1775:6;1783;1791;1844:2;1832:9;1823:7;1819:23;1815:32;1812:52;;;1860:1;1857;1850:12;1812:52;1899:9;1886:23;1918:31;1943:5;1918:31;:::i;:::-;1968:5;-1:-1:-1;2025:2:15;2010:18;;1997:32;2038:33;1997:32;2038:33;:::i;:::-;1698:456;;2090:7;;-1:-1:-1;;;2144:2:15;2129:18;;;;2116:32;;1698:456::o;2159:180::-;2218:6;2271:2;2259:9;2250:7;2246:23;2242:32;2239:52;;;2287:1;2284;2277:12;2239:52;-1:-1:-1;2310:23:15;;2159:180;-1:-1:-1;2159:180:15:o;2793:118::-;2879:5;2872:13;2865:21;2858:5;2855:32;2845:60;;2901:1;2898;2891:12;2916:241;2972:6;3025:2;3013:9;3004:7;3000:23;2996:32;2993:52;;;3041:1;3038;3031:12;2993:52;3080:9;3067:23;3099:28;3121:5;3099:28;:::i;3401:446::-;3484:6;3492;3500;3508;3561:3;3549:9;3540:7;3536:23;3532:33;3529:53;;;3578:1;3575;3568:12;3529:53;3617:9;3604:23;3636:28;3658:5;3636:28;:::i;:::-;3683:5;3735:2;3720:18;;3707:32;;-1:-1:-1;3786:2:15;3771:18;;3758:32;;3837:2;3822:18;3809:32;;-1:-1:-1;3401:446:15;-1:-1:-1;;;3401:446:15:o;4060:382::-;4125:6;4133;4186:2;4174:9;4165:7;4161:23;4157:32;4154:52;;;4202:1;4199;4192:12;4154:52;4241:9;4228:23;4260:31;4285:5;4260:31;:::i;:::-;4310:5;-1:-1:-1;4367:2:15;4352:18;;4339:32;4380:30;4339:32;4380:30;:::i;:::-;4429:7;4419:17;;;4060:382;;;;;:::o;4447:248::-;4515:6;4523;4576:2;4564:9;4555:7;4551:23;4547:32;4544:52;;;4592:1;4589;4582:12;4544:52;-1:-1:-1;;4615:23:15;;;4685:2;4670:18;;;4657:32;;-1:-1:-1;4447:248:15:o;4700:388::-;4768:6;4776;4829:2;4817:9;4808:7;4804:23;4800:32;4797:52;;;4845:1;4842;4835:12;4797:52;4884:9;4871:23;4903:31;4928:5;4903:31;:::i;:::-;4953:5;-1:-1:-1;5010:2:15;4995:18;;4982:32;5023:33;4982:32;5023:33;:::i;5417:356::-;5619:2;5601:21;;;5638:18;;;5631:30;5697:34;5692:2;5677:18;;5670:62;5764:2;5749:18;;5417:356::o;6187:127::-;6248:10;6243:3;6239:20;6236:1;6229:31;6279:4;6276:1;6269:15;6303:4;6300:1;6293:15;6319:217;6359:1;6385;6375:132;;6429:10;6424:3;6420:20;6417:1;6410:31;6464:4;6461:1;6454:15;6492:4;6489:1;6482:15;6375:132;-1:-1:-1;6521:9:15;;6319:217::o;8075:128::-;8115:3;8146:1;8142:6;8139:1;8136:13;8133:39;;;8152:18;;:::i;:::-;-1:-1:-1;8188:9:15;;8075:128::o;10705:818::-;10847:6;10855;10863;10871;10879;10887;10895;10903;10911;10964:3;10952:9;10943:7;10939:23;10935:33;10932:53;;;10981:1;10978;10971:12;10932:53;11010:9;11004:16;10994:26;;11063:2;11052:9;11048:18;11042:25;11076:31;11101:5;11076:31;:::i;:::-;11126:5;11116:15;;;11171:2;11160:9;11156:18;11150:25;11140:35;;11215:2;11204:9;11200:18;11194:25;11184:35;;11259:3;11248:9;11244:19;11238:26;11228:36;;11304:3;11293:9;11289:19;11283:26;11273:36;;11354:3;11343:9;11339:19;11333:26;11368:33;11393:7;11368:33;:::i;:::-;11420:7;11410:17;;;11467:3;11456:9;11452:19;11446:26;11436:36;;11512:3;11501:9;11497:19;11491:26;11481:36;;10705:818;;;;;;;;;;;:::o;11936:125::-;11976:4;12004:1;12001;11998:8;11995:34;;;12009:18;;:::i;:::-;-1:-1:-1;12046:9:15;;11936:125::o;12425:251::-;12495:6;12548:2;12536:9;12527:7;12523:23;12519:32;12516:52;;;12564:1;12561;12554:12;12516:52;12596:9;12590:16;12615:31;12640:5;12615:31;:::i;13602:306::-;13690:6;13698;13706;13759:2;13747:9;13738:7;13734:23;13730:32;13727:52;;;13775:1;13772;13765:12;13727:52;13804:9;13798:16;13788:26;;13854:2;13843:9;13839:18;13833:25;13823:35;;13898:2;13887:9;13883:18;13877:25;13867:35;;13602:306;;;;;:::o;13913:184::-;13983:6;14036:2;14024:9;14015:7;14011:23;14007:32;14004:52;;;14052:1;14049;14042:12;14004:52;-1:-1:-1;14075:16:15;;13913:184;-1:-1:-1;13913:184:15:o;14381:245::-;14448:6;14501:2;14489:9;14480:7;14476:23;14472:32;14469:52;;;14517:1;14514;14507:12;14469:52;14549:9;14543:16;14568:28;14590:5;14568:28;:::i;14991:168::-;15031:7;15097:1;15093;15089:6;15085:14;15082:1;15079:21;15074:1;15067:9;15060:17;15056:45;15053:71;;;15104:18;;:::i;:::-;-1:-1:-1;15144:9:15;;14991:168::o;16634:400::-;16836:2;16818:21;;;16875:2;16855:18;;;16848:30;16914:34;16909:2;16894:18;;16887:62;-1:-1:-1;;;16980:2:15;16965:18;;16958:34;17024:3;17009:19;;16634:400::o;23077:127::-;23138:10;23133:3;23129:20;23126:1;23119:31;23169:4;23166:1;23159:15;23193:4;23190:1;23183:15;23209:127;23270:10;23265:3;23261:20;23258:1;23251:31;23301:4;23298:1;23291:15;23325:4;23322:1;23315:15;23341:135;23380:3;-1:-1:-1;;23401:17:15;;23398:43;;;23421:18;;:::i;:::-;-1:-1:-1;23468:1:15;23457:13;;23341:135::o;23613:980::-;23875:4;23923:3;23912:9;23908:19;23954:6;23943:9;23936:25;23980:2;24018:6;24013:2;24002:9;23998:18;23991:34;24061:3;24056:2;24045:9;24041:18;24034:31;24085:6;24120;24114:13;24151:6;24143;24136:22;24189:3;24178:9;24174:19;24167:26;;24228:2;24220:6;24216:15;24202:29;;24249:1;24259:195;24273:6;24270:1;24267:13;24259:195;;;24338:13;;-1:-1:-1;;;;;24334:39:15;24322:52;;24429:15;;;;24394:12;;;;24370:1;24288:9;24259:195;;;-1:-1:-1;;;;;;;24510:32:15;;;;24505:2;24490:18;;24483:60;-1:-1:-1;;;24574:3:15;24559:19;24552:35;24471:3;23613:980;-1:-1:-1;;;23613:980:15:o

Swarm Source

ipfs://2b41243493cdec11484c2098149d3d141f911ac8e50ac0d139682ad8c69bffd5
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.