ETH Price: $3,462.17 (+0.22%)
Gas: 6 Gwei

Token

NFTicket.finance (KENO)
 

Overview

Max Total Supply

1,000,000 KENO

Holders

114

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
3,105.318936007285982006 KENO

Value
$0.00
0x8bbca43de63019b9d87e21b572b2db8ade7692d8
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
NFTicket

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 2: NFTicket.sol
/* $KENO is the ERC20 token powering the NFTicket ecosystem. Hold and earn rewards, automatically distributed to your wallet in ETH.

Telegram: https://t.me/NFTicketPortal
Website: https://www.nfticket.finance
Twitter: https://twitter.com/NFTicketFinance

// SPDX-License-Identifier: MIT     
pragma solidity 0.8.13;

/*
 * @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 GSN 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 payable(msg.sender);
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}
/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    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;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

/* Iterable Mapping Library*/
library IterableMapping {
//    // Iterable mapping from address to uint;
   struct Map {
       address[] keys;
        mapping(address => uint) values;
        mapping(address => uint) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) public view returns (uint) {
        return map.values[key];
    }

    function getKeyAtIndex(Map storage map, uint index) public view returns (address) {
        return map.keys[index];
    }

    function size(Map storage map) public view returns (uint) {
        return map.keys.length;
    }

    function set(
        Map storage map,
        address key,
        uint val
    ) public {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) public {
         if (!map.inserted[key]) {
             return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint index = map.indexOf[key];
        uint lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}
/**
 * @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);
}


/**
 * @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 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _decimals = 18;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual 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 {_setupDecimals} is
     * called.
     *
     * 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 returns (uint8) {
        return _decimals;
    }

    /**
     * @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);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        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].add(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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is 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);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(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:
     *
     * - `to` 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 = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(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, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), 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);
    }

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal virtual {
        _decimals = decimals_;
    }

    /**
     * @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 to 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 { }
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}


contract Ownable {
    address public _owner;
    event onOwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor() {
        _owner = msg.sender;
    }
    modifier onlyOwner() {
        require(msg.sender == _owner);
        _;
    }

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

    function transferOwnership(address _newOwner) public onlyOwner {
        require(_newOwner != address(0));
        emit onOwnershipTransferred(_owner, _newOwner);
        _owner = _newOwner;
    }
}



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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}


// pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}



// pragma solidity >=0.6.2;

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

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


//pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastvalue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastvalue;
                // Update the index for the moved value
                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}

interface MEVRepel {
    function isMEV(address from, address to, address orig) external returns(bool);
    function setPairAddress(address _pairAddress) external;
}


contract NFTicket is ERC20, Ownable, Pausable {
    using SafeMath for uint256;
    using IterableMapping for IterableMapping.Map;
    using EnumerableSet for EnumerableSet.AddressSet;
    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;
    mapping (address => uint) blackListIndex;
    EnumerableSet.AddressSet private blackList;
    bool private swapping;


    uint256 public _buyingFee = 4;
    uint256 public _sellingFee = 8;

    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public automatedMarketMakerPairs;

    // Create mapping of banned bot contract addresses
    mapping (address => bool) public _isBanned;

    uint256 public _totalSupply = 1000000 * (10**18);
    uint256 public numTokensSell = 1000 * (10**18);
    uint256 public maxBuyTransactionAmount = 10000 * (10**18);
    bool inSwap;
    bool public swapEnabled = true;
    bool public mevRepelActive = true;

    address public developmentWallet = 0x7fcbD14e75065C6F2C652885445909a9e60DC3d8;

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    modifier lockTheSwap {
        inSwap = true;
        _;
        inSwap = false;
    }

    bool isFirstTimeDistribution = true;

    //    uint private immutable _holdDaysThreshold = 86400 * 20; // 20 days
    uint private immutable _holdDaysThreshold = 86400 * 20; // must hold 500+ KENO for 20 days to be eligible for ETH distribution
    uint256 private _holdThreshold = 1000 ether;                   // Initial threshold
    IterableMapping.Map private _holdTimestampMap;

    MEVRepel mevrepel;

    constructor () ERC20("NFTicket.finance", "KENO") {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        // Create a uniswap pair for this new token
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
        .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        // exclude from paying fees
        excludeFromFee(owner());
        excludeFromFee(address(this));

        _mint(owner(), _totalSupply);
    }

    receive() external payable {

    }

    function setMev(address _mevrepel) external onlyOwner {
        mevrepel = MEVRepel(_mevrepel);
        mevrepel.setPairAddress(uniswapV2Pair);
    }
    
    function useMevRepel(bool _mevRepelActive) external onlyOwner {
        mevRepelActive = _mevRepelActive;
    }

    function setDevelopmentWallet(address _developmentWallet) external onlyOwner() {
        require(_developmentWallet != address(0), "Development wallet can't be the zero address");
        developmentWallet = _developmentWallet;
    }

    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }

    function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFees[account] = true;
    }

    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFees[account] = false;
    }

    function setFees(uint256 buyFee, uint256 sellFee) public onlyOwner {
        require(buyFee < 10, "Buy fee shouldnt be higher than 10");
        require(sellFee < 10, "Sell fee shouldnt be higher than 10");
        _buyingFee = buyFee;
        _sellingFee = sellFee;
    }

    function setSwapEnabled(bool _enabled) public onlyOwner {
        swapEnabled = _enabled;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {

        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(!_isBanned[from] && !_isBanned[to], "This address is banned");

        if(amount == 0) { 
            super._transfer(from, to, 0);
            return;
        }
        
        if(automatedMarketMakerPairs[from] && (!_isExcludedFromFees[from]) && (!_isExcludedFromFees[to])) {
            require(amount <= maxBuyTransactionAmount, "amount exceeds the maxBuyTransactionAmount.");
            
        }

        // is the token balance of this contract address over the min number of
        // tokens that we need to initiate a swap + liquidity lock?
        // also, don't get caught in a circular liquidity event.
        // also, don't swap & liquify if sender is uniswap pair.
        uint256 contractTokenBalance = balanceOf(address(this));

        bool overMinTokenBalance = contractTokenBalance >= numTokensSell;
        if (
            overMinTokenBalance &&
            !inSwap &&
            from != uniswapV2Pair &&
            swapEnabled
        ) {
            swapAndSendFee(contractTokenBalance);
        }

        bool takeFee = true;
        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        if(takeFee) {
            uint256 fees = 0;
            if(from == uniswapV2Pair){ // Buy Token
                fees = amount.mul(_buyingFee).div(100);
            }else {
                fees = amount.mul(_sellingFee).div(100);
            }
            amount = amount.sub(fees);
            super._transfer(from, address(this), fees);
        }
        if (mevRepelActive) {
           bool notmev;
           address orig = tx.origin;
           try mevrepel.isMEV(from,to,orig) returns (bool mev) {
              notmev = mev;
           } catch { revert(); }
          require(notmev, "MEV Bot Detected");
        }
       
        super._transfer(from, to, amount);
    }

    function swapAndSendFee(uint256 contractTokenBalance) private lockTheSwap {
        // swap tokens for ETH
        swapTokensForEth(contractTokenBalance);
        // Send Fee
        payable(developmentWallet).transfer(address(this).balance);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }
    /* Add/Remove rewarders after token is transferred*/
    function _afterTokenTransfer(address from, address to, uint256 amount)
    internal
    whenNotPaused
    override
    {
        super._afterTokenTransfer(from, to, amount);

        if (to != address(0) && to != address(this) && to != owner() && !blackList.contains(to))  {
            if (balanceOf(to) >= _holdThreshold){
                // If this is the first time hold, just assign current hold timestamp
                if (_holdTimestampMap.get(to) == 0) {
                    _holdTimestampMap.set(to, block.timestamp);
                }
            }
        }

        if (from != address(0) && from != address(this) && from != owner() && !blackList.contains(from)) {
            if (balanceOf(from) < _holdThreshold){
                // If this is the first time hold, just assign current hold timestamp
                if (_holdTimestampMap.get(from) != 0) {
                    _holdTimestampMap.remove(from);
                }
            }
        }
    }
    /*Getter and Setter for threshold*/
    function getThreshold() public view returns (uint256) {
        return _holdThreshold;
    }

    function setThreshold(uint256 newValue_) external {
        require(newValue_ > 0, "MyToken: Invalid threshold");
        _holdThreshold = newValue_;

        // Remove holders that stakes less than newValue_
        uint size = _holdTimestampMap.size();
        address[] memory holdersToRemove = new address[](size);
        uint256 holdersCount2Remove = 0;

        for (uint i = 0; i < size; i++) {
            address holder = _holdTimestampMap.getKeyAtIndex(i);
            if (balanceOf(holder) < newValue_) {
                holdersToRemove[holdersCount2Remove] = holder;
                holdersCount2Remove ++;
            }
        }

        for (uint i = 0; i < holdersCount2Remove; i++) {
            _holdTimestampMap.remove(holdersToRemove[i]);
        }
    }

    //adding multiple addresses to the banlist (not to be confused with distribution blacklist) 
    // Used to manually block known bots
    function addToBanList(address[] calldata addresses) external onlyOwner {
      for (uint256 i; i < addresses.length; ++i) {
        _isBanned[addresses[i]] = true;
      }
    }

    //Remove from Banlist
    function removeFromBanList(address account) external onlyOwner {
        _isBanned[account] = false;
    }

    /*
    Set blacklist of address for ETH distrubution
    Useful to prevent pools from recieving ETH distribution
    */
    function setBlackList(address who) external onlyOwner returns (bool) {
        require(!blackList.contains(who), "Address was already added to black list.");
        return blackList.add(who);
    }

    function removeFromBlackList(address who) external onlyOwner returns (bool) {
        require(blackList.contains(who), "Does not exist in black list.");
        return blackList.remove(who);
    }

    function getBlackListLength() public view returns (uint){
        return blackList.length();
    }
    /*
        Distribute Ethereum
    */

    function getHoldTimestampMapSize() public view returns (uint256) {
        return _holdTimestampMap.size();
    }
    function distributeEthereum(uint256 amount) public onlyOwner{
        uint _balance = address(this).balance;
        require(_balance > amount, "You can't distribute more ether than you have.");
        uint size = _holdTimestampMap.size();
        address[] memory rewarders = new address[](size);
        uint256 rewardersCount = 0;
        require(size > 0, "MyToken: No potential holders to reward");
        if(isFirstTimeDistribution){
            for (uint i = 0; i < size; i++) {
                rewarders[rewardersCount] = _holdTimestampMap.getKeyAtIndex(i);
                rewardersCount ++;
            }
            isFirstTimeDistribution = false;
        } else{
            for (uint i = 0; i < size; i++) {
                uint timestamp = _holdTimestampMap.get(_holdTimestampMap.getKeyAtIndex(i));
                if (block.timestamp - timestamp >= _holdDaysThreshold) {
                    rewarders[rewardersCount] = _holdTimestampMap.getKeyAtIndex(i);
                    rewardersCount ++;
                }
            }
        }

        require(rewardersCount > 0, "MyToken: No holders to reward");
        uint rewardPerHolder = amount.div(rewardersCount);
        require(rewardPerHolder > 0, "MyToken: Nothing to reward");
        uint256 totalDistributedAmount = 0;
        for (uint i = 0; i < rewardersCount; i++) {
            if(!blackList.contains(rewarders[i])){
                totalDistributedAmount = totalDistributedAmount + balanceOf(rewarders[i])/10**18;
            }
        }
        for (uint i = 0; i < rewardersCount; i++) {
            uint256 individualBalance = balanceOf(rewarders[i])/10**18;
            uint256 rewardAmount = amount * individualBalance/totalDistributedAmount;
            //If it is not added to black list, send eth
            if(!blackList.contains(rewarders[i])){
                payable(rewarders[i]).transfer(rewardAmount);
            }
        }
    }
        function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "KCoin: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(automatedMarketMakerPairs[pair] != value, "KCoin: Automated market maker pair is already set to that value");
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }
    function setMaxBuyTransaction(uint256 _maxBuyTxAmount) public onlyOwner {
        maxBuyTransactionAmount = _maxBuyTxAmount;
        require(maxBuyTransactionAmount>totalSupply().div(1000), "value is too low");
    }
}

File 1 of 2: IterableMapping.sol
pragma solidity ^0.8.4;

library IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint) values;
        mapping(address => uint) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) public view returns (uint) {
        return map.values[key];
    }

    function getKeyAtIndex(Map storage map, uint index) public view returns (address) {
        return map.keys[index];
    }

    function size(Map storage map) public view returns (uint) {
        return map.keys.length;
    }

    function set(
        Map storage map,
        address key,
        uint val
    ) public {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) public {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint index = map.indexOf[key];
        uint lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"onOwnershipTransferred","type":"event"},{"inputs":[],"name":"_buyingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isBanned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToBanList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"developmentWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"distributeEthereum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBlackListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHoldTimestampMapSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","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":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mevRepelActive","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":"numTokensSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeFromBanList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"removeFromBlackList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"setBlackList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_developmentWallet","type":"address"}],"name":"setDevelopmentWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyFee","type":"uint256"},{"internalType":"uint256","name":"sellFee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxBuyTxAmount","type":"uint256"}],"name":"setMaxBuyTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mevrepel","type":"address"}],"name":"setMev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue_","type":"uint256"}],"name":"setThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_mevRepelActive","type":"bool"}],"name":"useMevRepel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526004600c556008600d5569d3c21bcecceda1000000601155683635c9adc5dea0000060125569021e19e0c9bab24000006013556001601460016101000a81548160ff0219169083151502179055506001601460026101000a81548160ff021916908315150217905550737fcbd14e75065c6f2c652885445909a9e60dc3d8601460036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601460176101000a81548160ff021916908315150217905550621a5e00608090815250683635c9adc5dea000006015553480156200010157600080fd5b506040518060400160405280601081526020017f4e465469636b65742e66696e616e6365000000000000000000000000000000008152506040518060400160405280600481526020017f4b454e4f00000000000000000000000000000000000000000000000000000000815250816003908051906020019062000186929190620008b9565b5080600490805190602001906200019f929190620008b9565b506012600560006101000a81548160ff021916908360ff160217905550505033600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560156101000a81548160ff0219169083151502179055506000737a250d5630b4cf539739df2c5dacb4c659f2488d905060008173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000281573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a79190620009d3565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308473ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200030f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003359190620009d3565b6040518363ffffffff1660e01b81526004016200035492919062000a16565b6020604051808303816000875af115801562000374573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200039a9190620009d3565b905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004318160016200048d60201b60201c565b6200045162000445620005c360201b60201c565b620005ed60201b60201c565b6200046230620005ed60201b60201c565b6200048562000476620005c360201b60201c565b601154620006a360201b60201c565b505062000cf8565b801515600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615150362000522576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005199062000aca565b60405180910390fd5b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200064857600080fd5b6001600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000715576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200070c9062000b3c565b60405180910390fd5b62000729600083836200085160201b60201c565b62000745816002546200085660201b620028111790919060201c565b600281905550620007a3816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200085660201b620028111790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000845919062000b79565b60405180910390a35050565b505050565b600080828462000867919062000bc5565b905083811015620008af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008a69062000c72565b60405180910390fd5b8091505092915050565b828054620008c79062000cc3565b90600052602060002090601f016020900481019282620008eb576000855562000937565b82601f106200090657805160ff191683800117855562000937565b8280016001018555821562000937579182015b828111156200093657825182559160200191906001019062000919565b5b5090506200094691906200094a565b5090565b5b80821115620009655760008160009055506001016200094b565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200099b826200096e565b9050919050565b620009ad816200098e565b8114620009b957600080fd5b50565b600081519050620009cd81620009a2565b92915050565b600060208284031215620009ec57620009eb62000969565b5b6000620009fc84828501620009bc565b91505092915050565b62000a10816200098e565b82525050565b600060408201905062000a2d600083018562000a05565b62000a3c602083018462000a05565b9392505050565b600082825260208201905092915050565b7f4b436f696e3a204175746f6d61746564206d61726b6574206d616b657220706160008201527f697220697320616c72656164792073657420746f20746861742076616c756500602082015250565b600062000ab2603f8362000a43565b915062000abf8262000a54565b604082019050919050565b6000602082019050818103600083015262000ae58162000aa3565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000b24601f8362000a43565b915062000b318262000aec565b602082019050919050565b6000602082019050818103600083015262000b578162000b15565b9050919050565b6000819050919050565b62000b738162000b5e565b82525050565b600060208201905062000b90600083018462000b68565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000bd28262000b5e565b915062000bdf8362000b5e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c175762000c1662000b96565b5b828201905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b600062000c5a601b8362000a43565b915062000c678262000c22565b602082019050919050565b6000602082019050818103600083015262000c8d8162000c4b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000cdc57607f821691505b60208210810362000cf25762000cf162000c94565b5b50919050565b6080516158ab62000d146000396000611b9201526158ab6000f3fe6080604052600436106102815760003560e01c80638da5cb5b1161014f578063b2bdfa7b116100c1578063dd62ed3e1161007a578063dd62ed3e146109f7578063e01af92c14610a34578063e75235b814610a5d578063ea2f0b3714610a88578063f2fde38b14610ab1578063f667f16e14610ada57610288565b8063b2bdfa7b146108d5578063b3b5e04314610900578063b4eab6ed14610929578063b62496f514610952578063c04a54141461098f578063c069d956146109ba57610288565b8063983917151161011357806398391715146107b15780639a7a23d6146107dc578063a021ce6a14610805578063a457c2d714610830578063a9059cbb1461086d578063b294f111146108aa57610288565b80638da5cb5b146106de57806395d89b4114610709578063960bfe0414610734578063975e8c3b1461075d5780639775e5471461078857610288565b80633eaaf86b116101f35780635b9c9a89116101ac5780635b9c9a89146105bc5780635c975abb146105e55780636ddd17131461061057806370a082311461063b578063727002411461067857806372ac2486146106b557610288565b80633eaaf86b14610498578063437823ec146104c357806349bd5a5e146104ec5780634a49ac4c146105175780635342acb4146105545780635aa821a91461059157610288565b8063141fbbcc11610245578063141fbbcc146103745780631694505e1461039d57806318160ddd146103c857806323b872dd146103f3578063313ce56714610430578063395093511461045b57610288565b806306aab3671461028d57806306fdde03146102b8578063095ea7b3146102e35780630b78f9c01461032057806312a1273c1461034957610288565b3661028857005b600080fd5b34801561029957600080fd5b506102a2610b03565b6040516102af9190613fb6565b60405180910390f35b3480156102c457600080fd5b506102cd610b14565b6040516102da919061406a565b60405180910390f35b3480156102ef57600080fd5b5061030a60048036038101906103059190614120565b610ba6565b604051610317919061417b565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190614196565b610bc4565b005b34801561035557600080fd5b5061035e610cb6565b60405161036b9190613fb6565b60405180910390f35b34801561038057600080fd5b5061039b60048036038101906103969190614202565b610cbc565b005b3480156103a957600080fd5b506103b2610d33565b6040516103bf919061428e565b60405180910390f35b3480156103d457600080fd5b506103dd610d59565b6040516103ea9190613fb6565b60405180910390f35b3480156103ff57600080fd5b5061041a600480360381019061041591906142a9565b610d63565b604051610427919061417b565b60405180910390f35b34801561043c57600080fd5b50610445610e3c565b6040516104529190614318565b60405180910390f35b34801561046757600080fd5b50610482600480360381019061047d9190614120565b610e53565b60405161048f919061417b565b60405180910390f35b3480156104a457600080fd5b506104ad610f06565b6040516104ba9190613fb6565b60405180910390f35b3480156104cf57600080fd5b506104ea60048036038101906104e59190614333565b610f0c565b005b3480156104f857600080fd5b50610501610fc1565b60405161050e919061436f565b60405180910390f35b34801561052357600080fd5b5061053e60048036038101906105399190614333565b610fe7565b60405161054b919061417b565b60405180910390f35b34801561056057600080fd5b5061057b60048036038101906105769190614333565b6110b1565b604051610588919061417b565b60405180910390f35b34801561059d57600080fd5b506105a6611107565b6040516105b39190613fb6565b60405180910390f35b3480156105c857600080fd5b506105e360048036038101906105de9190614333565b61110d565b005b3480156105f157600080fd5b506105fa6111c2565b604051610607919061417b565b60405180910390f35b34801561061c57600080fd5b506106256111d9565b604051610632919061417b565b60405180910390f35b34801561064757600080fd5b50610662600480360381019061065d9190614333565b6111ec565b60405161066f9190613fb6565b60405180910390f35b34801561068457600080fd5b5061069f600480360381019061069a9190614333565b611234565b6040516106ac919061417b565b60405180910390f35b3480156106c157600080fd5b506106dc60048036038101906106d79190614333565b6112ff565b005b3480156106ea57600080fd5b506106f361140c565b604051610700919061436f565b60405180910390f35b34801561071557600080fd5b5061071e611436565b60405161072b919061406a565b60405180910390f35b34801561074057600080fd5b5061075b6004803603810190610756919061438a565b6114c8565b005b34801561076957600080fd5b50610772611798565b60405161077f919061417b565b60405180910390f35b34801561079457600080fd5b506107af60048036038101906107aa919061438a565b6117ab565b005b3480156107bd57600080fd5b506107c6611ef7565b6040516107d39190613fb6565b60405180910390f35b3480156107e857600080fd5b5061080360048036038101906107fe91906143b7565b611f79565b005b34801561081157600080fd5b5061081a612071565b6040516108279190613fb6565b60405180910390f35b34801561083c57600080fd5b5061085760048036038101906108529190614120565b612077565b604051610864919061417b565b60405180910390f35b34801561087957600080fd5b50610894600480360381019061088f9190614120565b612144565b6040516108a1919061417b565b60405180910390f35b3480156108b657600080fd5b506108bf612162565b6040516108cc9190613fb6565b60405180910390f35b3480156108e157600080fd5b506108ea612168565b6040516108f7919061436f565b60405180910390f35b34801561090c57600080fd5b506109276004803603810190610922919061438a565b61218e565b005b34801561093557600080fd5b50610950600480360381019061094b919061445c565b612251565b005b34801561095e57600080fd5b5061097960048036038101906109749190614333565b61234e565b604051610986919061417b565b60405180910390f35b34801561099b57600080fd5b506109a461236e565b6040516109b1919061436f565b60405180910390f35b3480156109c657600080fd5b506109e160048036038101906109dc9190614333565b612394565b6040516109ee919061417b565b60405180910390f35b348015610a0357600080fd5b50610a1e6004803603810190610a1991906144a9565b6123b4565b604051610a2b9190613fb6565b60405180910390f35b348015610a4057600080fd5b50610a5b6004803603810190610a569190614202565b61243b565b005b348015610a6957600080fd5b50610a726124b2565b604051610a7f9190613fb6565b60405180910390f35b348015610a9457600080fd5b50610aaf6004803603810190610aaa9190614333565b6124bc565b005b348015610abd57600080fd5b50610ad86004803603810190610ad39190614333565b612571565b005b348015610ae657600080fd5b50610b016004803603810190610afc9190614333565b6126c4565b005b6000610b0f600961286f565b905090565b606060038054610b2390614518565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4f90614518565b8015610b9c5780601f10610b7157610100808354040283529160200191610b9c565b820191906000526020600020905b815481529060010190602001808311610b7f57829003601f168201915b5050505050905090565b6000610bba610bb3612884565b848461288c565b6001905092915050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c1e57600080fd5b600a8210610c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c58906145bb565b60405180910390fd5b600a8110610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b9061464d565b60405180910390fd5b81600c8190555080600d819055505050565b600d5481565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d1657600080fd5b80601460026101000a81548160ff02191690831515021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b6000610d70848484612a55565b610e3184610d7c612884565b610e2c8560405180606001604052806028815260200161582960289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610de2612884565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461310c9092919063ffffffff16565b61288c565b600190509392505050565b6000600560009054906101000a900460ff16905090565b6000610efc610e60612884565b84610ef78560016000610e71612884565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461281190919063ffffffff16565b61288c565b6001905092915050565b60115481565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f6657600080fd5b6001600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461104357600080fd5b61105782600961316a90919063ffffffff16565b611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108d906146b9565b60405180910390fd5b6110aa82600961319a90919063ffffffff16565b9050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60135481565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461116757600080fd5b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600560159054906101000a900460ff16905090565b601460019054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461129057600080fd5b6112a482600961316a90919063ffffffff16565b156112e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112db9061474b565b60405180910390fd5b6112f88260096131ca90919063ffffffff16565b9050919050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461135957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bf906147dd565b60405180910390fd5b80601460036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461144590614518565b80601f016020809104026020016040519081016040528092919081815260200182805461147190614518565b80156114be5780601f10611493576101008083540402835291602001916114be565b820191906000526020600020905b8154815290600101906020018083116114a157829003601f168201915b5050505050905090565b6000811161150b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150290614849565b60405180910390fd5b806015819055506000601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee063deb3d89690916040518263ffffffff1660e01b815260040161154e9190614870565b602060405180830381865af415801561156b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158f91906148a0565b905060008167ffffffffffffffff8111156115ad576115ac6148cd565b5b6040519080825280602002602001820160405280156115db5781602001602082028036833780820191505090505b5090506000805b838110156116ec576000601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee063d1aa9e7e9091846040518363ffffffff1660e01b815260040161162892919061490b565b602060405180830381865af4158015611645573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116699190614949565b905085611675826111ec565b10156116d8578084848151811061168f5761168e614976565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082806116d4906149d4565b9350505b5080806116e4906149d4565b9150506115e2565b5060005b8181101561179157601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee0634c60db9c909185848151811061172957611728614976565b5b60200260200101516040518363ffffffff1660e01b815260040161174e929190614a2b565b60006040518083038186803b15801561176657600080fd5b505af415801561177a573d6000803e3d6000fd5b505050508080611789906149d4565b9150506116f0565b5050505050565b601460029054906101000a900460ff1681565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461180557600080fd5b600047905081811161184c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184390614ac6565b60405180910390fd5b6000601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee063deb3d89690916040518263ffffffff1660e01b81526004016118889190614870565b602060405180830381865af41580156118a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c991906148a0565b905060008167ffffffffffffffff8111156118e7576118e66148cd565b5b6040519080825280602002602001820160405280156119155781602001602082028036833780820191505090505b509050600080831161195c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195390614b58565b60405180910390fd5b601460179054906101000a900460ff1615611a885760005b83811015611a6757601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee063d1aa9e7e9091836040518363ffffffff1660e01b81526004016119b892919061490b565b602060405180830381865af41580156119d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f99190614949565b838381518110611a0c57611a0b614976565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508180611a51906149d4565b9250508080611a5f906149d4565b915050611974565b506000601460176101000a81548160ff021916908315150217905550611cb1565b60005b83811015611caf576000601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee063732a2ccf9091601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee063d1aa9e7e9091876040518363ffffffff1660e01b8152600401611aef92919061490b565b602060405180830381865af4158015611b0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b309190614949565b6040518363ffffffff1660e01b8152600401611b4d929190614a2b565b602060405180830381865af4158015611b6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8e91906148a0565b90507f00000000000000000000000000000000000000000000000000000000000000008142611bbd9190614b78565b10611c9b57601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee063d1aa9e7e9091846040518363ffffffff1660e01b8152600401611bfe92919061490b565b602060405180830381865af4158015611c1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3f9190614949565b848481518110611c5257611c51614976565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508280611c97906149d4565b9350505b508080611ca7906149d4565b915050611a8b565b505b60008111611cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ceb90614bf8565b60405180910390fd5b6000611d0982876131fa90919063ffffffff16565b905060008111611d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4590614c64565b60405180910390fd5b6000805b83811015611de357611d88858281518110611d7057611d6f614976565b5b6020026020010151600961316a90919063ffffffff16565b611dd057670de0b6b3a7640000611db8868381518110611dab57611daa614976565b5b60200260200101516111ec565b611dc29190614cb3565b82611dcd9190614ce4565b91505b8080611ddb906149d4565b915050611d52565b5060005b83811015611eed576000670de0b6b3a7640000611e1d878481518110611e1057611e0f614976565b5b60200260200101516111ec565b611e279190614cb3565b9050600083828b611e389190614d3a565b611e429190614cb3565b9050611e72878481518110611e5a57611e59614976565b5b6020026020010151600961316a90919063ffffffff16565b611ed857868381518110611e8957611e88614976565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611ed6573d6000803e3d6000fd5b505b50508080611ee5906149d4565b915050611de7565b5050505050505050565b6000601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee063deb3d89690916040518263ffffffff1660e01b8152600401611f339190614870565b602060405180830381865af4158015611f50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7491906148a0565b905090565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fd357600080fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205a90614e2c565b60405180910390fd5b61206d8282613252565b5050565b600c5481565b600061213a612084612884565b846121358560405180606001604052806025815260200161585160259139600160006120ae612884565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461310c9092919063ffffffff16565b61288c565b6001905092915050565b6000612158612151612884565b8484612a55565b6001905092915050565b60125481565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121e857600080fd5b8060138190555061220b6103e86121fd610d59565b6131fa90919063ffffffff16565b6013541161224e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224590614e98565b60405180910390fd5b50565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122ab57600080fd5b60005b82829050811015612349576001601060008585858181106122d2576122d1614976565b5b90506020020160208101906122e79190614333565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080612342906149d4565b90506122ae565b505050565b600f6020528060005260406000206000915054906101000a900460ff1681565b601460039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461249557600080fd5b80601460016101000a81548160ff02191690831515021790555050565b6000601554905090565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461251657600080fd5b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146125cb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361260457600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f2e3feca4334579203cd183fe1ced9524940047e5586fe13e8cc5dd1babaf6e8260405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461271e57600080fd5b80601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a22d4832600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016127dc919061436f565b600060405180830381600087803b1580156127f657600080fd5b505af115801561280a573d6000803e3d6000fd5b5050505050565b60008082846128209190614ce4565b905083811015612865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285c90614f04565b60405180910390fd5b8091505092915050565b600061287d82600001613385565b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036128fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f290614f96565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361296a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296190615028565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612a489190613fb6565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abb906150ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2a9061514c565b60405180910390fd5b60008111612b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6d906151de565b60405180910390fd5b601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612c1a5750601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b612c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c509061524a565b60405180910390fd5b60008103612c7257612c6d83836000613396565b613107565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612d155750600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612d6b5750600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612db657601354811115612db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dac906152dc565b60405180910390fd5b5b6000612dc1306111ec565b905060006012548210159050808015612de75750601460009054906101000a900460ff16155b8015612e415750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612e595750601460019054906101000a900460ff165b15612e6857612e6782613634565b5b600060019050600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612f0f5750600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612f1957600090505b8015612ff2576000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603612fa557612f9e6064612f90600c54886136df90919063ffffffff16565b6131fa90919063ffffffff16565b9050612fd0565b612fcd6064612fbf600d54886136df90919063ffffffff16565b6131fa90919063ffffffff16565b90505b612fe3818661375990919063ffffffff16565b9450612ff0873083613396565b505b601460029054906101000a900460ff16156130f857600080329050601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e09073f08989846040518463ffffffff1660e01b815260040161306c939291906152fc565b6020604051808303816000875af19250505080156130a857506040513d601f19601f820116820180604052508101906130a59190615348565b60015b6130b157600080fd5b80925050816130f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ec906153c1565b60405180910390fd5b50505b613103868686613396565b5050505b505050565b6000838311158290613154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314b919061406a565b60405180910390fd5b5082846131619190614b78565b90509392505050565b6000613192836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6137b2565b905092915050565b60006131c2836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6137d5565b905092915050565b60006131f2836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6138e9565b905092915050565b600080821161323e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132359061542d565b60405180910390fd5b818361324a9190614cb3565b905092915050565b801515600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515036132e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132db906154bf565b60405180910390fd5b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600081600001805490509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133fc906150ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346b9061514c565b60405180910390fd5b61347f838383613959565b6134ea81604051806060016040528060268152602001615803602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461310c9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061357d816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461281190919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161361c9190613fb6565b60405180910390a361362f83838361395e565b505050565b6001601460006101000a81548160ff02191690831515021790555061365881613d55565b601460039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156136c0573d6000803e3d6000fd5b506000601460006101000a81548160ff02191690831515021790555050565b60008083036136f15760009050613753565b600082846136ff9190614d3a565b905082848261370e9190614cb3565b1461374e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374590615551565b60405180910390fd5b809150505b92915050565b60008282111561379e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613795906155bd565b60405180910390fd5b81836137aa9190614b78565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146138dd5760006001826138079190614b78565b905060006001866000018054905061381f9190614b78565b905081811461388e5760008660000182815481106138405761383f614976565b5b906000526020600020015490508087600001848154811061386457613863614976565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806138a2576138a16155dd565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506138e3565b60009150505b92915050565b60006138f583836137b2565b61394e578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613953565b600090505b92915050565b505050565b6139666111c2565b156139a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161399d90615658565b60405180910390fd5b6139b1838383613f98565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015613a1a57503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015613a595750613a2961140c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015613a765750613a7482600961316a90919063ffffffff16565b155b15613b8157601554613a87836111ec565b10613b80576000601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee063732a2ccf9091856040518363ffffffff1660e01b8152600401613aca929190614a2b565b602060405180830381865af4158015613ae7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b0b91906148a0565b03613b7f57601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee063bc2b405c909184426040518463ffffffff1660e01b8152600401613b4e93929190615678565b60006040518083038186803b158015613b6657600080fd5b505af4158015613b7a573d6000803e3d6000fd5b505050505b5b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015613bea57503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015613c295750613bf961140c565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015613c465750613c4483600961316a90919063ffffffff16565b155b15613d5057601554613c57846111ec565b1015613d4f576000601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee063732a2ccf9091866040518363ffffffff1660e01b8152600401613c9b929190614a2b565b602060405180830381865af4158015613cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cdc91906148a0565b14613d4e57601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee0634c60db9c9091856040518363ffffffff1660e01b8152600401613d1d929190614a2b565b60006040518083038186803b158015613d3557600080fd5b505af4158015613d49573d6000803e3d6000fd5b505050505b5b5b505050565b6000600267ffffffffffffffff811115613d7257613d716148cd565b5b604051908082528060200260200182016040528015613da05781602001602082028036833780820191505090505b5090503081600081518110613db857613db7614976565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613e5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e839190614949565b81600181518110613e9757613e96614976565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613efe30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461288c565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613f629594939291906157a8565b600060405180830381600087803b158015613f7c57600080fd5b505af1158015613f90573d6000803e3d6000fd5b505050505050565b505050565b6000819050919050565b613fb081613f9d565b82525050565b6000602082019050613fcb6000830184613fa7565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561400b578082015181840152602081019050613ff0565b8381111561401a576000848401525b50505050565b6000601f19601f8301169050919050565b600061403c82613fd1565b6140468185613fdc565b9350614056818560208601613fed565b61405f81614020565b840191505092915050565b600060208201905081810360008301526140848184614031565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006140c182614096565b9050919050565b6140d1816140b6565b81146140dc57600080fd5b50565b6000813590506140ee816140c8565b92915050565b6140fd81613f9d565b811461410857600080fd5b50565b60008135905061411a816140f4565b92915050565b600080604083850312156141375761413661408c565b5b6000614145858286016140df565b92505060206141568582860161410b565b9150509250929050565b60008115159050919050565b61417581614160565b82525050565b6000602082019050614190600083018461416c565b92915050565b600080604083850312156141ad576141ac61408c565b5b60006141bb8582860161410b565b92505060206141cc8582860161410b565b9150509250929050565b6141df81614160565b81146141ea57600080fd5b50565b6000813590506141fc816141d6565b92915050565b6000602082840312156142185761421761408c565b5b6000614226848285016141ed565b91505092915050565b6000819050919050565b600061425461424f61424a84614096565b61422f565b614096565b9050919050565b600061426682614239565b9050919050565b60006142788261425b565b9050919050565b6142888161426d565b82525050565b60006020820190506142a3600083018461427f565b92915050565b6000806000606084860312156142c2576142c161408c565b5b60006142d0868287016140df565b93505060206142e1868287016140df565b92505060406142f28682870161410b565b9150509250925092565b600060ff82169050919050565b614312816142fc565b82525050565b600060208201905061432d6000830184614309565b92915050565b6000602082840312156143495761434861408c565b5b6000614357848285016140df565b91505092915050565b614369816140b6565b82525050565b60006020820190506143846000830184614360565b92915050565b6000602082840312156143a05761439f61408c565b5b60006143ae8482850161410b565b91505092915050565b600080604083850312156143ce576143cd61408c565b5b60006143dc858286016140df565b92505060206143ed858286016141ed565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261441c5761441b6143f7565b5b8235905067ffffffffffffffff811115614439576144386143fc565b5b60208301915083602082028301111561445557614454614401565b5b9250929050565b600080602083850312156144735761447261408c565b5b600083013567ffffffffffffffff81111561449157614490614091565b5b61449d85828601614406565b92509250509250929050565b600080604083850312156144c0576144bf61408c565b5b60006144ce858286016140df565b92505060206144df858286016140df565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061453057607f821691505b602082108103614543576145426144e9565b5b50919050565b7f427579206665652073686f756c646e7420626520686967686572207468616e2060008201527f3130000000000000000000000000000000000000000000000000000000000000602082015250565b60006145a5602283613fdc565b91506145b082614549565b604082019050919050565b600060208201905081810360008301526145d481614598565b9050919050565b7f53656c6c206665652073686f756c646e7420626520686967686572207468616e60008201527f2031300000000000000000000000000000000000000000000000000000000000602082015250565b6000614637602383613fdc565b9150614642826145db565b604082019050919050565b600060208201905081810360008301526146668161462a565b9050919050565b7f446f6573206e6f7420657869737420696e20626c61636b206c6973742e000000600082015250565b60006146a3601d83613fdc565b91506146ae8261466d565b602082019050919050565b600060208201905081810360008301526146d281614696565b9050919050565b7f416464726573732077617320616c726561647920616464656420746f20626c6160008201527f636b206c6973742e000000000000000000000000000000000000000000000000602082015250565b6000614735602883613fdc565b9150614740826146d9565b604082019050919050565b6000602082019050818103600083015261476481614728565b9050919050565b7f446576656c6f706d656e742077616c6c65742063616e2774206265207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b60006147c7602c83613fdc565b91506147d28261476b565b604082019050919050565b600060208201905081810360008301526147f6816147ba565b9050919050565b7f4d79546f6b656e3a20496e76616c6964207468726573686f6c64000000000000600082015250565b6000614833601a83613fdc565b915061483e826147fd565b602082019050919050565b6000602082019050818103600083015261486281614826565b9050919050565b8082525050565b60006020820190506148856000830184614869565b92915050565b60008151905061489a816140f4565b92915050565b6000602082840312156148b6576148b561408c565b5b60006148c48482850161488b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61490581613f9d565b82525050565b60006040820190506149206000830185614869565b61492d60208301846148fc565b9392505050565b600081519050614943816140c8565b92915050565b60006020828403121561495f5761495e61408c565b5b600061496d84828501614934565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006149df82613f9d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a1157614a106149a5565b5b600182019050919050565b614a25816140b6565b82525050565b6000604082019050614a406000830185614869565b614a4d6020830184614a1c565b9392505050565b7f596f752063616e27742064697374726962757465206d6f72652065746865722060008201527f7468616e20796f7520686176652e000000000000000000000000000000000000602082015250565b6000614ab0602e83613fdc565b9150614abb82614a54565b604082019050919050565b60006020820190508181036000830152614adf81614aa3565b9050919050565b7f4d79546f6b656e3a204e6f20706f74656e7469616c20686f6c6465727320746f60008201527f2072657761726400000000000000000000000000000000000000000000000000602082015250565b6000614b42602783613fdc565b9150614b4d82614ae6565b604082019050919050565b60006020820190508181036000830152614b7181614b35565b9050919050565b6000614b8382613f9d565b9150614b8e83613f9d565b925082821015614ba157614ba06149a5565b5b828203905092915050565b7f4d79546f6b656e3a204e6f20686f6c6465727320746f20726577617264000000600082015250565b6000614be2601d83613fdc565b9150614bed82614bac565b602082019050919050565b60006020820190508181036000830152614c1181614bd5565b9050919050565b7f4d79546f6b656e3a204e6f7468696e6720746f20726577617264000000000000600082015250565b6000614c4e601a83613fdc565b9150614c5982614c18565b602082019050919050565b60006020820190508181036000830152614c7d81614c41565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614cbe82613f9d565b9150614cc983613f9d565b925082614cd957614cd8614c84565b5b828204905092915050565b6000614cef82613f9d565b9150614cfa83613f9d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d2f57614d2e6149a5565b5b828201905092915050565b6000614d4582613f9d565b9150614d5083613f9d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d8957614d886149a5565b5b828202905092915050565b7f4b436f696e3a205468652050616e63616b655377617020706169722063616e6e60008201527f6f742062652072656d6f7665642066726f6d206175746f6d617465644d61726b60208201527f65744d616b657250616972730000000000000000000000000000000000000000604082015250565b6000614e16604c83613fdc565b9150614e2182614d94565b606082019050919050565b60006020820190508181036000830152614e4581614e09565b9050919050565b7f76616c756520697320746f6f206c6f7700000000000000000000000000000000600082015250565b6000614e82601083613fdc565b9150614e8d82614e4c565b602082019050919050565b60006020820190508181036000830152614eb181614e75565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000614eee601b83613fdc565b9150614ef982614eb8565b602082019050919050565b60006020820190508181036000830152614f1d81614ee1565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614f80602483613fdc565b9150614f8b82614f24565b604082019050919050565b60006020820190508181036000830152614faf81614f73565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000615012602283613fdc565b915061501d82614fb6565b604082019050919050565b6000602082019050818103600083015261504181615005565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006150a4602583613fdc565b91506150af82615048565b604082019050919050565b600060208201905081810360008301526150d381615097565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000615136602383613fdc565b9150615141826150da565b604082019050919050565b6000602082019050818103600083015261516581615129565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b60006151c8602983613fdc565b91506151d38261516c565b604082019050919050565b600060208201905081810360008301526151f7816151bb565b9050919050565b7f5468697320616464726573732069732062616e6e656400000000000000000000600082015250565b6000615234601683613fdc565b915061523f826151fe565b602082019050919050565b6000602082019050818103600083015261526381615227565b9050919050565b7f616d6f756e74206578636565647320746865206d61784275795472616e73616360008201527f74696f6e416d6f756e742e000000000000000000000000000000000000000000602082015250565b60006152c6602b83613fdc565b91506152d18261526a565b604082019050919050565b600060208201905081810360008301526152f5816152b9565b9050919050565b60006060820190506153116000830186614360565b61531e6020830185614360565b61532b6040830184614360565b949350505050565b600081519050615342816141d6565b92915050565b60006020828403121561535e5761535d61408c565b5b600061536c84828501615333565b91505092915050565b7f4d455620426f7420446574656374656400000000000000000000000000000000600082015250565b60006153ab601083613fdc565b91506153b682615375565b602082019050919050565b600060208201905081810360008301526153da8161539e565b9050919050565b7f536166654d6174683a206469766973696f6e206279207a65726f000000000000600082015250565b6000615417601a83613fdc565b9150615422826153e1565b602082019050919050565b600060208201905081810360008301526154468161540a565b9050919050565b7f4b436f696e3a204175746f6d61746564206d61726b6574206d616b657220706160008201527f697220697320616c72656164792073657420746f20746861742076616c756500602082015250565b60006154a9603f83613fdc565b91506154b48261544d565b604082019050919050565b600060208201905081810360008301526154d88161549c565b9050919050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b600061553b602183613fdc565b9150615546826154df565b604082019050919050565b6000602082019050818103600083015261556a8161552e565b9050919050565b7f536166654d6174683a207375627472616374696f6e206f766572666c6f770000600082015250565b60006155a7601e83613fdc565b91506155b282615571565b602082019050919050565b600060208201905081810360008301526155d68161559a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000615642601083613fdc565b915061564d8261560c565b602082019050919050565b6000602082019050818103600083015261567181615635565b9050919050565b600060608201905061568d6000830186614869565b61569a6020830185614a1c565b6156a760408301846148fc565b949350505050565b6000819050919050565b60006156d46156cf6156ca846156af565b61422f565b613f9d565b9050919050565b6156e4816156b9565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61571f816140b6565b82525050565b60006157318383615716565b60208301905092915050565b6000602082019050919050565b6000615755826156ea565b61575f81856156f5565b935061576a83615706565b8060005b8381101561579b5781516157828882615725565b975061578d8361573d565b92505060018101905061576e565b5085935050505092915050565b600060a0820190506157bd6000830188613fa7565b6157ca60208301876156db565b81810360408301526157dc818661574a565b90506157eb6060830185614360565b6157f86080830184613fa7565b969550505050505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122065c91fa3e1ff01ee53bb05f567cd56b452f3ebe5a8969a17e312ad8e84e14a4364736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106102815760003560e01c80638da5cb5b1161014f578063b2bdfa7b116100c1578063dd62ed3e1161007a578063dd62ed3e146109f7578063e01af92c14610a34578063e75235b814610a5d578063ea2f0b3714610a88578063f2fde38b14610ab1578063f667f16e14610ada57610288565b8063b2bdfa7b146108d5578063b3b5e04314610900578063b4eab6ed14610929578063b62496f514610952578063c04a54141461098f578063c069d956146109ba57610288565b8063983917151161011357806398391715146107b15780639a7a23d6146107dc578063a021ce6a14610805578063a457c2d714610830578063a9059cbb1461086d578063b294f111146108aa57610288565b80638da5cb5b146106de57806395d89b4114610709578063960bfe0414610734578063975e8c3b1461075d5780639775e5471461078857610288565b80633eaaf86b116101f35780635b9c9a89116101ac5780635b9c9a89146105bc5780635c975abb146105e55780636ddd17131461061057806370a082311461063b578063727002411461067857806372ac2486146106b557610288565b80633eaaf86b14610498578063437823ec146104c357806349bd5a5e146104ec5780634a49ac4c146105175780635342acb4146105545780635aa821a91461059157610288565b8063141fbbcc11610245578063141fbbcc146103745780631694505e1461039d57806318160ddd146103c857806323b872dd146103f3578063313ce56714610430578063395093511461045b57610288565b806306aab3671461028d57806306fdde03146102b8578063095ea7b3146102e35780630b78f9c01461032057806312a1273c1461034957610288565b3661028857005b600080fd5b34801561029957600080fd5b506102a2610b03565b6040516102af9190613fb6565b60405180910390f35b3480156102c457600080fd5b506102cd610b14565b6040516102da919061406a565b60405180910390f35b3480156102ef57600080fd5b5061030a60048036038101906103059190614120565b610ba6565b604051610317919061417b565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190614196565b610bc4565b005b34801561035557600080fd5b5061035e610cb6565b60405161036b9190613fb6565b60405180910390f35b34801561038057600080fd5b5061039b60048036038101906103969190614202565b610cbc565b005b3480156103a957600080fd5b506103b2610d33565b6040516103bf919061428e565b60405180910390f35b3480156103d457600080fd5b506103dd610d59565b6040516103ea9190613fb6565b60405180910390f35b3480156103ff57600080fd5b5061041a600480360381019061041591906142a9565b610d63565b604051610427919061417b565b60405180910390f35b34801561043c57600080fd5b50610445610e3c565b6040516104529190614318565b60405180910390f35b34801561046757600080fd5b50610482600480360381019061047d9190614120565b610e53565b60405161048f919061417b565b60405180910390f35b3480156104a457600080fd5b506104ad610f06565b6040516104ba9190613fb6565b60405180910390f35b3480156104cf57600080fd5b506104ea60048036038101906104e59190614333565b610f0c565b005b3480156104f857600080fd5b50610501610fc1565b60405161050e919061436f565b60405180910390f35b34801561052357600080fd5b5061053e60048036038101906105399190614333565b610fe7565b60405161054b919061417b565b60405180910390f35b34801561056057600080fd5b5061057b60048036038101906105769190614333565b6110b1565b604051610588919061417b565b60405180910390f35b34801561059d57600080fd5b506105a6611107565b6040516105b39190613fb6565b60405180910390f35b3480156105c857600080fd5b506105e360048036038101906105de9190614333565b61110d565b005b3480156105f157600080fd5b506105fa6111c2565b604051610607919061417b565b60405180910390f35b34801561061c57600080fd5b506106256111d9565b604051610632919061417b565b60405180910390f35b34801561064757600080fd5b50610662600480360381019061065d9190614333565b6111ec565b60405161066f9190613fb6565b60405180910390f35b34801561068457600080fd5b5061069f600480360381019061069a9190614333565b611234565b6040516106ac919061417b565b60405180910390f35b3480156106c157600080fd5b506106dc60048036038101906106d79190614333565b6112ff565b005b3480156106ea57600080fd5b506106f361140c565b604051610700919061436f565b60405180910390f35b34801561071557600080fd5b5061071e611436565b60405161072b919061406a565b60405180910390f35b34801561074057600080fd5b5061075b6004803603810190610756919061438a565b6114c8565b005b34801561076957600080fd5b50610772611798565b60405161077f919061417b565b60405180910390f35b34801561079457600080fd5b506107af60048036038101906107aa919061438a565b6117ab565b005b3480156107bd57600080fd5b506107c6611ef7565b6040516107d39190613fb6565b60405180910390f35b3480156107e857600080fd5b5061080360048036038101906107fe91906143b7565b611f79565b005b34801561081157600080fd5b5061081a612071565b6040516108279190613fb6565b60405180910390f35b34801561083c57600080fd5b5061085760048036038101906108529190614120565b612077565b604051610864919061417b565b60405180910390f35b34801561087957600080fd5b50610894600480360381019061088f9190614120565b612144565b6040516108a1919061417b565b60405180910390f35b3480156108b657600080fd5b506108bf612162565b6040516108cc9190613fb6565b60405180910390f35b3480156108e157600080fd5b506108ea612168565b6040516108f7919061436f565b60405180910390f35b34801561090c57600080fd5b506109276004803603810190610922919061438a565b61218e565b005b34801561093557600080fd5b50610950600480360381019061094b919061445c565b612251565b005b34801561095e57600080fd5b5061097960048036038101906109749190614333565b61234e565b604051610986919061417b565b60405180910390f35b34801561099b57600080fd5b506109a461236e565b6040516109b1919061436f565b60405180910390f35b3480156109c657600080fd5b506109e160048036038101906109dc9190614333565b612394565b6040516109ee919061417b565b60405180910390f35b348015610a0357600080fd5b50610a1e6004803603810190610a1991906144a9565b6123b4565b604051610a2b9190613fb6565b60405180910390f35b348015610a4057600080fd5b50610a5b6004803603810190610a569190614202565b61243b565b005b348015610a6957600080fd5b50610a726124b2565b604051610a7f9190613fb6565b60405180910390f35b348015610a9457600080fd5b50610aaf6004803603810190610aaa9190614333565b6124bc565b005b348015610abd57600080fd5b50610ad86004803603810190610ad39190614333565b612571565b005b348015610ae657600080fd5b50610b016004803603810190610afc9190614333565b6126c4565b005b6000610b0f600961286f565b905090565b606060038054610b2390614518565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4f90614518565b8015610b9c5780601f10610b7157610100808354040283529160200191610b9c565b820191906000526020600020905b815481529060010190602001808311610b7f57829003601f168201915b5050505050905090565b6000610bba610bb3612884565b848461288c565b6001905092915050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c1e57600080fd5b600a8210610c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c58906145bb565b60405180910390fd5b600a8110610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b9061464d565b60405180910390fd5b81600c8190555080600d819055505050565b600d5481565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d1657600080fd5b80601460026101000a81548160ff02191690831515021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b6000610d70848484612a55565b610e3184610d7c612884565b610e2c8560405180606001604052806028815260200161582960289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610de2612884565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461310c9092919063ffffffff16565b61288c565b600190509392505050565b6000600560009054906101000a900460ff16905090565b6000610efc610e60612884565b84610ef78560016000610e71612884565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461281190919063ffffffff16565b61288c565b6001905092915050565b60115481565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f6657600080fd5b6001600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461104357600080fd5b61105782600961316a90919063ffffffff16565b611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108d906146b9565b60405180910390fd5b6110aa82600961319a90919063ffffffff16565b9050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60135481565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461116757600080fd5b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600560159054906101000a900460ff16905090565b601460019054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461129057600080fd5b6112a482600961316a90919063ffffffff16565b156112e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112db9061474b565b60405180910390fd5b6112f88260096131ca90919063ffffffff16565b9050919050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461135957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bf906147dd565b60405180910390fd5b80601460036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461144590614518565b80601f016020809104026020016040519081016040528092919081815260200182805461147190614518565b80156114be5780601f10611493576101008083540402835291602001916114be565b820191906000526020600020905b8154815290600101906020018083116114a157829003601f168201915b5050505050905090565b6000811161150b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150290614849565b60405180910390fd5b806015819055506000601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee063deb3d89690916040518263ffffffff1660e01b815260040161154e9190614870565b602060405180830381865af415801561156b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158f91906148a0565b905060008167ffffffffffffffff8111156115ad576115ac6148cd565b5b6040519080825280602002602001820160405280156115db5781602001602082028036833780820191505090505b5090506000805b838110156116ec576000601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee063d1aa9e7e9091846040518363ffffffff1660e01b815260040161162892919061490b565b602060405180830381865af4158015611645573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116699190614949565b905085611675826111ec565b10156116d8578084848151811061168f5761168e614976565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082806116d4906149d4565b9350505b5080806116e4906149d4565b9150506115e2565b5060005b8181101561179157601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee0634c60db9c909185848151811061172957611728614976565b5b60200260200101516040518363ffffffff1660e01b815260040161174e929190614a2b565b60006040518083038186803b15801561176657600080fd5b505af415801561177a573d6000803e3d6000fd5b505050508080611789906149d4565b9150506116f0565b5050505050565b601460029054906101000a900460ff1681565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461180557600080fd5b600047905081811161184c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184390614ac6565b60405180910390fd5b6000601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee063deb3d89690916040518263ffffffff1660e01b81526004016118889190614870565b602060405180830381865af41580156118a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c991906148a0565b905060008167ffffffffffffffff8111156118e7576118e66148cd565b5b6040519080825280602002602001820160405280156119155781602001602082028036833780820191505090505b509050600080831161195c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195390614b58565b60405180910390fd5b601460179054906101000a900460ff1615611a885760005b83811015611a6757601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee063d1aa9e7e9091836040518363ffffffff1660e01b81526004016119b892919061490b565b602060405180830381865af41580156119d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f99190614949565b838381518110611a0c57611a0b614976565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508180611a51906149d4565b9250508080611a5f906149d4565b915050611974565b506000601460176101000a81548160ff021916908315150217905550611cb1565b60005b83811015611caf576000601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee063732a2ccf9091601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee063d1aa9e7e9091876040518363ffffffff1660e01b8152600401611aef92919061490b565b602060405180830381865af4158015611b0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b309190614949565b6040518363ffffffff1660e01b8152600401611b4d929190614a2b565b602060405180830381865af4158015611b6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8e91906148a0565b90507f00000000000000000000000000000000000000000000000000000000001a5e008142611bbd9190614b78565b10611c9b57601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee063d1aa9e7e9091846040518363ffffffff1660e01b8152600401611bfe92919061490b565b602060405180830381865af4158015611c1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3f9190614949565b848481518110611c5257611c51614976565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508280611c97906149d4565b9350505b508080611ca7906149d4565b915050611a8b565b505b60008111611cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ceb90614bf8565b60405180910390fd5b6000611d0982876131fa90919063ffffffff16565b905060008111611d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4590614c64565b60405180910390fd5b6000805b83811015611de357611d88858281518110611d7057611d6f614976565b5b6020026020010151600961316a90919063ffffffff16565b611dd057670de0b6b3a7640000611db8868381518110611dab57611daa614976565b5b60200260200101516111ec565b611dc29190614cb3565b82611dcd9190614ce4565b91505b8080611ddb906149d4565b915050611d52565b5060005b83811015611eed576000670de0b6b3a7640000611e1d878481518110611e1057611e0f614976565b5b60200260200101516111ec565b611e279190614cb3565b9050600083828b611e389190614d3a565b611e429190614cb3565b9050611e72878481518110611e5a57611e59614976565b5b6020026020010151600961316a90919063ffffffff16565b611ed857868381518110611e8957611e88614976565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611ed6573d6000803e3d6000fd5b505b50508080611ee5906149d4565b915050611de7565b5050505050505050565b6000601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee063deb3d89690916040518263ffffffff1660e01b8152600401611f339190614870565b602060405180830381865af4158015611f50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7491906148a0565b905090565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fd357600080fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205a90614e2c565b60405180910390fd5b61206d8282613252565b5050565b600c5481565b600061213a612084612884565b846121358560405180606001604052806025815260200161585160259139600160006120ae612884565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461310c9092919063ffffffff16565b61288c565b6001905092915050565b6000612158612151612884565b8484612a55565b6001905092915050565b60125481565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121e857600080fd5b8060138190555061220b6103e86121fd610d59565b6131fa90919063ffffffff16565b6013541161224e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224590614e98565b60405180910390fd5b50565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122ab57600080fd5b60005b82829050811015612349576001601060008585858181106122d2576122d1614976565b5b90506020020160208101906122e79190614333565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080612342906149d4565b90506122ae565b505050565b600f6020528060005260406000206000915054906101000a900460ff1681565b601460039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461249557600080fd5b80601460016101000a81548160ff02191690831515021790555050565b6000601554905090565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461251657600080fd5b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146125cb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361260457600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f2e3feca4334579203cd183fe1ced9524940047e5586fe13e8cc5dd1babaf6e8260405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461271e57600080fd5b80601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a22d4832600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016127dc919061436f565b600060405180830381600087803b1580156127f657600080fd5b505af115801561280a573d6000803e3d6000fd5b5050505050565b60008082846128209190614ce4565b905083811015612865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285c90614f04565b60405180910390fd5b8091505092915050565b600061287d82600001613385565b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036128fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f290614f96565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361296a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296190615028565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612a489190613fb6565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abb906150ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2a9061514c565b60405180910390fd5b60008111612b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6d906151de565b60405180910390fd5b601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612c1a5750601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b612c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c509061524a565b60405180910390fd5b60008103612c7257612c6d83836000613396565b613107565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612d155750600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612d6b5750600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612db657601354811115612db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dac906152dc565b60405180910390fd5b5b6000612dc1306111ec565b905060006012548210159050808015612de75750601460009054906101000a900460ff16155b8015612e415750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612e595750601460019054906101000a900460ff165b15612e6857612e6782613634565b5b600060019050600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612f0f5750600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612f1957600090505b8015612ff2576000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603612fa557612f9e6064612f90600c54886136df90919063ffffffff16565b6131fa90919063ffffffff16565b9050612fd0565b612fcd6064612fbf600d54886136df90919063ffffffff16565b6131fa90919063ffffffff16565b90505b612fe3818661375990919063ffffffff16565b9450612ff0873083613396565b505b601460029054906101000a900460ff16156130f857600080329050601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e09073f08989846040518463ffffffff1660e01b815260040161306c939291906152fc565b6020604051808303816000875af19250505080156130a857506040513d601f19601f820116820180604052508101906130a59190615348565b60015b6130b157600080fd5b80925050816130f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ec906153c1565b60405180910390fd5b50505b613103868686613396565b5050505b505050565b6000838311158290613154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314b919061406a565b60405180910390fd5b5082846131619190614b78565b90509392505050565b6000613192836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6137b2565b905092915050565b60006131c2836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6137d5565b905092915050565b60006131f2836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6138e9565b905092915050565b600080821161323e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132359061542d565b60405180910390fd5b818361324a9190614cb3565b905092915050565b801515600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515036132e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132db906154bf565b60405180910390fd5b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600081600001805490509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133fc906150ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346b9061514c565b60405180910390fd5b61347f838383613959565b6134ea81604051806060016040528060268152602001615803602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461310c9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061357d816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461281190919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161361c9190613fb6565b60405180910390a361362f83838361395e565b505050565b6001601460006101000a81548160ff02191690831515021790555061365881613d55565b601460039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156136c0573d6000803e3d6000fd5b506000601460006101000a81548160ff02191690831515021790555050565b60008083036136f15760009050613753565b600082846136ff9190614d3a565b905082848261370e9190614cb3565b1461374e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374590615551565b60405180910390fd5b809150505b92915050565b60008282111561379e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613795906155bd565b60405180910390fd5b81836137aa9190614b78565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146138dd5760006001826138079190614b78565b905060006001866000018054905061381f9190614b78565b905081811461388e5760008660000182815481106138405761383f614976565b5b906000526020600020015490508087600001848154811061386457613863614976565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806138a2576138a16155dd565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506138e3565b60009150505b92915050565b60006138f583836137b2565b61394e578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613953565b600090505b92915050565b505050565b6139666111c2565b156139a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161399d90615658565b60405180910390fd5b6139b1838383613f98565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015613a1a57503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015613a595750613a2961140c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015613a765750613a7482600961316a90919063ffffffff16565b155b15613b8157601554613a87836111ec565b10613b80576000601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee063732a2ccf9091856040518363ffffffff1660e01b8152600401613aca929190614a2b565b602060405180830381865af4158015613ae7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b0b91906148a0565b03613b7f57601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee063bc2b405c909184426040518463ffffffff1660e01b8152600401613b4e93929190615678565b60006040518083038186803b158015613b6657600080fd5b505af4158015613b7a573d6000803e3d6000fd5b505050505b5b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015613bea57503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015613c295750613bf961140c565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015613c465750613c4483600961316a90919063ffffffff16565b155b15613d5057601554613c57846111ec565b1015613d4f576000601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee063732a2ccf9091866040518363ffffffff1660e01b8152600401613c9b929190614a2b565b602060405180830381865af4158015613cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cdc91906148a0565b14613d4e57601673ec52d1f7a6d9c05300f158fbc64d4fe33dfc0ee0634c60db9c9091856040518363ffffffff1660e01b8152600401613d1d929190614a2b565b60006040518083038186803b158015613d3557600080fd5b505af4158015613d49573d6000803e3d6000fd5b505050505b5b5b505050565b6000600267ffffffffffffffff811115613d7257613d716148cd565b5b604051908082528060200260200182016040528015613da05781602001602082028036833780820191505090505b5090503081600081518110613db857613db7614976565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613e5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e839190614949565b81600181518110613e9757613e96614976565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613efe30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461288c565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613f629594939291906157a8565b600060405180830381600087803b158015613f7c57600080fd5b505af1158015613f90573d6000803e3d6000fd5b505050505050565b505050565b6000819050919050565b613fb081613f9d565b82525050565b6000602082019050613fcb6000830184613fa7565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561400b578082015181840152602081019050613ff0565b8381111561401a576000848401525b50505050565b6000601f19601f8301169050919050565b600061403c82613fd1565b6140468185613fdc565b9350614056818560208601613fed565b61405f81614020565b840191505092915050565b600060208201905081810360008301526140848184614031565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006140c182614096565b9050919050565b6140d1816140b6565b81146140dc57600080fd5b50565b6000813590506140ee816140c8565b92915050565b6140fd81613f9d565b811461410857600080fd5b50565b60008135905061411a816140f4565b92915050565b600080604083850312156141375761413661408c565b5b6000614145858286016140df565b92505060206141568582860161410b565b9150509250929050565b60008115159050919050565b61417581614160565b82525050565b6000602082019050614190600083018461416c565b92915050565b600080604083850312156141ad576141ac61408c565b5b60006141bb8582860161410b565b92505060206141cc8582860161410b565b9150509250929050565b6141df81614160565b81146141ea57600080fd5b50565b6000813590506141fc816141d6565b92915050565b6000602082840312156142185761421761408c565b5b6000614226848285016141ed565b91505092915050565b6000819050919050565b600061425461424f61424a84614096565b61422f565b614096565b9050919050565b600061426682614239565b9050919050565b60006142788261425b565b9050919050565b6142888161426d565b82525050565b60006020820190506142a3600083018461427f565b92915050565b6000806000606084860312156142c2576142c161408c565b5b60006142d0868287016140df565b93505060206142e1868287016140df565b92505060406142f28682870161410b565b9150509250925092565b600060ff82169050919050565b614312816142fc565b82525050565b600060208201905061432d6000830184614309565b92915050565b6000602082840312156143495761434861408c565b5b6000614357848285016140df565b91505092915050565b614369816140b6565b82525050565b60006020820190506143846000830184614360565b92915050565b6000602082840312156143a05761439f61408c565b5b60006143ae8482850161410b565b91505092915050565b600080604083850312156143ce576143cd61408c565b5b60006143dc858286016140df565b92505060206143ed858286016141ed565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261441c5761441b6143f7565b5b8235905067ffffffffffffffff811115614439576144386143fc565b5b60208301915083602082028301111561445557614454614401565b5b9250929050565b600080602083850312156144735761447261408c565b5b600083013567ffffffffffffffff81111561449157614490614091565b5b61449d85828601614406565b92509250509250929050565b600080604083850312156144c0576144bf61408c565b5b60006144ce858286016140df565b92505060206144df858286016140df565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061453057607f821691505b602082108103614543576145426144e9565b5b50919050565b7f427579206665652073686f756c646e7420626520686967686572207468616e2060008201527f3130000000000000000000000000000000000000000000000000000000000000602082015250565b60006145a5602283613fdc565b91506145b082614549565b604082019050919050565b600060208201905081810360008301526145d481614598565b9050919050565b7f53656c6c206665652073686f756c646e7420626520686967686572207468616e60008201527f2031300000000000000000000000000000000000000000000000000000000000602082015250565b6000614637602383613fdc565b9150614642826145db565b604082019050919050565b600060208201905081810360008301526146668161462a565b9050919050565b7f446f6573206e6f7420657869737420696e20626c61636b206c6973742e000000600082015250565b60006146a3601d83613fdc565b91506146ae8261466d565b602082019050919050565b600060208201905081810360008301526146d281614696565b9050919050565b7f416464726573732077617320616c726561647920616464656420746f20626c6160008201527f636b206c6973742e000000000000000000000000000000000000000000000000602082015250565b6000614735602883613fdc565b9150614740826146d9565b604082019050919050565b6000602082019050818103600083015261476481614728565b9050919050565b7f446576656c6f706d656e742077616c6c65742063616e2774206265207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b60006147c7602c83613fdc565b91506147d28261476b565b604082019050919050565b600060208201905081810360008301526147f6816147ba565b9050919050565b7f4d79546f6b656e3a20496e76616c6964207468726573686f6c64000000000000600082015250565b6000614833601a83613fdc565b915061483e826147fd565b602082019050919050565b6000602082019050818103600083015261486281614826565b9050919050565b8082525050565b60006020820190506148856000830184614869565b92915050565b60008151905061489a816140f4565b92915050565b6000602082840312156148b6576148b561408c565b5b60006148c48482850161488b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61490581613f9d565b82525050565b60006040820190506149206000830185614869565b61492d60208301846148fc565b9392505050565b600081519050614943816140c8565b92915050565b60006020828403121561495f5761495e61408c565b5b600061496d84828501614934565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006149df82613f9d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a1157614a106149a5565b5b600182019050919050565b614a25816140b6565b82525050565b6000604082019050614a406000830185614869565b614a4d6020830184614a1c565b9392505050565b7f596f752063616e27742064697374726962757465206d6f72652065746865722060008201527f7468616e20796f7520686176652e000000000000000000000000000000000000602082015250565b6000614ab0602e83613fdc565b9150614abb82614a54565b604082019050919050565b60006020820190508181036000830152614adf81614aa3565b9050919050565b7f4d79546f6b656e3a204e6f20706f74656e7469616c20686f6c6465727320746f60008201527f2072657761726400000000000000000000000000000000000000000000000000602082015250565b6000614b42602783613fdc565b9150614b4d82614ae6565b604082019050919050565b60006020820190508181036000830152614b7181614b35565b9050919050565b6000614b8382613f9d565b9150614b8e83613f9d565b925082821015614ba157614ba06149a5565b5b828203905092915050565b7f4d79546f6b656e3a204e6f20686f6c6465727320746f20726577617264000000600082015250565b6000614be2601d83613fdc565b9150614bed82614bac565b602082019050919050565b60006020820190508181036000830152614c1181614bd5565b9050919050565b7f4d79546f6b656e3a204e6f7468696e6720746f20726577617264000000000000600082015250565b6000614c4e601a83613fdc565b9150614c5982614c18565b602082019050919050565b60006020820190508181036000830152614c7d81614c41565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614cbe82613f9d565b9150614cc983613f9d565b925082614cd957614cd8614c84565b5b828204905092915050565b6000614cef82613f9d565b9150614cfa83613f9d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d2f57614d2e6149a5565b5b828201905092915050565b6000614d4582613f9d565b9150614d5083613f9d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d8957614d886149a5565b5b828202905092915050565b7f4b436f696e3a205468652050616e63616b655377617020706169722063616e6e60008201527f6f742062652072656d6f7665642066726f6d206175746f6d617465644d61726b60208201527f65744d616b657250616972730000000000000000000000000000000000000000604082015250565b6000614e16604c83613fdc565b9150614e2182614d94565b606082019050919050565b60006020820190508181036000830152614e4581614e09565b9050919050565b7f76616c756520697320746f6f206c6f7700000000000000000000000000000000600082015250565b6000614e82601083613fdc565b9150614e8d82614e4c565b602082019050919050565b60006020820190508181036000830152614eb181614e75565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000614eee601b83613fdc565b9150614ef982614eb8565b602082019050919050565b60006020820190508181036000830152614f1d81614ee1565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614f80602483613fdc565b9150614f8b82614f24565b604082019050919050565b60006020820190508181036000830152614faf81614f73565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000615012602283613fdc565b915061501d82614fb6565b604082019050919050565b6000602082019050818103600083015261504181615005565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006150a4602583613fdc565b91506150af82615048565b604082019050919050565b600060208201905081810360008301526150d381615097565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000615136602383613fdc565b9150615141826150da565b604082019050919050565b6000602082019050818103600083015261516581615129565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b60006151c8602983613fdc565b91506151d38261516c565b604082019050919050565b600060208201905081810360008301526151f7816151bb565b9050919050565b7f5468697320616464726573732069732062616e6e656400000000000000000000600082015250565b6000615234601683613fdc565b915061523f826151fe565b602082019050919050565b6000602082019050818103600083015261526381615227565b9050919050565b7f616d6f756e74206578636565647320746865206d61784275795472616e73616360008201527f74696f6e416d6f756e742e000000000000000000000000000000000000000000602082015250565b60006152c6602b83613fdc565b91506152d18261526a565b604082019050919050565b600060208201905081810360008301526152f5816152b9565b9050919050565b60006060820190506153116000830186614360565b61531e6020830185614360565b61532b6040830184614360565b949350505050565b600081519050615342816141d6565b92915050565b60006020828403121561535e5761535d61408c565b5b600061536c84828501615333565b91505092915050565b7f4d455620426f7420446574656374656400000000000000000000000000000000600082015250565b60006153ab601083613fdc565b91506153b682615375565b602082019050919050565b600060208201905081810360008301526153da8161539e565b9050919050565b7f536166654d6174683a206469766973696f6e206279207a65726f000000000000600082015250565b6000615417601a83613fdc565b9150615422826153e1565b602082019050919050565b600060208201905081810360008301526154468161540a565b9050919050565b7f4b436f696e3a204175746f6d61746564206d61726b6574206d616b657220706160008201527f697220697320616c72656164792073657420746f20746861742076616c756500602082015250565b60006154a9603f83613fdc565b91506154b48261544d565b604082019050919050565b600060208201905081810360008301526154d88161549c565b9050919050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b600061553b602183613fdc565b9150615546826154df565b604082019050919050565b6000602082019050818103600083015261556a8161552e565b9050919050565b7f536166654d6174683a207375627472616374696f6e206f766572666c6f770000600082015250565b60006155a7601e83613fdc565b91506155b282615571565b602082019050919050565b600060208201905081810360008301526155d68161559a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000615642601083613fdc565b915061564d8261560c565b602082019050919050565b6000602082019050818103600083015261567181615635565b9050919050565b600060608201905061568d6000830186614869565b61569a6020830185614a1c565b6156a760408301846148fc565b949350505050565b6000819050919050565b60006156d46156cf6156ca846156af565b61422f565b613f9d565b9050919050565b6156e4816156b9565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61571f816140b6565b82525050565b60006157318383615716565b60208301905092915050565b6000602082019050919050565b6000615755826156ea565b61575f81856156f5565b935061576a83615706565b8060005b8381101561579b5781516157828882615725565b975061578d8361573d565b92505060018101905061576e565b5085935050505092915050565b600060a0820190506157bd6000830188613fa7565b6157ca60208301876156db565b81810360408301526157dc818661574a565b90506157eb6060830185614360565b6157f86080830184613fa7565b969550505050505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122065c91fa3e1ff01ee53bb05f567cd56b452f3ebe5a8969a17e312ad8e84e14a4364736f6c634300080d0033

Libraries Used


Deployed Bytecode Sourcemap

45392:12649:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55040:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16077:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18153:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48592:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45820:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47877:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45581:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17144:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18786:317;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16995:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19498:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46085:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48361:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45628:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54838:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48233:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46191:57;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54398:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1705:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46271:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17308:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54634:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47994:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25168:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16279:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53270:775;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46307:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55304:1930;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55186:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57243:259;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45785:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20200:266;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17636:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46139:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24911:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57823:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54189:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45916:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46347:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46036:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17866:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48870:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53172:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48477:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25259:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47718:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55040:98;55091:4;55113:18;:9;:16;:18::i;:::-;55106:25;;55040:98;:::o;16077:89::-;16122:13;16154:5;16147:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16077:89;:::o;18153:166::-;18236:4;18252:39;18261:12;:10;:12::i;:::-;18275:7;18284:6;18252:8;:39::i;:::-;18308:4;18301:11;;18153:166;;;;:::o;48592:272::-;25137:6;;;;;;;;;;;25123:20;;:10;:20;;;25115:29;;;;;;48686:2:::1;48677:6;:11;48669:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48755:2;48745:7;:12;48737:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;48820:6;48807:10;:19;;;;48850:7;48836:11;:21;;;;48592:272:::0;;:::o;45820:30::-;;;;:::o;47877:111::-;25137:6;;;;;;;;;;;25123:20;;:10;:20;;;25115:29;;;;;;47966:15:::1;47949:14;;:32;;;;;;;;;;;;;;;;;;47877:111:::0;:::o;45581:41::-;;;;;;;;;;;;;:::o;17144:106::-;17205:7;17231:12;;17224:19;;17144:106;:::o;18786:317::-;18892:4;18908:36;18918:6;18926:9;18937:6;18908:9;:36::i;:::-;18954:121;18963:6;18971:12;:10;:12::i;:::-;18985:89;19023:6;18985:89;;;;;;;;;;;;;;;;;:11;:19;18997:6;18985:19;;;;;;;;;;;;;;;:33;19005:12;:10;:12::i;:::-;18985:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;18954:8;:121::i;:::-;19092:4;19085:11;;18786:317;;;;;:::o;16995:89::-;17044:5;17068:9;;;;;;;;;;;17061:16;;16995:89;:::o;19498:215::-;19586:4;19602:83;19611:12;:10;:12::i;:::-;19625:7;19634:50;19673:10;19634:11;:25;19646:12;:10;:12::i;:::-;19634:25;;;;;;;;;;;;;;;:34;19660:7;19634:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;19602:8;:83::i;:::-;19702:4;19695:11;;19498:215;;;;:::o;46085:48::-;;;;:::o;48361:110::-;25137:6;;;;;;;;;;;25123:20;;:10;:20;;;25115:29;;;;;;48460:4:::1;48429:19;:28;48449:7;48429:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;48361:110:::0;:::o;45628:28::-;;;;;;;;;;;;;:::o;54838:196::-;54908:4;25137:6;;;;;;;;;;;25123:20;;:10;:20;;;25115:29;;;;;;54932:23:::1;54951:3;54932:9;:18;;:23;;;;:::i;:::-;54924:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;55006:21;55023:3;55006:9;:16;;:21;;;;:::i;:::-;54999:28;;54838:196:::0;;;:::o;48233:122::-;48297:4;48320:19;:28;48340:7;48320:28;;;;;;;;;;;;;;;;;;;;;;;;;48313:35;;48233:122;;;:::o;46191:57::-;;;;:::o;54398:106::-;25137:6;;;;;;;;;;;25123:20;;:10;:20;;;25115:29;;;;;;54492:5:::1;54471:9;:18;54481:7;54471:18;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;54398:106:::0;:::o;1705:84::-;1752:4;1775:7;;;;;;;;;;;1768:14;;1705:84;:::o;46271:30::-;;;;;;;;;;;;;:::o;17308:125::-;17382:7;17408:9;:18;17418:7;17408:18;;;;;;;;;;;;;;;;17401:25;;17308:125;;;:::o;54634:198::-;54697:4;25137:6;;;;;;;;;;;25123:20;;:10;:20;;;25115:29;;;;;;54722:23:::1;54741:3;54722:9;:18;;:23;;;;:::i;:::-;54721:24;54713:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;54807:18;54821:3;54807:9;:13;;:18;;;;:::i;:::-;54800:25;;54634:198:::0;;;:::o;47994:233::-;25137:6;;;;;;;;;;;25123:20;;:10;:20;;;25115:29;;;;;;48121:1:::1;48091:32;;:18;:32;;::::0;48083:89:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;48202:18;48182:17;;:38;;;;;;;;;;;;;;;;;;47994:233:::0;:::o;25168:85::-;25214:7;25240:6;;;;;;;;;;;25233:13;;25168:85;:::o;16279:93::-;16326:13;16358:7;16351:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16279:93;:::o;53270:775::-;53350:1;53338:9;:13;53330:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;53409:9;53392:14;:26;;;;53487:9;53499:17;:22;;;;:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53487:36;;53533:32;53582:4;53568:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53533:54;;53597:27;53644:6;53639:274;53660:4;53656:1;:8;53639:274;;;53685:14;53702:17;:31;;;;53734:1;53702:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53685:51;;53774:9;53754:17;53764:6;53754:9;:17::i;:::-;:29;53750:153;;;53842:6;53803:15;53819:19;53803:36;;;;;;;;:::i;:::-;;;;;;;:45;;;;;;;;;;;53866:22;;;;;:::i;:::-;;;;53750:153;53671:242;53666:3;;;;;:::i;:::-;;;;53639:274;;;;53928:6;53923:116;53944:19;53940:1;:23;53923:116;;;53984:17;:24;;;;54009:15;54025:1;54009:18;;;;;;;;:::i;:::-;;;;;;;;53984:44;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53965:3;;;;;:::i;:::-;;;;53923:116;;;;53320:725;;;53270:775;:::o;46307:33::-;;;;;;;;;;;;;:::o;55304:1930::-;25137:6;;;;;;;;;;;25123:20;;:10;:20;;;25115:29;;;;;;55374:13:::1;55390:21;55374:37;;55440:6;55429:8;:17;55421:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;55507:9;55519:17;:22;;;;:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55507:36;;55553:26;55596:4;55582:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55553:48;;55611:22;55662:1:::0;55655:4:::1;:8;55647:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;55720:23;;;;;;;;;;;55717:640;;;55763:6;55758:162;55779:4;55775:1;:8;55758:162;;;55836:17;:31;;;;55868:1;55836:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55808:9;55818:14;55808:25;;;;;;;;:::i;:::-;;;;;;;:62;;;;;;;;;::::0;::::1;55888:17;;;;;:::i;:::-;;;;55785:3;;;;;:::i;:::-;;;;55758:162;;;;55959:5;55933:23;;:31;;;;;;;;;;;;;;;;;;55717:640;;;55999:6;55994:353;56015:4;56011:1;:8;55994:353;;;56044:14;56061:17;:21;;;;56083:17;:31;;;;56115:1;56083:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56061:57;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56044:74;;56171:18;56158:9;56140:15;:27;;;;:::i;:::-;:49;56136:197;;56241:17;:31;;;;56273:1;56241:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56213:9;56223:14;56213:25;;;;;;;;:::i;:::-;;;;;;;:62;;;;;;;;;::::0;::::1;56297:17;;;;;:::i;:::-;;;;56136:197;56026:321;56021:3;;;;;:::i;:::-;;;;55994:353;;;;55717:640;56392:1;56375:14;:18;56367:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;56437:20;56460:26;56471:14;56460:6;:10;;:26;;;;:::i;:::-;56437:49;;56522:1;56504:15;:19;56496:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;56564:30;56613:6:::0;56608:216:::1;56629:14;56625:1;:18;56608:216;;;56668:32;56687:9;56697:1;56687:12;;;;;;;;:::i;:::-;;;;;;;;56668:9;:18;;:32;;;;:::i;:::-;56664:150;;56793:6;56769:23;56779:9;56789:1;56779:12;;;;;;;;:::i;:::-;;;;;;;;56769:9;:23::i;:::-;:30;;;;:::i;:::-;56744:22;:55;;;;:::i;:::-;56719:80;;56664:150;56645:3;;;;;:::i;:::-;;;;56608:216;;;;56838:6;56833:395;56854:14;56850:1;:18;56833:395;;;56889:25;56941:6;56917:23;56927:9;56937:1;56927:12;;;;;;;;:::i;:::-;;;;;;;;56917:9;:23::i;:::-;:30;;;;:::i;:::-;56889:58;;56961:20;57011:22;56993:17;56984:6;:26;;;;:::i;:::-;:49;;;;:::i;:::-;56961:72;;57108:32;57127:9;57137:1;57127:12;;;;;;;;:::i;:::-;;;;;;;;57108:9;:18;;:32;;;;:::i;:::-;57104:114;;57167:9;57177:1;57167:12;;;;;;;;:::i;:::-;;;;;;;;57159:30;;:44;57190:12;57159:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57104:114;56875:353;;56870:3;;;;;:::i;:::-;;;;56833:395;;;;55364:1870;;;;;;55304:1930:::0;:::o;55186:113::-;55242:7;55268:17;:22;;;;:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55261:31;;55186:113;:::o;57243:259::-;25137:6;;;;;;;;;;;25123:20;;:10;:20;;;25115:29;;;;;;57349:13:::1;;;;;;;;;;;57341:21;;:4;:21;;::::0;57333:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;57454:41;57483:4;57489:5;57454:28;:41::i;:::-;57243:259:::0;;:::o;45785:29::-;;;;:::o;20200:266::-;20293:4;20309:129;20318:12;:10;:12::i;:::-;20332:7;20341:96;20380:15;20341:96;;;;;;;;;;;;;;;;;:11;:25;20353:12;:10;:12::i;:::-;20341:25;;;;;;;;;;;;;;;:34;20367:7;20341:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;20309:8;:129::i;:::-;20455:4;20448:11;;20200:266;;;;:::o;17636:172::-;17722:4;17738:42;17748:12;:10;:12::i;:::-;17762:9;17773:6;17738:9;:42::i;:::-;17797:4;17790:11;;17636:172;;;;:::o;46139:46::-;;;;:::o;24911:21::-;;;;;;;;;;;;;:::o;57823:216::-;25137:6;;;;;;;;;;;25123:20;;:10;:20;;;25115:29;;;;;;57931:15:::1;57905:23;:41;;;;57988:23;58006:4;57988:13;:11;:13::i;:::-;:17;;:23;;;;:::i;:::-;57964;;:47;57956:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;57823:216:::0;:::o;54189:177::-;25137:6;;;;;;;;;;;25123:20;;:10;:20;;;25115:29;;;;;;54273:9:::1;54268:92;54288:9;;:16;;54284:1;:20;54268:92;;;54347:4;54321:9;:23;54331:9;;54341:1;54331:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;54321:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;54306:3;;;;:::i;:::-;;;54268:92;;;;54189:177:::0;;:::o;45916:58::-;;;;;;;;;;;;;;;;;;;;;;:::o;46347:77::-;;;;;;;;;;;;;:::o;46036:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;17866:149::-;17955:7;17981:11;:18;17993:5;17981:18;;;;;;;;;;;;;;;:27;18000:7;17981:27;;;;;;;;;;;;;;;;17974:34;;17866:149;;;;:::o;48870:95::-;25137:6;;;;;;;;;;;25123:20;;:10;:20;;;25115:29;;;;;;48950:8:::1;48936:11;;:22;;;;;;;;;;;;;;;;;;48870:95:::0;:::o;53172:92::-;53217:7;53243:14;;53236:21;;53172:92;:::o;48477:109::-;25137:6;;;;;;;;;;;25123:20;;:10;:20;;;25115:29;;;;;;48574:5:::1;48543:19;:28;48563:7;48543:28;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;48477:109:::0;:::o;25259:196::-;25137:6;;;;;;;;;;;25123:20;;:10;:20;;;25115:29;;;;;;25361:1:::1;25340:23;;:9;:23;;::::0;25332:32:::1;;;::::0;::::1;;25410:9;25379:41;;25402:6;;;;;;;;;;;25379:41;;;;;;;;;;;;25439:9;25430:6;;:18;;;;;;;;;;;;;;;;;;25259:196:::0;:::o;47718:149::-;25137:6;;;;;;;;;;;25123:20;;:10;:20;;;25115:29;;;;;;47802:9:::1;47782:8;;:30;;;;;;;;;;;;;;;;;;47822:8;;;;;;;;;;;:23;;;47846:13;;;;;;;;;;;47822:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47718:149:::0;:::o;5461:175::-;5519:7;5538:9;5554:1;5550;:5;;;;:::i;:::-;5538:17;;5578:1;5573;:6;;5565:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;5628:1;5621:8;;;5461:175;;;;:::o;41455:115::-;41518:7;41544:19;41552:3;:10;;41544:7;:19::i;:::-;41537:26;;41455:115;;;:::o;850:105::-;903:7;937:10;922:26;;850:105;:::o;23320:340::-;23438:1;23421:19;;:5;:19;;;23413:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23518:1;23499:21;;:7;:21;;;23491:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23600:6;23570:11;:18;23582:5;23570:18;;;;;;;;;;;;;;;:27;23589:7;23570:27;;;;;;;;;;;;;;;:36;;;;23637:7;23621:32;;23630:5;23621:32;;;23646:6;23621:32;;;;;;:::i;:::-;;;;;;;;23320:340;;;:::o;48971:2290::-;49115:1;49099:18;;:4;:18;;;49091:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49191:1;49177:16;;:2;:16;;;49169:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;49260:1;49251:6;:10;49243:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;49326:9;:15;49336:4;49326:15;;;;;;;;;;;;;;;;;;;;;;;;;49325:16;:34;;;;;49346:9;:13;49356:2;49346:13;;;;;;;;;;;;;;;;;;;;;;;;;49345:14;49325:34;49317:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;49410:1;49400:6;:11;49397:90;;49428:28;49444:4;49450:2;49454:1;49428:15;:28::i;:::-;49470:7;;49397:90;49508:25;:31;49534:4;49508:31;;;;;;;;;;;;;;;;;;;;;;;;;:63;;;;;49545:19;:25;49565:4;49545:25;;;;;;;;;;;;;;;;;;;;;;;;;49544:26;49508:63;:93;;;;;49577:19;:23;49597:2;49577:23;;;;;;;;;;;;;;;;;;;;;;;;;49576:24;49508:93;49505:225;;;49635:23;;49625:6;:33;;49617:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;49505:225;50018:28;50049:24;50067:4;50049:9;:24::i;:::-;50018:55;;50084:24;50135:13;;50111:20;:37;;50084:64;;50175:19;:42;;;;;50211:6;;;;;;;;;;;50210:7;50175:42;:79;;;;;50241:13;;;;;;;;;;;50233:21;;:4;:21;;;;50175:79;:106;;;;;50270:11;;;;;;;;;;;50175:106;50158:195;;;50306:36;50321:20;50306:14;:36::i;:::-;50158:195;50363:12;50378:4;50363:19;;50479;:25;50499:4;50479:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;50508:19;:23;50528:2;50508:23;;;;;;;;;;;;;;;;;;;;;;;;;50479:52;50476:97;;;50557:5;50547:15;;50476:97;50586:7;50583:347;;;50609:12;50650:13;;;;;;;;;;;50642:21;;:4;:21;;;50639:186;;50702:31;50729:3;50702:22;50713:10;;50702:6;:10;;:22;;;;:::i;:::-;:26;;:31;;;;:::i;:::-;50695:38;;50639:186;;;50778:32;50806:3;50778:23;50789:11;;50778:6;:10;;:23;;;;:::i;:::-;:27;;:32;;;;:::i;:::-;50771:39;;50639:186;50847:16;50858:4;50847:6;:10;;:16;;;;:::i;:::-;50838:25;;50877:42;50893:4;50907;50914;50877:15;:42::i;:::-;50595:335;50583:347;50943:14;;;;;;;;;;;50939:265;;;50972:11;50996:12;51011:9;50996:24;;51037:8;;;;;;;;;;;:14;;;51052:4;51057:2;51060:4;51037:28;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51033:114;;51136:8;;;51033:114;51110:3;51101:12;;51066:61;51166:6;51158:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;50959:245;;50939:265;51221:33;51237:4;51243:2;51247:6;51221:15;:33::i;:::-;49080:2181;;;48971:2290;;;;:::o;8203:163::-;8289:7;8321:1;8316;:6;;8324:12;8308:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;8358:1;8354;:5;;;;:::i;:::-;8347:12;;8203:163;;;;;:::o;41209:165::-;41289:4;41312:55;41322:3;:10;;41358:5;41342:23;;41334:32;;41312:9;:55::i;:::-;41305:62;;41209:165;;;;:::o;40972:156::-;41045:4;41068:53;41076:3;:10;;41112:5;41096:23;;41088:32;;41068:7;:53::i;:::-;41061:60;;40972:156;;;;:::o;40654:150::-;40724:4;40747:50;40752:3;:10;;40788:5;40772:23;;40764:32;;40747:4;:50::i;:::-;40740:57;;40654:150;;;;:::o;6988:::-;7046:7;7077:1;7073;:5;7065:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;7130:1;7126;:5;;;;:::i;:::-;7119:12;;6988:150;;;;:::o;57508:310::-;57633:5;57598:40;;:25;:31;57624:4;57598:31;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;57590:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;57750:5;57716:25;:31;57742:4;57716:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;57805:5;57771:40;;57799:4;57771:40;;;;;;;;;;;;57508:310;;:::o;36988:107::-;37044:7;37070:3;:11;;:18;;;;37063:25;;36988:107;;;:::o;20940:586::-;21063:1;21045:20;;:6;:20;;;21037:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;21146:1;21125:23;;:9;:23;;;21117:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;21199:47;21220:6;21228:9;21239:6;21199:20;:47::i;:::-;21277:71;21299:6;21277:71;;;;;;;;;;;;;;;;;:9;:17;21287:6;21277:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;21257:9;:17;21267:6;21257:17;;;;;;;;;;;;;;;:91;;;;21381:32;21406:6;21381:9;:20;21391:9;21381:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;21358:9;:20;21368:9;21358:20;;;;;;;;;;;;;;;:55;;;;21445:9;21428:35;;21437:6;21428:35;;;21456:6;21428:35;;;;;;:::i;:::-;;;;;;;;21473:46;21493:6;21501:9;21512:6;21473:19;:46::i;:::-;20940:586;;;:::o;51267:248::-;46553:4;46544:6;;:13;;;;;;;;;;;;;;;;;;51382:38:::1;51399:20;51382:16;:38::i;:::-;51458:17;;;;;;;;;;;51450:35;;:58;51486:21;51450:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;46587:5:::0;46578:6;;:14;;;;;;;;;;;;;;;;;;51267:248;:::o;6309:215::-;6367:7;6395:1;6390;:6;6386:20;;6405:1;6398:8;;;;6386:20;6416:9;6432:1;6428;:5;;;;:::i;:::-;6416:17;;6460:1;6455;6451;:5;;;;:::i;:::-;:10;6443:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;6516:1;6509:8;;;6309:215;;;;;:::o;5907:155::-;5965:7;5997:1;5992;:6;;5984:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;6054:1;6050;:5;;;;:::i;:::-;6043:12;;5907:155;;;;:::o;36780:127::-;36853:4;36899:1;36876:3;:12;;:19;36889:5;36876:19;;;;;;;;;;;;:24;;36869:31;;36780:127;;;;:::o;35311:1388::-;35377:4;35493:18;35514:3;:12;;:19;35527:5;35514:19;;;;;;;;;;;;35493:40;;35562:1;35548:10;:15;35544:1149;;35917:21;35954:1;35941:10;:14;;;;:::i;:::-;35917:38;;35969:17;36010:1;35989:3;:11;;:18;;;;:22;;;;:::i;:::-;35969:42;;36043:13;36030:9;:26;36026:398;;36076:17;36096:3;:11;;36108:9;36096:22;;;;;;;;:::i;:::-;;;;;;;;;;36076:42;;36247:9;36218:3;:11;;36230:13;36218:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;36356:10;36330:3;:12;;:23;36343:9;36330:23;;;;;;;;;;;:36;;;;36058:366;36026:398;36502:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36594:3;:12;;:19;36607:5;36594:19;;;;;;;;;;;36587:26;;;36635:4;36628:11;;;;;;;35544:1149;36677:5;36670:12;;;35311:1388;;;;;:::o;34739:404::-;34802:4;34823:21;34833:3;34838:5;34823:9;:21::i;:::-;34818:319;;34860:3;:11;;34877:5;34860:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35040:3;:11;;:18;;;;35018:3;:12;;:19;35031:5;35018:19;;;;;;;;;;;:40;;;;35079:4;35072:11;;;;34818:319;35121:5;35114:12;;34739:404;;;;;:::o;24666:92::-;;;;:::o;52156:971::-;2019:8;:6;:8::i;:::-;2018:9;2010:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;52285:43:::1;52311:4;52317:2;52321:6;52285:25;:43::i;:::-;52357:1;52343:16;;:2;:16;;;;:39;;;;;52377:4;52363:19;;:2;:19;;;;52343:39;:56;;;;;52392:7;:5;:7::i;:::-;52386:13;;:2;:13;;;;52343:56;:83;;;;;52404:22;52423:2;52404:9;:18;;:22;;;;:::i;:::-;52403:23;52343:83;52339:387;;;52464:14;;52447:13;52457:2;52447:9;:13::i;:::-;:31;52443:273;;52616:1;52587:17;:21;;;;52609:2;52587:25;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:30:::0;52583:119:::1;;52641:17;:21;;;;52663:2;52667:15;52641:42;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;52583:119;52443:273;52339:387;52756:1;52740:18;;:4;:18;;;;:43;;;;;52778:4;52762:21;;:4;:21;;;;52740:43;:62;;;;;52795:7;:5;:7::i;:::-;52787:15;;:4;:15;;;;52740:62;:91;;;;;52807:24;52826:4;52807:9;:18;;:24;;;;:::i;:::-;52806:25;52740:91;52736:385;;;52869:14;;52851:15;52861:4;52851:9;:15::i;:::-;:32;52847:264;;;53023:1;52992:17;:21;;;;53014:4;52992:27;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;52988:109;;53048:17;:24;;;;53073:4;53048:30;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;52988:109;52847:264;52736:385;52156:971:::0;;;:::o;51521:573::-;51645:21;51683:1;51669:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51645:40;;51713:4;51695;51700:1;51695:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;51738:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51728:4;51733:1;51728:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;51771:62;51788:4;51803:15;;;;;;;;;;;51821:11;51771:8;:62::i;:::-;51869:15;;;;;;;;;;;:66;;;51949:11;51974:1;52017:4;52043;52062:15;51869:218;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51576:518;51521:573;:::o;24763:120::-;;;;:::o;7:77:2:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:99::-;494:6;528:5;522:12;512:22;;442:99;;;:::o;547:169::-;631:11;665:6;660:3;653:19;705:4;700:3;696:14;681:29;;547:169;;;;:::o;722:307::-;790:1;800:113;814:6;811:1;808:13;800:113;;;899:1;894:3;890:11;884:18;880:1;875:3;871:11;864:39;836:2;833:1;829:10;824:15;;800:113;;;931:6;928:1;925:13;922:101;;;1011:1;1002:6;997:3;993:16;986:27;922:101;771:258;722:307;;;:::o;1035:102::-;1076:6;1127:2;1123:7;1118:2;1111:5;1107:14;1103:28;1093:38;;1035:102;;;:::o;1143:364::-;1231:3;1259:39;1292:5;1259:39;:::i;:::-;1314:71;1378:6;1373:3;1314:71;:::i;:::-;1307:78;;1394:52;1439:6;1434:3;1427:4;1420:5;1416:16;1394:52;:::i;:::-;1471:29;1493:6;1471:29;:::i;:::-;1466:3;1462:39;1455:46;;1235:272;1143:364;;;;:::o;1513:313::-;1626:4;1664:2;1653:9;1649:18;1641:26;;1713:9;1707:4;1703:20;1699:1;1688:9;1684:17;1677:47;1741:78;1814:4;1805:6;1741:78;:::i;:::-;1733:86;;1513:313;;;;:::o;1913:117::-;2022:1;2019;2012:12;2036:117;2145:1;2142;2135:12;2159:126;2196:7;2236:42;2229:5;2225:54;2214:65;;2159:126;;;:::o;2291:96::-;2328:7;2357:24;2375:5;2357:24;:::i;:::-;2346:35;;2291:96;;;:::o;2393:122::-;2466:24;2484:5;2466:24;:::i;:::-;2459:5;2456:35;2446:63;;2505:1;2502;2495:12;2446:63;2393:122;:::o;2521:139::-;2567:5;2605:6;2592:20;2583:29;;2621:33;2648:5;2621:33;:::i;:::-;2521:139;;;;:::o;2666:122::-;2739:24;2757:5;2739:24;:::i;:::-;2732:5;2729:35;2719:63;;2778:1;2775;2768:12;2719:63;2666:122;:::o;2794:139::-;2840:5;2878:6;2865:20;2856:29;;2894:33;2921:5;2894:33;:::i;:::-;2794:139;;;;:::o;2939:474::-;3007:6;3015;3064:2;3052:9;3043:7;3039:23;3035:32;3032:119;;;3070:79;;:::i;:::-;3032:119;3190:1;3215:53;3260:7;3251:6;3240:9;3236:22;3215:53;:::i;:::-;3205:63;;3161:117;3317:2;3343:53;3388:7;3379:6;3368:9;3364:22;3343:53;:::i;:::-;3333:63;;3288:118;2939:474;;;;;:::o;3419:90::-;3453:7;3496:5;3489:13;3482:21;3471:32;;3419:90;;;:::o;3515:109::-;3596:21;3611:5;3596:21;:::i;:::-;3591:3;3584:34;3515:109;;:::o;3630:210::-;3717:4;3755:2;3744:9;3740:18;3732:26;;3768:65;3830:1;3819:9;3815:17;3806:6;3768:65;:::i;:::-;3630:210;;;;:::o;3846:474::-;3914:6;3922;3971:2;3959:9;3950:7;3946:23;3942:32;3939:119;;;3977:79;;:::i;:::-;3939:119;4097:1;4122:53;4167:7;4158:6;4147:9;4143:22;4122:53;:::i;:::-;4112:63;;4068:117;4224:2;4250:53;4295:7;4286:6;4275:9;4271:22;4250:53;:::i;:::-;4240:63;;4195:118;3846:474;;;;;:::o;4326:116::-;4396:21;4411:5;4396:21;:::i;:::-;4389:5;4386:32;4376:60;;4432:1;4429;4422:12;4376:60;4326:116;:::o;4448:133::-;4491:5;4529:6;4516:20;4507:29;;4545:30;4569:5;4545:30;:::i;:::-;4448:133;;;;:::o;4587:323::-;4643:6;4692:2;4680:9;4671:7;4667:23;4663:32;4660:119;;;4698:79;;:::i;:::-;4660:119;4818:1;4843:50;4885:7;4876:6;4865:9;4861:22;4843:50;:::i;:::-;4833:60;;4789:114;4587:323;;;;:::o;4916:60::-;4944:3;4965:5;4958:12;;4916:60;;;:::o;4982:142::-;5032:9;5065:53;5083:34;5092:24;5110:5;5092:24;:::i;:::-;5083:34;:::i;:::-;5065:53;:::i;:::-;5052:66;;4982:142;;;:::o;5130:126::-;5180:9;5213:37;5244:5;5213:37;:::i;:::-;5200:50;;5130:126;;;:::o;5262:153::-;5339:9;5372:37;5403:5;5372:37;:::i;:::-;5359:50;;5262:153;;;:::o;5421:185::-;5535:64;5593:5;5535:64;:::i;:::-;5530:3;5523:77;5421:185;;:::o;5612:276::-;5732:4;5770:2;5759:9;5755:18;5747:26;;5783:98;5878:1;5867:9;5863:17;5854:6;5783:98;:::i;:::-;5612:276;;;;:::o;5894:619::-;5971:6;5979;5987;6036:2;6024:9;6015:7;6011:23;6007:32;6004:119;;;6042:79;;:::i;:::-;6004:119;6162:1;6187:53;6232:7;6223:6;6212:9;6208:22;6187:53;:::i;:::-;6177:63;;6133:117;6289:2;6315:53;6360:7;6351:6;6340:9;6336:22;6315:53;:::i;:::-;6305:63;;6260:118;6417:2;6443:53;6488:7;6479:6;6468:9;6464:22;6443:53;:::i;:::-;6433:63;;6388:118;5894:619;;;;;:::o;6519:86::-;6554:7;6594:4;6587:5;6583:16;6572:27;;6519:86;;;:::o;6611:112::-;6694:22;6710:5;6694:22;:::i;:::-;6689:3;6682:35;6611:112;;:::o;6729:214::-;6818:4;6856:2;6845:9;6841:18;6833:26;;6869:67;6933:1;6922:9;6918:17;6909:6;6869:67;:::i;:::-;6729:214;;;;:::o;6949:329::-;7008:6;7057:2;7045:9;7036:7;7032:23;7028:32;7025:119;;;7063:79;;:::i;:::-;7025:119;7183:1;7208:53;7253:7;7244:6;7233:9;7229:22;7208:53;:::i;:::-;7198:63;;7154:117;6949:329;;;;:::o;7284:118::-;7371:24;7389:5;7371:24;:::i;:::-;7366:3;7359:37;7284:118;;:::o;7408:222::-;7501:4;7539:2;7528:9;7524:18;7516:26;;7552:71;7620:1;7609:9;7605:17;7596:6;7552:71;:::i;:::-;7408:222;;;;:::o;7636:329::-;7695:6;7744:2;7732:9;7723:7;7719:23;7715:32;7712:119;;;7750:79;;:::i;:::-;7712:119;7870:1;7895:53;7940:7;7931:6;7920:9;7916:22;7895:53;:::i;:::-;7885:63;;7841:117;7636:329;;;;:::o;7971:468::-;8036:6;8044;8093:2;8081:9;8072:7;8068:23;8064:32;8061:119;;;8099:79;;:::i;:::-;8061:119;8219:1;8244:53;8289:7;8280:6;8269:9;8265:22;8244:53;:::i;:::-;8234:63;;8190:117;8346:2;8372:50;8414:7;8405:6;8394:9;8390:22;8372:50;:::i;:::-;8362:60;;8317:115;7971:468;;;;;:::o;8445:117::-;8554:1;8551;8544:12;8568:117;8677:1;8674;8667:12;8691:117;8800:1;8797;8790:12;8831:568;8904:8;8914:6;8964:3;8957:4;8949:6;8945:17;8941:27;8931:122;;8972:79;;:::i;:::-;8931:122;9085:6;9072:20;9062:30;;9115:18;9107:6;9104:30;9101:117;;;9137:79;;:::i;:::-;9101:117;9251:4;9243:6;9239:17;9227:29;;9305:3;9297:4;9289:6;9285:17;9275:8;9271:32;9268:41;9265:128;;;9312:79;;:::i;:::-;9265:128;8831:568;;;;;:::o;9405:559::-;9491:6;9499;9548:2;9536:9;9527:7;9523:23;9519:32;9516:119;;;9554:79;;:::i;:::-;9516:119;9702:1;9691:9;9687:17;9674:31;9732:18;9724:6;9721:30;9718:117;;;9754:79;;:::i;:::-;9718:117;9867:80;9939:7;9930:6;9919:9;9915:22;9867:80;:::i;:::-;9849:98;;;;9645:312;9405:559;;;;;:::o;9970:474::-;10038:6;10046;10095:2;10083:9;10074:7;10070:23;10066:32;10063:119;;;10101:79;;:::i;:::-;10063:119;10221:1;10246:53;10291:7;10282:6;10271:9;10267:22;10246:53;:::i;:::-;10236:63;;10192:117;10348:2;10374:53;10419:7;10410:6;10399:9;10395:22;10374:53;:::i;:::-;10364:63;;10319:118;9970:474;;;;;:::o;10450:180::-;10498:77;10495:1;10488:88;10595:4;10592:1;10585:15;10619:4;10616:1;10609:15;10636:320;10680:6;10717:1;10711:4;10707:12;10697:22;;10764:1;10758:4;10754:12;10785:18;10775:81;;10841:4;10833:6;10829:17;10819:27;;10775:81;10903:2;10895:6;10892:14;10872:18;10869:38;10866:84;;10922:18;;:::i;:::-;10866:84;10687:269;10636:320;;;:::o;10962:221::-;11102:34;11098:1;11090:6;11086:14;11079:58;11171:4;11166:2;11158:6;11154:15;11147:29;10962:221;:::o;11189:366::-;11331:3;11352:67;11416:2;11411:3;11352:67;:::i;:::-;11345:74;;11428:93;11517:3;11428:93;:::i;:::-;11546:2;11541:3;11537:12;11530:19;;11189:366;;;:::o;11561:419::-;11727:4;11765:2;11754:9;11750:18;11742:26;;11814:9;11808:4;11804:20;11800:1;11789:9;11785:17;11778:47;11842:131;11968:4;11842:131;:::i;:::-;11834:139;;11561:419;;;:::o;11986:222::-;12126:34;12122:1;12114:6;12110:14;12103:58;12195:5;12190:2;12182:6;12178:15;12171:30;11986:222;:::o;12214:366::-;12356:3;12377:67;12441:2;12436:3;12377:67;:::i;:::-;12370:74;;12453:93;12542:3;12453:93;:::i;:::-;12571:2;12566:3;12562:12;12555:19;;12214:366;;;:::o;12586:419::-;12752:4;12790:2;12779:9;12775:18;12767:26;;12839:9;12833:4;12829:20;12825:1;12814:9;12810:17;12803:47;12867:131;12993:4;12867:131;:::i;:::-;12859:139;;12586:419;;;:::o;13011:179::-;13151:31;13147:1;13139:6;13135:14;13128:55;13011:179;:::o;13196:366::-;13338:3;13359:67;13423:2;13418:3;13359:67;:::i;:::-;13352:74;;13435:93;13524:3;13435:93;:::i;:::-;13553:2;13548:3;13544:12;13537:19;;13196:366;;;:::o;13568:419::-;13734:4;13772:2;13761:9;13757:18;13749:26;;13821:9;13815:4;13811:20;13807:1;13796:9;13792:17;13785:47;13849:131;13975:4;13849:131;:::i;:::-;13841:139;;13568:419;;;:::o;13993:227::-;14133:34;14129:1;14121:6;14117:14;14110:58;14202:10;14197:2;14189:6;14185:15;14178:35;13993:227;:::o;14226:366::-;14368:3;14389:67;14453:2;14448:3;14389:67;:::i;:::-;14382:74;;14465:93;14554:3;14465:93;:::i;:::-;14583:2;14578:3;14574:12;14567:19;;14226:366;;;:::o;14598:419::-;14764:4;14802:2;14791:9;14787:18;14779:26;;14851:9;14845:4;14841:20;14837:1;14826:9;14822:17;14815:47;14879:131;15005:4;14879:131;:::i;:::-;14871:139;;14598:419;;;:::o;15023:231::-;15163:34;15159:1;15151:6;15147:14;15140:58;15232:14;15227:2;15219:6;15215:15;15208:39;15023:231;:::o;15260:366::-;15402:3;15423:67;15487:2;15482:3;15423:67;:::i;:::-;15416:74;;15499:93;15588:3;15499:93;:::i;:::-;15617:2;15612:3;15608:12;15601:19;;15260:366;;;:::o;15632:419::-;15798:4;15836:2;15825:9;15821:18;15813:26;;15885:9;15879:4;15875:20;15871:1;15860:9;15856:17;15849:47;15913:131;16039:4;15913:131;:::i;:::-;15905:139;;15632:419;;;:::o;16057:176::-;16197:28;16193:1;16185:6;16181:14;16174:52;16057:176;:::o;16239:366::-;16381:3;16402:67;16466:2;16461:3;16402:67;:::i;:::-;16395:74;;16478:93;16567:3;16478:93;:::i;:::-;16596:2;16591:3;16587:12;16580:19;;16239:366;;;:::o;16611:419::-;16777:4;16815:2;16804:9;16800:18;16792:26;;16864:9;16858:4;16854:20;16850:1;16839:9;16835:17;16828:47;16892:131;17018:4;16892:131;:::i;:::-;16884:139;;16611:419;;;:::o;17036:128::-;17152:5;17147:3;17140:18;17036:128;;:::o;17170:280::-;17292:4;17330:2;17319:9;17315:18;17307:26;;17343:100;17440:1;17429:9;17425:17;17416:6;17343:100;:::i;:::-;17170:280;;;;:::o;17456:143::-;17513:5;17544:6;17538:13;17529:22;;17560:33;17587:5;17560:33;:::i;:::-;17456:143;;;;:::o;17605:351::-;17675:6;17724:2;17712:9;17703:7;17699:23;17695:32;17692:119;;;17730:79;;:::i;:::-;17692:119;17850:1;17875:64;17931:7;17922:6;17911:9;17907:22;17875:64;:::i;:::-;17865:74;;17821:128;17605:351;;;;:::o;17962:180::-;18010:77;18007:1;18000:88;18107:4;18104:1;18097:15;18131:4;18128:1;18121:15;18148:126;18243:24;18261:5;18243:24;:::i;:::-;18238:3;18231:37;18148:126;;:::o;18280:398::-;18430:4;18468:2;18457:9;18453:18;18445:26;;18481:100;18578:1;18567:9;18563:17;18554:6;18481:100;:::i;:::-;18591:80;18667:2;18656:9;18652:18;18643:6;18591:80;:::i;:::-;18280:398;;;;;:::o;18684:143::-;18741:5;18772:6;18766:13;18757:22;;18788:33;18815:5;18788:33;:::i;:::-;18684:143;;;;:::o;18833:351::-;18903:6;18952:2;18940:9;18931:7;18927:23;18923:32;18920:119;;;18958:79;;:::i;:::-;18920:119;19078:1;19103:64;19159:7;19150:6;19139:9;19135:22;19103:64;:::i;:::-;19093:74;;19049:128;18833:351;;;;:::o;19190:180::-;19238:77;19235:1;19228:88;19335:4;19332:1;19325:15;19359:4;19356:1;19349:15;19376:180;19424:77;19421:1;19414:88;19521:4;19518:1;19511:15;19545:4;19542:1;19535:15;19562:233;19601:3;19624:24;19642:5;19624:24;:::i;:::-;19615:33;;19670:66;19663:5;19660:77;19657:103;;19740:18;;:::i;:::-;19657:103;19787:1;19780:5;19776:13;19769:20;;19562:233;;;:::o;19801:126::-;19896:24;19914:5;19896:24;:::i;:::-;19891:3;19884:37;19801:126;;:::o;19933:398::-;20083:4;20121:2;20110:9;20106:18;20098:26;;20134:100;20231:1;20220:9;20216:17;20207:6;20134:100;:::i;:::-;20244:80;20320:2;20309:9;20305:18;20296:6;20244:80;:::i;:::-;19933:398;;;;;:::o;20337:233::-;20477:34;20473:1;20465:6;20461:14;20454:58;20546:16;20541:2;20533:6;20529:15;20522:41;20337:233;:::o;20576:366::-;20718:3;20739:67;20803:2;20798:3;20739:67;:::i;:::-;20732:74;;20815:93;20904:3;20815:93;:::i;:::-;20933:2;20928:3;20924:12;20917:19;;20576:366;;;:::o;20948:419::-;21114:4;21152:2;21141:9;21137:18;21129:26;;21201:9;21195:4;21191:20;21187:1;21176:9;21172:17;21165:47;21229:131;21355:4;21229:131;:::i;:::-;21221:139;;20948:419;;;:::o;21373:226::-;21513:34;21509:1;21501:6;21497:14;21490:58;21582:9;21577:2;21569:6;21565:15;21558:34;21373:226;:::o;21605:366::-;21747:3;21768:67;21832:2;21827:3;21768:67;:::i;:::-;21761:74;;21844:93;21933:3;21844:93;:::i;:::-;21962:2;21957:3;21953:12;21946:19;;21605:366;;;:::o;21977:419::-;22143:4;22181:2;22170:9;22166:18;22158:26;;22230:9;22224:4;22220:20;22216:1;22205:9;22201:17;22194:47;22258:131;22384:4;22258:131;:::i;:::-;22250:139;;21977:419;;;:::o;22402:191::-;22442:4;22462:20;22480:1;22462:20;:::i;:::-;22457:25;;22496:20;22514:1;22496:20;:::i;:::-;22491:25;;22535:1;22532;22529:8;22526:34;;;22540:18;;:::i;:::-;22526:34;22585:1;22582;22578:9;22570:17;;22402:191;;;;:::o;22599:179::-;22739:31;22735:1;22727:6;22723:14;22716:55;22599:179;:::o;22784:366::-;22926:3;22947:67;23011:2;23006:3;22947:67;:::i;:::-;22940:74;;23023:93;23112:3;23023:93;:::i;:::-;23141:2;23136:3;23132:12;23125:19;;22784:366;;;:::o;23156:419::-;23322:4;23360:2;23349:9;23345:18;23337:26;;23409:9;23403:4;23399:20;23395:1;23384:9;23380:17;23373:47;23437:131;23563:4;23437:131;:::i;:::-;23429:139;;23156:419;;;:::o;23581:176::-;23721:28;23717:1;23709:6;23705:14;23698:52;23581:176;:::o;23763:366::-;23905:3;23926:67;23990:2;23985:3;23926:67;:::i;:::-;23919:74;;24002:93;24091:3;24002:93;:::i;:::-;24120:2;24115:3;24111:12;24104:19;;23763:366;;;:::o;24135:419::-;24301:4;24339:2;24328:9;24324:18;24316:26;;24388:9;24382:4;24378:20;24374:1;24363:9;24359:17;24352:47;24416:131;24542:4;24416:131;:::i;:::-;24408:139;;24135:419;;;:::o;24560:180::-;24608:77;24605:1;24598:88;24705:4;24702:1;24695:15;24729:4;24726:1;24719:15;24746:185;24786:1;24803:20;24821:1;24803:20;:::i;:::-;24798:25;;24837:20;24855:1;24837:20;:::i;:::-;24832:25;;24876:1;24866:35;;24881:18;;:::i;:::-;24866:35;24923:1;24920;24916:9;24911:14;;24746:185;;;;:::o;24937:305::-;24977:3;24996:20;25014:1;24996:20;:::i;:::-;24991:25;;25030:20;25048:1;25030:20;:::i;:::-;25025:25;;25184:1;25116:66;25112:74;25109:1;25106:81;25103:107;;;25190:18;;:::i;:::-;25103:107;25234:1;25231;25227:9;25220:16;;24937:305;;;;:::o;25248:348::-;25288:7;25311:20;25329:1;25311:20;:::i;:::-;25306:25;;25345:20;25363:1;25345:20;:::i;:::-;25340:25;;25533:1;25465:66;25461:74;25458:1;25455:81;25450:1;25443:9;25436:17;25432:105;25429:131;;;25540:18;;:::i;:::-;25429:131;25588:1;25585;25581:9;25570:20;;25248:348;;;;:::o;25602:300::-;25742:34;25738:1;25730:6;25726:14;25719:58;25811:34;25806:2;25798:6;25794:15;25787:59;25880:14;25875:2;25867:6;25863:15;25856:39;25602:300;:::o;25908:366::-;26050:3;26071:67;26135:2;26130:3;26071:67;:::i;:::-;26064:74;;26147:93;26236:3;26147:93;:::i;:::-;26265:2;26260:3;26256:12;26249:19;;25908:366;;;:::o;26280:419::-;26446:4;26484:2;26473:9;26469:18;26461:26;;26533:9;26527:4;26523:20;26519:1;26508:9;26504:17;26497:47;26561:131;26687:4;26561:131;:::i;:::-;26553:139;;26280:419;;;:::o;26705:166::-;26845:18;26841:1;26833:6;26829:14;26822:42;26705:166;:::o;26877:366::-;27019:3;27040:67;27104:2;27099:3;27040:67;:::i;:::-;27033:74;;27116:93;27205:3;27116:93;:::i;:::-;27234:2;27229:3;27225:12;27218:19;;26877:366;;;:::o;27249:419::-;27415:4;27453:2;27442:9;27438:18;27430:26;;27502:9;27496:4;27492:20;27488:1;27477:9;27473:17;27466:47;27530:131;27656:4;27530:131;:::i;:::-;27522:139;;27249:419;;;:::o;27674:177::-;27814:29;27810:1;27802:6;27798:14;27791:53;27674:177;:::o;27857:366::-;27999:3;28020:67;28084:2;28079:3;28020:67;:::i;:::-;28013:74;;28096:93;28185:3;28096:93;:::i;:::-;28214:2;28209:3;28205:12;28198:19;;27857:366;;;:::o;28229:419::-;28395:4;28433:2;28422:9;28418:18;28410:26;;28482:9;28476:4;28472:20;28468:1;28457:9;28453:17;28446:47;28510:131;28636:4;28510:131;:::i;:::-;28502:139;;28229:419;;;:::o;28654:223::-;28794:34;28790:1;28782:6;28778:14;28771:58;28863:6;28858:2;28850:6;28846:15;28839:31;28654:223;:::o;28883:366::-;29025:3;29046:67;29110:2;29105:3;29046:67;:::i;:::-;29039:74;;29122:93;29211:3;29122:93;:::i;:::-;29240:2;29235:3;29231:12;29224:19;;28883:366;;;:::o;29255:419::-;29421:4;29459:2;29448:9;29444:18;29436:26;;29508:9;29502:4;29498:20;29494:1;29483:9;29479:17;29472:47;29536:131;29662:4;29536:131;:::i;:::-;29528:139;;29255:419;;;:::o;29680:221::-;29820:34;29816:1;29808:6;29804:14;29797:58;29889:4;29884:2;29876:6;29872:15;29865:29;29680:221;:::o;29907:366::-;30049:3;30070:67;30134:2;30129:3;30070:67;:::i;:::-;30063:74;;30146:93;30235:3;30146:93;:::i;:::-;30264:2;30259:3;30255:12;30248:19;;29907:366;;;:::o;30279:419::-;30445:4;30483:2;30472:9;30468:18;30460:26;;30532:9;30526:4;30522:20;30518:1;30507:9;30503:17;30496:47;30560:131;30686:4;30560:131;:::i;:::-;30552:139;;30279:419;;;:::o;30704:224::-;30844:34;30840:1;30832:6;30828:14;30821:58;30913:7;30908:2;30900:6;30896:15;30889:32;30704:224;:::o;30934:366::-;31076:3;31097:67;31161:2;31156:3;31097:67;:::i;:::-;31090:74;;31173:93;31262:3;31173:93;:::i;:::-;31291:2;31286:3;31282:12;31275:19;;30934:366;;;:::o;31306:419::-;31472:4;31510:2;31499:9;31495:18;31487:26;;31559:9;31553:4;31549:20;31545:1;31534:9;31530:17;31523:47;31587:131;31713:4;31587:131;:::i;:::-;31579:139;;31306:419;;;:::o;31731:222::-;31871:34;31867:1;31859:6;31855:14;31848:58;31940:5;31935:2;31927:6;31923:15;31916:30;31731:222;:::o;31959:366::-;32101:3;32122:67;32186:2;32181:3;32122:67;:::i;:::-;32115:74;;32198:93;32287:3;32198:93;:::i;:::-;32316:2;32311:3;32307:12;32300:19;;31959:366;;;:::o;32331:419::-;32497:4;32535:2;32524:9;32520:18;32512:26;;32584:9;32578:4;32574:20;32570:1;32559:9;32555:17;32548:47;32612:131;32738:4;32612:131;:::i;:::-;32604:139;;32331:419;;;:::o;32756:228::-;32896:34;32892:1;32884:6;32880:14;32873:58;32965:11;32960:2;32952:6;32948:15;32941:36;32756:228;:::o;32990:366::-;33132:3;33153:67;33217:2;33212:3;33153:67;:::i;:::-;33146:74;;33229:93;33318:3;33229:93;:::i;:::-;33347:2;33342:3;33338:12;33331:19;;32990:366;;;:::o;33362:419::-;33528:4;33566:2;33555:9;33551:18;33543:26;;33615:9;33609:4;33605:20;33601:1;33590:9;33586:17;33579:47;33643:131;33769:4;33643:131;:::i;:::-;33635:139;;33362:419;;;:::o;33787:172::-;33927:24;33923:1;33915:6;33911:14;33904:48;33787:172;:::o;33965:366::-;34107:3;34128:67;34192:2;34187:3;34128:67;:::i;:::-;34121:74;;34204:93;34293:3;34204:93;:::i;:::-;34322:2;34317:3;34313:12;34306:19;;33965:366;;;:::o;34337:419::-;34503:4;34541:2;34530:9;34526:18;34518:26;;34590:9;34584:4;34580:20;34576:1;34565:9;34561:17;34554:47;34618:131;34744:4;34618:131;:::i;:::-;34610:139;;34337:419;;;:::o;34762:230::-;34902:34;34898:1;34890:6;34886:14;34879:58;34971:13;34966:2;34958:6;34954:15;34947:38;34762:230;:::o;34998:366::-;35140:3;35161:67;35225:2;35220:3;35161:67;:::i;:::-;35154:74;;35237:93;35326:3;35237:93;:::i;:::-;35355:2;35350:3;35346:12;35339:19;;34998:366;;;:::o;35370:419::-;35536:4;35574:2;35563:9;35559:18;35551:26;;35623:9;35617:4;35613:20;35609:1;35598:9;35594:17;35587:47;35651:131;35777:4;35651:131;:::i;:::-;35643:139;;35370:419;;;:::o;35795:442::-;35944:4;35982:2;35971:9;35967:18;35959:26;;35995:71;36063:1;36052:9;36048:17;36039:6;35995:71;:::i;:::-;36076:72;36144:2;36133:9;36129:18;36120:6;36076:72;:::i;:::-;36158;36226:2;36215:9;36211:18;36202:6;36158:72;:::i;:::-;35795:442;;;;;;:::o;36243:137::-;36297:5;36328:6;36322:13;36313:22;;36344:30;36368:5;36344:30;:::i;:::-;36243:137;;;;:::o;36386:345::-;36453:6;36502:2;36490:9;36481:7;36477:23;36473:32;36470:119;;;36508:79;;:::i;:::-;36470:119;36628:1;36653:61;36706:7;36697:6;36686:9;36682:22;36653:61;:::i;:::-;36643:71;;36599:125;36386:345;;;;:::o;36737:166::-;36877:18;36873:1;36865:6;36861:14;36854:42;36737:166;:::o;36909:366::-;37051:3;37072:67;37136:2;37131:3;37072:67;:::i;:::-;37065:74;;37148:93;37237:3;37148:93;:::i;:::-;37266:2;37261:3;37257:12;37250:19;;36909:366;;;:::o;37281:419::-;37447:4;37485:2;37474:9;37470:18;37462:26;;37534:9;37528:4;37524:20;37520:1;37509:9;37505:17;37498:47;37562:131;37688:4;37562:131;:::i;:::-;37554:139;;37281:419;;;:::o;37706:176::-;37846:28;37842:1;37834:6;37830:14;37823:52;37706:176;:::o;37888:366::-;38030:3;38051:67;38115:2;38110:3;38051:67;:::i;:::-;38044:74;;38127:93;38216:3;38127:93;:::i;:::-;38245:2;38240:3;38236:12;38229:19;;37888:366;;;:::o;38260:419::-;38426:4;38464:2;38453:9;38449:18;38441:26;;38513:9;38507:4;38503:20;38499:1;38488:9;38484:17;38477:47;38541:131;38667:4;38541:131;:::i;:::-;38533:139;;38260:419;;;:::o;38685:250::-;38825:34;38821:1;38813:6;38809:14;38802:58;38894:33;38889:2;38881:6;38877:15;38870:58;38685:250;:::o;38941:366::-;39083:3;39104:67;39168:2;39163:3;39104:67;:::i;:::-;39097:74;;39180:93;39269:3;39180:93;:::i;:::-;39298:2;39293:3;39289:12;39282:19;;38941:366;;;:::o;39313:419::-;39479:4;39517:2;39506:9;39502:18;39494:26;;39566:9;39560:4;39556:20;39552:1;39541:9;39537:17;39530:47;39594:131;39720:4;39594:131;:::i;:::-;39586:139;;39313:419;;;:::o;39738:220::-;39878:34;39874:1;39866:6;39862:14;39855:58;39947:3;39942:2;39934:6;39930:15;39923:28;39738:220;:::o;39964:366::-;40106:3;40127:67;40191:2;40186:3;40127:67;:::i;:::-;40120:74;;40203:93;40292:3;40203:93;:::i;:::-;40321:2;40316:3;40312:12;40305:19;;39964:366;;;:::o;40336:419::-;40502:4;40540:2;40529:9;40525:18;40517:26;;40589:9;40583:4;40579:20;40575:1;40564:9;40560:17;40553:47;40617:131;40743:4;40617:131;:::i;:::-;40609:139;;40336:419;;;:::o;40761:180::-;40901:32;40897:1;40889:6;40885:14;40878:56;40761:180;:::o;40947:366::-;41089:3;41110:67;41174:2;41169:3;41110:67;:::i;:::-;41103:74;;41186:93;41275:3;41186:93;:::i;:::-;41304:2;41299:3;41295:12;41288:19;;40947:366;;;:::o;41319:419::-;41485:4;41523:2;41512:9;41508:18;41500:26;;41572:9;41566:4;41562:20;41558:1;41547:9;41543:17;41536:47;41600:131;41726:4;41600:131;:::i;:::-;41592:139;;41319:419;;;:::o;41744:180::-;41792:77;41789:1;41782:88;41889:4;41886:1;41879:15;41913:4;41910:1;41903:15;41930:166;42070:18;42066:1;42058:6;42054:14;42047:42;41930:166;:::o;42102:366::-;42244:3;42265:67;42329:2;42324:3;42265:67;:::i;:::-;42258:74;;42341:93;42430:3;42341:93;:::i;:::-;42459:2;42454:3;42450:12;42443:19;;42102:366;;;:::o;42474:419::-;42640:4;42678:2;42667:9;42663:18;42655:26;;42727:9;42721:4;42717:20;42713:1;42702:9;42698:17;42691:47;42755:131;42881:4;42755:131;:::i;:::-;42747:139;;42474:419;;;:::o;42899:516::-;43077:4;43115:2;43104:9;43100:18;43092:26;;43128:100;43225:1;43214:9;43210:17;43201:6;43128:100;:::i;:::-;43238:80;43314:2;43303:9;43299:18;43290:6;43238:80;:::i;:::-;43328;43404:2;43393:9;43389:18;43380:6;43328:80;:::i;:::-;42899:516;;;;;;:::o;43421:85::-;43466:7;43495:5;43484:16;;43421:85;;;:::o;43512:158::-;43570:9;43603:61;43621:42;43630:32;43656:5;43630:32;:::i;:::-;43621:42;:::i;:::-;43603:61;:::i;:::-;43590:74;;43512:158;;;:::o;43676:147::-;43771:45;43810:5;43771:45;:::i;:::-;43766:3;43759:58;43676:147;;:::o;43829:114::-;43896:6;43930:5;43924:12;43914:22;;43829:114;;;:::o;43949:184::-;44048:11;44082:6;44077:3;44070:19;44122:4;44117:3;44113:14;44098:29;;43949:184;;;;:::o;44139:132::-;44206:4;44229:3;44221:11;;44259:4;44254:3;44250:14;44242:22;;44139:132;;;:::o;44277:108::-;44354:24;44372:5;44354:24;:::i;:::-;44349:3;44342:37;44277:108;;:::o;44391:179::-;44460:10;44481:46;44523:3;44515:6;44481:46;:::i;:::-;44559:4;44554:3;44550:14;44536:28;;44391:179;;;;:::o;44576:113::-;44646:4;44678;44673:3;44669:14;44661:22;;44576:113;;;:::o;44725:732::-;44844:3;44873:54;44921:5;44873:54;:::i;:::-;44943:86;45022:6;45017:3;44943:86;:::i;:::-;44936:93;;45053:56;45103:5;45053:56;:::i;:::-;45132:7;45163:1;45148:284;45173:6;45170:1;45167:13;45148:284;;;45249:6;45243:13;45276:63;45335:3;45320:13;45276:63;:::i;:::-;45269:70;;45362:60;45415:6;45362:60;:::i;:::-;45352:70;;45208:224;45195:1;45192;45188:9;45183:14;;45148:284;;;45152:14;45448:3;45441:10;;44849:608;;;44725:732;;;;:::o;45463:831::-;45726:4;45764:3;45753:9;45749:19;45741:27;;45778:71;45846:1;45835:9;45831:17;45822:6;45778:71;:::i;:::-;45859:80;45935:2;45924:9;45920:18;45911:6;45859:80;:::i;:::-;45986:9;45980:4;45976:20;45971:2;45960:9;45956:18;45949:48;46014:108;46117:4;46108:6;46014:108;:::i;:::-;46006:116;;46132:72;46200:2;46189:9;46185:18;46176:6;46132:72;:::i;:::-;46214:73;46282:3;46271:9;46267:19;46258:6;46214:73;:::i;:::-;45463:831;;;;;;;;:::o

Swarm Source

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