ETH Price: $3,314.52 (-3.48%)
Gas: 23 Gwei

Token

Saja (SAJA)
 

Overview

Max Total Supply

1,000,000,000,000,000,000 SAJA

Holders

73

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
12,348,377,694,392,104.084608469 SAJA

Value
$0.00
0xd877282f5A1a22D7f96A4d3C984EDceacCE44689
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:
Saja

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 7 of 7: Saja.sol
// SPDX-License-Identifier: Unlicensed
pragma solidity ^0.8.6;

import './IERC20.sol';
import './ERC20.sol';
import './Address.sol';
import './Ownable.sol';


library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}


contract Saja is Context, IERC20, Ownable {

    using SafeMath for uint256;
    using Address for address;
    mapping(address => uint256) private _balances;
    mapping(address => bool) private _isExcludedFromRewards;
    mapping(address => bool) private _holdersExist;
    mapping(address => bool) private _isTctHolders;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => uint256) private _blockNumberByAddress;
    address[] private _tctHolders;
    address[] private _holders;
    address[] private alphaRewardAddresses;
    address[] private lionRewardAddresses;
    address[] private lionessRewardAddresses;
    address[] private cubRewardAddresses;
    address[] private defaultRewardAddresses;
    address private _nonBotAddress;
    //default values of tiers at launch
    uint256 private _alphaLionRewardRate = 350;  //3.5%
    uint256 private _lionRewardRate = 275;  //2.75%
    uint256 private _lionessRewardRate = 250;  //2.5%
    uint256 private _cubRewardRate = 225;  //2.25%
    uint256 private _defaultRate = 200;  //2%
    uint256 private _promotionRate = 1500;  //15% in base points for non TCT holders reward
    bool private _doPromotion = true;
    bool private _botDetectorEnabled = true;
    //default tier amounts from tct balances to qualify for extra reflection
    uint256 private _tctCubTier = 25000000000000000000000000000;
    uint256 private _tctLionessTier = 100000000000000000000000000000;
    uint256 private _tctLionTier = 300000000000000000000000000000;
    uint256 private _tctAlphaTier = 500000000000000000000000000000;
    uint256 private constant _tTotal = 1000000000000 * 10 ** 6 * 10 ** 9;
    uint256 private _maxTxAmount = 1000000000000 * 10 ** 6 * 10 ** 9;
    string private _name = 'Saja';
    string private _symbol = 'SAJA';
    uint8 private _decimals = 9;
    address private _deadAddress = 0x000000000000000000000000000000000000dEaD;
    ERC20 private tctToken;

    constructor () {
        //initialize TCT Contract
        tctToken = ERC20(0x84155b2be780C8eCEdFe06CDaD341f295858579D);
        _isExcludedFromRewards[owner()] = true;
        _isExcludedFromRewards[address(this)] = true;
        _balances[_msgSender()] = _tTotal;
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

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

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

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

    function totalSupply() public pure override returns (uint256) {
        return _tTotal;
    }

    function burnAddress() public view returns (address) {
        return _deadAddress;
    }

    function getTctTokenBalance(address addr) public view returns (uint256) {
        return tctToken.balanceOf(addr);
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _balances[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);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function getTctTierSettings() public view returns (uint256, uint256, uint256, uint256)  {
        return (_tctCubTier, _tctLionessTier, _tctLionTier, _tctAlphaTier);
    }

    function getTctRateSettings() public view returns (uint256, uint256, uint256, uint256)  {
        return (_cubRewardRate, _lionessRewardRate, _lionRewardRate, _alphaLionRewardRate);
    }

    function getDefaultReflectionRate() public view returns (uint256)  {
        return _defaultRate;
    }

    function getPromotionSettings() public view returns (bool, uint256)  {
        return (_doPromotion, _promotionRate);
    }

    function isBotDectorEnabled() public view returns (bool) {
        return _botDetectorEnabled;
    }

    function setBotDector(bool enableOnDisable) external onlyOwner() {
        _botDetectorEnabled = enableOnDisable;
    }

    function setRewardRates(uint256 defaultRate, uint256 cubRate, uint256 lionessRate, uint256 lionRate, uint256 alphaLionRate) external onlyOwner() {
        _defaultRate = defaultRate;
        _cubRewardRate = cubRate;
        _lionessRewardRate = lionessRate;
        _lionRewardRate = lionRate;
        _alphaLionRewardRate = alphaLionRate;
    }

    function setTctRewardTier(uint256 cubTier, uint256 LionessTier, uint256 lionTier, uint256 alphaTier) external onlyOwner() {
        _tctCubTier = cubTier;
        _tctLionessTier = LionessTier;
        _tctLionTier = lionTier;
        _tctAlphaTier = alphaTier;
    }

    function setPromotion(uint256 promotionRate, bool doPromotion) external onlyOwner() {
        _doPromotion = doPromotion;
        _promotionRate = promotionRate;
    }

    function initTctContract(address contractAddress) external onlyOwner() {
        tctToken = ERC20(contractAddress);
    }

    function taxFreeTransfers(address[] memory addresses, uint256[] memory amounts) external onlyOwner() {
        for (uint256 i = 0; i < addresses.length; i++) {
            address recipient = addresses[i];
            uint256 amount = amounts[i];
            uint256 senderBalance = _balances[msg.sender].sub(amount);
            _balances[msg.sender] = senderBalance;
            _balances[recipient] = _balances[recipient].add(amount);
            addUpdateHolder(recipient);
            emit Transfer(msg.sender, recipient, amount);
        }
    }

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

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _transfer(address sender, address recipient, uint256 amount) private {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        if (sender != owner() && recipient != owner())
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");

        if (_isExcludedFromRewards[sender] && !_isExcludedFromRewards[recipient]) {
            _transferTaxFree(sender, recipient, amount);
        } else if (!_isExcludedFromRewards[sender] && _isExcludedFromRewards[recipient]) {
            _transferTaxFree(sender, recipient, amount);
        } else if (!_isExcludedFromRewards[sender] && !_isExcludedFromRewards[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcludedFromRewards[sender] && _isExcludedFromRewards[recipient]) {
            _transferTaxFree(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }

    }

    function _transferTaxFree(address sender, address recipient, uint256 amount) private {
        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function getValidTransferAddress(address sender, address recipient) internal virtual returns (address) {
        require(!Address.isContract(sender) || !Address.isContract(recipient), 'Bots are not allowed');
        if (Address.isContract(sender)) return recipient;
        else return sender;
    }

    function verifyOneTxPerBlock(address nonBotAdress) internal virtual {
        bool isNewBlock = _blockNumberByAddress[nonBotAdress] == 0 || _blockNumberByAddress[nonBotAdress] < block.number;
        require(isNewBlock, 'Only one transaction per block is allowed');
    }

    function _transferStandard(address sender, address recipient, uint256 amount) private {

        if (_botDetectorEnabled) {
            _nonBotAddress = getValidTransferAddress(sender, recipient);
            verifyOneTxPerBlock(_nonBotAddress);
        }
        uint256 alphaLionRewardAmount = amount.div(_alphaLionRewardRate);
        uint256 lionRewarAmount = amount.div(_lionRewardRate);
        uint256 lionessRewardAmount = amount.div(_lionessRewardRate);
        uint256 cubRewardAmount = amount.div(_cubRewardRate);
        uint256 defaultRewardAmount = amount.div(_defaultRate);
        uint256 firstTimeHolderIncentiveAmount = 0;
        uint256 taxTotal = alphaLionRewardAmount.add(lionRewarAmount).add(lionessRewardAmount).add(cubRewardAmount).add(defaultRewardAmount);
        if (_doPromotion && !_holdersExist[recipient] && _isExcludedFromRewards[sender]) {
            firstTimeHolderIncentiveAmount = amount.div(_promotionRate);
            taxTotal = taxTotal.add(firstTimeHolderIncentiveAmount);
        }
        addUpdateHolder(recipient);
        uint256 amountToRecipient = amount.sub(taxTotal).add(firstTimeHolderIncentiveAmount);
        _balances[sender] = _balances[sender].sub(amount);
        _balances[sender] = _balances[sender].sub(firstTimeHolderIncentiveAmount);
        _balances[recipient] = _balances[recipient].add(amountToRecipient);
        distributeTokens(defaultRewardAmount, cubRewardAmount, lionessRewardAmount, lionRewarAmount, alphaLionRewardAmount);
        emit Transfer(sender, recipient, amountToRecipient);

        if (_botDetectorEnabled) {
            _blockNumberByAddress[_nonBotAddress] = block.number;
        }
    }

    function addUpdateHolder(address recipient) private {
        if (!_holdersExist[recipient]) {
            _holders.push(recipient);
            _holdersExist[recipient] = true;
        }
    }

    function distributeTokens(uint256 defaultAmount, uint256 cubAmount, uint256 lionessAmount, uint256 lionAmount, uint256 alphaLionAmount) private {
        clearRewardAddresses();
        uint256 unusedRewards = 0;
        for (uint256 i = 0; i < _holders.length; i++) {
            address holderAddress = _holders[i];
            //skip holder from getting any rewards
            if (_isExcludedFromRewards[holderAddress]) {
                continue;
            }
            uint256 tctBalance = getTctTokenBalance(holderAddress);
            if (holderAddress != _deadAddress) {
                if (tctBalance >= _tctAlphaTier) {
                    alphaRewardAddresses.push(holderAddress);
                }
                if (tctBalance >= _tctLionTier) {
                    lionRewardAddresses.push(holderAddress);
                }
                if (tctBalance >= _tctLionessTier) {
                    lionessRewardAddresses.push(holderAddress);
                }
                if (tctBalance >= _tctCubTier) {
                    cubRewardAddresses.push(holderAddress);
                }
            }
            defaultRewardAddresses.push(holderAddress);
        }
        unusedRewards = unusedRewards.add(addTokensToAddresses(alphaRewardAddresses, alphaLionAmount));
        unusedRewards = unusedRewards.add(addTokensToAddresses(lionRewardAddresses, lionAmount));
        unusedRewards = unusedRewards.add(addTokensToAddresses(lionessRewardAddresses, lionessAmount));
        unusedRewards = unusedRewards.add(addTokensToAddresses(cubRewardAddresses, cubAmount));
        defaultAmount = defaultAmount.add(unusedRewards);
        addTokensToAddresses(defaultRewardAddresses, defaultAmount);
    }

    function _transferExcludeReflection(address sender, address recipient, uint256 amount) private {
        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function addTokensToAddresses(address[] memory addresses, uint256 amountToDistribute) private returns (uint256) {
        if (addresses.length > 0) {
            uint256 distAmount = amountToDistribute.div(addresses.length);

            for (uint256 i = 0; i < addresses.length; i++) {
                address holderAddress = addresses[i];
                _balances[holderAddress] = _balances[holderAddress].add(distAmount);
            }
            return 0;
        } else {
            return amountToDistribute;
        }
    }

    function clearRewardAddresses() private {
        delete alphaRewardAddresses;
        delete lionRewardAddresses;
        delete lionessRewardAddresses;
        delete cubRewardAddresses;
        delete defaultRewardAddresses;
    }

    function includeAccountsForRewards(address[] memory addresses) external onlyOwner() {
        for (uint256 i = 0; i < addresses.length; i++) {
            address addr = addresses[i];
            delete _isExcludedFromRewards[addr];
        }
    }

    function excludeAccountsFromRewards(address[] memory accounts) external onlyOwner() {

        for (uint256 i = 0; i < accounts.length; i++) {
            _isExcludedFromRewards[accounts[i]] = true;
        }
    }
}

File 1 of 7: Address.sol
// SPDX-License-Identifier: MIT

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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 2 of 7: Context.sol
// SPDX-License-Identifier: MIT

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 3 of 7: ERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./IERC20Metadata.sol";
import "./Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual 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;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    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;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, burnAddress(), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
          _balances[account] = accountBalance - amount;
          _balances[burnAddress()] = _balances[burnAddress()] + amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, burnAddress(), amount);

        _afterTokenTransfer(account, burnAddress(), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function burnAddress() public virtual returns (address) {
      return address(0);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

File 4 of 7: IERC20.sol
// SPDX-License-Identifier: MIT

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 5 of 7: IERC20Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

File 6 of 7: Ownable.sol
// SPDX-License-Identifier: MIT

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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":"burnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"excludeAccountsFromRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getDefaultReflectionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPromotionSettings","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTctRateSettings","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTctTierSettings","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getTctTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"includeAccountsForRewards","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":"contractAddress","type":"address"}],"name":"initTctContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isBotDectorEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enableOnDisable","type":"bool"}],"name":"setBotDector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"promotionRate","type":"uint256"},{"internalType":"bool","name":"doPromotion","type":"bool"}],"name":"setPromotion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"defaultRate","type":"uint256"},{"internalType":"uint256","name":"cubRate","type":"uint256"},{"internalType":"uint256","name":"lionessRate","type":"uint256"},{"internalType":"uint256","name":"lionRate","type":"uint256"},{"internalType":"uint256","name":"alphaLionRate","type":"uint256"}],"name":"setRewardRates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cubTier","type":"uint256"},{"internalType":"uint256","name":"LionessTier","type":"uint256"},{"internalType":"uint256","name":"lionTier","type":"uint256"},{"internalType":"uint256","name":"alphaTier","type":"uint256"}],"name":"setTctRewardTier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"taxFreeTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","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"}]

608060405261015e600f5561011360105560fa60115560e160125560c86013556105dc6014556001601560006101000a81548160ff0219169083151502179055506001601560016101000a81548160ff0219169083151502179055506b50c783eb9b5c85f2a80000006016556c01431e0fae6d7217caa00000006017556c03c95a2f0b4856475fe00000006018556c064f964e68233a76f5200000006019556b033b2e3c9fd0803ce8000000601a556040518060400160405280600481526020017f53616a6100000000000000000000000000000000000000000000000000000000815250601b9080519060200190620000fb929190620004c8565b506040518060400160405280600481526020017f53414a4100000000000000000000000000000000000000000000000000000000815250601c908051906020019062000149929190620004c8565b506009601d60006101000a81548160ff021916908360ff16021790555061dead601d60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620001b657600080fd5b50620001d7620001cb620003d360201b60201c565b620003db60201b60201c565b7384155b2be780c8ecedfe06cdad341f295858579d601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160026000620002426200049f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506b033b2e3c9fd0803ce8000000600160006200030c620003d360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506200035a620003d360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b033b2e3c9fd0803ce8000000604051620003c5919062000589565b60405180910390a362000615565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620004d690620005b0565b90600052602060002090601f016020900481019282620004fa576000855562000546565b82601f106200051557805160ff191683800117855562000546565b8280016001018555821562000546579182015b828111156200054557825182559160200191906001019062000528565b5b50905062000555919062000559565b5090565b5b80821115620005745760008160009055506001016200055a565b5090565b6200058381620005a6565b82525050565b6000602082019050620005a0600083018462000578565b92915050565b6000819050919050565b60006002820490506001821680620005c957607f821691505b60208210811415620005e057620005df620005e6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61402480620006256000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c806370a082311161010457806397189262116100a2578063a9059cbb11610071578063a9059cbb14610513578063ca1245b814610543578063dd62ed3e1461055f578063f2fde38b1461058f576101cf565b8063971892621461048a5780639ee93d47146104a6578063a0f32d13146104c7578063a457c2d7146104e3576101cf565b80638da5cb5b116100de5780638da5cb5b14610413578063927a06eb14610431578063938ccc2f1461044d57806395d89b411461046c576101cf565b806370a08231146103bb57806370d5ae05146103eb578063715018a614610409576101cf565b806339509351116101715780635c8d90081161014b5780635c8d9008146103355780635c9689fa146103655780635d0956ab146103815780636ae369861461039d576101cf565b806339509351146102cb5780633f799736146102fb5780634a42efe914610317576101cf565b806318160ddd116101ad57806318160ddd1461024357806323b872dd14610261578063313ce5671461029157806336188d4f146102af576101cf565b806306fdde03146101d457806308623590146101f2578063095ea7b314610213575b600080fd5b6101dc6105ab565b6040516101e991906136d4565b60405180910390f35b6101fa61063d565b60405161020a9493929190613871565b60405180910390f35b61022d60048036038101906102289190613202565b61065d565b60405161023a9190613690565b60405180910390f35b61024b61067b565b6040516102589190613856565b60405180910390f35b61027b600480360381019061027691906131af565b61068f565b6040516102889190613690565b60405180910390f35b610299610768565b6040516102a691906138b6565b60405180910390f35b6102c960048036038101906102c49190613142565b61077f565b005b6102e560048036038101906102e09190613202565b61083f565b6040516102f29190613690565b60405180910390f35b61031560048036038101906103109190613242565b6108f2565b005b61031f610a00565b60405161032c9190613856565b60405180910390f35b61034f600480360381019061034a9190613142565b610a0a565b60405161035c9190613856565b60405180910390f35b61037f600480360381019061037a919061339d565b610abe565b005b61039b60048036038101906103969190613242565b610b5c565b005b6103a5610c6d565b6040516103b29190613690565b60405180910390f35b6103d560048036038101906103d09190613142565b610c84565b6040516103e29190613856565b60405180910390f35b6103f3610ccd565b6040516104009190613675565b60405180910390f35b610411610cf7565b005b61041b610d7f565b6040516104289190613675565b60405180910390f35b61044b60048036038101906104469190613303565b610da8565b005b610455610e41565b6040516104639291906136ab565b60405180910390f35b610474610e5f565b60405161048191906136d4565b60405180910390f35b6104a4600480360381019061049f9190613404565b610ef1565b005b6104ae610f97565b6040516104be9493929190613871565b60405180910390f35b6104e160048036038101906104dc919061335d565b610fb7565b005b6104fd60048036038101906104f89190613202565b611058565b60405161050a9190613690565b60405180910390f35b61052d60048036038101906105289190613202565b611125565b60405161053a9190613690565b60405180910390f35b61055d6004803603810190610558919061328b565b611143565b005b6105796004803603810190610574919061316f565b6113c1565b6040516105869190613856565b60405180910390f35b6105a960048036038101906105a49190613142565b611448565b005b6060601b80546105ba90613aad565b80601f01602080910402602001604051908101604052809291908181526020018280546105e690613aad565b80156106335780601f1061060857610100808354040283529160200191610633565b820191906000526020600020905b81548152906001019060200180831161061657829003601f168201915b5050505050905090565b600080600080601254601154601054600f54935093509350935090919293565b600061067161066a611540565b8484611548565b6001905092915050565b60006b033b2e3c9fd0803ce8000000905090565b600061069c848484611713565b61075d846106a8611540565b61075885604051806060016040528060288152602001613fa260289139600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061070e611540565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611beb9092919063ffffffff16565b611548565b600190509392505050565b6000601d60009054906101000a900460ff16905090565b610787611540565b73ffffffffffffffffffffffffffffffffffffffff166107a5610d7f565b73ffffffffffffffffffffffffffffffffffffffff16146107fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f2906137b6565b60405180910390fd5b80601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006108e861084c611540565b846108e3856005600061085d611540565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c4f90919063ffffffff16565b611548565b6001905092915050565b6108fa611540565b73ffffffffffffffffffffffffffffffffffffffff16610918610d7f565b73ffffffffffffffffffffffffffffffffffffffff161461096e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610965906137b6565b60405180910390fd5b60005b81518110156109fc57600082828151811061098f5761098e613be6565b5b60200260200101519050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555080806109f490613b10565b915050610971565b5050565b6000601354905090565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610a679190613675565b60206040518083038186803b158015610a7f57600080fd5b505afa158015610a93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab79190613330565b9050919050565b610ac6611540565b73ffffffffffffffffffffffffffffffffffffffff16610ae4610d7f565b73ffffffffffffffffffffffffffffffffffffffff1614610b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b31906137b6565b60405180910390fd5b8360168190555082601781905550816018819055508060198190555050505050565b610b64611540565b73ffffffffffffffffffffffffffffffffffffffff16610b82610d7f565b73ffffffffffffffffffffffffffffffffffffffff1614610bd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcf906137b6565b60405180910390fd5b60005b8151811015610c6957600160026000848481518110610bfd57610bfc613be6565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610c6190613b10565b915050610bdb565b5050565b6000601560019054906101000a900460ff16905090565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610cff611540565b73ffffffffffffffffffffffffffffffffffffffff16610d1d610d7f565b73ffffffffffffffffffffffffffffffffffffffff1614610d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6a906137b6565b60405180910390fd5b610d7d6000611cad565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610db0611540565b73ffffffffffffffffffffffffffffffffffffffff16610dce610d7f565b73ffffffffffffffffffffffffffffffffffffffff1614610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b906137b6565b60405180910390fd5b80601560016101000a81548160ff02191690831515021790555050565b600080601560009054906101000a900460ff16601454915091509091565b6060601c8054610e6e90613aad565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9a90613aad565b8015610ee75780601f10610ebc57610100808354040283529160200191610ee7565b820191906000526020600020905b815481529060010190602001808311610eca57829003601f168201915b5050505050905090565b610ef9611540565b73ffffffffffffffffffffffffffffffffffffffff16610f17610d7f565b73ffffffffffffffffffffffffffffffffffffffff1614610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f64906137b6565b60405180910390fd5b8460138190555083601281905550826011819055508160108190555080600f819055505050505050565b600080600080601654601754601854601954935093509350935090919293565b610fbf611540565b73ffffffffffffffffffffffffffffffffffffffff16610fdd610d7f565b73ffffffffffffffffffffffffffffffffffffffff1614611033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102a906137b6565b60405180910390fd5b80601560006101000a81548160ff021916908315150217905550816014819055505050565b600061111b611065611540565b8461111685604051806060016040528060258152602001613fca602591396005600061108f611540565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611beb9092919063ffffffff16565b611548565b6001905092915050565b6000611139611132611540565b8484611713565b6001905092915050565b61114b611540565b73ffffffffffffffffffffffffffffffffffffffff16611169610d7f565b73ffffffffffffffffffffffffffffffffffffffff16146111bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b6906137b6565b60405180910390fd5b60005b82518110156113bc5760008382815181106111e0576111df613be6565b5b6020026020010151905060008383815181106111ff576111fe613be6565b5b60200260200101519050600061125d82600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d7190919063ffffffff16565b905080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506112f582600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c4f90919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061134183611dbb565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161139e9190613856565b60405180910390a350505080806113b490613b10565b9150506111c2565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611450611540565b73ffffffffffffffffffffffffffffffffffffffff1661146e610d7f565b73ffffffffffffffffffffffffffffffffffffffff16146114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bb906137b6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152b90613736565b60405180910390fd5b61153d81611cad565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115af90613836565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161f90613756565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117069190613856565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177a906137f6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ea906136f6565b60405180910390fd5b60008111611836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182d906137d6565b60405180910390fd5b61183e610d7f565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156118ac575061187c610d7f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156118f757601a548111156118f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ed90613796565b60405180910390fd5b5b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561199a5750600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156119af576119aa838383611ecb565b611be6565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015611a525750600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611a6757611a62838383611ecb565b611be5565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015611b0b5750600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611b2057611b1b83838361205f565b611be4565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611bc25750600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611bd757611bd2838383611ecb565b611be3565b611be283838361205f565b5b5b5b5b505050565b6000838311158290611c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2a91906136d4565b60405180910390fd5b5060008385611c4291906139f1565b9050809150509392505050565b6000808284611c5e919061396a565b905083811015611ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9a90613776565b60405180910390fd5b8091505092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611db383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611beb565b905092915050565b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611ec8576008819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b50565b611f1d81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d7190919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611fb281600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c4f90919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516120529190613856565b60405180910390a3505050565b601560019054906101000a900460ff16156120ea5761207e838361258e565b600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506120e9600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661260a565b5b6000612101600f54836126dd90919063ffffffff16565b9050600061211a601054846126dd90919063ffffffff16565b90506000612133601154856126dd90919063ffffffff16565b9050600061214c601254866126dd90919063ffffffff16565b90506000612165601354876126dd90919063ffffffff16565b90506000806121b3836121a586612197896121898c8e611c4f90919063ffffffff16565b611c4f90919063ffffffff16565b611c4f90919063ffffffff16565b611c4f90919063ffffffff16565b9050601560009054906101000a900460ff16801561221b5750600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156122705750600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156122a25761228a601454896126dd90919063ffffffff16565b915061229f8282611c4f90919063ffffffff16565b90505b6122ab89611dbb565b60006122d2836122c4848c611d7190919063ffffffff16565b611c4f90919063ffffffff16565b905061232689600160008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d7190919063ffffffff16565b600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506123bb83600160008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d7190919063ffffffff16565b600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061245081600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c4f90919063ffffffff16565b600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506124a08486888a8c612727565b8973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516124fd9190613856565b60405180910390a3601560019054906101000a900460ff1615612581574360066000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5050505050505050505050565b600061259983612daa565b15806125ab57506125a982612daa565b155b6125ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e190613816565b60405180910390fd5b6125f383612daa565b1561260057819050612604565b8290505b92915050565b600080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541480612697575043600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b9050806126d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d090613716565b60405180910390fd5b5050565b600061271f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612dbd565b905092915050565b61272f612e20565b6000805b600880549050811015612a6b5760006008828154811061275657612755613be6565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156127db5750612a58565b60006127e682610a0a565b9050601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129f25760195481106128aa576009829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b601854811061291757600a829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b601754811061298457600b829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b60165481106129f157600c829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b600d829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505b8080612a6390613b10565b915050612733565b50612b0e612aff6009805480602002602001604051908101604052809291908181526020018280548015612af457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612aaa575b505050505084612e68565b82611c4f90919063ffffffff16565b9050612bb2612ba3600a805480602002602001604051908101604052809291908181526020018280548015612b9857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612b4e575b505050505085612e68565b82611c4f90919063ffffffff16565b9050612c56612c47600b805480602002602001604051908101604052809291908181526020018280548015612c3c57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612bf2575b505050505086612e68565b82611c4f90919063ffffffff16565b9050612cfa612ceb600c805480602002602001604051908101604052809291908181526020018280548015612ce057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612c96575b505050505087612e68565b82611c4f90919063ffffffff16565b9050612d0f8187611c4f90919063ffffffff16565b9550612da1600d805480602002602001604051908101604052809291908181526020018280548015612d9657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612d4c575b505050505087612e68565b50505050505050565b600080823b905060008111915050919050565b60008083118290612e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfb91906136d4565b60405180910390fd5b5060008385612e1391906139c0565b9050809150509392505050565b60096000612e2e9190612f74565b600a6000612e3c9190612f74565b600b6000612e4a9190612f74565b600c6000612e589190612f74565b600d6000612e669190612f74565b565b60008083511115612f6a576000612e898451846126dd90919063ffffffff16565b905060005b8451811015612f5f576000858281518110612eac57612eab613be6565b5b60200260200101519050612f0883600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c4f90919063ffffffff16565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550508080612f5790613b10565b915050612e8e565b506000915050612f6e565b8190505b92915050565b5080546000825590600052602060002090810190612f929190612f95565b50565b5b80821115612fae576000816000905550600101612f96565b5090565b6000612fc5612fc0846138f6565b6138d1565b90508083825260208201905082856020860282011115612fe857612fe7613c49565b5b60005b858110156130185781612ffe8882613092565b845260208401935060208301925050600181019050612feb565b5050509392505050565b600061303561303084613922565b6138d1565b9050808382526020820190508285602086028201111561305857613057613c49565b5b60005b85811015613088578161306e8882613118565b84526020840193506020830192505060018101905061305b565b5050509392505050565b6000813590506130a181613f5c565b92915050565b600082601f8301126130bc576130bb613c44565b5b81356130cc848260208601612fb2565b91505092915050565b600082601f8301126130ea576130e9613c44565b5b81356130fa848260208601613022565b91505092915050565b60008135905061311281613f73565b92915050565b60008135905061312781613f8a565b92915050565b60008151905061313c81613f8a565b92915050565b60006020828403121561315857613157613c53565b5b600061316684828501613092565b91505092915050565b6000806040838503121561318657613185613c53565b5b600061319485828601613092565b92505060206131a585828601613092565b9150509250929050565b6000806000606084860312156131c8576131c7613c53565b5b60006131d686828701613092565b93505060206131e786828701613092565b92505060406131f886828701613118565b9150509250925092565b6000806040838503121561321957613218613c53565b5b600061322785828601613092565b925050602061323885828601613118565b9150509250929050565b60006020828403121561325857613257613c53565b5b600082013567ffffffffffffffff81111561327657613275613c4e565b5b613282848285016130a7565b91505092915050565b600080604083850312156132a2576132a1613c53565b5b600083013567ffffffffffffffff8111156132c0576132bf613c4e565b5b6132cc858286016130a7565b925050602083013567ffffffffffffffff8111156132ed576132ec613c4e565b5b6132f9858286016130d5565b9150509250929050565b60006020828403121561331957613318613c53565b5b600061332784828501613103565b91505092915050565b60006020828403121561334657613345613c53565b5b60006133548482850161312d565b91505092915050565b6000806040838503121561337457613373613c53565b5b600061338285828601613118565b925050602061339385828601613103565b9150509250929050565b600080600080608085870312156133b7576133b6613c53565b5b60006133c587828801613118565b94505060206133d687828801613118565b93505060406133e787828801613118565b92505060606133f887828801613118565b91505092959194509250565b600080600080600060a086880312156134205761341f613c53565b5b600061342e88828901613118565b955050602061343f88828901613118565b945050604061345088828901613118565b935050606061346188828901613118565b925050608061347288828901613118565b9150509295509295909350565b61348881613a25565b82525050565b61349781613a37565b82525050565b60006134a88261394e565b6134b28185613959565b93506134c2818560208601613a7a565b6134cb81613c58565b840191505092915050565b60006134e3602383613959565b91506134ee82613c69565b604082019050919050565b6000613506602983613959565b915061351182613cb8565b604082019050919050565b6000613529602683613959565b915061353482613d07565b604082019050919050565b600061354c602283613959565b915061355782613d56565b604082019050919050565b600061356f601b83613959565b915061357a82613da5565b602082019050919050565b6000613592602883613959565b915061359d82613dce565b604082019050919050565b60006135b5602083613959565b91506135c082613e1d565b602082019050919050565b60006135d8602983613959565b91506135e382613e46565b604082019050919050565b60006135fb602583613959565b915061360682613e95565b604082019050919050565b600061361e601483613959565b915061362982613ee4565b602082019050919050565b6000613641602483613959565b915061364c82613f0d565b604082019050919050565b61366081613a63565b82525050565b61366f81613a6d565b82525050565b600060208201905061368a600083018461347f565b92915050565b60006020820190506136a5600083018461348e565b92915050565b60006040820190506136c0600083018561348e565b6136cd6020830184613657565b9392505050565b600060208201905081810360008301526136ee818461349d565b905092915050565b6000602082019050818103600083015261370f816134d6565b9050919050565b6000602082019050818103600083015261372f816134f9565b9050919050565b6000602082019050818103600083015261374f8161351c565b9050919050565b6000602082019050818103600083015261376f8161353f565b9050919050565b6000602082019050818103600083015261378f81613562565b9050919050565b600060208201905081810360008301526137af81613585565b9050919050565b600060208201905081810360008301526137cf816135a8565b9050919050565b600060208201905081810360008301526137ef816135cb565b9050919050565b6000602082019050818103600083015261380f816135ee565b9050919050565b6000602082019050818103600083015261382f81613611565b9050919050565b6000602082019050818103600083015261384f81613634565b9050919050565b600060208201905061386b6000830184613657565b92915050565b60006080820190506138866000830187613657565b6138936020830186613657565b6138a06040830185613657565b6138ad6060830184613657565b95945050505050565b60006020820190506138cb6000830184613666565b92915050565b60006138db6138ec565b90506138e78282613adf565b919050565b6000604051905090565b600067ffffffffffffffff82111561391157613910613c15565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561393d5761393c613c15565b5b602082029050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600061397582613a63565b915061398083613a63565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139b5576139b4613b59565b5b828201905092915050565b60006139cb82613a63565b91506139d683613a63565b9250826139e6576139e5613b88565b5b828204905092915050565b60006139fc82613a63565b9150613a0783613a63565b925082821015613a1a57613a19613b59565b5b828203905092915050565b6000613a3082613a43565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015613a98578082015181840152602081019050613a7d565b83811115613aa7576000848401525b50505050565b60006002820490506001821680613ac557607f821691505b60208210811415613ad957613ad8613bb7565b5b50919050565b613ae882613c58565b810181811067ffffffffffffffff82111715613b0757613b06613c15565b5b80604052505050565b6000613b1b82613a63565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b4e57613b4d613b59565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4f6e6c79206f6e65207472616e73616374696f6e2070657220626c6f636b206960008201527f7320616c6c6f7765640000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f426f747320617265206e6f7420616c6c6f776564000000000000000000000000600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b613f6581613a25565b8114613f7057600080fd5b50565b613f7c81613a37565b8114613f8757600080fd5b50565b613f9381613a63565b8114613f9e57600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220f51b3518ccca04fa9bdbcd421be5f2723e30d1f4330ddcc3d6a71b66a359a55b64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c806370a082311161010457806397189262116100a2578063a9059cbb11610071578063a9059cbb14610513578063ca1245b814610543578063dd62ed3e1461055f578063f2fde38b1461058f576101cf565b8063971892621461048a5780639ee93d47146104a6578063a0f32d13146104c7578063a457c2d7146104e3576101cf565b80638da5cb5b116100de5780638da5cb5b14610413578063927a06eb14610431578063938ccc2f1461044d57806395d89b411461046c576101cf565b806370a08231146103bb57806370d5ae05146103eb578063715018a614610409576101cf565b806339509351116101715780635c8d90081161014b5780635c8d9008146103355780635c9689fa146103655780635d0956ab146103815780636ae369861461039d576101cf565b806339509351146102cb5780633f799736146102fb5780634a42efe914610317576101cf565b806318160ddd116101ad57806318160ddd1461024357806323b872dd14610261578063313ce5671461029157806336188d4f146102af576101cf565b806306fdde03146101d457806308623590146101f2578063095ea7b314610213575b600080fd5b6101dc6105ab565b6040516101e991906136d4565b60405180910390f35b6101fa61063d565b60405161020a9493929190613871565b60405180910390f35b61022d60048036038101906102289190613202565b61065d565b60405161023a9190613690565b60405180910390f35b61024b61067b565b6040516102589190613856565b60405180910390f35b61027b600480360381019061027691906131af565b61068f565b6040516102889190613690565b60405180910390f35b610299610768565b6040516102a691906138b6565b60405180910390f35b6102c960048036038101906102c49190613142565b61077f565b005b6102e560048036038101906102e09190613202565b61083f565b6040516102f29190613690565b60405180910390f35b61031560048036038101906103109190613242565b6108f2565b005b61031f610a00565b60405161032c9190613856565b60405180910390f35b61034f600480360381019061034a9190613142565b610a0a565b60405161035c9190613856565b60405180910390f35b61037f600480360381019061037a919061339d565b610abe565b005b61039b60048036038101906103969190613242565b610b5c565b005b6103a5610c6d565b6040516103b29190613690565b60405180910390f35b6103d560048036038101906103d09190613142565b610c84565b6040516103e29190613856565b60405180910390f35b6103f3610ccd565b6040516104009190613675565b60405180910390f35b610411610cf7565b005b61041b610d7f565b6040516104289190613675565b60405180910390f35b61044b60048036038101906104469190613303565b610da8565b005b610455610e41565b6040516104639291906136ab565b60405180910390f35b610474610e5f565b60405161048191906136d4565b60405180910390f35b6104a4600480360381019061049f9190613404565b610ef1565b005b6104ae610f97565b6040516104be9493929190613871565b60405180910390f35b6104e160048036038101906104dc919061335d565b610fb7565b005b6104fd60048036038101906104f89190613202565b611058565b60405161050a9190613690565b60405180910390f35b61052d60048036038101906105289190613202565b611125565b60405161053a9190613690565b60405180910390f35b61055d6004803603810190610558919061328b565b611143565b005b6105796004803603810190610574919061316f565b6113c1565b6040516105869190613856565b60405180910390f35b6105a960048036038101906105a49190613142565b611448565b005b6060601b80546105ba90613aad565b80601f01602080910402602001604051908101604052809291908181526020018280546105e690613aad565b80156106335780601f1061060857610100808354040283529160200191610633565b820191906000526020600020905b81548152906001019060200180831161061657829003601f168201915b5050505050905090565b600080600080601254601154601054600f54935093509350935090919293565b600061067161066a611540565b8484611548565b6001905092915050565b60006b033b2e3c9fd0803ce8000000905090565b600061069c848484611713565b61075d846106a8611540565b61075885604051806060016040528060288152602001613fa260289139600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061070e611540565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611beb9092919063ffffffff16565b611548565b600190509392505050565b6000601d60009054906101000a900460ff16905090565b610787611540565b73ffffffffffffffffffffffffffffffffffffffff166107a5610d7f565b73ffffffffffffffffffffffffffffffffffffffff16146107fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f2906137b6565b60405180910390fd5b80601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006108e861084c611540565b846108e3856005600061085d611540565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c4f90919063ffffffff16565b611548565b6001905092915050565b6108fa611540565b73ffffffffffffffffffffffffffffffffffffffff16610918610d7f565b73ffffffffffffffffffffffffffffffffffffffff161461096e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610965906137b6565b60405180910390fd5b60005b81518110156109fc57600082828151811061098f5761098e613be6565b5b60200260200101519050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555080806109f490613b10565b915050610971565b5050565b6000601354905090565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610a679190613675565b60206040518083038186803b158015610a7f57600080fd5b505afa158015610a93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab79190613330565b9050919050565b610ac6611540565b73ffffffffffffffffffffffffffffffffffffffff16610ae4610d7f565b73ffffffffffffffffffffffffffffffffffffffff1614610b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b31906137b6565b60405180910390fd5b8360168190555082601781905550816018819055508060198190555050505050565b610b64611540565b73ffffffffffffffffffffffffffffffffffffffff16610b82610d7f565b73ffffffffffffffffffffffffffffffffffffffff1614610bd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcf906137b6565b60405180910390fd5b60005b8151811015610c6957600160026000848481518110610bfd57610bfc613be6565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610c6190613b10565b915050610bdb565b5050565b6000601560019054906101000a900460ff16905090565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610cff611540565b73ffffffffffffffffffffffffffffffffffffffff16610d1d610d7f565b73ffffffffffffffffffffffffffffffffffffffff1614610d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6a906137b6565b60405180910390fd5b610d7d6000611cad565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610db0611540565b73ffffffffffffffffffffffffffffffffffffffff16610dce610d7f565b73ffffffffffffffffffffffffffffffffffffffff1614610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b906137b6565b60405180910390fd5b80601560016101000a81548160ff02191690831515021790555050565b600080601560009054906101000a900460ff16601454915091509091565b6060601c8054610e6e90613aad565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9a90613aad565b8015610ee75780601f10610ebc57610100808354040283529160200191610ee7565b820191906000526020600020905b815481529060010190602001808311610eca57829003601f168201915b5050505050905090565b610ef9611540565b73ffffffffffffffffffffffffffffffffffffffff16610f17610d7f565b73ffffffffffffffffffffffffffffffffffffffff1614610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f64906137b6565b60405180910390fd5b8460138190555083601281905550826011819055508160108190555080600f819055505050505050565b600080600080601654601754601854601954935093509350935090919293565b610fbf611540565b73ffffffffffffffffffffffffffffffffffffffff16610fdd610d7f565b73ffffffffffffffffffffffffffffffffffffffff1614611033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102a906137b6565b60405180910390fd5b80601560006101000a81548160ff021916908315150217905550816014819055505050565b600061111b611065611540565b8461111685604051806060016040528060258152602001613fca602591396005600061108f611540565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611beb9092919063ffffffff16565b611548565b6001905092915050565b6000611139611132611540565b8484611713565b6001905092915050565b61114b611540565b73ffffffffffffffffffffffffffffffffffffffff16611169610d7f565b73ffffffffffffffffffffffffffffffffffffffff16146111bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b6906137b6565b60405180910390fd5b60005b82518110156113bc5760008382815181106111e0576111df613be6565b5b6020026020010151905060008383815181106111ff576111fe613be6565b5b60200260200101519050600061125d82600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d7190919063ffffffff16565b905080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506112f582600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c4f90919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061134183611dbb565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161139e9190613856565b60405180910390a350505080806113b490613b10565b9150506111c2565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611450611540565b73ffffffffffffffffffffffffffffffffffffffff1661146e610d7f565b73ffffffffffffffffffffffffffffffffffffffff16146114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bb906137b6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152b90613736565b60405180910390fd5b61153d81611cad565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115af90613836565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161f90613756565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117069190613856565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177a906137f6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ea906136f6565b60405180910390fd5b60008111611836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182d906137d6565b60405180910390fd5b61183e610d7f565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156118ac575061187c610d7f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156118f757601a548111156118f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ed90613796565b60405180910390fd5b5b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561199a5750600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156119af576119aa838383611ecb565b611be6565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015611a525750600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611a6757611a62838383611ecb565b611be5565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015611b0b5750600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611b2057611b1b83838361205f565b611be4565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611bc25750600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611bd757611bd2838383611ecb565b611be3565b611be283838361205f565b5b5b5b5b505050565b6000838311158290611c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2a91906136d4565b60405180910390fd5b5060008385611c4291906139f1565b9050809150509392505050565b6000808284611c5e919061396a565b905083811015611ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9a90613776565b60405180910390fd5b8091505092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611db383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611beb565b905092915050565b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611ec8576008819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b50565b611f1d81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d7190919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611fb281600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c4f90919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516120529190613856565b60405180910390a3505050565b601560019054906101000a900460ff16156120ea5761207e838361258e565b600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506120e9600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661260a565b5b6000612101600f54836126dd90919063ffffffff16565b9050600061211a601054846126dd90919063ffffffff16565b90506000612133601154856126dd90919063ffffffff16565b9050600061214c601254866126dd90919063ffffffff16565b90506000612165601354876126dd90919063ffffffff16565b90506000806121b3836121a586612197896121898c8e611c4f90919063ffffffff16565b611c4f90919063ffffffff16565b611c4f90919063ffffffff16565b611c4f90919063ffffffff16565b9050601560009054906101000a900460ff16801561221b5750600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156122705750600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156122a25761228a601454896126dd90919063ffffffff16565b915061229f8282611c4f90919063ffffffff16565b90505b6122ab89611dbb565b60006122d2836122c4848c611d7190919063ffffffff16565b611c4f90919063ffffffff16565b905061232689600160008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d7190919063ffffffff16565b600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506123bb83600160008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d7190919063ffffffff16565b600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061245081600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c4f90919063ffffffff16565b600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506124a08486888a8c612727565b8973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516124fd9190613856565b60405180910390a3601560019054906101000a900460ff1615612581574360066000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5050505050505050505050565b600061259983612daa565b15806125ab57506125a982612daa565b155b6125ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e190613816565b60405180910390fd5b6125f383612daa565b1561260057819050612604565b8290505b92915050565b600080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541480612697575043600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b9050806126d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d090613716565b60405180910390fd5b5050565b600061271f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612dbd565b905092915050565b61272f612e20565b6000805b600880549050811015612a6b5760006008828154811061275657612755613be6565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156127db5750612a58565b60006127e682610a0a565b9050601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129f25760195481106128aa576009829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b601854811061291757600a829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b601754811061298457600b829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b60165481106129f157600c829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b600d829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505b8080612a6390613b10565b915050612733565b50612b0e612aff6009805480602002602001604051908101604052809291908181526020018280548015612af457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612aaa575b505050505084612e68565b82611c4f90919063ffffffff16565b9050612bb2612ba3600a805480602002602001604051908101604052809291908181526020018280548015612b9857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612b4e575b505050505085612e68565b82611c4f90919063ffffffff16565b9050612c56612c47600b805480602002602001604051908101604052809291908181526020018280548015612c3c57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612bf2575b505050505086612e68565b82611c4f90919063ffffffff16565b9050612cfa612ceb600c805480602002602001604051908101604052809291908181526020018280548015612ce057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612c96575b505050505087612e68565b82611c4f90919063ffffffff16565b9050612d0f8187611c4f90919063ffffffff16565b9550612da1600d805480602002602001604051908101604052809291908181526020018280548015612d9657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612d4c575b505050505087612e68565b50505050505050565b600080823b905060008111915050919050565b60008083118290612e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfb91906136d4565b60405180910390fd5b5060008385612e1391906139c0565b9050809150509392505050565b60096000612e2e9190612f74565b600a6000612e3c9190612f74565b600b6000612e4a9190612f74565b600c6000612e589190612f74565b600d6000612e669190612f74565b565b60008083511115612f6a576000612e898451846126dd90919063ffffffff16565b905060005b8451811015612f5f576000858281518110612eac57612eab613be6565b5b60200260200101519050612f0883600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c4f90919063ffffffff16565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550508080612f5790613b10565b915050612e8e565b506000915050612f6e565b8190505b92915050565b5080546000825590600052602060002090810190612f929190612f95565b50565b5b80821115612fae576000816000905550600101612f96565b5090565b6000612fc5612fc0846138f6565b6138d1565b90508083825260208201905082856020860282011115612fe857612fe7613c49565b5b60005b858110156130185781612ffe8882613092565b845260208401935060208301925050600181019050612feb565b5050509392505050565b600061303561303084613922565b6138d1565b9050808382526020820190508285602086028201111561305857613057613c49565b5b60005b85811015613088578161306e8882613118565b84526020840193506020830192505060018101905061305b565b5050509392505050565b6000813590506130a181613f5c565b92915050565b600082601f8301126130bc576130bb613c44565b5b81356130cc848260208601612fb2565b91505092915050565b600082601f8301126130ea576130e9613c44565b5b81356130fa848260208601613022565b91505092915050565b60008135905061311281613f73565b92915050565b60008135905061312781613f8a565b92915050565b60008151905061313c81613f8a565b92915050565b60006020828403121561315857613157613c53565b5b600061316684828501613092565b91505092915050565b6000806040838503121561318657613185613c53565b5b600061319485828601613092565b92505060206131a585828601613092565b9150509250929050565b6000806000606084860312156131c8576131c7613c53565b5b60006131d686828701613092565b93505060206131e786828701613092565b92505060406131f886828701613118565b9150509250925092565b6000806040838503121561321957613218613c53565b5b600061322785828601613092565b925050602061323885828601613118565b9150509250929050565b60006020828403121561325857613257613c53565b5b600082013567ffffffffffffffff81111561327657613275613c4e565b5b613282848285016130a7565b91505092915050565b600080604083850312156132a2576132a1613c53565b5b600083013567ffffffffffffffff8111156132c0576132bf613c4e565b5b6132cc858286016130a7565b925050602083013567ffffffffffffffff8111156132ed576132ec613c4e565b5b6132f9858286016130d5565b9150509250929050565b60006020828403121561331957613318613c53565b5b600061332784828501613103565b91505092915050565b60006020828403121561334657613345613c53565b5b60006133548482850161312d565b91505092915050565b6000806040838503121561337457613373613c53565b5b600061338285828601613118565b925050602061339385828601613103565b9150509250929050565b600080600080608085870312156133b7576133b6613c53565b5b60006133c587828801613118565b94505060206133d687828801613118565b93505060406133e787828801613118565b92505060606133f887828801613118565b91505092959194509250565b600080600080600060a086880312156134205761341f613c53565b5b600061342e88828901613118565b955050602061343f88828901613118565b945050604061345088828901613118565b935050606061346188828901613118565b925050608061347288828901613118565b9150509295509295909350565b61348881613a25565b82525050565b61349781613a37565b82525050565b60006134a88261394e565b6134b28185613959565b93506134c2818560208601613a7a565b6134cb81613c58565b840191505092915050565b60006134e3602383613959565b91506134ee82613c69565b604082019050919050565b6000613506602983613959565b915061351182613cb8565b604082019050919050565b6000613529602683613959565b915061353482613d07565b604082019050919050565b600061354c602283613959565b915061355782613d56565b604082019050919050565b600061356f601b83613959565b915061357a82613da5565b602082019050919050565b6000613592602883613959565b915061359d82613dce565b604082019050919050565b60006135b5602083613959565b91506135c082613e1d565b602082019050919050565b60006135d8602983613959565b91506135e382613e46565b604082019050919050565b60006135fb602583613959565b915061360682613e95565b604082019050919050565b600061361e601483613959565b915061362982613ee4565b602082019050919050565b6000613641602483613959565b915061364c82613f0d565b604082019050919050565b61366081613a63565b82525050565b61366f81613a6d565b82525050565b600060208201905061368a600083018461347f565b92915050565b60006020820190506136a5600083018461348e565b92915050565b60006040820190506136c0600083018561348e565b6136cd6020830184613657565b9392505050565b600060208201905081810360008301526136ee818461349d565b905092915050565b6000602082019050818103600083015261370f816134d6565b9050919050565b6000602082019050818103600083015261372f816134f9565b9050919050565b6000602082019050818103600083015261374f8161351c565b9050919050565b6000602082019050818103600083015261376f8161353f565b9050919050565b6000602082019050818103600083015261378f81613562565b9050919050565b600060208201905081810360008301526137af81613585565b9050919050565b600060208201905081810360008301526137cf816135a8565b9050919050565b600060208201905081810360008301526137ef816135cb565b9050919050565b6000602082019050818103600083015261380f816135ee565b9050919050565b6000602082019050818103600083015261382f81613611565b9050919050565b6000602082019050818103600083015261384f81613634565b9050919050565b600060208201905061386b6000830184613657565b92915050565b60006080820190506138866000830187613657565b6138936020830186613657565b6138a06040830185613657565b6138ad6060830184613657565b95945050505050565b60006020820190506138cb6000830184613666565b92915050565b60006138db6138ec565b90506138e78282613adf565b919050565b6000604051905090565b600067ffffffffffffffff82111561391157613910613c15565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561393d5761393c613c15565b5b602082029050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600061397582613a63565b915061398083613a63565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139b5576139b4613b59565b5b828201905092915050565b60006139cb82613a63565b91506139d683613a63565b9250826139e6576139e5613b88565b5b828204905092915050565b60006139fc82613a63565b9150613a0783613a63565b925082821015613a1a57613a19613b59565b5b828203905092915050565b6000613a3082613a43565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015613a98578082015181840152602081019050613a7d565b83811115613aa7576000848401525b50505050565b60006002820490506001821680613ac557607f821691505b60208210811415613ad957613ad8613bb7565b5b50919050565b613ae882613c58565b810181811067ffffffffffffffff82111715613b0757613b06613c15565b5b80604052505050565b6000613b1b82613a63565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b4e57613b4d613b59565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4f6e6c79206f6e65207472616e73616374696f6e2070657220626c6f636b206960008201527f7320616c6c6f7765640000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f426f747320617265206e6f7420616c6c6f776564000000000000000000000000600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b613f6581613a25565b8114613f7057600080fd5b50565b613f7c81613a37565b8114613f8757600080fd5b50565b613f9381613a63565b8114613f9e57600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220f51b3518ccca04fa9bdbcd421be5f2723e30d1f4330ddcc3d6a71b66a359a55b64736f6c63430008070033

Deployed Bytecode Sourcemap

1661:14092:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3962:81;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6136:187;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;4987:158;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4227:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5151:309;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4140:81;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7596:121;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5466:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15283:248;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6329:103;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4421:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7150:267;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15537:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6567:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4547:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4326:89;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1598:92:5;;;:::i;:::-;;966:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6673:119:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6438:123;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;4049:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6798:346;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5959:171;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;7423:167;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5687:266;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4670:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7723:551;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4840:141;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1839:189:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3962:81:6;3999:13;4031:5;4024:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3962:81;:::o;6136:187::-;6187:7;6196;6205;6214;6242:14;;6258:18;;6278:15;;6295:20;;6234:82;;;;;;;;6136:187;;;;:::o;4987:158::-;5062:4;5078:39;5087:12;:10;:12::i;:::-;5101:7;5110:6;5078:8;:39::i;:::-;5134:4;5127:11;;4987:158;;;;:::o;4227:93::-;4280:7;3305:33;4299:14;;4227:93;:::o;5151:309::-;5249:4;5265:36;5275:6;5283:9;5294:6;5265:9;:36::i;:::-;5311:121;5320:6;5328:12;:10;:12::i;:::-;5342:89;5380:6;5342:89;;;;;;;;;;;;;;;;;:11;:19;5354:6;5342:19;;;;;;;;;;;;;;;:33;5362:12;:10;:12::i;:::-;5342:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;5311:8;:121::i;:::-;5449:4;5442:11;;5151:309;;;;;:::o;4140:81::-;4181:5;4205:9;;;;;;;;;;;4198:16;;4140:81;:::o;7596:121::-;1189:12:5;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7694:15:6::1;7677:8;;:33;;;;;;;;;;;;;;;;;;7596:121:::0;:::o;5466:215::-;5554:4;5570:83;5579:12;:10;:12::i;:::-;5593:7;5602:50;5641:10;5602:11;:25;5614:12;:10;:12::i;:::-;5602:25;;;;;;;;;;;;;;;:34;5628:7;5602:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;5570:8;:83::i;:::-;5670:4;5663:11;;5466:215;;;;:::o;15283:248::-;1189:12:5;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15382:9:6::1;15377:148;15401:9;:16;15397:1;:20;15377:148;;;15438:12;15453:9;15463:1;15453:12;;;;;;;;:::i;:::-;;;;;;;;15438:27;;15486:22;:28;15509:4;15486:28;;;;;;;;;;;;;;;;15479:35;;;;;;;;;;;15424:101;15419:3;;;;;:::i;:::-;;;;15377:148;;;;15283:248:::0;:::o;6329:103::-;6386:7;6413:12;;6406:19;;6329:103;:::o;4421:120::-;4484:7;4510:8;;;;;;;;;;;:18;;;4529:4;4510:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4503:31;;4421:120;;;:::o;7150:267::-;1189:12:5;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7296:7:6::1;7282:11;:21;;;;7331:11;7313:15;:29;;;;7367:8;7352:12;:23;;;;7401:9;7385:13;:25;;;;7150:267:::0;;;;:::o;15537:214::-;1189:12:5;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15637:9:6::1;15632:113;15656:8;:15;15652:1;:19;15632:113;;;15730:4;15692:22;:35;15715:8;15724:1;15715:11;;;;;;;;:::i;:::-;;;;;;;;15692:35;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;15673:3;;;;;:::i;:::-;;;;15632:113;;;;15537:214:::0;:::o;6567:100::-;6618:4;6641:19;;;;;;;;;;;6634:26;;6567:100;:::o;4547:117::-;4613:7;4639:9;:18;4649:7;4639:18;;;;;;;;;;;;;;;;4632:25;;4547:117;;;:::o;4326:89::-;4370:7;4396:12;;;;;;;;;;;4389:19;;4326:89;:::o;1598:92:5:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1662:21:::1;1680:1;1662:9;:21::i;:::-;1598:92::o:0;966:85::-;1012:7;1038:6;;;;;;;;;;;1031:13;;966:85;:::o;6673:119:6:-;1189:12:5;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6770:15:6::1;6748:19;;:37;;;;;;;;;;;;;;;;;;6673:119:::0;:::o;6438:123::-;6491:4;6497:7;6525:12;;;;;;;;;;;6539:14;;6517:37;;;;6438:123;;:::o;4049:85::-;4088:13;4120:7;4113:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4049:85;:::o;6798:346::-;1189:12:5;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6968:11:6::1;6953:12;:26;;;;7006:7;6989:14;:24;;;;7044:11;7023:18;:32;;;;7083:8;7065:15;:26;;;;7124:13;7101:20;:36;;;;6798:346:::0;;;;;:::o;5959:171::-;6010:7;6019;6028;6037;6065:11;;6078:15;;6095:12;;6109:13;;6057:66;;;;;;;;5959:171;;;;:::o;7423:167::-;1189:12:5;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7532:11:6::1;7517:12;;:26;;;;;;;;;;;;;;;;;;7570:13;7553:14;:30;;;;7423:167:::0;;:::o;5687:266::-;5780:4;5796:129;5805:12;:10;:12::i;:::-;5819:7;5828:96;5867:15;5828:96;;;;;;;;;;;;;;;;;:11;:25;5840:12;:10;:12::i;:::-;5828:25;;;;;;;;;;;;;;;:34;5854:7;5828:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;5796:8;:129::i;:::-;5942:4;5935:11;;5687:266;;;;:::o;4670:164::-;4748:4;4764:42;4774:12;:10;:12::i;:::-;4788:9;4799:6;4764:9;:42::i;:::-;4823:4;4816:11;;4670:164;;;;:::o;7723:551::-;1189:12:5;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7839:9:6::1;7834:434;7858:9;:16;7854:1;:20;7834:434;;;7895:17;7915:9;7925:1;7915:12;;;;;;;;:::i;:::-;;;;;;;;7895:32;;7941:14;7958:7;7966:1;7958:10;;;;;;;;:::i;:::-;;;;;;;;7941:27;;7982:21;8006:33;8032:6;8006:9;:21;8016:10;8006:21;;;;;;;;;;;;;;;;:25;;:33;;;;:::i;:::-;7982:57;;8077:13;8053:9;:21;8063:10;8053:21;;;;;;;;;;;;;;;:37;;;;8127:32;8152:6;8127:9;:20;8137:9;8127:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;8104:9;:20;8114:9;8104:20;;;;;;;;;;;;;;;:55;;;;8173:26;8189:9;8173:15;:26::i;:::-;8239:9;8218:39;;8227:10;8218:39;;;8250:6;8218:39;;;;;;:::i;:::-;;;;;;;;7881:387;;;7876:3;;;;;:::i;:::-;;;;7834:434;;;;7723:551:::0;;:::o;4840:141::-;4921:7;4947:11;:18;4959:5;4947:18;;;;;;;;;;;;;;;:27;4966:7;4947:27;;;;;;;;;;;;;;;;4940:34;;4840:141;;;;:::o;1839:189:5:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1947:1:::1;1927:22;;:8;:22;;;;1919:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2002:19;2012:8;2002:9;:19::i;:::-;1839:189:::0;:::o;586:96:1:-;639:7;665:10;658:17;;586:96;:::o;8280:331:6:-;8389:1;8372:19;;:5;:19;;;;8364:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8469:1;8450:21;;:7;:21;;;;8442:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8551:6;8521:11;:18;8533:5;8521:18;;;;;;;;;;;;;;;:27;8540:7;8521:27;;;;;;;;;;;;;;;:36;;;;8588:7;8572:32;;8581:5;8572:32;;;8597:6;8572:32;;;;;;:::i;:::-;;;;;;;;8280:331;;;:::o;8617:1138::-;8731:1;8713:20;;:6;:20;;;;8705:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;8814:1;8793:23;;:9;:23;;;;8785:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;8883:1;8874:6;:10;8866:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;8955:7;:5;:7::i;:::-;8945:17;;:6;:17;;;;:41;;;;;8979:7;:5;:7::i;:::-;8966:20;;:9;:20;;;;8945:41;8941:134;;;9018:12;;9008:6;:22;;9000:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;8941:134;9090:22;:30;9113:6;9090:30;;;;;;;;;;;;;;;;;;;;;;;;;:68;;;;;9125:22;:33;9148:9;9125:33;;;;;;;;;;;;;;;;;;;;;;;;;9124:34;9090:68;9086:662;;;9174:43;9191:6;9199:9;9210:6;9174:16;:43::i;:::-;9086:662;;;9239:22;:30;9262:6;9239:30;;;;;;;;;;;;;;;;;;;;;;;;;9238:31;:68;;;;;9273:22;:33;9296:9;9273:33;;;;;;;;;;;;;;;;;;;;;;;;;9238:68;9234:514;;;9322:43;9339:6;9347:9;9358:6;9322:16;:43::i;:::-;9234:514;;;9387:22;:30;9410:6;9387:30;;;;;;;;;;;;;;;;;;;;;;;;;9386:31;:69;;;;;9422:22;:33;9445:9;9422:33;;;;;;;;;;;;;;;;;;;;;;;;;9421:34;9386:69;9382:366;;;9471:44;9489:6;9497:9;9508:6;9471:17;:44::i;:::-;9382:366;;;9536:22;:30;9559:6;9536:30;;;;;;;;;;;;;;;;;;;;;;;;;:67;;;;;9570:22;:33;9593:9;9570:33;;;;;;;;;;;;;;;;;;;;;;;;;9536:67;9532:216;;;9619:43;9636:6;9644:9;9655:6;9619:16;:43::i;:::-;9532:216;;;9693:44;9711:6;9719:9;9730:6;9693:17;:44::i;:::-;9532:216;9382:366;9234:514;9086:662;8617:1138;;;:::o;505:187::-;591:7;623:1;618;:6;;626:12;610:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;649:9;665:1;661;:5;;;;:::i;:::-;649:17;;684:1;677:8;;;505:187;;;;;:::o;183:176::-;241:7;260:9;276:1;272;:5;;;;:::i;:::-;260:17;;300:1;295;:6;;287:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;351:1;344:8;;;183:176;;;;:::o;2034:169:5:-;2089:16;2108:6;;;;;;;;;;;2089:25;;2133:8;2124:6;;:17;;;;;;;;;;;;;;;;;;2187:8;2156:40;;2177:8;2156:40;;;;;;;;;;;;2079:124;2034:169;:::o;365:134:6:-;423:7;449:43;453:1;456;449:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;442:50;;365:134;;;;:::o;12299:193::-;12366:13;:24;12380:9;12366:24;;;;;;;;;;;;;;;;;;;;;;;;;12361:125;;12406:8;12420:9;12406:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12471:4;12444:13;:24;12458:9;12444:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;12361:125;12299:193;:::o;9761:266::-;9876:29;9898:6;9876:9;:17;9886:6;9876:17;;;;;;;;;;;;;;;;:21;;:29;;;;:::i;:::-;9856:9;:17;9866:6;9856:17;;;;;;;;;;;;;;;:49;;;;9938:32;9963:6;9938:9;:20;9948:9;9938:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;9915:9;:20;9925:9;9915:20;;;;;;;;;;;;;;;:55;;;;10002:9;9985:35;;9994:6;9985:35;;;10013:6;9985:35;;;;;;:::i;:::-;;;;;;;;9761:266;;;:::o;10616:1677::-;10717:19;;;;;;;;;;;10713:158;;;10769:42;10793:6;10801:9;10769:23;:42::i;:::-;10752:14;;:59;;;;;;;;;;;;;;;;;;10825:35;10845:14;;;;;;;;;;;10825:19;:35::i;:::-;10713:158;10880:29;10912:32;10923:20;;10912:6;:10;;:32;;;;:::i;:::-;10880:64;;10954:23;10980:27;10991:15;;10980:6;:10;;:27;;;;:::i;:::-;10954:53;;11017:27;11047:30;11058:18;;11047:6;:10;;:30;;;;:::i;:::-;11017:60;;11087:23;11113:26;11124:14;;11113:6;:10;;:26;;;;:::i;:::-;11087:52;;11149:27;11179:24;11190:12;;11179:6;:10;;:24;;;;:::i;:::-;11149:54;;11213:38;11265:16;11284:113;11377:19;11284:88;11356:15;11284:67;11331:19;11284:42;11310:15;11284:21;:25;;:42;;;;:::i;:::-;:46;;:67;;;;:::i;:::-;:71;;:88;;;;:::i;:::-;:92;;:113;;;;:::i;:::-;11265:132;;11411:12;;;;;;;;;;;:41;;;;;11428:13;:24;11442:9;11428:24;;;;;;;;;;;;;;;;;;;;;;;;;11427:25;11411:41;:75;;;;;11456:22;:30;11479:6;11456:30;;;;;;;;;;;;;;;;;;;;;;;;;11411:75;11407:234;;;11535:26;11546:14;;11535:6;:10;;:26;;;;:::i;:::-;11502:59;;11586:44;11599:30;11586:8;:12;;:44;;;;:::i;:::-;11575:55;;11407:234;11650:26;11666:9;11650:15;:26::i;:::-;11686:25;11714:56;11739:30;11714:20;11725:8;11714:6;:10;;:20;;;;:::i;:::-;:24;;:56;;;;:::i;:::-;11686:84;;11800:29;11822:6;11800:9;:17;11810:6;11800:17;;;;;;;;;;;;;;;;:21;;:29;;;;:::i;:::-;11780:9;:17;11790:6;11780:17;;;;;;;;;;;;;;;:49;;;;11859:53;11881:30;11859:9;:17;11869:6;11859:17;;;;;;;;;;;;;;;;:21;;:53;;;;:::i;:::-;11839:9;:17;11849:6;11839:17;;;;;;;;;;;;;;;:73;;;;11945:43;11970:17;11945:9;:20;11955:9;11945:20;;;;;;;;;;;;;;;;:24;;:43;;;;:::i;:::-;11922:9;:20;11932:9;11922:20;;;;;;;;;;;;;;;:66;;;;11998:115;12015:19;12036:15;12053:19;12074:15;12091:21;11998:16;:115::i;:::-;12145:9;12128:46;;12137:6;12128:46;;;12156:17;12128:46;;;;;;:::i;:::-;;;;;;;;12189:19;;;;;;;;;;;12185:102;;;12264:12;12224:21;:37;12246:14;;;;;;;;;;;12224:37;;;;;;;;;;;;;;;:52;;;;12185:102;10702:1591;;;;;;;;10616:1677;;;:::o;10033:300::-;10127:7;10155:26;10174:6;10155:18;:26::i;:::-;10154:27;:61;;;;10186:29;10205:9;10186:18;:29::i;:::-;10185:30;10154:61;10146:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;10254:26;10273:6;10254:18;:26::i;:::-;10250:76;;;10289:9;10282:16;;;;10250:76;10320:6;10313:13;;10033:300;;;;;:::o;10339:271::-;10417:15;10474:1;10435:21;:35;10457:12;10435:35;;;;;;;;;;;;;;;;:40;:94;;;;10517:12;10479:21;:35;10501:12;10479:35;;;;;;;;;;;;;;;;:50;10435:94;10417:112;;10547:10;10539:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;10407:203;10339:271;:::o;945:130::-;1003:7;1029:39;1033:1;1036;1029:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;1022:46;;945:130;;;;:::o;12498:1719::-;12652:22;:20;:22::i;:::-;12684:21;12724:9;12719:963;12743:8;:15;;;;12739:1;:19;12719:963;;;12779:21;12803:8;12812:1;12803:11;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12779:35;;12883:22;:37;12906:13;12883:37;;;;;;;;;;;;;;;;;;;;;;;;;12879:84;;;12940:8;;;12879:84;12976:18;12997:33;13016:13;12997:18;:33::i;:::-;12976:54;;13065:12;;;;;;;;;;;13048:29;;:13;:29;;;13044:572;;13115:13;;13101:10;:27;13097:114;;13152:20;13178:13;13152:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13097:114;13246:12;;13232:10;:26;13228:112;;13282:19;13307:13;13282:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13228:112;13375:15;;13361:10;:29;13357:118;;13414:22;13442:13;13414:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13357:118;13510:11;;13496:10;:25;13492:110;;13545:18;13569:13;13545:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13492:110;13044:572;13629:22;13657:13;13629:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12765:917;;12719:963;12760:3;;;;;:::i;:::-;;;;12719:963;;;;13707:78;13725:59;13746:20;13725:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13768:15;13725:20;:59::i;:::-;13707:13;:17;;:78;;;;:::i;:::-;13691:94;;13811:72;13829:53;13850:19;13829:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13871:10;13829:20;:53::i;:::-;13811:13;:17;;:72;;;;:::i;:::-;13795:88;;13909:78;13927:59;13948:22;13927:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13972:13;13927:20;:59::i;:::-;13909:13;:17;;:78;;;;:::i;:::-;13893:94;;14013:70;14031:51;14052:18;14031:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14072:9;14031:20;:51::i;:::-;14013:13;:17;;:70;;;;:::i;:::-;13997:86;;14109:32;14127:13;14109;:17;;:32;;;;:::i;:::-;14093:48;;14151:59;14172:22;14151:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14196:13;14151:20;:59::i;:::-;;12642:1575;12498:1719;;;;;:::o;718:377:0:-;778:4;981:12;1046:7;1034:20;1026:28;;1087:1;1080:4;:8;1073:15;;;718:377;;;:::o;1081:272:6:-;1167:7;1198:1;1194;:5;1201:12;1186:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1224:9;1240:1;1236;:5;;;;:::i;:::-;1224:17;;1345:1;1338:8;;;1081:272;;;;;:::o;15044:233::-;15101:20;;15094:27;;;;:::i;:::-;15138:19;;15131:26;;;;:::i;:::-;15174:22;;15167:29;;;;:::i;:::-;15213:18;;15206:25;;;;:::i;:::-;15248:22;;15241:29;;;;:::i;:::-;15044:233::o;14505:533::-;14608:7;14650:1;14631:9;:16;:20;14627:405;;;14667:18;14688:40;14711:9;:16;14688:18;:22;;:40;;;;:::i;:::-;14667:61;;14748:9;14743:201;14767:9;:16;14763:1;:20;14743:201;;;14808:21;14832:9;14842:1;14832:12;;;;;;;;:::i;:::-;;;;;;;;14808:36;;14889:40;14918:10;14889:9;:24;14899:13;14889:24;;;;;;;;;;;;;;;;:28;;:40;;;;:::i;:::-;14862:9;:24;14872:13;14862:24;;;;;;;;;;;;;;;:67;;;;14790:154;14785:3;;;;;:::i;:::-;;;;14743:201;;;;14964:1;14957:8;;;;;14627:405;15003:18;14996:25;;14505:533;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:7:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:139::-;1543:5;1581:6;1568:20;1559:29;;1597:33;1624:5;1597:33;:::i;:::-;1497:139;;;;:::o;1659:370::-;1730:5;1779:3;1772:4;1764:6;1760:17;1756:27;1746:122;;1787:79;;:::i;:::-;1746:122;1904:6;1891:20;1929:94;2019:3;2011:6;2004:4;1996:6;1992:17;1929:94;:::i;:::-;1920:103;;1736:293;1659:370;;;;:::o;2052:::-;2123:5;2172:3;2165:4;2157:6;2153:17;2149:27;2139:122;;2180:79;;:::i;:::-;2139:122;2297:6;2284:20;2322:94;2412:3;2404:6;2397:4;2389:6;2385:17;2322:94;:::i;:::-;2313:103;;2129:293;2052:370;;;;:::o;2428:133::-;2471:5;2509:6;2496:20;2487:29;;2525:30;2549:5;2525:30;:::i;:::-;2428:133;;;;:::o;2567:139::-;2613:5;2651:6;2638:20;2629:29;;2667:33;2694:5;2667:33;:::i;:::-;2567:139;;;;:::o;2712:143::-;2769:5;2800:6;2794:13;2785:22;;2816:33;2843:5;2816:33;:::i;:::-;2712:143;;;;:::o;2861:329::-;2920:6;2969:2;2957:9;2948:7;2944:23;2940:32;2937:119;;;2975:79;;:::i;:::-;2937:119;3095:1;3120:53;3165:7;3156:6;3145:9;3141:22;3120:53;:::i;:::-;3110:63;;3066:117;2861:329;;;;:::o;3196:474::-;3264:6;3272;3321:2;3309:9;3300:7;3296:23;3292:32;3289:119;;;3327:79;;:::i;:::-;3289:119;3447:1;3472:53;3517:7;3508:6;3497:9;3493:22;3472:53;:::i;:::-;3462:63;;3418:117;3574:2;3600:53;3645:7;3636:6;3625:9;3621:22;3600:53;:::i;:::-;3590:63;;3545:118;3196:474;;;;;:::o;3676:619::-;3753:6;3761;3769;3818:2;3806:9;3797:7;3793:23;3789:32;3786:119;;;3824:79;;:::i;:::-;3786:119;3944:1;3969:53;4014:7;4005:6;3994:9;3990:22;3969:53;:::i;:::-;3959:63;;3915:117;4071:2;4097:53;4142:7;4133:6;4122:9;4118:22;4097:53;:::i;:::-;4087:63;;4042:118;4199:2;4225:53;4270:7;4261:6;4250:9;4246:22;4225:53;:::i;:::-;4215:63;;4170:118;3676:619;;;;;:::o;4301:474::-;4369:6;4377;4426:2;4414:9;4405:7;4401:23;4397:32;4394:119;;;4432:79;;:::i;:::-;4394:119;4552:1;4577:53;4622:7;4613:6;4602:9;4598:22;4577:53;:::i;:::-;4567:63;;4523:117;4679:2;4705:53;4750:7;4741:6;4730:9;4726:22;4705:53;:::i;:::-;4695:63;;4650:118;4301:474;;;;;:::o;4781:539::-;4865:6;4914:2;4902:9;4893:7;4889:23;4885:32;4882:119;;;4920:79;;:::i;:::-;4882:119;5068:1;5057:9;5053:17;5040:31;5098:18;5090:6;5087:30;5084:117;;;5120:79;;:::i;:::-;5084:117;5225:78;5295:7;5286:6;5275:9;5271:22;5225:78;:::i;:::-;5215:88;;5011:302;4781:539;;;;:::o;5326:894::-;5444:6;5452;5501:2;5489:9;5480:7;5476:23;5472:32;5469:119;;;5507:79;;:::i;:::-;5469:119;5655:1;5644:9;5640:17;5627:31;5685:18;5677:6;5674:30;5671:117;;;5707:79;;:::i;:::-;5671:117;5812:78;5882:7;5873:6;5862:9;5858:22;5812:78;:::i;:::-;5802:88;;5598:302;5967:2;5956:9;5952:18;5939:32;5998:18;5990:6;5987:30;5984:117;;;6020:79;;:::i;:::-;5984:117;6125:78;6195:7;6186:6;6175:9;6171:22;6125:78;:::i;:::-;6115:88;;5910:303;5326:894;;;;;:::o;6226:323::-;6282:6;6331:2;6319:9;6310:7;6306:23;6302:32;6299:119;;;6337:79;;:::i;:::-;6299:119;6457:1;6482:50;6524:7;6515:6;6504:9;6500:22;6482:50;:::i;:::-;6472:60;;6428:114;6226:323;;;;:::o;6555:351::-;6625:6;6674:2;6662:9;6653:7;6649:23;6645:32;6642:119;;;6680:79;;:::i;:::-;6642:119;6800:1;6825:64;6881:7;6872:6;6861:9;6857:22;6825:64;:::i;:::-;6815:74;;6771:128;6555:351;;;;:::o;6912:468::-;6977:6;6985;7034:2;7022:9;7013:7;7009:23;7005:32;7002:119;;;7040:79;;:::i;:::-;7002:119;7160:1;7185:53;7230:7;7221:6;7210:9;7206:22;7185:53;:::i;:::-;7175:63;;7131:117;7287:2;7313:50;7355:7;7346:6;7335:9;7331:22;7313:50;:::i;:::-;7303:60;;7258:115;6912:468;;;;;:::o;7386:765::-;7472:6;7480;7488;7496;7545:3;7533:9;7524:7;7520:23;7516:33;7513:120;;;7552:79;;:::i;:::-;7513:120;7672:1;7697:53;7742:7;7733:6;7722:9;7718:22;7697:53;:::i;:::-;7687:63;;7643:117;7799:2;7825:53;7870:7;7861:6;7850:9;7846:22;7825:53;:::i;:::-;7815:63;;7770:118;7927:2;7953:53;7998:7;7989:6;7978:9;7974:22;7953:53;:::i;:::-;7943:63;;7898:118;8055:2;8081:53;8126:7;8117:6;8106:9;8102:22;8081:53;:::i;:::-;8071:63;;8026:118;7386:765;;;;;;;:::o;8157:911::-;8252:6;8260;8268;8276;8284;8333:3;8321:9;8312:7;8308:23;8304:33;8301:120;;;8340:79;;:::i;:::-;8301:120;8460:1;8485:53;8530:7;8521:6;8510:9;8506:22;8485:53;:::i;:::-;8475:63;;8431:117;8587:2;8613:53;8658:7;8649:6;8638:9;8634:22;8613:53;:::i;:::-;8603:63;;8558:118;8715:2;8741:53;8786:7;8777:6;8766:9;8762:22;8741:53;:::i;:::-;8731:63;;8686:118;8843:2;8869:53;8914:7;8905:6;8894:9;8890:22;8869:53;:::i;:::-;8859:63;;8814:118;8971:3;8998:53;9043:7;9034:6;9023:9;9019:22;8998:53;:::i;:::-;8988:63;;8942:119;8157:911;;;;;;;;:::o;9074:118::-;9161:24;9179:5;9161:24;:::i;:::-;9156:3;9149:37;9074:118;;:::o;9198:109::-;9279:21;9294:5;9279:21;:::i;:::-;9274:3;9267:34;9198:109;;:::o;9313:364::-;9401:3;9429:39;9462:5;9429:39;:::i;:::-;9484:71;9548:6;9543:3;9484:71;:::i;:::-;9477:78;;9564:52;9609:6;9604:3;9597:4;9590:5;9586:16;9564:52;:::i;:::-;9641:29;9663:6;9641:29;:::i;:::-;9636:3;9632:39;9625:46;;9405:272;9313:364;;;;:::o;9683:366::-;9825:3;9846:67;9910:2;9905:3;9846:67;:::i;:::-;9839:74;;9922:93;10011:3;9922:93;:::i;:::-;10040:2;10035:3;10031:12;10024:19;;9683:366;;;:::o;10055:::-;10197:3;10218:67;10282:2;10277:3;10218:67;:::i;:::-;10211:74;;10294:93;10383:3;10294:93;:::i;:::-;10412:2;10407:3;10403:12;10396:19;;10055:366;;;:::o;10427:::-;10569:3;10590:67;10654:2;10649:3;10590:67;:::i;:::-;10583:74;;10666:93;10755:3;10666:93;:::i;:::-;10784:2;10779:3;10775:12;10768:19;;10427:366;;;:::o;10799:::-;10941:3;10962:67;11026:2;11021:3;10962:67;:::i;:::-;10955:74;;11038:93;11127:3;11038:93;:::i;:::-;11156:2;11151:3;11147:12;11140:19;;10799:366;;;:::o;11171:::-;11313:3;11334:67;11398:2;11393:3;11334:67;:::i;:::-;11327:74;;11410:93;11499:3;11410:93;:::i;:::-;11528:2;11523:3;11519:12;11512:19;;11171:366;;;:::o;11543:::-;11685:3;11706:67;11770:2;11765:3;11706:67;:::i;:::-;11699:74;;11782:93;11871:3;11782:93;:::i;:::-;11900:2;11895:3;11891:12;11884:19;;11543:366;;;:::o;11915:::-;12057:3;12078:67;12142:2;12137:3;12078:67;:::i;:::-;12071:74;;12154:93;12243:3;12154:93;:::i;:::-;12272:2;12267:3;12263:12;12256:19;;11915:366;;;:::o;12287:::-;12429:3;12450:67;12514:2;12509:3;12450:67;:::i;:::-;12443:74;;12526:93;12615:3;12526:93;:::i;:::-;12644:2;12639:3;12635:12;12628:19;;12287:366;;;:::o;12659:::-;12801:3;12822:67;12886:2;12881:3;12822:67;:::i;:::-;12815:74;;12898:93;12987:3;12898:93;:::i;:::-;13016:2;13011:3;13007:12;13000:19;;12659:366;;;:::o;13031:::-;13173:3;13194:67;13258:2;13253:3;13194:67;:::i;:::-;13187:74;;13270:93;13359:3;13270:93;:::i;:::-;13388:2;13383:3;13379:12;13372:19;;13031:366;;;:::o;13403:::-;13545:3;13566:67;13630:2;13625:3;13566:67;:::i;:::-;13559:74;;13642:93;13731:3;13642:93;:::i;:::-;13760:2;13755:3;13751:12;13744:19;;13403:366;;;:::o;13775:118::-;13862:24;13880:5;13862:24;:::i;:::-;13857:3;13850:37;13775:118;;:::o;13899:112::-;13982:22;13998:5;13982:22;:::i;:::-;13977:3;13970:35;13899:112;;:::o;14017:222::-;14110:4;14148:2;14137:9;14133:18;14125:26;;14161:71;14229:1;14218:9;14214:17;14205:6;14161:71;:::i;:::-;14017:222;;;;:::o;14245:210::-;14332:4;14370:2;14359:9;14355:18;14347:26;;14383:65;14445:1;14434:9;14430:17;14421:6;14383:65;:::i;:::-;14245:210;;;;:::o;14461:320::-;14576:4;14614:2;14603:9;14599:18;14591:26;;14627:65;14689:1;14678:9;14674:17;14665:6;14627:65;:::i;:::-;14702:72;14770:2;14759:9;14755:18;14746:6;14702:72;:::i;:::-;14461:320;;;;;:::o;14787:313::-;14900:4;14938:2;14927:9;14923:18;14915:26;;14987:9;14981:4;14977:20;14973:1;14962:9;14958:17;14951:47;15015:78;15088:4;15079:6;15015:78;:::i;:::-;15007:86;;14787:313;;;;:::o;15106:419::-;15272:4;15310:2;15299:9;15295:18;15287:26;;15359:9;15353:4;15349:20;15345:1;15334:9;15330:17;15323:47;15387:131;15513:4;15387:131;:::i;:::-;15379:139;;15106:419;;;:::o;15531:::-;15697:4;15735:2;15724:9;15720:18;15712:26;;15784:9;15778:4;15774:20;15770:1;15759:9;15755:17;15748:47;15812:131;15938:4;15812:131;:::i;:::-;15804:139;;15531:419;;;:::o;15956:::-;16122:4;16160:2;16149:9;16145:18;16137:26;;16209:9;16203:4;16199:20;16195:1;16184:9;16180:17;16173:47;16237:131;16363:4;16237:131;:::i;:::-;16229:139;;15956:419;;;:::o;16381:::-;16547:4;16585:2;16574:9;16570:18;16562:26;;16634:9;16628:4;16624:20;16620:1;16609:9;16605:17;16598:47;16662:131;16788:4;16662:131;:::i;:::-;16654:139;;16381:419;;;:::o;16806:::-;16972:4;17010:2;16999:9;16995:18;16987:26;;17059:9;17053:4;17049:20;17045:1;17034:9;17030:17;17023:47;17087:131;17213:4;17087:131;:::i;:::-;17079:139;;16806:419;;;:::o;17231:::-;17397:4;17435:2;17424:9;17420:18;17412:26;;17484:9;17478:4;17474:20;17470:1;17459:9;17455:17;17448:47;17512:131;17638:4;17512:131;:::i;:::-;17504:139;;17231:419;;;:::o;17656:::-;17822:4;17860:2;17849:9;17845:18;17837:26;;17909:9;17903:4;17899:20;17895:1;17884:9;17880:17;17873:47;17937:131;18063:4;17937:131;:::i;:::-;17929:139;;17656:419;;;:::o;18081:::-;18247:4;18285:2;18274:9;18270:18;18262:26;;18334:9;18328:4;18324:20;18320:1;18309:9;18305:17;18298:47;18362:131;18488:4;18362:131;:::i;:::-;18354:139;;18081:419;;;:::o;18506:::-;18672:4;18710:2;18699:9;18695:18;18687:26;;18759:9;18753:4;18749:20;18745:1;18734:9;18730:17;18723:47;18787:131;18913:4;18787:131;:::i;:::-;18779:139;;18506:419;;;:::o;18931:::-;19097:4;19135:2;19124:9;19120:18;19112:26;;19184:9;19178:4;19174:20;19170:1;19159:9;19155:17;19148:47;19212:131;19338:4;19212:131;:::i;:::-;19204:139;;18931:419;;;:::o;19356:::-;19522:4;19560:2;19549:9;19545:18;19537:26;;19609:9;19603:4;19599:20;19595:1;19584:9;19580:17;19573:47;19637:131;19763:4;19637:131;:::i;:::-;19629:139;;19356:419;;;:::o;19781:222::-;19874:4;19912:2;19901:9;19897:18;19889:26;;19925:71;19993:1;19982:9;19978:17;19969:6;19925:71;:::i;:::-;19781:222;;;;:::o;20009:553::-;20186:4;20224:3;20213:9;20209:19;20201:27;;20238:71;20306:1;20295:9;20291:17;20282:6;20238:71;:::i;:::-;20319:72;20387:2;20376:9;20372:18;20363:6;20319:72;:::i;:::-;20401;20469:2;20458:9;20454:18;20445:6;20401:72;:::i;:::-;20483;20551:2;20540:9;20536:18;20527:6;20483:72;:::i;:::-;20009:553;;;;;;;:::o;20568:214::-;20657:4;20695:2;20684:9;20680:18;20672:26;;20708:67;20772:1;20761:9;20757:17;20748:6;20708:67;:::i;:::-;20568:214;;;;:::o;20788:129::-;20822:6;20849:20;;:::i;:::-;20839:30;;20878:33;20906:4;20898:6;20878:33;:::i;:::-;20788:129;;;:::o;20923:75::-;20956:6;20989:2;20983:9;20973:19;;20923:75;:::o;21004:311::-;21081:4;21171:18;21163:6;21160:30;21157:56;;;21193:18;;:::i;:::-;21157:56;21243:4;21235:6;21231:17;21223:25;;21303:4;21297;21293:15;21285:23;;21004:311;;;:::o;21321:::-;21398:4;21488:18;21480:6;21477:30;21474:56;;;21510:18;;:::i;:::-;21474:56;21560:4;21552:6;21548:17;21540:25;;21620:4;21614;21610:15;21602:23;;21321:311;;;:::o;21638:99::-;21690:6;21724:5;21718:12;21708:22;;21638:99;;;:::o;21743:169::-;21827:11;21861:6;21856:3;21849:19;21901:4;21896:3;21892:14;21877:29;;21743:169;;;;:::o;21918:305::-;21958:3;21977:20;21995:1;21977:20;:::i;:::-;21972:25;;22011:20;22029:1;22011:20;:::i;:::-;22006:25;;22165:1;22097:66;22093:74;22090:1;22087:81;22084:107;;;22171:18;;:::i;:::-;22084:107;22215:1;22212;22208:9;22201:16;;21918:305;;;;:::o;22229:185::-;22269:1;22286:20;22304:1;22286:20;:::i;:::-;22281:25;;22320:20;22338:1;22320:20;:::i;:::-;22315:25;;22359:1;22349:35;;22364:18;;:::i;:::-;22349:35;22406:1;22403;22399:9;22394:14;;22229:185;;;;:::o;22420:191::-;22460:4;22480:20;22498:1;22480:20;:::i;:::-;22475:25;;22514:20;22532:1;22514:20;:::i;:::-;22509:25;;22553:1;22550;22547:8;22544:34;;;22558:18;;:::i;:::-;22544:34;22603:1;22600;22596:9;22588:17;;22420:191;;;;:::o;22617:96::-;22654:7;22683:24;22701:5;22683:24;:::i;:::-;22672:35;;22617:96;;;:::o;22719:90::-;22753:7;22796:5;22789:13;22782:21;22771:32;;22719:90;;;:::o;22815:126::-;22852:7;22892:42;22885:5;22881:54;22870:65;;22815:126;;;:::o;22947:77::-;22984:7;23013:5;23002:16;;22947:77;;;:::o;23030:86::-;23065:7;23105:4;23098:5;23094:16;23083:27;;23030:86;;;:::o;23122:307::-;23190:1;23200:113;23214:6;23211:1;23208:13;23200:113;;;23299:1;23294:3;23290:11;23284:18;23280:1;23275:3;23271:11;23264:39;23236:2;23233:1;23229:10;23224:15;;23200:113;;;23331:6;23328:1;23325:13;23322:101;;;23411:1;23402:6;23397:3;23393:16;23386:27;23322:101;23171:258;23122:307;;;:::o;23435:320::-;23479:6;23516:1;23510:4;23506:12;23496:22;;23563:1;23557:4;23553:12;23584:18;23574:81;;23640:4;23632:6;23628:17;23618:27;;23574:81;23702:2;23694:6;23691:14;23671:18;23668:38;23665:84;;;23721:18;;:::i;:::-;23665:84;23486:269;23435:320;;;:::o;23761:281::-;23844:27;23866:4;23844:27;:::i;:::-;23836:6;23832:40;23974:6;23962:10;23959:22;23938:18;23926:10;23923:34;23920:62;23917:88;;;23985:18;;:::i;:::-;23917:88;24025:10;24021:2;24014:22;23804:238;23761:281;;:::o;24048:233::-;24087:3;24110:24;24128:5;24110:24;:::i;:::-;24101:33;;24156:66;24149:5;24146:77;24143:103;;;24226:18;;:::i;:::-;24143:103;24273:1;24266:5;24262:13;24255:20;;24048:233;;;:::o;24287:180::-;24335:77;24332:1;24325:88;24432:4;24429:1;24422:15;24456:4;24453:1;24446:15;24473:180;24521:77;24518:1;24511:88;24618:4;24615:1;24608:15;24642:4;24639:1;24632:15;24659:180;24707:77;24704:1;24697:88;24804:4;24801:1;24794:15;24828:4;24825:1;24818:15;24845:180;24893:77;24890:1;24883:88;24990:4;24987:1;24980:15;25014:4;25011:1;25004:15;25031:180;25079:77;25076:1;25069:88;25176:4;25173:1;25166:15;25200:4;25197:1;25190:15;25217:117;25326:1;25323;25316:12;25340:117;25449:1;25446;25439:12;25463:117;25572:1;25569;25562:12;25586:117;25695:1;25692;25685:12;25709:102;25750:6;25801:2;25797:7;25792:2;25785:5;25781:14;25777:28;25767:38;;25709:102;;;:::o;25817:222::-;25957:34;25953:1;25945:6;25941:14;25934:58;26026:5;26021:2;26013:6;26009:15;26002:30;25817:222;:::o;26045:228::-;26185:34;26181:1;26173:6;26169:14;26162:58;26254:11;26249:2;26241:6;26237:15;26230:36;26045:228;:::o;26279:225::-;26419:34;26415:1;26407:6;26403:14;26396:58;26488:8;26483:2;26475:6;26471:15;26464:33;26279:225;:::o;26510:221::-;26650:34;26646:1;26638:6;26634:14;26627:58;26719:4;26714:2;26706:6;26702:15;26695:29;26510:221;:::o;26737:177::-;26877:29;26873:1;26865:6;26861:14;26854:53;26737:177;:::o;26920:227::-;27060:34;27056:1;27048:6;27044:14;27037:58;27129:10;27124:2;27116:6;27112:15;27105:35;26920:227;:::o;27153:182::-;27293:34;27289:1;27281:6;27277:14;27270:58;27153:182;:::o;27341:228::-;27481:34;27477:1;27469:6;27465:14;27458:58;27550:11;27545:2;27537:6;27533:15;27526:36;27341:228;:::o;27575:224::-;27715:34;27711:1;27703:6;27699:14;27692:58;27784:7;27779:2;27771:6;27767:15;27760:32;27575:224;:::o;27805:170::-;27945:22;27941:1;27933:6;27929:14;27922:46;27805:170;:::o;27981:223::-;28121:34;28117:1;28109:6;28105:14;28098:58;28190:6;28185:2;28177:6;28173:15;28166:31;27981:223;:::o;28210:122::-;28283:24;28301:5;28283:24;:::i;:::-;28276:5;28273:35;28263:63;;28322:1;28319;28312:12;28263:63;28210:122;:::o;28338:116::-;28408:21;28423:5;28408:21;:::i;:::-;28401:5;28398:32;28388:60;;28444:1;28441;28434:12;28388:60;28338:116;:::o;28460:122::-;28533:24;28551:5;28533:24;:::i;:::-;28526:5;28523:35;28513:63;;28572:1;28569;28562:12;28513:63;28460:122;:::o

Swarm Source

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