ETH Price: $3,387.27 (+1.17%)

Token

Gramps (GRAMPS)
 

Overview

Max Total Supply

40,000,000 GRAMPS

Holders

2,323 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
solomon60s.eth
Balance
273 GRAMPS

Value
$0.00
0xd879071885e2c6e3c2719b963968da03f7e9ccce
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The $GRAMPS Coin is ERC20 Token used as the foundation for the Grandpa Ape ecosystem. It is an exclusive game currency of the Grandpa Ape P2E Game.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Gramps

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-26
*/

// SPDX-License-Identifier: MIT
//  
//     ___                     _                 _                   
//    / _ \_ __ __ _ _ __   __| |_ __   __ _    /_\  _ __   ___  ___ 
//   / /_\/ '__/ _` | '_ \ / _` | '_ \ / _` |  //_\\| '_ \ / _ \/ __|
//  / /_\\| | | (_| | | | | (_| | |_) | (_| | /  _  \ |_) |  __/\__ \
//  \____/|_|  \__,_|_| |_|\__,_| .__/ \__,_| \_/ \_/ .__/ \___||___/
//                              |_|                 |_|              
//              __,__
//     .--.  .-"     "-.  .--.
//    / .. \/  .-. .-.  \/ .. \
//   | |  '|  /   Y   \  |'  | |
//   | \   \  \ 0 | 0 /  /   / |
//    \ '- ,\.-"`` ``"-./, -' /
//     `'-' /_   ^ ^   _\ '-'`
//         |  \._   _./  |
//         \   \ `~` /   /
//          '._ '-=-' _.'
//             '~---~'
//  
// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/security/Pausable.sol


// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

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

    bool private _paused;

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

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

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

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

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

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `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 Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin 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 Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `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, _allowances[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 = _allowances[owner][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `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;
        }
        _balances[to] += amount;

        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;
        _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;
        }
        _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 Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * 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 before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

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

// File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}

// File: contracts/Gramps.sol


pragma solidity ^0.8.4;
//  
//     ___                     _                 _                   
//    / _ \_ __ __ _ _ __   __| |_ __   __ _    /_\  _ __   ___  ___ 
//   / /_\/ '__/ _` | '_ \ / _` | '_ \ / _` |  //_\\| '_ \ / _ \/ __|
//  / /_\\| | | (_| | | | | (_| | |_) | (_| | /  _  \ |_) |  __/\__ \
//  \____/|_|  \__,_|_| |_|\__,_| .__/ \__,_| \_/ \_/ .__/ \___||___/
//                              |_|                 |_|              
//              __,__
//     .--.  .-"     "-.  .--.
//    / .. \/  .-. .-.  \/ .. \
//   | |  '|  /   Y   \  |'  | |
//   | \   \  \ 0 | 0 /  /   / |
//    \ '- ,\.-"`` ``"-./, -' /
//     `'-' /_   ^ ^   _\ '-'`
//         |  \._   _./  |
//         \   \ `~` /   /
//          '._ '-=-' _.'
//             '~---~'
//  





contract Gramps is ERC20, ERC20Burnable, Pausable, Ownable {

  uint256 public costToBuy = 1000000000000 wei;
  uint256 public tokenSellValue = 900000000000 wei;
  uint256 public reserveAmount = 100000;
  uint256 public reserveEth = 1000000000000000000 wei;
  bool public mintStatus = false;
  bool public claimTokensStatus = false;
  bool public buyTokensStatus = false;
  bool public sellTokensStatus = false;
  bool public sendTokensBackStatus = false;
  mapping(string => bytes32) public signatures;
  event tokensClaimed(address indexed _by, string indexed nftTokenId, uint _amount);
  event tokensBought(address indexed _by, uint256 _eth, uint256 _amount);
  event tokensSold(address indexed _by, uint256 _amount, uint256 amountOfETHToTransfer);

    constructor(uint256 initialSupply) ERC20("Gramps", "GRAMPS") {
	 _mint(address(this), initialSupply);
	}

	// Pause
    function pause() public onlyOwner {
        _pause();
    }

	// Unpause
    function unpause() public onlyOwner {
        _unpause();
    }

	// Owner Mint
    function mint(address to, uint256 amount) public onlyOwner {
     require(mintStatus, "Minting is not allowed at the moment.");
     _mint(to, amount);
    }

	// Before Token Transfer
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal whenNotPaused override
    {
	 super._beforeTokenTransfer(from, to, amount);
    }
	
    // Auth
	//
	// DEVELOPED BY gallaghersean.eth
	// ATTENTION: If you would like to use this function in your contract, send 1 eth to gallaghersean.eth and you'll receive the rights to use the function AND 2 hours of development time to help implementing it.
	// (c) Copyright 2022 gallaghersean.eth All Rights Reserved
	//
    function auth(string memory nftTokenId, string memory privateKey, bytes32 newSignature) internal {
     require(signatures[nftTokenId] != "","Authentication failed!");
	 bytes32 signature = keccak256(abi.encodePacked(nftTokenId,privateKey));
     require(signatures[nftTokenId] == signature,"Authentication failed!");
	 signatures[nftTokenId] = newSignature;
    }
	
	// Update Signatures
	function updateSignatures(string[] calldata nftTokenIds, bytes32[] calldata _signatures) public onlyOwner {
     for (uint256 i=0; i < nftTokenIds.length; i++) {
	  string memory nftTokenId = nftTokenIds[i];
	  bytes32 signature = _signatures[i];
	  signatures[nftTokenId] = signature;
	 }
	}
	
	// Claim Tokens
	function claimTokens(uint _amount, string memory nftTokenId, string memory privateKey, bytes32 newSignature) public {
     require(claimTokensStatus, "Claiming tokens is not active at the moment.");
	 auth(nftTokenId,privateKey,newSignature);
     require(_amount > 0, "You have to claim at least 1 token.");
     uint256 contractBalance = ERC20(address(this)).balanceOf(address(this));
     require(contractBalance >= _amount, "Contract does not have enough tokens for you to claim right now.");
     require((contractBalance - _amount) >= reserveAmount, "Contract does not have enough tokens for you to claim right now.");
     (bool sent) = ERC20(address(this)).transfer(msg.sender, _amount);
     require(sent, "Failed to transfer tokens.");
     emit tokensClaimed(msg.sender, nftTokenId, _amount);
	}
	
	// Buy Tokens
	function buyTokens(uint256 _amount) public payable returns (uint256 _amountBought) {
     require(buyTokensStatus, "Buying tokens is not active at the moment.");
	 if (msg.sender != owner()) {
      require(msg.value > 0, "Send ETH to buy some tokens.");
      uint256 ethCost = costToBuy * _amount;
      require(msg.value >= ethCost, "Not enough ETH to buy tokens.");
      uint256 contractBalance = ERC20(address(this)).balanceOf(address(this));
      require(contractBalance >= _amount, "Contract does not have enough tokens for your purchase.");
      require((contractBalance - _amount) >= reserveAmount, "Contract does not have enough tokens for your purchase.");
	 }
     (bool sent) = ERC20(address(this)).transfer(msg.sender, _amount);
     require(sent, "Failed to transfer tokens.");
     emit tokensBought(msg.sender, msg.value, _amount);
     return _amount;
	}

	// Sell Tokens
    function sellTokens(uint256 _amount) public {
     require(sellTokensStatus, "Selling tokens is not active at the moment.");
     require(_amount > 0, "Specify an amount of tokens greater than zero.");
     uint256 userBalance = ERC20(address(this)).balanceOf(msg.sender);
     require(userBalance >= _amount, "Your balance is lower than the amount of tokens you want to sell.");
     uint256 amountOfETHToTransfer = _amount * tokenSellValue;
     uint256 contractETHBalance = address(this).balance;
     require(contractETHBalance >= amountOfETHToTransfer, "Contract does not have enough funds to accept the sell request.");
     require((contractETHBalance - reserveEth) >= amountOfETHToTransfer, "Contract does not have enough funds to accept the sell request.");
	 approve(address(this), _amount);
     (bool sent) = ERC20(address(this)).transferFrom(msg.sender, address(this), _amount);
     require(sent, "Failed to transfer tokens.");
     (sent,) = msg.sender.call{value: amountOfETHToTransfer}("");
     require(sent, "Failed to send ETH.");
     emit tokensSold(msg.sender, _amount, amountOfETHToTransfer);
    }
	
	// Send Tokens Back to Contract
	function sendTokensBack(uint256 _amount) public {
     require(sendTokensBackStatus, "Sending tokens back is not active at the moment.");
     require(_amount > 0, "Specify an amount of tokens greater than zero.");
     uint256 userBalance = ERC20(address(this)).balanceOf(msg.sender);
     require(userBalance >= _amount, "Your balance is lower than the amount of tokens needed.");
	 approve(address(this), _amount);
     (bool sent) = ERC20(address(this)).transferFrom(msg.sender, address(this), _amount);
     require(sent, "Failed to transfer tokens.");
	}
	
	// Get Status
    function getStatus(string memory _type) public view returns (bool _status) {
	 if(compare(_type,"claimTokens")) { _status = claimTokensStatus; }
	 else if(compare(_type,"buyTokens")) { _status = buyTokensStatus; }
	 else if(compare(_type,"sellTokens")) { _status = sellTokensStatus; }
	 else if(compare(_type,"sendTokensBack")) { _status = sendTokensBackStatus; }
     return _status;
	}
	
	// Set Status
    function setStatus(string[] calldata _type, bool[] calldata _status) public onlyOwner {
     for (uint i=0; i < _type.length; i++) {
	  if(compare(_type[i],"mint")) { mintStatus = _status[i]; }
	  else if(compare(_type[i],"claimTokens")) { claimTokensStatus = _status[i]; }
	  else if(compare(_type[i],"buyTokens")) { buyTokensStatus = _status[i]; }
	  else if(compare(_type[i],"sellTokens")) { sellTokensStatus = _status[i]; }
	  else if(compare(_type[i],"sendTokensBack")) { sendTokensBackStatus = _status[i]; }
     }
	}
	
	// Change Values for costToBuy and tokenSellValue and reserveAmount
	function changeVars(string[] calldata _vars,uint256[] calldata _amounts) public onlyOwner {
     for (uint i=0; i < _vars.length; i++) {
	  if(compare(_vars[i],"costToBuy")) { costToBuy = _amounts[i]; }
	  else if(compare(_vars[i],"tokenSellValue")) { tokenSellValue = _amounts[i]; }
	  else if(compare(_vars[i],"reserveAmount")) { reserveAmount = _amounts[i]; }
      else if(compare(_vars[i],"reserveEth")) { reserveEth = _amounts[i]; }
	 }
	}
	
	// Withdraw Exact Amount
	function withdrawAmount(uint256 _amount) public onlyOwner {
     uint256 ownerBalance = address(this).balance;
     require(ownerBalance >= _amount, "The contract does not have enough of a balance to withdraw.");
     (bool sent,) = msg.sender.call{value: _amount}("");
     require(sent, "Failed to send withdraw.");
    }
	
	// Withdraw
	function withdraw() public onlyOwner {
     uint256 ownerBalance = address(this).balance;
     require(ownerBalance > 0, "The contract does not have a balance to withdraw.");
     (bool sent,) = msg.sender.call{value: address(this).balance}("");
     require(sent, "Failed to send withdraw.");
    }
   
    // Compare Strings
    function compare(string memory a, string memory b) public pure returns(bool) {
     return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"initialSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_eth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"tokensBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_by","type":"address"},{"indexed":true,"internalType":"string","name":"nftTokenId","type":"string"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"tokensClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOfETHToTransfer","type":"uint256"}],"name":"tokensSold","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"buyTokens","outputs":[{"internalType":"uint256","name":"_amountBought","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"buyTokensStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"_vars","type":"string[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"changeVars","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"string","name":"nftTokenId","type":"string"},{"internalType":"string","name":"privateKey","type":"string"},{"internalType":"bytes32","name":"newSignature","type":"bytes32"}],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimTokensStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"a","type":"string"},{"internalType":"string","name":"b","type":"string"}],"name":"compare","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"costToBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_type","type":"string"}],"name":"getStatus","outputs":[{"internalType":"bool","name":"_status","type":"bool"}],"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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"sellTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTokensStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"sendTokensBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sendTokensBackStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"_type","type":"string[]"},{"internalType":"bool[]","name":"_status","type":"bool[]"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"signatures","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenSellValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"nftTokenIds","type":"string[]"},{"internalType":"bytes32[]","name":"_signatures","type":"bytes32[]"}],"name":"updateSignatures","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawAmount","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405264e8d4a5100060065564d18c2e2800600755620186a0600855670de0b6b3a76400006009556000600a60006101000a81548160ff0219169083151502179055506000600a60016101000a81548160ff0219169083151502179055506000600a60026101000a81548160ff0219169083151502179055506000600a60036101000a81548160ff0219169083151502179055506000600a60046101000a81548160ff021916908315150217905550348015620000bd57600080fd5b5060405162006148380380620061488339818101604052810190620000e3919062000576565b6040518060400160405280600681526020017f4772616d707300000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f4752414d50530000000000000000000000000000000000000000000000000000815250816003908051906020019062000167929190620004af565b50806004908051906020019062000180929190620004af565b5050506000600560006101000a81548160ff021916908315150217905550620001be620001b2620001d760201b60201c565b620001df60201b60201c565b620001d03082620002a560201b60201c565b50620007e5565b600033905090565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000318576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200030f9062000629565b60405180910390fd5b6200032c600083836200041e60201b60201c565b806002600082825462000340919062000679565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000397919062000679565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620003fe91906200064b565b60405180910390a36200041a600083836200048e60201b60201c565b5050565b6200042e6200049360201b60201c565b1562000471576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004689062000607565b60405180910390fd5b62000489838383620004aa60201b62002ded1760201c565b505050565b505050565b6000600560009054906101000a900460ff16905090565b505050565b828054620004bd90620006e0565b90600052602060002090601f016020900481019282620004e157600085556200052d565b82601f10620004fc57805160ff19168380011785556200052d565b828001600101855582156200052d579182015b828111156200052c5782518255916020019190600101906200050f565b5b5090506200053c919062000540565b5090565b5b808211156200055b57600081600090555060010162000541565b5090565b6000815190506200057081620007cb565b92915050565b6000602082840312156200058f576200058e62000774565b5b60006200059f848285016200055f565b91505092915050565b6000620005b760108362000668565b9150620005c48262000779565b602082019050919050565b6000620005de601f8362000668565b9150620005eb82620007a2565b602082019050919050565b6200060181620006d6565b82525050565b600060208201905081810360008301526200062281620005a8565b9050919050565b600060208201905081810360008301526200064481620005cf565b9050919050565b6000602082019050620006626000830184620005f6565b92915050565b600082825260208201905092915050565b60006200068682620006d6565b91506200069383620006d6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620006cb57620006ca62000716565b5b828201905092915050565b6000819050919050565b60006002820490506001821680620006f957607f821691505b6020821081141562000710576200070f62000745565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b620007d681620006d6565b8114620007e257600080fd5b50565b61595380620007f56000396000f3fe6080604052600436106102465760003560e01c80635f9ed499116101395780638633cf4a116100b6578063a457c2d71161007a578063a457c2d71461084d578063a9059cbb1461088a578063b5209c20146108c7578063dd62ed3e146108f2578063ded046581461092f578063f2fde38b1461095857610246565b80638633cf4a14610776578063899b1528146107a15780638da5cb5b146107cc57806395d89b41146107f75780639da3f8fd1461082257610246565b806371685ecc116100fd57806371685ecc146106b757806379cc6790146106e25780637a13e2221461070b5780637f50b4bf146107365780638456cb591461075f57610246565b80635f9ed499146105e45780636c11bcd31461060f57806370a082311461063857806370d8a44e14610675578063715018a6146106a057610246565b806339509351116101c757806342966c681161018b57806342966c68146104ff578063441f36b5146105285780634b09b72a146105655780635ab2338f146105905780635c975abb146105b957610246565b8063395093511461042e5780633a96fdd71461046b5780633ccfd60b146104a85780633f4ba83a146104bf57806340c10f19146104d657610246565b806322b05ed21161020e57806322b05ed21461033057806323b872dd1461036d5780632ce770f5146103aa578063313ce567146103d35780633610724e146103fe57610246565b80630252fbda1461024b5780630562b9f71461027457806306fdde031461029d578063095ea7b3146102c857806318160ddd14610305575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613f6d565b610981565b005b34801561028057600080fd5b5061029b60048036038101906102969190613f6d565b610bc6565b005b3480156102a957600080fd5b506102b2610d3b565b6040516102bf91906146e5565b60405180910390f35b3480156102d457600080fd5b506102ef60048036038101906102ea9190613c8f565b610dcd565b6040516102fc91906146af565b60405180910390f35b34801561031157600080fd5b5061031a610df0565b6040516103279190614b47565b60405180910390f35b34801561033c57600080fd5b5061035760048036038101906103529190613eac565b610dfa565b60405161036491906146af565b60405180910390f35b34801561037957600080fd5b50610394600480360381019061038f9190613c3c565b610f6c565b6040516103a191906146af565b60405180910390f35b3480156103b657600080fd5b506103d160048036038101906103cc9190613d50565b610f9b565b005b3480156103df57600080fd5b506103e86110ee565b6040516103f59190614b8b565b60405180910390f35b61041860048036038101906104139190613f6d565b6110f7565b6040516104259190614b47565b60405180910390f35b34801561043a57600080fd5b5061045560048036038101906104509190613c8f565b611466565b60405161046291906146af565b60405180910390f35b34801561047757600080fd5b50610492600480360381019061048d9190613ef5565b611510565b60405161049f91906146af565b60405180910390f35b3480156104b457600080fd5b506104bd611569565b005b3480156104cb57600080fd5b506104d46116dd565b005b3480156104e257600080fd5b506104fd60048036038101906104f89190613c8f565b611763565b005b34801561050b57600080fd5b5061052660048036038101906105219190613f6d565b61183c565b005b34801561053457600080fd5b5061054f600480360381019061054a9190613eac565b611850565b60405161055c91906146ca565b60405180910390f35b34801561057157600080fd5b5061057a61187e565b6040516105879190614b47565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190613dd1565b611884565b005b3480156105c557600080fd5b506105ce611c67565b6040516105db91906146af565b60405180910390f35b3480156105f057600080fd5b506105f9611c7e565b60405161060691906146af565b60405180910390f35b34801561061b57600080fd5b5061063660048036038101906106319190613f6d565b611c91565b005b34801561064457600080fd5b5061065f600480360381019061065a9190613bcf565b61207e565b60405161066c9190614b47565b60405180910390f35b34801561068157600080fd5b5061068a6120c6565b60405161069791906146af565b60405180910390f35b3480156106ac57600080fd5b506106b56120d9565b005b3480156106c357600080fd5b506106cc612161565b6040516106d99190614b47565b60405180910390f35b3480156106ee57600080fd5b5061070960048036038101906107049190613c8f565b612167565b005b34801561071757600080fd5b50610720612187565b60405161072d91906146af565b60405180910390f35b34801561074257600080fd5b5061075d60048036038101906107589190613ccf565b61219a565b005b34801561076b57600080fd5b506107746126f3565b005b34801561078257600080fd5b5061078b612779565b6040516107989190614b47565b60405180910390f35b3480156107ad57600080fd5b506107b661277f565b6040516107c39190614b47565b60405180910390f35b3480156107d857600080fd5b506107e1612785565b6040516107ee9190614634565b60405180910390f35b34801561080357600080fd5b5061080c6127af565b60405161081991906146e5565b60405180910390f35b34801561082e57600080fd5b50610837612841565b60405161084491906146af565b60405180910390f35b34801561085957600080fd5b50610874600480360381019061086f9190613c8f565b612854565b60405161088191906146af565b60405180910390f35b34801561089657600080fd5b506108b160048036038101906108ac9190613c8f565b61293e565b6040516108be91906146af565b60405180910390f35b3480156108d357600080fd5b506108dc612961565b6040516108e991906146af565b60405180910390f35b3480156108fe57600080fd5b5061091960048036038101906109149190613bfc565b612974565b6040516109269190614b47565b60405180910390f35b34801561093b57600080fd5b5061095660048036038101906109519190613fc7565b6129fb565b005b34801561096457600080fd5b5061097f600480360381019061097a9190613bcf565b612cf5565b005b600a60049054906101000a900460ff166109d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c790614b07565b60405180910390fd5b60008111610a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0a90614a87565b60405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610a4e9190614634565b60206040518083038186803b158015610a6657600080fd5b505afa158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613f9a565b905081811015610ae3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ada90614987565b60405180910390fd5b610aed3083610dcd565b5060003073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401610b2d9392919061464f565b602060405180830381600087803b158015610b4757600080fd5b505af1158015610b5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7f9190613e7f565b905080610bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb890614a27565b60405180910390fd5b505050565b610bce612df2565b73ffffffffffffffffffffffffffffffffffffffff16610bec612785565b73ffffffffffffffffffffffffffffffffffffffff1614610c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c39906149a7565b60405180910390fd5b600047905081811015610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c81906148a7565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1683604051610cb09061461f565b60006040518083038185875af1925050503d8060008114610ced576040519150601f19603f3d011682016040523d82523d6000602084013e610cf2565b606091505b5050905080610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614947565b60405180910390fd5b505050565b606060038054610d4a90614e16565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7690614e16565b8015610dc35780601f10610d9857610100808354040283529160200191610dc3565b820191906000526020600020905b815481529060010190602001808311610da657829003601f168201915b5050505050905090565b600080610dd8612df2565b9050610de5818585612dfa565b600191505092915050565b6000600254905090565b6000610e3b826040518060400160405280600b81526020017f636c61696d546f6b656e73000000000000000000000000000000000000000000815250611510565b15610e5757600a60019054906101000a900460ff169050610f67565b610e96826040518060400160405280600981526020017f627579546f6b656e730000000000000000000000000000000000000000000000815250611510565b15610eb257600a60029054906101000a900460ff169050610f66565b610ef1826040518060400160405280600a81526020017f73656c6c546f6b656e7300000000000000000000000000000000000000000000815250611510565b15610f0d57600a60039054906101000a900460ff169050610f65565b610f4c826040518060400160405280600e81526020017f73656e64546f6b656e734261636b000000000000000000000000000000000000815250611510565b15610f6457600a60049054906101000a900460ff1690505b5b5b5b919050565b600080610f77612df2565b9050610f84858285612fc5565b610f8f858585613051565b60019150509392505050565b610fa3612df2565b73ffffffffffffffffffffffffffffffffffffffff16610fc1612785565b73ffffffffffffffffffffffffffffffffffffffff1614611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e906149a7565b60405180910390fd5b60005b848490508110156110e757600085858381811061103a57611039614f20565b5b905060200281019061104c9190614ba6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060008484848181106110a6576110a5614f20565b5b90506020020135905080600b836040516110c091906145e4565b908152602001604051809103902081905550505080806110df90614e79565b91505061101a565b5050505050565b60006012905090565b6000600a60029054906101000a900460ff16611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113f90614767565b60405180910390fd5b611150612785565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461133d57600034116111c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bc90614a47565b60405180910390fd5b6000826006546111d59190614ce7565b90508034101561121a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121190614867565b60405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112559190614634565b60206040518083038186803b15801561126d57600080fd5b505afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190613f9a565b9050838110156112ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e190614847565b60405180910390fd5b60085484826112f99190614d41565b101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133190614847565b60405180910390fd5b50505b60003073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b815260040161137a929190614686565b602060405180830381600087803b15801561139457600080fd5b505af11580156113a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113cc9190613e7f565b90508061140e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140590614a27565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167eae404b3dc9b4a4b60ccee470a69dc7d92a2d2b1398ddf3d84385c75944daaa3485604051611455929190614b62565b60405180910390a282915050919050565b600080611471612df2565b9050611505818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115009190614c91565b612dfa565b600191505092915050565b60008160405160200161152391906145e4565b604051602081830303815290604052805190602001208360405160200161154a91906145e4565b6040516020818303038152906040528051906020012014905092915050565b611571612df2565b73ffffffffffffffffffffffffffffffffffffffff1661158f612785565b73ffffffffffffffffffffffffffffffffffffffff16146115e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dc906149a7565b60405180910390fd5b60004790506000811161162d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611624906147e7565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516116539061461f565b60006040518083038185875af1925050503d8060008114611690576040519150601f19603f3d011682016040523d82523d6000602084013e611695565b606091505b50509050806116d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d090614947565b60405180910390fd5b5050565b6116e5612df2565b73ffffffffffffffffffffffffffffffffffffffff16611703612785565b73ffffffffffffffffffffffffffffffffffffffff1614611759576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611750906149a7565b60405180910390fd5b6117616132d2565b565b61176b612df2565b73ffffffffffffffffffffffffffffffffffffffff16611789612785565b73ffffffffffffffffffffffffffffffffffffffff16146117df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d6906149a7565b60405180910390fd5b600a60009054906101000a900460ff1661182e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182590614727565b60405180910390fd5b6118388282613374565b5050565b61184d611847612df2565b826134d4565b50565b600b818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b60085481565b61188c612df2565b73ffffffffffffffffffffffffffffffffffffffff166118aa612785565b73ffffffffffffffffffffffffffffffffffffffff1614611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f7906149a7565b60405180910390fd5b60005b84849050811015611c60576119b485858381811061192457611923614f20565b5b90506020028101906119369190614ba6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506040518060400160405280600981526020017f636f7374546f4275790000000000000000000000000000000000000000000000815250611510565b156119de578282828181106119cc576119cb614f20565b5b90506020020135600681905550611c4d565b611a848585838181106119f4576119f3614f20565b5b9050602002810190611a069190614ba6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506040518060400160405280600e81526020017f746f6b656e53656c6c56616c7565000000000000000000000000000000000000815250611510565b15611aae57828282818110611a9c57611a9b614f20565b5b90506020020135600781905550611c4c565b611b54858583818110611ac457611ac3614f20565b5b9050602002810190611ad69190614ba6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506040518060400160405280600d81526020017f72657365727665416d6f756e7400000000000000000000000000000000000000815250611510565b15611b7e57828282818110611b6c57611b6b614f20565b5b90506020020135600881905550611c4b565b611c24858583818110611b9457611b93614f20565b5b9050602002810190611ba69190614ba6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506040518060400160405280600a81526020017f7265736572766545746800000000000000000000000000000000000000000000815250611510565b15611c4a57828282818110611c3c57611c3b614f20565b5b905060200201356009819055505b5b5b5b8080611c5890614e79565b915050611903565b5050505050565b6000600560009054906101000a900460ff16905090565b600a60029054906101000a900460ff1681565b600a60039054906101000a900460ff16611ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd790614967565b60405180910390fd5b60008111611d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1a90614a87565b60405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611d5e9190614634565b60206040518083038186803b158015611d7657600080fd5b505afa158015611d8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dae9190613f9a565b905081811015611df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dea906148e7565b60405180910390fd5b600060075483611e039190614ce7565b9050600047905081811015611e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4490614887565b60405180910390fd5b8160095482611e5c9190614d41565b1015611e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9490614887565b60405180910390fd5b611ea73085610dcd565b5060003073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b8152600401611ee79392919061464f565b602060405180830381600087803b158015611f0157600080fd5b505af1158015611f15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f399190613e7f565b905080611f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7290614a27565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff1683604051611f9f9061461f565b60006040518083038185875af1925050503d8060008114611fdc576040519150601f19603f3d011682016040523d82523d6000602084013e611fe1565b606091505b50508091505080612027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201e90614907565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f2cf8ec0af9cc504531fe2392542793e26f95be50724e0d0bcc46f01f7521e6ef868560405161206f929190614b62565b60405180910390a25050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600a60049054906101000a900460ff1681565b6120e1612df2565b73ffffffffffffffffffffffffffffffffffffffff166120ff612785565b73ffffffffffffffffffffffffffffffffffffffff1614612155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214c906149a7565b60405180910390fd5b61215f60006136ab565b565b60065481565b61217982612173612df2565b83612fc5565b61218382826134d4565b5050565b600a60039054906101000a900460ff1681565b6121a2612df2565b73ffffffffffffffffffffffffffffffffffffffff166121c0612785565b73ffffffffffffffffffffffffffffffffffffffff1614612216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220d906149a7565b60405180910390fd5b60005b848490508110156126ec576122ca85858381811061223a57612239614f20565b5b905060200281019061224c9190614ba6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506040518060400160405280600481526020017f6d696e7400000000000000000000000000000000000000000000000000000000815250611510565b15612315578282828181106122e2576122e1614f20565b5b90506020020160208101906122f79190613e52565b600a60006101000a81548160ff0219169083151502179055506126d9565b6123bb85858381811061232b5761232a614f20565b5b905060200281019061233d9190614ba6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506040518060400160405280600b81526020017f636c61696d546f6b656e73000000000000000000000000000000000000000000815250611510565b15612406578282828181106123d3576123d2614f20565b5b90506020020160208101906123e89190613e52565b600a60016101000a81548160ff0219169083151502179055506126d8565b6124ac85858381811061241c5761241b614f20565b5b905060200281019061242e9190614ba6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506040518060400160405280600981526020017f627579546f6b656e730000000000000000000000000000000000000000000000815250611510565b156124f7578282828181106124c4576124c3614f20565b5b90506020020160208101906124d99190613e52565b600a60026101000a81548160ff0219169083151502179055506126d7565b61259d85858381811061250d5761250c614f20565b5b905060200281019061251f9190614ba6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506040518060400160405280600a81526020017f73656c6c546f6b656e7300000000000000000000000000000000000000000000815250611510565b156125e8578282828181106125b5576125b4614f20565b5b90506020020160208101906125ca9190613e52565b600a60036101000a81548160ff0219169083151502179055506126d6565b61268e8585838181106125fe576125fd614f20565b5b90506020028101906126109190614ba6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506040518060400160405280600e81526020017f73656e64546f6b656e734261636b000000000000000000000000000000000000815250611510565b156126d5578282828181106126a6576126a5614f20565b5b90506020020160208101906126bb9190613e52565b600a60046101000a81548160ff0219169083151502179055505b5b5b5b5b80806126e490614e79565b915050612219565b5050505050565b6126fb612df2565b73ffffffffffffffffffffffffffffffffffffffff16612719612785565b73ffffffffffffffffffffffffffffffffffffffff161461276f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612766906149a7565b60405180910390fd5b612777613771565b565b60075481565b60095481565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546127be90614e16565b80601f01602080910402602001604051908101604052809291908181526020018280546127ea90614e16565b80156128375780601f1061280c57610100808354040283529160200191612837565b820191906000526020600020905b81548152906001019060200180831161281a57829003601f168201915b5050505050905090565b600a60009054906101000a900460ff1681565b60008061285f612df2565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291c90614ae7565b60405180910390fd5b6129328286868403612dfa565b60019250505092915050565b600080612949612df2565b9050612956818585613051565b600191505092915050565b600a60019054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a60019054906101000a900460ff16612a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a41906149e7565b60405180910390fd5b612a55838383613814565b60008411612a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8f90614aa7565b60405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612ad39190614634565b60206040518083038186803b158015612aeb57600080fd5b505afa158015612aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b239190613f9a565b905084811015612b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5f90614927565b60405180910390fd5b6008548582612b779190614d41565b1015612bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baf90614927565b60405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33886040518363ffffffff1660e01b8152600401612bf5929190614686565b602060405180830381600087803b158015612c0f57600080fd5b505af1158015612c23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c479190613e7f565b905080612c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8090614a27565b60405180910390fd5b84604051612c9791906145e4565b60405180910390203373ffffffffffffffffffffffffffffffffffffffff167f3342396a1b05d7a6416ee6bbc87bdee0ae2c283b97ac21fa8773e09538224f2488604051612ce59190614b47565b60405180910390a3505050505050565b612cfd612df2565b73ffffffffffffffffffffffffffffffffffffffff16612d1b612785565b73ffffffffffffffffffffffffffffffffffffffff1614612d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d68906149a7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd8906147a7565b60405180910390fd5b612dea816136ab565b50565b505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6190614a67565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed1906147c7565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612fb89190614b47565b60405180910390a3505050565b6000612fd18484612974565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461304b578181101561303d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303490614807565b60405180910390fd5b61304a8484848403612dfa565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b890614a07565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312890614707565b60405180910390fd5b61313c83838361392c565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156131c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b990614827565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132559190614c91565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516132b99190614b47565b60405180910390a36132cc848484613984565b50505050565b6132da611c67565b613319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331090614747565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61335d612df2565b60405161336a9190614634565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133db90614b27565b60405180910390fd5b6133f06000838361392c565b80600260008282546134029190614c91565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134579190614c91565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516134bc9190614b47565b60405180910390a36134d060008383613984565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353b906149c7565b60405180910390fd5b6135508260008361392c565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156135d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135cd90614787565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461362d9190614d41565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516136929190614b47565b60405180910390a36136a683600084613984565b505050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613779611c67565b156137b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b0906148c7565b60405180910390fd5b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137fd612df2565b60405161380a9190614634565b60405180910390a1565b6000600b8460405161382691906145e4565b9081526020016040518091039020541415613876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161386d90614ac7565b60405180910390fd5b6000838360405160200161388b9291906145fb565b60405160208183030381529060405280519060200120905080600b856040516138b491906145e4565b90815260200160405180910390205414613903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138fa90614ac7565b60405180910390fd5b81600b8560405161391491906145e4565b90815260200160405180910390208190555050505050565b613934611c67565b15613974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161396b906148c7565b60405180910390fd5b61397f838383612ded565b505050565b505050565b600061399c61399784614c2e565b614c09565b9050828152602081018484840111156139b8576139b7614f9c565b5b6139c3848285614dd4565b509392505050565b6000813590506139da816158c1565b92915050565b60008083601f8401126139f6576139f5614f83565b5b8235905067ffffffffffffffff811115613a1357613a12614f7e565b5b602083019150836020820283011115613a2f57613a2e614f92565b5b9250929050565b60008083601f840112613a4c57613a4b614f83565b5b8235905067ffffffffffffffff811115613a6957613a68614f7e565b5b602083019150836020820283011115613a8557613a84614f92565b5b9250929050565b60008083601f840112613aa257613aa1614f83565b5b8235905067ffffffffffffffff811115613abf57613abe614f7e565b5b602083019150836020820283011115613adb57613ada614f92565b5b9250929050565b60008083601f840112613af857613af7614f83565b5b8235905067ffffffffffffffff811115613b1557613b14614f7e565b5b602083019150836020820283011115613b3157613b30614f92565b5b9250929050565b600081359050613b47816158d8565b92915050565b600081519050613b5c816158d8565b92915050565b600081359050613b71816158ef565b92915050565b600082601f830112613b8c57613b8b614f83565b5b8135613b9c848260208601613989565b91505092915050565b600081359050613bb481615906565b92915050565b600081519050613bc981615906565b92915050565b600060208284031215613be557613be4614fa6565b5b6000613bf3848285016139cb565b91505092915050565b60008060408385031215613c1357613c12614fa6565b5b6000613c21858286016139cb565b9250506020613c32858286016139cb565b9150509250929050565b600080600060608486031215613c5557613c54614fa6565b5b6000613c63868287016139cb565b9350506020613c74868287016139cb565b9250506040613c8586828701613ba5565b9150509250925092565b60008060408385031215613ca657613ca5614fa6565b5b6000613cb4858286016139cb565b9250506020613cc585828601613ba5565b9150509250929050565b60008060008060408587031215613ce957613ce8614fa6565b5b600085013567ffffffffffffffff811115613d0757613d06614fa1565b5b613d1387828801613a8c565b9450945050602085013567ffffffffffffffff811115613d3657613d35614fa1565b5b613d42878288016139e0565b925092505092959194509250565b60008060008060408587031215613d6a57613d69614fa6565b5b600085013567ffffffffffffffff811115613d8857613d87614fa1565b5b613d9487828801613a8c565b9450945050602085013567ffffffffffffffff811115613db757613db6614fa1565b5b613dc387828801613a36565b925092505092959194509250565b60008060008060408587031215613deb57613dea614fa6565b5b600085013567ffffffffffffffff811115613e0957613e08614fa1565b5b613e1587828801613a8c565b9450945050602085013567ffffffffffffffff811115613e3857613e37614fa1565b5b613e4487828801613ae2565b925092505092959194509250565b600060208284031215613e6857613e67614fa6565b5b6000613e7684828501613b38565b91505092915050565b600060208284031215613e9557613e94614fa6565b5b6000613ea384828501613b4d565b91505092915050565b600060208284031215613ec257613ec1614fa6565b5b600082013567ffffffffffffffff811115613ee057613edf614fa1565b5b613eec84828501613b77565b91505092915050565b60008060408385031215613f0c57613f0b614fa6565b5b600083013567ffffffffffffffff811115613f2a57613f29614fa1565b5b613f3685828601613b77565b925050602083013567ffffffffffffffff811115613f5757613f56614fa1565b5b613f6385828601613b77565b9150509250929050565b600060208284031215613f8357613f82614fa6565b5b6000613f9184828501613ba5565b91505092915050565b600060208284031215613fb057613faf614fa6565b5b6000613fbe84828501613bba565b91505092915050565b60008060008060808587031215613fe157613fe0614fa6565b5b6000613fef87828801613ba5565b945050602085013567ffffffffffffffff8111156140105761400f614fa1565b5b61401c87828801613b77565b935050604085013567ffffffffffffffff81111561403d5761403c614fa1565b5b61404987828801613b77565b925050606061405a87828801613b62565b91505092959194509250565b61406f81614d75565b82525050565b61407e81614d87565b82525050565b61408d81614d93565b82525050565b600061409e82614c5f565b6140a88185614c75565b93506140b8818560208601614de3565b6140c181614fab565b840191505092915050565b60006140d782614c5f565b6140e18185614c86565b93506140f1818560208601614de3565b80840191505092915050565b600061410a602383614c75565b915061411582614fbc565b604082019050919050565b600061412d602583614c75565b91506141388261500b565b604082019050919050565b6000614150601483614c75565b915061415b8261505a565b602082019050919050565b6000614173602a83614c75565b915061417e82615083565b604082019050919050565b6000614196602283614c75565b91506141a1826150d2565b604082019050919050565b60006141b9602683614c75565b91506141c482615121565b604082019050919050565b60006141dc602283614c75565b91506141e782615170565b604082019050919050565b60006141ff603183614c75565b915061420a826151bf565b604082019050919050565b6000614222601d83614c75565b915061422d8261520e565b602082019050919050565b6000614245602683614c75565b915061425082615237565b604082019050919050565b6000614268603783614c75565b915061427382615286565b604082019050919050565b600061428b601d83614c75565b9150614296826152d5565b602082019050919050565b60006142ae603f83614c75565b91506142b9826152fe565b604082019050919050565b60006142d1603b83614c75565b91506142dc8261534d565b604082019050919050565b60006142f4601083614c75565b91506142ff8261539c565b602082019050919050565b6000614317604183614c75565b9150614322826153c5565b606082019050919050565b600061433a601383614c75565b91506143458261543a565b602082019050919050565b600061435d604083614c75565b915061436882615463565b604082019050919050565b6000614380601883614c75565b915061438b826154b2565b602082019050919050565b60006143a3602b83614c75565b91506143ae826154db565b604082019050919050565b60006143c6603783614c75565b91506143d18261552a565b604082019050919050565b60006143e9602083614c75565b91506143f482615579565b602082019050919050565b600061440c602183614c75565b9150614417826155a2565b604082019050919050565b600061442f602c83614c75565b915061443a826155f1565b604082019050919050565b6000614452602583614c75565b915061445d82615640565b604082019050919050565b6000614475601a83614c75565b91506144808261568f565b602082019050919050565b6000614498601c83614c75565b91506144a3826156b8565b602082019050919050565b60006144bb600083614c6a565b91506144c6826156e1565b600082019050919050565b60006144de602483614c75565b91506144e9826156e4565b604082019050919050565b6000614501602e83614c75565b915061450c82615733565b604082019050919050565b6000614524602383614c75565b915061452f82615782565b604082019050919050565b6000614547601683614c75565b9150614552826157d1565b602082019050919050565b600061456a602583614c75565b9150614575826157fa565b604082019050919050565b600061458d603083614c75565b915061459882615849565b604082019050919050565b60006145b0601f83614c75565b91506145bb82615898565b602082019050919050565b6145cf81614dbd565b82525050565b6145de81614dc7565b82525050565b60006145f082846140cc565b915081905092915050565b600061460782856140cc565b915061461382846140cc565b91508190509392505050565b600061462a826144ae565b9150819050919050565b60006020820190506146496000830184614066565b92915050565b60006060820190506146646000830186614066565b6146716020830185614066565b61467e60408301846145c6565b949350505050565b600060408201905061469b6000830185614066565b6146a860208301846145c6565b9392505050565b60006020820190506146c46000830184614075565b92915050565b60006020820190506146df6000830184614084565b92915050565b600060208201905081810360008301526146ff8184614093565b905092915050565b60006020820190508181036000830152614720816140fd565b9050919050565b6000602082019050818103600083015261474081614120565b9050919050565b6000602082019050818103600083015261476081614143565b9050919050565b6000602082019050818103600083015261478081614166565b9050919050565b600060208201905081810360008301526147a081614189565b9050919050565b600060208201905081810360008301526147c0816141ac565b9050919050565b600060208201905081810360008301526147e0816141cf565b9050919050565b60006020820190508181036000830152614800816141f2565b9050919050565b6000602082019050818103600083015261482081614215565b9050919050565b6000602082019050818103600083015261484081614238565b9050919050565b600060208201905081810360008301526148608161425b565b9050919050565b600060208201905081810360008301526148808161427e565b9050919050565b600060208201905081810360008301526148a0816142a1565b9050919050565b600060208201905081810360008301526148c0816142c4565b9050919050565b600060208201905081810360008301526148e0816142e7565b9050919050565b600060208201905081810360008301526149008161430a565b9050919050565b600060208201905081810360008301526149208161432d565b9050919050565b6000602082019050818103600083015261494081614350565b9050919050565b6000602082019050818103600083015261496081614373565b9050919050565b6000602082019050818103600083015261498081614396565b9050919050565b600060208201905081810360008301526149a0816143b9565b9050919050565b600060208201905081810360008301526149c0816143dc565b9050919050565b600060208201905081810360008301526149e0816143ff565b9050919050565b60006020820190508181036000830152614a0081614422565b9050919050565b60006020820190508181036000830152614a2081614445565b9050919050565b60006020820190508181036000830152614a4081614468565b9050919050565b60006020820190508181036000830152614a608161448b565b9050919050565b60006020820190508181036000830152614a80816144d1565b9050919050565b60006020820190508181036000830152614aa0816144f4565b9050919050565b60006020820190508181036000830152614ac081614517565b9050919050565b60006020820190508181036000830152614ae08161453a565b9050919050565b60006020820190508181036000830152614b008161455d565b9050919050565b60006020820190508181036000830152614b2081614580565b9050919050565b60006020820190508181036000830152614b40816145a3565b9050919050565b6000602082019050614b5c60008301846145c6565b92915050565b6000604082019050614b7760008301856145c6565b614b8460208301846145c6565b9392505050565b6000602082019050614ba060008301846145d5565b92915050565b60008083356001602003843603038112614bc357614bc2614f8d565b5b80840192508235915067ffffffffffffffff821115614be557614be4614f88565b5b602083019250600182023603831315614c0157614c00614f97565b5b509250929050565b6000614c13614c24565b9050614c1f8282614e48565b919050565b6000604051905090565b600067ffffffffffffffff821115614c4957614c48614f4f565b5b614c5282614fab565b9050602081019050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c9c82614dbd565b9150614ca783614dbd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614cdc57614cdb614ec2565b5b828201905092915050565b6000614cf282614dbd565b9150614cfd83614dbd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d3657614d35614ec2565b5b828202905092915050565b6000614d4c82614dbd565b9150614d5783614dbd565b925082821015614d6a57614d69614ec2565b5b828203905092915050565b6000614d8082614d9d565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614e01578082015181840152602081019050614de6565b83811115614e10576000848401525b50505050565b60006002820490506001821680614e2e57607f821691505b60208210811415614e4257614e41614ef1565b5b50919050565b614e5182614fab565b810181811067ffffffffffffffff82111715614e7057614e6f614f4f565b5b80604052505050565b6000614e8482614dbd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614eb757614eb6614ec2565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e67206973206e6f7420616c6c6f77656420617420746865206d6f60008201527f6d656e742e000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f427579696e6720746f6b656e73206973206e6f7420616374697665206174207460008201527f6865206d6f6d656e742e00000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f54686520636f6e747261637420646f6573206e6f74206861766520612062616c60008201527f616e636520746f2077697468647261772e000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f436f6e747261637420646f6573206e6f74206861766520656e6f75676820746f60008201527f6b656e7320666f7220796f75722070757263686173652e000000000000000000602082015250565b7f4e6f7420656e6f7567682045544820746f2062757920746f6b656e732e000000600082015250565b7f436f6e747261637420646f6573206e6f74206861766520656e6f75676820667560008201527f6e647320746f20616363657074207468652073656c6c20726571756573742e00602082015250565b7f54686520636f6e747261637420646f6573206e6f74206861766520656e6f756760008201527f68206f6620612062616c616e636520746f2077697468647261772e0000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f596f75722062616c616e6365206973206c6f776572207468616e20746865206160008201527f6d6f756e74206f6620746f6b656e7320796f752077616e7420746f2073656c6c60208201527f2e00000000000000000000000000000000000000000000000000000000000000604082015250565b7f4661696c656420746f2073656e64204554482e00000000000000000000000000600082015250565b7f436f6e747261637420646f6573206e6f74206861766520656e6f75676820746f60008201527f6b656e7320666f7220796f7520746f20636c61696d207269676874206e6f772e602082015250565b7f4661696c656420746f2073656e642077697468647261772e0000000000000000600082015250565b7f53656c6c696e6720746f6b656e73206973206e6f74206163746976652061742060008201527f746865206d6f6d656e742e000000000000000000000000000000000000000000602082015250565b7f596f75722062616c616e6365206973206c6f776572207468616e20746865206160008201527f6d6f756e74206f6620746f6b656e73206e65656465642e000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f436c61696d696e6720746f6b656e73206973206e6f742061637469766520617460008201527f20746865206d6f6d656e742e0000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f207472616e7366657220746f6b656e732e000000000000600082015250565b7f53656e642045544820746f2062757920736f6d6520746f6b656e732e00000000600082015250565b50565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f5370656369667920616e20616d6f756e74206f6620746f6b656e73206772656160008201527f746572207468616e207a65726f2e000000000000000000000000000000000000602082015250565b7f596f75206861766520746f20636c61696d206174206c65617374203120746f6b60008201527f656e2e0000000000000000000000000000000000000000000000000000000000602082015250565b7f41757468656e7469636174696f6e206661696c65642100000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f53656e64696e6720746f6b656e73206261636b206973206e6f7420616374697660008201527f6520617420746865206d6f6d656e742e00000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6158ca81614d75565b81146158d557600080fd5b50565b6158e181614d87565b81146158ec57600080fd5b50565b6158f881614d93565b811461590357600080fd5b50565b61590f81614dbd565b811461591a57600080fd5b5056fea2646970667358221220925706d9db3f5f492779357cbdc9b3d126f111669b5a5b1648c661ef8695555d64736f6c634300080700330000000000000000000000000000000000000000002116545850052128000000

Deployed Bytecode

0x6080604052600436106102465760003560e01c80635f9ed499116101395780638633cf4a116100b6578063a457c2d71161007a578063a457c2d71461084d578063a9059cbb1461088a578063b5209c20146108c7578063dd62ed3e146108f2578063ded046581461092f578063f2fde38b1461095857610246565b80638633cf4a14610776578063899b1528146107a15780638da5cb5b146107cc57806395d89b41146107f75780639da3f8fd1461082257610246565b806371685ecc116100fd57806371685ecc146106b757806379cc6790146106e25780637a13e2221461070b5780637f50b4bf146107365780638456cb591461075f57610246565b80635f9ed499146105e45780636c11bcd31461060f57806370a082311461063857806370d8a44e14610675578063715018a6146106a057610246565b806339509351116101c757806342966c681161018b57806342966c68146104ff578063441f36b5146105285780634b09b72a146105655780635ab2338f146105905780635c975abb146105b957610246565b8063395093511461042e5780633a96fdd71461046b5780633ccfd60b146104a85780633f4ba83a146104bf57806340c10f19146104d657610246565b806322b05ed21161020e57806322b05ed21461033057806323b872dd1461036d5780632ce770f5146103aa578063313ce567146103d35780633610724e146103fe57610246565b80630252fbda1461024b5780630562b9f71461027457806306fdde031461029d578063095ea7b3146102c857806318160ddd14610305575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613f6d565b610981565b005b34801561028057600080fd5b5061029b60048036038101906102969190613f6d565b610bc6565b005b3480156102a957600080fd5b506102b2610d3b565b6040516102bf91906146e5565b60405180910390f35b3480156102d457600080fd5b506102ef60048036038101906102ea9190613c8f565b610dcd565b6040516102fc91906146af565b60405180910390f35b34801561031157600080fd5b5061031a610df0565b6040516103279190614b47565b60405180910390f35b34801561033c57600080fd5b5061035760048036038101906103529190613eac565b610dfa565b60405161036491906146af565b60405180910390f35b34801561037957600080fd5b50610394600480360381019061038f9190613c3c565b610f6c565b6040516103a191906146af565b60405180910390f35b3480156103b657600080fd5b506103d160048036038101906103cc9190613d50565b610f9b565b005b3480156103df57600080fd5b506103e86110ee565b6040516103f59190614b8b565b60405180910390f35b61041860048036038101906104139190613f6d565b6110f7565b6040516104259190614b47565b60405180910390f35b34801561043a57600080fd5b5061045560048036038101906104509190613c8f565b611466565b60405161046291906146af565b60405180910390f35b34801561047757600080fd5b50610492600480360381019061048d9190613ef5565b611510565b60405161049f91906146af565b60405180910390f35b3480156104b457600080fd5b506104bd611569565b005b3480156104cb57600080fd5b506104d46116dd565b005b3480156104e257600080fd5b506104fd60048036038101906104f89190613c8f565b611763565b005b34801561050b57600080fd5b5061052660048036038101906105219190613f6d565b61183c565b005b34801561053457600080fd5b5061054f600480360381019061054a9190613eac565b611850565b60405161055c91906146ca565b60405180910390f35b34801561057157600080fd5b5061057a61187e565b6040516105879190614b47565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190613dd1565b611884565b005b3480156105c557600080fd5b506105ce611c67565b6040516105db91906146af565b60405180910390f35b3480156105f057600080fd5b506105f9611c7e565b60405161060691906146af565b60405180910390f35b34801561061b57600080fd5b5061063660048036038101906106319190613f6d565b611c91565b005b34801561064457600080fd5b5061065f600480360381019061065a9190613bcf565b61207e565b60405161066c9190614b47565b60405180910390f35b34801561068157600080fd5b5061068a6120c6565b60405161069791906146af565b60405180910390f35b3480156106ac57600080fd5b506106b56120d9565b005b3480156106c357600080fd5b506106cc612161565b6040516106d99190614b47565b60405180910390f35b3480156106ee57600080fd5b5061070960048036038101906107049190613c8f565b612167565b005b34801561071757600080fd5b50610720612187565b60405161072d91906146af565b60405180910390f35b34801561074257600080fd5b5061075d60048036038101906107589190613ccf565b61219a565b005b34801561076b57600080fd5b506107746126f3565b005b34801561078257600080fd5b5061078b612779565b6040516107989190614b47565b60405180910390f35b3480156107ad57600080fd5b506107b661277f565b6040516107c39190614b47565b60405180910390f35b3480156107d857600080fd5b506107e1612785565b6040516107ee9190614634565b60405180910390f35b34801561080357600080fd5b5061080c6127af565b60405161081991906146e5565b60405180910390f35b34801561082e57600080fd5b50610837612841565b60405161084491906146af565b60405180910390f35b34801561085957600080fd5b50610874600480360381019061086f9190613c8f565b612854565b60405161088191906146af565b60405180910390f35b34801561089657600080fd5b506108b160048036038101906108ac9190613c8f565b61293e565b6040516108be91906146af565b60405180910390f35b3480156108d357600080fd5b506108dc612961565b6040516108e991906146af565b60405180910390f35b3480156108fe57600080fd5b5061091960048036038101906109149190613bfc565b612974565b6040516109269190614b47565b60405180910390f35b34801561093b57600080fd5b5061095660048036038101906109519190613fc7565b6129fb565b005b34801561096457600080fd5b5061097f600480360381019061097a9190613bcf565b612cf5565b005b600a60049054906101000a900460ff166109d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c790614b07565b60405180910390fd5b60008111610a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0a90614a87565b60405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610a4e9190614634565b60206040518083038186803b158015610a6657600080fd5b505afa158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613f9a565b905081811015610ae3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ada90614987565b60405180910390fd5b610aed3083610dcd565b5060003073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401610b2d9392919061464f565b602060405180830381600087803b158015610b4757600080fd5b505af1158015610b5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7f9190613e7f565b905080610bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb890614a27565b60405180910390fd5b505050565b610bce612df2565b73ffffffffffffffffffffffffffffffffffffffff16610bec612785565b73ffffffffffffffffffffffffffffffffffffffff1614610c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c39906149a7565b60405180910390fd5b600047905081811015610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c81906148a7565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1683604051610cb09061461f565b60006040518083038185875af1925050503d8060008114610ced576040519150601f19603f3d011682016040523d82523d6000602084013e610cf2565b606091505b5050905080610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614947565b60405180910390fd5b505050565b606060038054610d4a90614e16565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7690614e16565b8015610dc35780601f10610d9857610100808354040283529160200191610dc3565b820191906000526020600020905b815481529060010190602001808311610da657829003601f168201915b5050505050905090565b600080610dd8612df2565b9050610de5818585612dfa565b600191505092915050565b6000600254905090565b6000610e3b826040518060400160405280600b81526020017f636c61696d546f6b656e73000000000000000000000000000000000000000000815250611510565b15610e5757600a60019054906101000a900460ff169050610f67565b610e96826040518060400160405280600981526020017f627579546f6b656e730000000000000000000000000000000000000000000000815250611510565b15610eb257600a60029054906101000a900460ff169050610f66565b610ef1826040518060400160405280600a81526020017f73656c6c546f6b656e7300000000000000000000000000000000000000000000815250611510565b15610f0d57600a60039054906101000a900460ff169050610f65565b610f4c826040518060400160405280600e81526020017f73656e64546f6b656e734261636b000000000000000000000000000000000000815250611510565b15610f6457600a60049054906101000a900460ff1690505b5b5b5b919050565b600080610f77612df2565b9050610f84858285612fc5565b610f8f858585613051565b60019150509392505050565b610fa3612df2565b73ffffffffffffffffffffffffffffffffffffffff16610fc1612785565b73ffffffffffffffffffffffffffffffffffffffff1614611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e906149a7565b60405180910390fd5b60005b848490508110156110e757600085858381811061103a57611039614f20565b5b905060200281019061104c9190614ba6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060008484848181106110a6576110a5614f20565b5b90506020020135905080600b836040516110c091906145e4565b908152602001604051809103902081905550505080806110df90614e79565b91505061101a565b5050505050565b60006012905090565b6000600a60029054906101000a900460ff16611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113f90614767565b60405180910390fd5b611150612785565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461133d57600034116111c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bc90614a47565b60405180910390fd5b6000826006546111d59190614ce7565b90508034101561121a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121190614867565b60405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112559190614634565b60206040518083038186803b15801561126d57600080fd5b505afa158015611281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a59190613f9a565b9050838110156112ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e190614847565b60405180910390fd5b60085484826112f99190614d41565b101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133190614847565b60405180910390fd5b50505b60003073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b815260040161137a929190614686565b602060405180830381600087803b15801561139457600080fd5b505af11580156113a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113cc9190613e7f565b90508061140e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140590614a27565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167eae404b3dc9b4a4b60ccee470a69dc7d92a2d2b1398ddf3d84385c75944daaa3485604051611455929190614b62565b60405180910390a282915050919050565b600080611471612df2565b9050611505818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115009190614c91565b612dfa565b600191505092915050565b60008160405160200161152391906145e4565b604051602081830303815290604052805190602001208360405160200161154a91906145e4565b6040516020818303038152906040528051906020012014905092915050565b611571612df2565b73ffffffffffffffffffffffffffffffffffffffff1661158f612785565b73ffffffffffffffffffffffffffffffffffffffff16146115e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dc906149a7565b60405180910390fd5b60004790506000811161162d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611624906147e7565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516116539061461f565b60006040518083038185875af1925050503d8060008114611690576040519150601f19603f3d011682016040523d82523d6000602084013e611695565b606091505b50509050806116d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d090614947565b60405180910390fd5b5050565b6116e5612df2565b73ffffffffffffffffffffffffffffffffffffffff16611703612785565b73ffffffffffffffffffffffffffffffffffffffff1614611759576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611750906149a7565b60405180910390fd5b6117616132d2565b565b61176b612df2565b73ffffffffffffffffffffffffffffffffffffffff16611789612785565b73ffffffffffffffffffffffffffffffffffffffff16146117df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d6906149a7565b60405180910390fd5b600a60009054906101000a900460ff1661182e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182590614727565b60405180910390fd5b6118388282613374565b5050565b61184d611847612df2565b826134d4565b50565b600b818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b60085481565b61188c612df2565b73ffffffffffffffffffffffffffffffffffffffff166118aa612785565b73ffffffffffffffffffffffffffffffffffffffff1614611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f7906149a7565b60405180910390fd5b60005b84849050811015611c60576119b485858381811061192457611923614f20565b5b90506020028101906119369190614ba6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506040518060400160405280600981526020017f636f7374546f4275790000000000000000000000000000000000000000000000815250611510565b156119de578282828181106119cc576119cb614f20565b5b90506020020135600681905550611c4d565b611a848585838181106119f4576119f3614f20565b5b9050602002810190611a069190614ba6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506040518060400160405280600e81526020017f746f6b656e53656c6c56616c7565000000000000000000000000000000000000815250611510565b15611aae57828282818110611a9c57611a9b614f20565b5b90506020020135600781905550611c4c565b611b54858583818110611ac457611ac3614f20565b5b9050602002810190611ad69190614ba6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506040518060400160405280600d81526020017f72657365727665416d6f756e7400000000000000000000000000000000000000815250611510565b15611b7e57828282818110611b6c57611b6b614f20565b5b90506020020135600881905550611c4b565b611c24858583818110611b9457611b93614f20565b5b9050602002810190611ba69190614ba6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506040518060400160405280600a81526020017f7265736572766545746800000000000000000000000000000000000000000000815250611510565b15611c4a57828282818110611c3c57611c3b614f20565b5b905060200201356009819055505b5b5b5b8080611c5890614e79565b915050611903565b5050505050565b6000600560009054906101000a900460ff16905090565b600a60029054906101000a900460ff1681565b600a60039054906101000a900460ff16611ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd790614967565b60405180910390fd5b60008111611d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1a90614a87565b60405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611d5e9190614634565b60206040518083038186803b158015611d7657600080fd5b505afa158015611d8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dae9190613f9a565b905081811015611df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dea906148e7565b60405180910390fd5b600060075483611e039190614ce7565b9050600047905081811015611e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4490614887565b60405180910390fd5b8160095482611e5c9190614d41565b1015611e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9490614887565b60405180910390fd5b611ea73085610dcd565b5060003073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b8152600401611ee79392919061464f565b602060405180830381600087803b158015611f0157600080fd5b505af1158015611f15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f399190613e7f565b905080611f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7290614a27565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff1683604051611f9f9061461f565b60006040518083038185875af1925050503d8060008114611fdc576040519150601f19603f3d011682016040523d82523d6000602084013e611fe1565b606091505b50508091505080612027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201e90614907565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f2cf8ec0af9cc504531fe2392542793e26f95be50724e0d0bcc46f01f7521e6ef868560405161206f929190614b62565b60405180910390a25050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600a60049054906101000a900460ff1681565b6120e1612df2565b73ffffffffffffffffffffffffffffffffffffffff166120ff612785565b73ffffffffffffffffffffffffffffffffffffffff1614612155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214c906149a7565b60405180910390fd5b61215f60006136ab565b565b60065481565b61217982612173612df2565b83612fc5565b61218382826134d4565b5050565b600a60039054906101000a900460ff1681565b6121a2612df2565b73ffffffffffffffffffffffffffffffffffffffff166121c0612785565b73ffffffffffffffffffffffffffffffffffffffff1614612216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220d906149a7565b60405180910390fd5b60005b848490508110156126ec576122ca85858381811061223a57612239614f20565b5b905060200281019061224c9190614ba6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506040518060400160405280600481526020017f6d696e7400000000000000000000000000000000000000000000000000000000815250611510565b15612315578282828181106122e2576122e1614f20565b5b90506020020160208101906122f79190613e52565b600a60006101000a81548160ff0219169083151502179055506126d9565b6123bb85858381811061232b5761232a614f20565b5b905060200281019061233d9190614ba6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506040518060400160405280600b81526020017f636c61696d546f6b656e73000000000000000000000000000000000000000000815250611510565b15612406578282828181106123d3576123d2614f20565b5b90506020020160208101906123e89190613e52565b600a60016101000a81548160ff0219169083151502179055506126d8565b6124ac85858381811061241c5761241b614f20565b5b905060200281019061242e9190614ba6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506040518060400160405280600981526020017f627579546f6b656e730000000000000000000000000000000000000000000000815250611510565b156124f7578282828181106124c4576124c3614f20565b5b90506020020160208101906124d99190613e52565b600a60026101000a81548160ff0219169083151502179055506126d7565b61259d85858381811061250d5761250c614f20565b5b905060200281019061251f9190614ba6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506040518060400160405280600a81526020017f73656c6c546f6b656e7300000000000000000000000000000000000000000000815250611510565b156125e8578282828181106125b5576125b4614f20565b5b90506020020160208101906125ca9190613e52565b600a60036101000a81548160ff0219169083151502179055506126d6565b61268e8585838181106125fe576125fd614f20565b5b90506020028101906126109190614ba6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506040518060400160405280600e81526020017f73656e64546f6b656e734261636b000000000000000000000000000000000000815250611510565b156126d5578282828181106126a6576126a5614f20565b5b90506020020160208101906126bb9190613e52565b600a60046101000a81548160ff0219169083151502179055505b5b5b5b5b80806126e490614e79565b915050612219565b5050505050565b6126fb612df2565b73ffffffffffffffffffffffffffffffffffffffff16612719612785565b73ffffffffffffffffffffffffffffffffffffffff161461276f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612766906149a7565b60405180910390fd5b612777613771565b565b60075481565b60095481565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546127be90614e16565b80601f01602080910402602001604051908101604052809291908181526020018280546127ea90614e16565b80156128375780601f1061280c57610100808354040283529160200191612837565b820191906000526020600020905b81548152906001019060200180831161281a57829003601f168201915b5050505050905090565b600a60009054906101000a900460ff1681565b60008061285f612df2565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291c90614ae7565b60405180910390fd5b6129328286868403612dfa565b60019250505092915050565b600080612949612df2565b9050612956818585613051565b600191505092915050565b600a60019054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a60019054906101000a900460ff16612a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a41906149e7565b60405180910390fd5b612a55838383613814565b60008411612a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8f90614aa7565b60405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612ad39190614634565b60206040518083038186803b158015612aeb57600080fd5b505afa158015612aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b239190613f9a565b905084811015612b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5f90614927565b60405180910390fd5b6008548582612b779190614d41565b1015612bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baf90614927565b60405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33886040518363ffffffff1660e01b8152600401612bf5929190614686565b602060405180830381600087803b158015612c0f57600080fd5b505af1158015612c23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c479190613e7f565b905080612c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8090614a27565b60405180910390fd5b84604051612c9791906145e4565b60405180910390203373ffffffffffffffffffffffffffffffffffffffff167f3342396a1b05d7a6416ee6bbc87bdee0ae2c283b97ac21fa8773e09538224f2488604051612ce59190614b47565b60405180910390a3505050505050565b612cfd612df2565b73ffffffffffffffffffffffffffffffffffffffff16612d1b612785565b73ffffffffffffffffffffffffffffffffffffffff1614612d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d68906149a7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd8906147a7565b60405180910390fd5b612dea816136ab565b50565b505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6190614a67565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed1906147c7565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612fb89190614b47565b60405180910390a3505050565b6000612fd18484612974565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461304b578181101561303d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303490614807565b60405180910390fd5b61304a8484848403612dfa565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b890614a07565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312890614707565b60405180910390fd5b61313c83838361392c565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156131c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b990614827565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132559190614c91565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516132b99190614b47565b60405180910390a36132cc848484613984565b50505050565b6132da611c67565b613319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331090614747565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61335d612df2565b60405161336a9190614634565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133db90614b27565b60405180910390fd5b6133f06000838361392c565b80600260008282546134029190614c91565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134579190614c91565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516134bc9190614b47565b60405180910390a36134d060008383613984565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353b906149c7565b60405180910390fd5b6135508260008361392c565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156135d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135cd90614787565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461362d9190614d41565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516136929190614b47565b60405180910390a36136a683600084613984565b505050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613779611c67565b156137b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b0906148c7565b60405180910390fd5b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137fd612df2565b60405161380a9190614634565b60405180910390a1565b6000600b8460405161382691906145e4565b9081526020016040518091039020541415613876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161386d90614ac7565b60405180910390fd5b6000838360405160200161388b9291906145fb565b60405160208183030381529060405280519060200120905080600b856040516138b491906145e4565b90815260200160405180910390205414613903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138fa90614ac7565b60405180910390fd5b81600b8560405161391491906145e4565b90815260200160405180910390208190555050505050565b613934611c67565b15613974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161396b906148c7565b60405180910390fd5b61397f838383612ded565b505050565b505050565b600061399c61399784614c2e565b614c09565b9050828152602081018484840111156139b8576139b7614f9c565b5b6139c3848285614dd4565b509392505050565b6000813590506139da816158c1565b92915050565b60008083601f8401126139f6576139f5614f83565b5b8235905067ffffffffffffffff811115613a1357613a12614f7e565b5b602083019150836020820283011115613a2f57613a2e614f92565b5b9250929050565b60008083601f840112613a4c57613a4b614f83565b5b8235905067ffffffffffffffff811115613a6957613a68614f7e565b5b602083019150836020820283011115613a8557613a84614f92565b5b9250929050565b60008083601f840112613aa257613aa1614f83565b5b8235905067ffffffffffffffff811115613abf57613abe614f7e565b5b602083019150836020820283011115613adb57613ada614f92565b5b9250929050565b60008083601f840112613af857613af7614f83565b5b8235905067ffffffffffffffff811115613b1557613b14614f7e565b5b602083019150836020820283011115613b3157613b30614f92565b5b9250929050565b600081359050613b47816158d8565b92915050565b600081519050613b5c816158d8565b92915050565b600081359050613b71816158ef565b92915050565b600082601f830112613b8c57613b8b614f83565b5b8135613b9c848260208601613989565b91505092915050565b600081359050613bb481615906565b92915050565b600081519050613bc981615906565b92915050565b600060208284031215613be557613be4614fa6565b5b6000613bf3848285016139cb565b91505092915050565b60008060408385031215613c1357613c12614fa6565b5b6000613c21858286016139cb565b9250506020613c32858286016139cb565b9150509250929050565b600080600060608486031215613c5557613c54614fa6565b5b6000613c63868287016139cb565b9350506020613c74868287016139cb565b9250506040613c8586828701613ba5565b9150509250925092565b60008060408385031215613ca657613ca5614fa6565b5b6000613cb4858286016139cb565b9250506020613cc585828601613ba5565b9150509250929050565b60008060008060408587031215613ce957613ce8614fa6565b5b600085013567ffffffffffffffff811115613d0757613d06614fa1565b5b613d1387828801613a8c565b9450945050602085013567ffffffffffffffff811115613d3657613d35614fa1565b5b613d42878288016139e0565b925092505092959194509250565b60008060008060408587031215613d6a57613d69614fa6565b5b600085013567ffffffffffffffff811115613d8857613d87614fa1565b5b613d9487828801613a8c565b9450945050602085013567ffffffffffffffff811115613db757613db6614fa1565b5b613dc387828801613a36565b925092505092959194509250565b60008060008060408587031215613deb57613dea614fa6565b5b600085013567ffffffffffffffff811115613e0957613e08614fa1565b5b613e1587828801613a8c565b9450945050602085013567ffffffffffffffff811115613e3857613e37614fa1565b5b613e4487828801613ae2565b925092505092959194509250565b600060208284031215613e6857613e67614fa6565b5b6000613e7684828501613b38565b91505092915050565b600060208284031215613e9557613e94614fa6565b5b6000613ea384828501613b4d565b91505092915050565b600060208284031215613ec257613ec1614fa6565b5b600082013567ffffffffffffffff811115613ee057613edf614fa1565b5b613eec84828501613b77565b91505092915050565b60008060408385031215613f0c57613f0b614fa6565b5b600083013567ffffffffffffffff811115613f2a57613f29614fa1565b5b613f3685828601613b77565b925050602083013567ffffffffffffffff811115613f5757613f56614fa1565b5b613f6385828601613b77565b9150509250929050565b600060208284031215613f8357613f82614fa6565b5b6000613f9184828501613ba5565b91505092915050565b600060208284031215613fb057613faf614fa6565b5b6000613fbe84828501613bba565b91505092915050565b60008060008060808587031215613fe157613fe0614fa6565b5b6000613fef87828801613ba5565b945050602085013567ffffffffffffffff8111156140105761400f614fa1565b5b61401c87828801613b77565b935050604085013567ffffffffffffffff81111561403d5761403c614fa1565b5b61404987828801613b77565b925050606061405a87828801613b62565b91505092959194509250565b61406f81614d75565b82525050565b61407e81614d87565b82525050565b61408d81614d93565b82525050565b600061409e82614c5f565b6140a88185614c75565b93506140b8818560208601614de3565b6140c181614fab565b840191505092915050565b60006140d782614c5f565b6140e18185614c86565b93506140f1818560208601614de3565b80840191505092915050565b600061410a602383614c75565b915061411582614fbc565b604082019050919050565b600061412d602583614c75565b91506141388261500b565b604082019050919050565b6000614150601483614c75565b915061415b8261505a565b602082019050919050565b6000614173602a83614c75565b915061417e82615083565b604082019050919050565b6000614196602283614c75565b91506141a1826150d2565b604082019050919050565b60006141b9602683614c75565b91506141c482615121565b604082019050919050565b60006141dc602283614c75565b91506141e782615170565b604082019050919050565b60006141ff603183614c75565b915061420a826151bf565b604082019050919050565b6000614222601d83614c75565b915061422d8261520e565b602082019050919050565b6000614245602683614c75565b915061425082615237565b604082019050919050565b6000614268603783614c75565b915061427382615286565b604082019050919050565b600061428b601d83614c75565b9150614296826152d5565b602082019050919050565b60006142ae603f83614c75565b91506142b9826152fe565b604082019050919050565b60006142d1603b83614c75565b91506142dc8261534d565b604082019050919050565b60006142f4601083614c75565b91506142ff8261539c565b602082019050919050565b6000614317604183614c75565b9150614322826153c5565b606082019050919050565b600061433a601383614c75565b91506143458261543a565b602082019050919050565b600061435d604083614c75565b915061436882615463565b604082019050919050565b6000614380601883614c75565b915061438b826154b2565b602082019050919050565b60006143a3602b83614c75565b91506143ae826154db565b604082019050919050565b60006143c6603783614c75565b91506143d18261552a565b604082019050919050565b60006143e9602083614c75565b91506143f482615579565b602082019050919050565b600061440c602183614c75565b9150614417826155a2565b604082019050919050565b600061442f602c83614c75565b915061443a826155f1565b604082019050919050565b6000614452602583614c75565b915061445d82615640565b604082019050919050565b6000614475601a83614c75565b91506144808261568f565b602082019050919050565b6000614498601c83614c75565b91506144a3826156b8565b602082019050919050565b60006144bb600083614c6a565b91506144c6826156e1565b600082019050919050565b60006144de602483614c75565b91506144e9826156e4565b604082019050919050565b6000614501602e83614c75565b915061450c82615733565b604082019050919050565b6000614524602383614c75565b915061452f82615782565b604082019050919050565b6000614547601683614c75565b9150614552826157d1565b602082019050919050565b600061456a602583614c75565b9150614575826157fa565b604082019050919050565b600061458d603083614c75565b915061459882615849565b604082019050919050565b60006145b0601f83614c75565b91506145bb82615898565b602082019050919050565b6145cf81614dbd565b82525050565b6145de81614dc7565b82525050565b60006145f082846140cc565b915081905092915050565b600061460782856140cc565b915061461382846140cc565b91508190509392505050565b600061462a826144ae565b9150819050919050565b60006020820190506146496000830184614066565b92915050565b60006060820190506146646000830186614066565b6146716020830185614066565b61467e60408301846145c6565b949350505050565b600060408201905061469b6000830185614066565b6146a860208301846145c6565b9392505050565b60006020820190506146c46000830184614075565b92915050565b60006020820190506146df6000830184614084565b92915050565b600060208201905081810360008301526146ff8184614093565b905092915050565b60006020820190508181036000830152614720816140fd565b9050919050565b6000602082019050818103600083015261474081614120565b9050919050565b6000602082019050818103600083015261476081614143565b9050919050565b6000602082019050818103600083015261478081614166565b9050919050565b600060208201905081810360008301526147a081614189565b9050919050565b600060208201905081810360008301526147c0816141ac565b9050919050565b600060208201905081810360008301526147e0816141cf565b9050919050565b60006020820190508181036000830152614800816141f2565b9050919050565b6000602082019050818103600083015261482081614215565b9050919050565b6000602082019050818103600083015261484081614238565b9050919050565b600060208201905081810360008301526148608161425b565b9050919050565b600060208201905081810360008301526148808161427e565b9050919050565b600060208201905081810360008301526148a0816142a1565b9050919050565b600060208201905081810360008301526148c0816142c4565b9050919050565b600060208201905081810360008301526148e0816142e7565b9050919050565b600060208201905081810360008301526149008161430a565b9050919050565b600060208201905081810360008301526149208161432d565b9050919050565b6000602082019050818103600083015261494081614350565b9050919050565b6000602082019050818103600083015261496081614373565b9050919050565b6000602082019050818103600083015261498081614396565b9050919050565b600060208201905081810360008301526149a0816143b9565b9050919050565b600060208201905081810360008301526149c0816143dc565b9050919050565b600060208201905081810360008301526149e0816143ff565b9050919050565b60006020820190508181036000830152614a0081614422565b9050919050565b60006020820190508181036000830152614a2081614445565b9050919050565b60006020820190508181036000830152614a4081614468565b9050919050565b60006020820190508181036000830152614a608161448b565b9050919050565b60006020820190508181036000830152614a80816144d1565b9050919050565b60006020820190508181036000830152614aa0816144f4565b9050919050565b60006020820190508181036000830152614ac081614517565b9050919050565b60006020820190508181036000830152614ae08161453a565b9050919050565b60006020820190508181036000830152614b008161455d565b9050919050565b60006020820190508181036000830152614b2081614580565b9050919050565b60006020820190508181036000830152614b40816145a3565b9050919050565b6000602082019050614b5c60008301846145c6565b92915050565b6000604082019050614b7760008301856145c6565b614b8460208301846145c6565b9392505050565b6000602082019050614ba060008301846145d5565b92915050565b60008083356001602003843603038112614bc357614bc2614f8d565b5b80840192508235915067ffffffffffffffff821115614be557614be4614f88565b5b602083019250600182023603831315614c0157614c00614f97565b5b509250929050565b6000614c13614c24565b9050614c1f8282614e48565b919050565b6000604051905090565b600067ffffffffffffffff821115614c4957614c48614f4f565b5b614c5282614fab565b9050602081019050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c9c82614dbd565b9150614ca783614dbd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614cdc57614cdb614ec2565b5b828201905092915050565b6000614cf282614dbd565b9150614cfd83614dbd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d3657614d35614ec2565b5b828202905092915050565b6000614d4c82614dbd565b9150614d5783614dbd565b925082821015614d6a57614d69614ec2565b5b828203905092915050565b6000614d8082614d9d565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614e01578082015181840152602081019050614de6565b83811115614e10576000848401525b50505050565b60006002820490506001821680614e2e57607f821691505b60208210811415614e4257614e41614ef1565b5b50919050565b614e5182614fab565b810181811067ffffffffffffffff82111715614e7057614e6f614f4f565b5b80604052505050565b6000614e8482614dbd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614eb757614eb6614ec2565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e67206973206e6f7420616c6c6f77656420617420746865206d6f60008201527f6d656e742e000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f427579696e6720746f6b656e73206973206e6f7420616374697665206174207460008201527f6865206d6f6d656e742e00000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f54686520636f6e747261637420646f6573206e6f74206861766520612062616c60008201527f616e636520746f2077697468647261772e000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f436f6e747261637420646f6573206e6f74206861766520656e6f75676820746f60008201527f6b656e7320666f7220796f75722070757263686173652e000000000000000000602082015250565b7f4e6f7420656e6f7567682045544820746f2062757920746f6b656e732e000000600082015250565b7f436f6e747261637420646f6573206e6f74206861766520656e6f75676820667560008201527f6e647320746f20616363657074207468652073656c6c20726571756573742e00602082015250565b7f54686520636f6e747261637420646f6573206e6f74206861766520656e6f756760008201527f68206f6620612062616c616e636520746f2077697468647261772e0000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f596f75722062616c616e6365206973206c6f776572207468616e20746865206160008201527f6d6f756e74206f6620746f6b656e7320796f752077616e7420746f2073656c6c60208201527f2e00000000000000000000000000000000000000000000000000000000000000604082015250565b7f4661696c656420746f2073656e64204554482e00000000000000000000000000600082015250565b7f436f6e747261637420646f6573206e6f74206861766520656e6f75676820746f60008201527f6b656e7320666f7220796f7520746f20636c61696d207269676874206e6f772e602082015250565b7f4661696c656420746f2073656e642077697468647261772e0000000000000000600082015250565b7f53656c6c696e6720746f6b656e73206973206e6f74206163746976652061742060008201527f746865206d6f6d656e742e000000000000000000000000000000000000000000602082015250565b7f596f75722062616c616e6365206973206c6f776572207468616e20746865206160008201527f6d6f756e74206f6620746f6b656e73206e65656465642e000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f436c61696d696e6720746f6b656e73206973206e6f742061637469766520617460008201527f20746865206d6f6d656e742e0000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f207472616e7366657220746f6b656e732e000000000000600082015250565b7f53656e642045544820746f2062757920736f6d6520746f6b656e732e00000000600082015250565b50565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f5370656369667920616e20616d6f756e74206f6620746f6b656e73206772656160008201527f746572207468616e207a65726f2e000000000000000000000000000000000000602082015250565b7f596f75206861766520746f20636c61696d206174206c65617374203120746f6b60008201527f656e2e0000000000000000000000000000000000000000000000000000000000602082015250565b7f41757468656e7469636174696f6e206661696c65642100000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f53656e64696e6720746f6b656e73206261636b206973206e6f7420616374697660008201527f6520617420746865206d6f6d656e742e00000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6158ca81614d75565b81146158d557600080fd5b50565b6158e181614d87565b81146158ec57600080fd5b50565b6158f881614d93565b811461590357600080fd5b50565b61590f81614dbd565b811461591a57600080fd5b5056fea2646970667358221220925706d9db3f5f492779357cbdc9b3d126f111669b5a5b1648c661ef8695555d64736f6c63430008070033

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

0000000000000000000000000000000000000000002116545850052128000000

-----Decoded View---------------
Arg [0] : initialSupply (uint256): 40000000000000000000000000

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


Deployed Bytecode Sourcemap

25095:8378:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30516:568;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32619:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12300:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14651:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13420:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31109:393;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15432:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27265:298;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13262:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28425:889;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16136:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33306:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32967:304;;;;;;;;;;;;;:::i;:::-;;26075:65;;;;;;;;;;;;;:::i;:::-;;26164:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23678:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25564:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25263:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32134:452;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5354:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25438:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29339:1137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13591:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25519:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3405:103;;;;;;;;;;;;;:::i;:::-;;25161:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24088:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25478:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31527:531;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25993:61;;;;;;;;;;;;;:::i;:::-;;25210:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25305:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2754:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12519:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25361:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16879:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13924:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25396:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14180:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27587:816;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3663:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30516:568;30580:20;;;;;;;;;;;30572:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;30679:1;30669:7;:11;30661:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;30739:19;30775:4;30761:30;;;30792:10;30761:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30739:64;;30834:7;30819:11;:22;;30811:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;30906:31;30922:4;30929:7;30906;:31::i;:::-;;30946:9;30973:4;30959:33;;;30993:10;31013:4;31020:7;30959:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30945:83;;31044:4;31036:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;30564:520;;30516:568;:::o;32619:328::-;2985:12;:10;:12::i;:::-;2974:23;;:7;:5;:7::i;:::-;:23;;;2966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32685:20:::1;32708:21;32685:44;;32761:7;32745:12;:23;;32737:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;32841:9;32855:10;:15;;32878:7;32855:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32840:50;;;32906:4;32898:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;32677:270;;32619:328:::0;:::o;12300:100::-;12354:13;12387:5;12380:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12300:100;:::o;14651:201::-;14734:4;14751:13;14767:12;:10;:12::i;:::-;14751:28;;14790:32;14799:5;14806:7;14815:6;14790:8;:32::i;:::-;14840:4;14833:11;;;14651:201;;;;:::o;13420:108::-;13481:7;13508:12;;13501:19;;13420:108;:::o;31109:393::-;31170:12;31192:28;31200:5;31192:28;;;;;;;;;;;;;;;;;:7;:28::i;:::-;31189:287;;;31234:17;;;;;;;;;;;31224:27;;31189:287;;;31266:26;31274:5;31266:26;;;;;;;;;;;;;;;;;:7;:26::i;:::-;31263:213;;;31306:15;;;;;;;;;;;31296:25;;31263:213;;;31336:27;31344:5;31336:27;;;;;;;;;;;;;;;;;:7;:27::i;:::-;31333:143;;;31377:16;;;;;;;;;;;31367:26;;31333:143;;;31408:31;31416:5;31408:31;;;;;;;;;;;;;;;;;:7;:31::i;:::-;31405:71;;;31453:20;;;;;;;;;;;31443:30;;31405:71;31333:143;31263:213;31189:287;31109:393;;;:::o;15432:295::-;15563:4;15580:15;15598:12;:10;:12::i;:::-;15580:30;;15621:38;15637:4;15643:7;15652:6;15621:15;:38::i;:::-;15670:27;15680:4;15686:2;15690:6;15670:9;:27::i;:::-;15715:4;15708:11;;;15432:295;;;;;:::o;27265:298::-;2985:12;:10;:12::i;:::-;2974:23;;:7;:5;:7::i;:::-;:23;;;2966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27384:9:::1;27379:180;27401:11;;:18;;27397:1;:22;27379:180;;;27432:24;27459:11;;27471:1;27459:14;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;27432:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27479:17;27499:11;;27511:1;27499:14;;;;;;;:::i;:::-;;;;;;;;27479:34;;27544:9;27519:10;27530;27519:22;;;;;;:::i;:::-;;;;;;;;;;;;;:34;;;;27426:133;;27421:3;;;;;:::i;:::-;;;;27379:180;;;;27265:298:::0;;;;:::o;13262:93::-;13320:5;13345:2;13338:9;;13262:93;:::o;28425:889::-;28485:21;28524:15;;;;;;;;;;;28516:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;28609:7;:5;:7::i;:::-;28595:21;;:10;:21;;;28591:517;;28647:1;28635:9;:13;28627:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;28690:15;28720:7;28708:9;;:19;;;;:::i;:::-;28690:37;;28757:7;28744:9;:20;;28736:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28807:23;28847:4;28833:30;;;28872:4;28833:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28807:71;;28914:7;28895:15;:26;;28887:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;29029:13;;29017:7;28999:15;:25;;;;:::i;:::-;28998:44;;28990:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;28618:490;;28591:517;29116:9;29143:4;29129:29;;;29159:10;29171:7;29129:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29115:64;;29195:4;29187:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;29256:10;29243:44;;;29268:9;29279:7;29243:44;;;;;;;:::i;:::-;;;;;;;;29302:7;29295:14;;;28425:889;;;:::o;16136:240::-;16224:4;16241:13;16257:12;:10;:12::i;:::-;16241:28;;16280:66;16289:5;16296:7;16335:10;16305:11;:18;16317:5;16305:18;;;;;;;;;;;;;;;:27;16324:7;16305:27;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;16280:8;:66::i;:::-;16364:4;16357:11;;;16136:240;;;;:::o;33306:164::-;33377:4;33459:1;33442:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;33432:30;;;;;;33425:1;33408:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;33398:30;;;;;;:64;33391:71;;33306:164;;;;:::o;32967:304::-;2985:12;:10;:12::i;:::-;2974:23;;:7;:5;:7::i;:::-;:23;;;2966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33012:20:::1;33035:21;33012:44;;33087:1;33072:12;:16;33064:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;33151:9;33165:10;:15;;33188:21;33165:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33150:64;;;33230:4;33222:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;33004:267;;32967:304::o:0;26075:65::-;2985:12;:10;:12::i;:::-;2974:23;;:7;:5;:7::i;:::-;:23;;;2966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26122:10:::1;:8;:10::i;:::-;26075:65::o:0;26164:160::-;2985:12;:10;:12::i;:::-;2974:23;;:7;:5;:7::i;:::-;:23;;;2966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26239:10:::1;;;;;;;;;;;26231:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;26299:17;26305:2;26309:6;26299:5;:17::i;:::-;26164:160:::0;;:::o;23678:91::-;23734:27;23740:12;:10;:12::i;:::-;23754:6;23734:5;:27::i;:::-;23678:91;:::o;25564:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25263:37::-;;;;:::o;32134:452::-;2985:12;:10;:12::i;:::-;2974:23;;:7;:5;:7::i;:::-;:23;;;2966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32237:6:::1;32232:350;32251:5;;:12;;32247:1;:16;32232:350;;;32279:29;32287:5;;32293:1;32287:8;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;32279:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;:7:::1;:29::i;:::-;32276:301;;;32324:8;;32333:1;32324:11;;;;;;;:::i;:::-;;;;;;;;32312:9;:23;;;;32276:301;;;32351:34;32359:5;;32365:1;32359:8;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;32351:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;:7:::1;:34::i;:::-;32348:229;;;32406:8;;32415:1;32406:11;;;;;;;:::i;:::-;;;;;;;;32389:14;:28;;;;32348:229;;;32433:33;32441:5;;32447:1;32441:8;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;32433:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;:7:::1;:33::i;:::-;32430:147;;;32486:8;;32495:1;32486:11;;;;;;;:::i;:::-;;;;;;;;32470:13;:27;;;;32430:147;;;32516:30;32524:5;;32530:1;32524:8;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;32516:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;:7:::1;:30::i;:::-;32513:64;;;32563:8;;32572:1;32563:11;;;;;;;:::i;:::-;;;;;;;;32550:10;:24;;;;32513:64;32430:147;32348:229;32276:301;32265:3;;;;;:::i;:::-;;;;32232:350;;;;32134:452:::0;;;;:::o;5354:86::-;5401:4;5425:7;;;;;;;;;;;5418:14;;5354:86;:::o;25438:35::-;;;;;;;;;;;;;:::o;29339:1137::-;29399:16;;;;;;;;;;;29391:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;29489:1;29479:7;:11;29471:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;29549:19;29585:4;29571:30;;;29602:10;29571:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29549:64;;29644:7;29629:11;:22;;29621:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;29729:29;29771:14;;29761:7;:24;;;;:::i;:::-;29729:56;;29793:26;29822:21;29793:50;;29881:21;29859:18;:43;;29851:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;30023:21;30008:10;;29987:18;:31;;;;:::i;:::-;29986:58;;29978:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;30117:31;30133:4;30140:7;30117;:31::i;:::-;;30157:9;30184:4;30170:33;;;30204:10;30224:4;30231:7;30170:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30156:83;;30255:4;30247:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;30308:10;:15;;30331:21;30308:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30298:59;;;;;30373:4;30365:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;30425:10;30414:54;;;30437:7;30446:21;30414:54;;;;;;;:::i;:::-;;;;;;;;29383:1093;;;;29339:1137;:::o;13591:127::-;13665:7;13692:9;:18;13702:7;13692:18;;;;;;;;;;;;;;;;13685:25;;13591:127;;;:::o;25519:40::-;;;;;;;;;;;;;:::o;3405:103::-;2985:12;:10;:12::i;:::-;2974:23;;:7;:5;:7::i;:::-;:23;;;2966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3470:30:::1;3497:1;3470:18;:30::i;:::-;3405:103::o:0;25161:44::-;;;;:::o;24088:164::-;24165:46;24181:7;24190:12;:10;:12::i;:::-;24204:6;24165:15;:46::i;:::-;24222:22;24228:7;24237:6;24222:5;:22::i;:::-;24088:164;;:::o;25478:36::-;;;;;;;;;;;;;:::o;31527:531::-;2985:12;:10;:12::i;:::-;2974:23;;:7;:5;:7::i;:::-;:23;;;2966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31626:6:::1;31621:433;31640:5;;:12;;31636:1;:16;31621:433;;;31668:24;31676:5;;31682:1;31676:8;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;31668:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;:7:::1;:24::i;:::-;31665:381;;;31709:7;;31717:1;31709:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;31696;;:23;;;;;;;;;;;;;;;;;;31665:381;;;31735:31;31743:5;;31749:1;31743:8;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;31735:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;:7:::1;:31::i;:::-;31732:314;;;31790:7;;31798:1;31790:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;31770:17;;:30;;;;;;;;;;;;;;;;;;31732:314;;;31816:29;31824:5;;31830:1;31824:8;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;31816:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;:7:::1;:29::i;:::-;31813:233;;;31867:7;;31875:1;31867:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;31849:15;;:28;;;;;;;;;;;;;;;;;;31813:233;;;31893:30;31901:5;;31907:1;31901:8;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;31893:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;:7:::1;:30::i;:::-;31890:156;;;31946:7;;31954:1;31946:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;31927:16;;:29;;;;;;;;;;;;;;;;;;31890:156;;;31972:34;31980:5;;31986:1;31980:8;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;31972:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;:7:::1;:34::i;:::-;31969:77;;;32033:7;;32041:1;32033:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;32010:20;;:33;;;;;;;;;;;;;;;;;;31969:77;31890:156;31813:233;31732:314;31665:381;31654:3;;;;;:::i;:::-;;;;31621:433;;;;31527:531:::0;;;;:::o;25993:61::-;2985:12;:10;:12::i;:::-;2974:23;;:7;:5;:7::i;:::-;:23;;;2966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26038:8:::1;:6;:8::i;:::-;25993:61::o:0;25210:48::-;;;;:::o;25305:51::-;;;;:::o;2754:87::-;2800:7;2827:6;;;;;;;;;;;2820:13;;2754:87;:::o;12519:104::-;12575:13;12608:7;12601:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12519:104;:::o;25361:30::-;;;;;;;;;;;;;:::o;16879:438::-;16972:4;16989:13;17005:12;:10;:12::i;:::-;16989:28;;17028:24;17055:11;:18;17067:5;17055:18;;;;;;;;;;;;;;;:27;17074:7;17055:27;;;;;;;;;;;;;;;;17028:54;;17121:15;17101:16;:35;;17093:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;17214:60;17223:5;17230:7;17258:15;17239:16;:34;17214:8;:60::i;:::-;17305:4;17298:11;;;;16879:438;;;;:::o;13924:193::-;14003:4;14020:13;14036:12;:10;:12::i;:::-;14020:28;;14059;14069:5;14076:2;14080:6;14059:9;:28::i;:::-;14105:4;14098:11;;;13924:193;;;;:::o;25396:37::-;;;;;;;;;;;;;:::o;14180:151::-;14269:7;14296:11;:18;14308:5;14296:18;;;;;;;;;;;;;;;:27;14315:7;14296:27;;;;;;;;;;;;;;;;14289:34;;14180:151;;;;:::o;27587:816::-;27719:17;;;;;;;;;;;27711:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27790:40;27795:10;27806;27817:12;27790:4;:40::i;:::-;27856:1;27846:7;:11;27838:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;27905:23;27945:4;27931:30;;;27970:4;27931:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27905:71;;28011:7;27992:15;:26;;27984:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28134:13;;28122:7;28104:15;:25;;;;:::i;:::-;28103:44;;28095:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;28225:9;28252:4;28238:29;;;28268:10;28280:7;28238:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28224:64;;28304:4;28296:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;28378:10;28352:46;;;;;;:::i;:::-;;;;;;;;28366:10;28352:46;;;28390:7;28352:46;;;;;;:::i;:::-;;;;;;;;27703:700;;27587:816;;;;:::o;3663:201::-;2985:12;:10;:12::i;:::-;2974:23;;:7;:5;:7::i;:::-;:23;;;2966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3772:1:::1;3752:22;;:8;:22;;;;3744:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3828:28;3847:8;3828:18;:28::i;:::-;3663:201:::0;:::o;22235:125::-;;;;:::o;1478:98::-;1531:7;1558:10;1551:17;;1478:98;:::o;20515:380::-;20668:1;20651:19;;:5;:19;;;;20643:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20749:1;20730:21;;:7;:21;;;;20722:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20833:6;20803:11;:18;20815:5;20803:18;;;;;;;;;;;;;;;:27;20822:7;20803:27;;;;;;;;;;;;;;;:36;;;;20871:7;20855:32;;20864:5;20855:32;;;20880:6;20855:32;;;;;;:::i;:::-;;;;;;;;20515:380;;;:::o;21182:453::-;21317:24;21344:25;21354:5;21361:7;21344:9;:25::i;:::-;21317:52;;21404:17;21384:16;:37;21380:248;;21466:6;21446:16;:26;;21438:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21550:51;21559:5;21566:7;21594:6;21575:16;:25;21550:8;:51::i;:::-;21380:248;21306:329;21182:453;;;:::o;17796:671::-;17943:1;17927:18;;:4;:18;;;;17919:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18020:1;18006:16;;:2;:16;;;;17998:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;18075:38;18096:4;18102:2;18106:6;18075:20;:38::i;:::-;18126:19;18148:9;:15;18158:4;18148:15;;;;;;;;;;;;;;;;18126:37;;18197:6;18182:11;:21;;18174:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;18314:6;18300:11;:20;18282:9;:15;18292:4;18282:15;;;;;;;;;;;;;;;:38;;;;18359:6;18342:9;:13;18352:2;18342:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;18398:2;18383:26;;18392:4;18383:26;;;18402:6;18383:26;;;;;;:::i;:::-;;;;;;;;18422:37;18442:4;18448:2;18452:6;18422:19;:37::i;:::-;17908:559;17796:671;;;:::o;6413:120::-;5957:8;:6;:8::i;:::-;5949:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;6482:5:::1;6472:7;;:15;;;;;;;;;;;;;;;;;;6503:22;6512:12;:10;:12::i;:::-;6503:22;;;;;;:::i;:::-;;;;;;;;6413:120::o:0;18754:399::-;18857:1;18838:21;;:7;:21;;;;18830:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;18908:49;18937:1;18941:7;18950:6;18908:20;:49::i;:::-;18986:6;18970:12;;:22;;;;;;;:::i;:::-;;;;;;;;19025:6;19003:9;:18;19013:7;19003:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;19068:7;19047:37;;19064:1;19047:37;;;19077:6;19047:37;;;;;;:::i;:::-;;;;;;;;19097:48;19125:1;19129:7;19138:6;19097:19;:48::i;:::-;18754:399;;:::o;19486:591::-;19589:1;19570:21;;:7;:21;;;;19562:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;19642:49;19663:7;19680:1;19684:6;19642:20;:49::i;:::-;19704:22;19729:9;:18;19739:7;19729:18;;;;;;;;;;;;;;;;19704:43;;19784:6;19766:14;:24;;19758:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;19903:6;19886:14;:23;19865:9;:18;19875:7;19865:18;;;;;;;;;;;;;;;:44;;;;19947:6;19931:12;;:22;;;;;;;:::i;:::-;;;;;;;;19997:1;19971:37;;19980:7;19971:37;;;20001:6;19971:37;;;;;;:::i;:::-;;;;;;;;20021:48;20041:7;20058:1;20062:6;20021:19;:48::i;:::-;19551:526;19486:591;;:::o;4024:191::-;4098:16;4117:6;;;;;;;;;;;4098:25;;4143:8;4134:6;;:17;;;;;;;;;;;;;;;;;;4198:8;4167:40;;4188:8;4167:40;;;;;;;;;;;;4087:128;4024:191;:::o;6154:118::-;5680:8;:6;:8::i;:::-;5679:9;5671:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;6224:4:::1;6214:7;;:14;;;;;;;;;;;;;;;;;;6244:20;6251:12;:10;:12::i;:::-;6244:20;;;;;;:::i;:::-;;;;;;;;6154:118::o:0;26867:369::-;26980:28;:10;26991;26980:22;;;;;;:::i;:::-;;;;;;;;;;;;;;:28;;26972:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27039:17;27086:10;27097;27069:39;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27059:50;;;;;;27039:70;;27151:9;27125:10;27136;27125:22;;;;;;:::i;:::-;;;;;;;;;;;;;;:35;27117:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;27216:12;27191:10;27202;27191:22;;;;;;:::i;:::-;;;;;;;;;;;;;:37;;;;26964:272;26867:369;;;:::o;26359:166::-;5680:8;:6;:8::i;:::-;5679:9;5671:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;26473:44:::1;26500:4;26506:2;26510:6;26473:26;:44::i;:::-;26359:166:::0;;;:::o;22964:124::-;;;;:::o;7:412:1:-;85:5;110:66;126:49;168:6;126:49;:::i;:::-;110:66;:::i;:::-;101:75;;199:6;192:5;185:21;237:4;230:5;226:16;275:3;266:6;261:3;257:16;254:25;251:112;;;282:79;;:::i;:::-;251:112;372:41;406:6;401:3;396;372:41;:::i;:::-;91:328;7:412;;;;;:::o;425:139::-;471:5;509:6;496:20;487:29;;525:33;552:5;525:33;:::i;:::-;425:139;;;;:::o;584:565::-;654:8;664:6;714:3;707:4;699:6;695:17;691:27;681:122;;722:79;;:::i;:::-;681:122;835:6;822:20;812:30;;865:18;857:6;854:30;851:117;;;887:79;;:::i;:::-;851:117;1001:4;993:6;989:17;977:29;;1055:3;1047:4;1039:6;1035:17;1025:8;1021:32;1018:41;1015:128;;;1062:79;;:::i;:::-;1015:128;584:565;;;;;:::o;1172:568::-;1245:8;1255:6;1305:3;1298:4;1290:6;1286:17;1282:27;1272:122;;1313:79;;:::i;:::-;1272:122;1426:6;1413:20;1403:30;;1456:18;1448:6;1445:30;1442:117;;;1478:79;;:::i;:::-;1442:117;1592:4;1584:6;1580:17;1568:29;;1646:3;1638:4;1630:6;1626:17;1616:8;1612:32;1609:41;1606:128;;;1653:79;;:::i;:::-;1606:128;1172:568;;;;;:::o;1762:580::-;1847:8;1857:6;1907:3;1900:4;1892:6;1888:17;1884:27;1874:122;;1915:79;;:::i;:::-;1874:122;2028:6;2015:20;2005:30;;2058:18;2050:6;2047:30;2044:117;;;2080:79;;:::i;:::-;2044:117;2194:4;2186:6;2182:17;2170:29;;2248:3;2240:4;2232:6;2228:17;2218:8;2214:32;2211:41;2208:128;;;2255:79;;:::i;:::-;2208:128;1762:580;;;;;:::o;2365:568::-;2438:8;2448:6;2498:3;2491:4;2483:6;2479:17;2475:27;2465:122;;2506:79;;:::i;:::-;2465:122;2619:6;2606:20;2596:30;;2649:18;2641:6;2638:30;2635:117;;;2671:79;;:::i;:::-;2635:117;2785:4;2777:6;2773:17;2761:29;;2839:3;2831:4;2823:6;2819:17;2809:8;2805:32;2802:41;2799:128;;;2846:79;;:::i;:::-;2799:128;2365:568;;;;;:::o;2939:133::-;2982:5;3020:6;3007:20;2998:29;;3036:30;3060:5;3036:30;:::i;:::-;2939:133;;;;:::o;3078:137::-;3132:5;3163:6;3157:13;3148:22;;3179:30;3203:5;3179:30;:::i;:::-;3078:137;;;;:::o;3221:139::-;3267:5;3305:6;3292:20;3283:29;;3321:33;3348:5;3321:33;:::i;:::-;3221:139;;;;:::o;3380:340::-;3436:5;3485:3;3478:4;3470:6;3466:17;3462:27;3452:122;;3493:79;;:::i;:::-;3452:122;3610:6;3597:20;3635:79;3710:3;3702:6;3695:4;3687:6;3683:17;3635:79;:::i;:::-;3626:88;;3442:278;3380:340;;;;:::o;3726:139::-;3772:5;3810:6;3797:20;3788:29;;3826:33;3853:5;3826:33;:::i;:::-;3726:139;;;;:::o;3871:143::-;3928:5;3959:6;3953:13;3944:22;;3975:33;4002:5;3975:33;:::i;:::-;3871:143;;;;:::o;4020:329::-;4079:6;4128:2;4116:9;4107:7;4103:23;4099:32;4096:119;;;4134:79;;:::i;:::-;4096:119;4254:1;4279:53;4324:7;4315:6;4304:9;4300:22;4279:53;:::i;:::-;4269:63;;4225:117;4020:329;;;;:::o;4355:474::-;4423:6;4431;4480:2;4468:9;4459:7;4455:23;4451:32;4448:119;;;4486:79;;:::i;:::-;4448:119;4606:1;4631:53;4676:7;4667:6;4656:9;4652:22;4631:53;:::i;:::-;4621:63;;4577:117;4733:2;4759:53;4804:7;4795:6;4784:9;4780:22;4759:53;:::i;:::-;4749:63;;4704:118;4355:474;;;;;:::o;4835:619::-;4912:6;4920;4928;4977:2;4965:9;4956:7;4952:23;4948:32;4945:119;;;4983:79;;:::i;:::-;4945:119;5103:1;5128:53;5173:7;5164:6;5153:9;5149:22;5128:53;:::i;:::-;5118:63;;5074:117;5230:2;5256:53;5301:7;5292:6;5281:9;5277:22;5256:53;:::i;:::-;5246:63;;5201:118;5358:2;5384:53;5429:7;5420:6;5409:9;5405:22;5384:53;:::i;:::-;5374:63;;5329:118;4835:619;;;;;:::o;5460:474::-;5528:6;5536;5585:2;5573:9;5564:7;5560:23;5556:32;5553:119;;;5591:79;;:::i;:::-;5553:119;5711:1;5736:53;5781:7;5772:6;5761:9;5757:22;5736:53;:::i;:::-;5726:63;;5682:117;5838:2;5864:53;5909:7;5900:6;5889:9;5885:22;5864:53;:::i;:::-;5854:63;;5809:118;5460:474;;;;;:::o;5940:952::-;6071:6;6079;6087;6095;6144:2;6132:9;6123:7;6119:23;6115:32;6112:119;;;6150:79;;:::i;:::-;6112:119;6298:1;6287:9;6283:17;6270:31;6328:18;6320:6;6317:30;6314:117;;;6350:79;;:::i;:::-;6314:117;6463:92;6547:7;6538:6;6527:9;6523:22;6463:92;:::i;:::-;6445:110;;;;6241:324;6632:2;6621:9;6617:18;6604:32;6663:18;6655:6;6652:30;6649:117;;;6685:79;;:::i;:::-;6649:117;6798:77;6867:7;6858:6;6847:9;6843:22;6798:77;:::i;:::-;6780:95;;;;6575:310;5940:952;;;;;;;:::o;6898:958::-;7032:6;7040;7048;7056;7105:2;7093:9;7084:7;7080:23;7076:32;7073:119;;;7111:79;;:::i;:::-;7073:119;7259:1;7248:9;7244:17;7231:31;7289:18;7281:6;7278:30;7275:117;;;7311:79;;:::i;:::-;7275:117;7424:92;7508:7;7499:6;7488:9;7484:22;7424:92;:::i;:::-;7406:110;;;;7202:324;7593:2;7582:9;7578:18;7565:32;7624:18;7616:6;7613:30;7610:117;;;7646:79;;:::i;:::-;7610:117;7759:80;7831:7;7822:6;7811:9;7807:22;7759:80;:::i;:::-;7741:98;;;;7536:313;6898:958;;;;;;;:::o;7862:::-;7996:6;8004;8012;8020;8069:2;8057:9;8048:7;8044:23;8040:32;8037:119;;;8075:79;;:::i;:::-;8037:119;8223:1;8212:9;8208:17;8195:31;8253:18;8245:6;8242:30;8239:117;;;8275:79;;:::i;:::-;8239:117;8388:92;8472:7;8463:6;8452:9;8448:22;8388:92;:::i;:::-;8370:110;;;;8166:324;8557:2;8546:9;8542:18;8529:32;8588:18;8580:6;8577:30;8574:117;;;8610:79;;:::i;:::-;8574:117;8723:80;8795:7;8786:6;8775:9;8771:22;8723:80;:::i;:::-;8705:98;;;;8500:313;7862:958;;;;;;;:::o;8826:323::-;8882:6;8931:2;8919:9;8910:7;8906:23;8902:32;8899:119;;;8937:79;;:::i;:::-;8899:119;9057:1;9082:50;9124:7;9115:6;9104:9;9100:22;9082:50;:::i;:::-;9072:60;;9028:114;8826:323;;;;:::o;9155:345::-;9222:6;9271:2;9259:9;9250:7;9246:23;9242:32;9239:119;;;9277:79;;:::i;:::-;9239:119;9397:1;9422:61;9475:7;9466:6;9455:9;9451:22;9422:61;:::i;:::-;9412:71;;9368:125;9155:345;;;;:::o;9506:509::-;9575:6;9624:2;9612:9;9603:7;9599:23;9595:32;9592:119;;;9630:79;;:::i;:::-;9592:119;9778:1;9767:9;9763:17;9750:31;9808:18;9800:6;9797:30;9794:117;;;9830:79;;:::i;:::-;9794:117;9935:63;9990:7;9981:6;9970:9;9966:22;9935:63;:::i;:::-;9925:73;;9721:287;9506:509;;;;:::o;10021:834::-;10109:6;10117;10166:2;10154:9;10145:7;10141:23;10137:32;10134:119;;;10172:79;;:::i;:::-;10134:119;10320:1;10309:9;10305:17;10292:31;10350:18;10342:6;10339:30;10336:117;;;10372:79;;:::i;:::-;10336:117;10477:63;10532:7;10523:6;10512:9;10508:22;10477:63;:::i;:::-;10467:73;;10263:287;10617:2;10606:9;10602:18;10589:32;10648:18;10640:6;10637:30;10634:117;;;10670:79;;:::i;:::-;10634:117;10775:63;10830:7;10821:6;10810:9;10806:22;10775:63;:::i;:::-;10765:73;;10560:288;10021:834;;;;;:::o;10861:329::-;10920:6;10969:2;10957:9;10948:7;10944:23;10940:32;10937:119;;;10975:79;;:::i;:::-;10937:119;11095:1;11120:53;11165:7;11156:6;11145:9;11141:22;11120:53;:::i;:::-;11110:63;;11066:117;10861:329;;;;:::o;11196:351::-;11266:6;11315:2;11303:9;11294:7;11290:23;11286:32;11283:119;;;11321:79;;:::i;:::-;11283:119;11441:1;11466:64;11522:7;11513:6;11502:9;11498:22;11466:64;:::i;:::-;11456:74;;11412:128;11196:351;;;;:::o;11553:1125::-;11659:6;11667;11675;11683;11732:3;11720:9;11711:7;11707:23;11703:33;11700:120;;;11739:79;;:::i;:::-;11700:120;11859:1;11884:53;11929:7;11920:6;11909:9;11905:22;11884:53;:::i;:::-;11874:63;;11830:117;12014:2;12003:9;11999:18;11986:32;12045:18;12037:6;12034:30;12031:117;;;12067:79;;:::i;:::-;12031:117;12172:63;12227:7;12218:6;12207:9;12203:22;12172:63;:::i;:::-;12162:73;;11957:288;12312:2;12301:9;12297:18;12284:32;12343:18;12335:6;12332:30;12329:117;;;12365:79;;:::i;:::-;12329:117;12470:63;12525:7;12516:6;12505:9;12501:22;12470:63;:::i;:::-;12460:73;;12255:288;12582:2;12608:53;12653:7;12644:6;12633:9;12629:22;12608:53;:::i;:::-;12598:63;;12553:118;11553:1125;;;;;;;:::o;12684:118::-;12771:24;12789:5;12771:24;:::i;:::-;12766:3;12759:37;12684:118;;:::o;12808:109::-;12889:21;12904:5;12889:21;:::i;:::-;12884:3;12877:34;12808:109;;:::o;12923:118::-;13010:24;13028:5;13010:24;:::i;:::-;13005:3;12998:37;12923:118;;:::o;13047:364::-;13135:3;13163:39;13196:5;13163:39;:::i;:::-;13218:71;13282:6;13277:3;13218:71;:::i;:::-;13211:78;;13298:52;13343:6;13338:3;13331:4;13324:5;13320:16;13298:52;:::i;:::-;13375:29;13397:6;13375:29;:::i;:::-;13370:3;13366:39;13359:46;;13139:272;13047:364;;;;:::o;13417:377::-;13523:3;13551:39;13584:5;13551:39;:::i;:::-;13606:89;13688:6;13683:3;13606:89;:::i;:::-;13599:96;;13704:52;13749:6;13744:3;13737:4;13730:5;13726:16;13704:52;:::i;:::-;13781:6;13776:3;13772:16;13765:23;;13527:267;13417:377;;;;:::o;13800:366::-;13942:3;13963:67;14027:2;14022:3;13963:67;:::i;:::-;13956:74;;14039:93;14128:3;14039:93;:::i;:::-;14157:2;14152:3;14148:12;14141:19;;13800:366;;;:::o;14172:::-;14314:3;14335:67;14399:2;14394:3;14335:67;:::i;:::-;14328:74;;14411:93;14500:3;14411:93;:::i;:::-;14529:2;14524:3;14520:12;14513:19;;14172:366;;;:::o;14544:::-;14686:3;14707:67;14771:2;14766:3;14707:67;:::i;:::-;14700:74;;14783:93;14872:3;14783:93;:::i;:::-;14901:2;14896:3;14892:12;14885:19;;14544:366;;;:::o;14916:::-;15058:3;15079:67;15143:2;15138:3;15079:67;:::i;:::-;15072:74;;15155:93;15244:3;15155:93;:::i;:::-;15273:2;15268:3;15264:12;15257:19;;14916:366;;;:::o;15288:::-;15430:3;15451:67;15515:2;15510:3;15451:67;:::i;:::-;15444:74;;15527:93;15616:3;15527:93;:::i;:::-;15645:2;15640:3;15636:12;15629:19;;15288:366;;;:::o;15660:::-;15802:3;15823:67;15887:2;15882:3;15823:67;:::i;:::-;15816:74;;15899:93;15988:3;15899:93;:::i;:::-;16017:2;16012:3;16008:12;16001:19;;15660:366;;;:::o;16032:::-;16174:3;16195:67;16259:2;16254:3;16195:67;:::i;:::-;16188:74;;16271:93;16360:3;16271:93;:::i;:::-;16389:2;16384:3;16380:12;16373:19;;16032:366;;;:::o;16404:::-;16546:3;16567:67;16631:2;16626:3;16567:67;:::i;:::-;16560:74;;16643:93;16732:3;16643:93;:::i;:::-;16761:2;16756:3;16752:12;16745:19;;16404:366;;;:::o;16776:::-;16918:3;16939:67;17003:2;16998:3;16939:67;:::i;:::-;16932:74;;17015:93;17104:3;17015:93;:::i;:::-;17133:2;17128:3;17124:12;17117:19;;16776:366;;;:::o;17148:::-;17290:3;17311:67;17375:2;17370:3;17311:67;:::i;:::-;17304:74;;17387:93;17476:3;17387:93;:::i;:::-;17505:2;17500:3;17496:12;17489:19;;17148:366;;;:::o;17520:::-;17662:3;17683:67;17747:2;17742:3;17683:67;:::i;:::-;17676:74;;17759:93;17848:3;17759:93;:::i;:::-;17877:2;17872:3;17868:12;17861:19;;17520:366;;;:::o;17892:::-;18034:3;18055:67;18119:2;18114:3;18055:67;:::i;:::-;18048:74;;18131:93;18220:3;18131:93;:::i;:::-;18249:2;18244:3;18240:12;18233:19;;17892:366;;;:::o;18264:::-;18406:3;18427:67;18491:2;18486:3;18427:67;:::i;:::-;18420:74;;18503:93;18592:3;18503:93;:::i;:::-;18621:2;18616:3;18612:12;18605:19;;18264:366;;;:::o;18636:::-;18778:3;18799:67;18863:2;18858:3;18799:67;:::i;:::-;18792:74;;18875:93;18964:3;18875:93;:::i;:::-;18993:2;18988:3;18984:12;18977:19;;18636:366;;;:::o;19008:::-;19150:3;19171:67;19235:2;19230:3;19171:67;:::i;:::-;19164:74;;19247:93;19336:3;19247:93;:::i;:::-;19365:2;19360:3;19356:12;19349:19;;19008:366;;;:::o;19380:::-;19522:3;19543:67;19607:2;19602:3;19543:67;:::i;:::-;19536:74;;19619:93;19708:3;19619:93;:::i;:::-;19737:2;19732:3;19728:12;19721:19;;19380:366;;;:::o;19752:::-;19894:3;19915:67;19979:2;19974:3;19915:67;:::i;:::-;19908:74;;19991:93;20080:3;19991:93;:::i;:::-;20109:2;20104:3;20100:12;20093:19;;19752:366;;;:::o;20124:::-;20266:3;20287:67;20351:2;20346:3;20287:67;:::i;:::-;20280:74;;20363:93;20452:3;20363:93;:::i;:::-;20481:2;20476:3;20472:12;20465:19;;20124:366;;;:::o;20496:::-;20638:3;20659:67;20723:2;20718:3;20659:67;:::i;:::-;20652:74;;20735:93;20824:3;20735:93;:::i;:::-;20853:2;20848:3;20844:12;20837:19;;20496:366;;;:::o;20868:::-;21010:3;21031:67;21095:2;21090:3;21031:67;:::i;:::-;21024:74;;21107:93;21196:3;21107:93;:::i;:::-;21225:2;21220:3;21216:12;21209:19;;20868:366;;;:::o;21240:::-;21382:3;21403:67;21467:2;21462:3;21403:67;:::i;:::-;21396:74;;21479:93;21568:3;21479:93;:::i;:::-;21597:2;21592:3;21588:12;21581:19;;21240:366;;;:::o;21612:::-;21754:3;21775:67;21839:2;21834:3;21775:67;:::i;:::-;21768:74;;21851:93;21940:3;21851:93;:::i;:::-;21969:2;21964:3;21960:12;21953:19;;21612:366;;;:::o;21984:::-;22126:3;22147:67;22211:2;22206:3;22147:67;:::i;:::-;22140:74;;22223:93;22312:3;22223:93;:::i;:::-;22341:2;22336:3;22332:12;22325:19;;21984:366;;;:::o;22356:::-;22498:3;22519:67;22583:2;22578:3;22519:67;:::i;:::-;22512:74;;22595:93;22684:3;22595:93;:::i;:::-;22713:2;22708:3;22704:12;22697:19;;22356:366;;;:::o;22728:::-;22870:3;22891:67;22955:2;22950:3;22891:67;:::i;:::-;22884:74;;22967:93;23056:3;22967:93;:::i;:::-;23085:2;23080:3;23076:12;23069:19;;22728:366;;;:::o;23100:::-;23242:3;23263:67;23327:2;23322:3;23263:67;:::i;:::-;23256:74;;23339:93;23428:3;23339:93;:::i;:::-;23457:2;23452:3;23448:12;23441:19;;23100:366;;;:::o;23472:::-;23614:3;23635:67;23699:2;23694:3;23635:67;:::i;:::-;23628:74;;23711:93;23800:3;23711:93;:::i;:::-;23829:2;23824:3;23820:12;23813:19;;23472:366;;;:::o;23844:398::-;24003:3;24024:83;24105:1;24100:3;24024:83;:::i;:::-;24017:90;;24116:93;24205:3;24116:93;:::i;:::-;24234:1;24229:3;24225:11;24218:18;;23844:398;;;:::o;24248:366::-;24390:3;24411:67;24475:2;24470:3;24411:67;:::i;:::-;24404:74;;24487:93;24576:3;24487:93;:::i;:::-;24605:2;24600:3;24596:12;24589:19;;24248:366;;;:::o;24620:::-;24762:3;24783:67;24847:2;24842:3;24783:67;:::i;:::-;24776:74;;24859:93;24948:3;24859:93;:::i;:::-;24977:2;24972:3;24968:12;24961:19;;24620:366;;;:::o;24992:::-;25134:3;25155:67;25219:2;25214:3;25155:67;:::i;:::-;25148:74;;25231:93;25320:3;25231:93;:::i;:::-;25349:2;25344:3;25340:12;25333:19;;24992:366;;;:::o;25364:::-;25506:3;25527:67;25591:2;25586:3;25527:67;:::i;:::-;25520:74;;25603:93;25692:3;25603:93;:::i;:::-;25721:2;25716:3;25712:12;25705:19;;25364:366;;;:::o;25736:::-;25878:3;25899:67;25963:2;25958:3;25899:67;:::i;:::-;25892:74;;25975:93;26064:3;25975:93;:::i;:::-;26093:2;26088:3;26084:12;26077:19;;25736:366;;;:::o;26108:::-;26250:3;26271:67;26335:2;26330:3;26271:67;:::i;:::-;26264:74;;26347:93;26436:3;26347:93;:::i;:::-;26465:2;26460:3;26456:12;26449:19;;26108:366;;;:::o;26480:::-;26622:3;26643:67;26707:2;26702:3;26643:67;:::i;:::-;26636:74;;26719:93;26808:3;26719:93;:::i;:::-;26837:2;26832:3;26828:12;26821:19;;26480:366;;;:::o;26852:118::-;26939:24;26957:5;26939:24;:::i;:::-;26934:3;26927:37;26852:118;;:::o;26976:112::-;27059:22;27075:5;27059:22;:::i;:::-;27054:3;27047:35;26976:112;;:::o;27094:275::-;27226:3;27248:95;27339:3;27330:6;27248:95;:::i;:::-;27241:102;;27360:3;27353:10;;27094:275;;;;:::o;27375:435::-;27555:3;27577:95;27668:3;27659:6;27577:95;:::i;:::-;27570:102;;27689:95;27780:3;27771:6;27689:95;:::i;:::-;27682:102;;27801:3;27794:10;;27375:435;;;;;:::o;27816:379::-;28000:3;28022:147;28165:3;28022:147;:::i;:::-;28015:154;;28186:3;28179:10;;27816:379;;;:::o;28201:222::-;28294:4;28332:2;28321:9;28317:18;28309:26;;28345:71;28413:1;28402:9;28398:17;28389:6;28345:71;:::i;:::-;28201:222;;;;:::o;28429:442::-;28578:4;28616:2;28605:9;28601:18;28593:26;;28629:71;28697:1;28686:9;28682:17;28673:6;28629:71;:::i;:::-;28710:72;28778:2;28767:9;28763:18;28754:6;28710:72;:::i;:::-;28792;28860:2;28849:9;28845:18;28836:6;28792:72;:::i;:::-;28429:442;;;;;;:::o;28877:332::-;28998:4;29036:2;29025:9;29021:18;29013:26;;29049:71;29117:1;29106:9;29102:17;29093:6;29049:71;:::i;:::-;29130:72;29198:2;29187:9;29183:18;29174:6;29130:72;:::i;:::-;28877:332;;;;;:::o;29215:210::-;29302:4;29340:2;29329:9;29325:18;29317:26;;29353:65;29415:1;29404:9;29400:17;29391:6;29353:65;:::i;:::-;29215:210;;;;:::o;29431:222::-;29524:4;29562:2;29551:9;29547:18;29539:26;;29575:71;29643:1;29632:9;29628:17;29619:6;29575:71;:::i;:::-;29431:222;;;;:::o;29659:313::-;29772:4;29810:2;29799:9;29795:18;29787:26;;29859:9;29853:4;29849:20;29845:1;29834:9;29830:17;29823:47;29887:78;29960:4;29951:6;29887:78;:::i;:::-;29879:86;;29659:313;;;;:::o;29978:419::-;30144:4;30182:2;30171:9;30167:18;30159:26;;30231:9;30225:4;30221:20;30217:1;30206:9;30202:17;30195:47;30259:131;30385:4;30259:131;:::i;:::-;30251:139;;29978:419;;;:::o;30403:::-;30569:4;30607:2;30596:9;30592:18;30584:26;;30656:9;30650:4;30646:20;30642:1;30631:9;30627:17;30620:47;30684:131;30810:4;30684:131;:::i;:::-;30676:139;;30403:419;;;:::o;30828:::-;30994:4;31032:2;31021:9;31017:18;31009:26;;31081:9;31075:4;31071:20;31067:1;31056:9;31052:17;31045:47;31109:131;31235:4;31109:131;:::i;:::-;31101:139;;30828:419;;;:::o;31253:::-;31419:4;31457:2;31446:9;31442:18;31434:26;;31506:9;31500:4;31496:20;31492:1;31481:9;31477:17;31470:47;31534:131;31660:4;31534:131;:::i;:::-;31526:139;;31253:419;;;:::o;31678:::-;31844:4;31882:2;31871:9;31867:18;31859:26;;31931:9;31925:4;31921:20;31917:1;31906:9;31902:17;31895:47;31959:131;32085:4;31959:131;:::i;:::-;31951:139;;31678:419;;;:::o;32103:::-;32269:4;32307:2;32296:9;32292:18;32284:26;;32356:9;32350:4;32346:20;32342:1;32331:9;32327:17;32320:47;32384:131;32510:4;32384:131;:::i;:::-;32376:139;;32103:419;;;:::o;32528:::-;32694:4;32732:2;32721:9;32717:18;32709:26;;32781:9;32775:4;32771:20;32767:1;32756:9;32752:17;32745:47;32809:131;32935:4;32809:131;:::i;:::-;32801:139;;32528:419;;;:::o;32953:::-;33119:4;33157:2;33146:9;33142:18;33134:26;;33206:9;33200:4;33196:20;33192:1;33181:9;33177:17;33170:47;33234:131;33360:4;33234:131;:::i;:::-;33226:139;;32953:419;;;:::o;33378:::-;33544:4;33582:2;33571:9;33567:18;33559:26;;33631:9;33625:4;33621:20;33617:1;33606:9;33602:17;33595:47;33659:131;33785:4;33659:131;:::i;:::-;33651:139;;33378:419;;;:::o;33803:::-;33969:4;34007:2;33996:9;33992:18;33984:26;;34056:9;34050:4;34046:20;34042:1;34031:9;34027:17;34020:47;34084:131;34210:4;34084:131;:::i;:::-;34076:139;;33803:419;;;:::o;34228:::-;34394:4;34432:2;34421:9;34417:18;34409:26;;34481:9;34475:4;34471:20;34467:1;34456:9;34452:17;34445:47;34509:131;34635:4;34509:131;:::i;:::-;34501:139;;34228:419;;;:::o;34653:::-;34819:4;34857:2;34846:9;34842:18;34834:26;;34906:9;34900:4;34896:20;34892:1;34881:9;34877:17;34870:47;34934:131;35060:4;34934:131;:::i;:::-;34926:139;;34653:419;;;:::o;35078:::-;35244:4;35282:2;35271:9;35267:18;35259:26;;35331:9;35325:4;35321:20;35317:1;35306:9;35302:17;35295:47;35359:131;35485:4;35359:131;:::i;:::-;35351:139;;35078:419;;;:::o;35503:::-;35669:4;35707:2;35696:9;35692:18;35684:26;;35756:9;35750:4;35746:20;35742:1;35731:9;35727:17;35720:47;35784:131;35910:4;35784:131;:::i;:::-;35776:139;;35503:419;;;:::o;35928:::-;36094:4;36132:2;36121:9;36117:18;36109:26;;36181:9;36175:4;36171:20;36167:1;36156:9;36152:17;36145:47;36209:131;36335:4;36209:131;:::i;:::-;36201:139;;35928:419;;;:::o;36353:::-;36519:4;36557:2;36546:9;36542:18;36534:26;;36606:9;36600:4;36596:20;36592:1;36581:9;36577:17;36570:47;36634:131;36760:4;36634:131;:::i;:::-;36626:139;;36353:419;;;:::o;36778:::-;36944:4;36982:2;36971:9;36967:18;36959:26;;37031:9;37025:4;37021:20;37017:1;37006:9;37002:17;36995:47;37059:131;37185:4;37059:131;:::i;:::-;37051:139;;36778:419;;;:::o;37203:::-;37369:4;37407:2;37396:9;37392:18;37384:26;;37456:9;37450:4;37446:20;37442:1;37431:9;37427:17;37420:47;37484:131;37610:4;37484:131;:::i;:::-;37476:139;;37203:419;;;:::o;37628:::-;37794:4;37832:2;37821:9;37817:18;37809:26;;37881:9;37875:4;37871:20;37867:1;37856:9;37852:17;37845:47;37909:131;38035:4;37909:131;:::i;:::-;37901:139;;37628:419;;;:::o;38053:::-;38219:4;38257:2;38246:9;38242:18;38234:26;;38306:9;38300:4;38296:20;38292:1;38281:9;38277:17;38270:47;38334:131;38460:4;38334:131;:::i;:::-;38326:139;;38053:419;;;:::o;38478:::-;38644:4;38682:2;38671:9;38667:18;38659:26;;38731:9;38725:4;38721:20;38717:1;38706:9;38702:17;38695:47;38759:131;38885:4;38759:131;:::i;:::-;38751:139;;38478:419;;;:::o;38903:::-;39069:4;39107:2;39096:9;39092:18;39084:26;;39156:9;39150:4;39146:20;39142:1;39131:9;39127:17;39120:47;39184:131;39310:4;39184:131;:::i;:::-;39176:139;;38903:419;;;:::o;39328:::-;39494:4;39532:2;39521:9;39517:18;39509:26;;39581:9;39575:4;39571:20;39567:1;39556:9;39552:17;39545:47;39609:131;39735:4;39609:131;:::i;:::-;39601:139;;39328:419;;;:::o;39753:::-;39919:4;39957:2;39946:9;39942:18;39934:26;;40006:9;40000:4;39996:20;39992:1;39981:9;39977:17;39970:47;40034:131;40160:4;40034:131;:::i;:::-;40026:139;;39753:419;;;:::o;40178:::-;40344:4;40382:2;40371:9;40367:18;40359:26;;40431:9;40425:4;40421:20;40417:1;40406:9;40402:17;40395:47;40459:131;40585:4;40459:131;:::i;:::-;40451:139;;40178:419;;;:::o;40603:::-;40769:4;40807:2;40796:9;40792:18;40784:26;;40856:9;40850:4;40846:20;40842:1;40831:9;40827:17;40820:47;40884:131;41010:4;40884:131;:::i;:::-;40876:139;;40603:419;;;:::o;41028:::-;41194:4;41232:2;41221:9;41217:18;41209:26;;41281:9;41275:4;41271:20;41267:1;41256:9;41252:17;41245:47;41309:131;41435:4;41309:131;:::i;:::-;41301:139;;41028:419;;;:::o;41453:::-;41619:4;41657:2;41646:9;41642:18;41634:26;;41706:9;41700:4;41696:20;41692:1;41681:9;41677:17;41670:47;41734:131;41860:4;41734:131;:::i;:::-;41726:139;;41453:419;;;:::o;41878:::-;42044:4;42082:2;42071:9;42067:18;42059:26;;42131:9;42125:4;42121:20;42117:1;42106:9;42102:17;42095:47;42159:131;42285:4;42159:131;:::i;:::-;42151:139;;41878:419;;;:::o;42303:::-;42469:4;42507:2;42496:9;42492:18;42484:26;;42556:9;42550:4;42546:20;42542:1;42531:9;42527:17;42520:47;42584:131;42710:4;42584:131;:::i;:::-;42576:139;;42303:419;;;:::o;42728:::-;42894:4;42932:2;42921:9;42917:18;42909:26;;42981:9;42975:4;42971:20;42967:1;42956:9;42952:17;42945:47;43009:131;43135:4;43009:131;:::i;:::-;43001:139;;42728:419;;;:::o;43153:::-;43319:4;43357:2;43346:9;43342:18;43334:26;;43406:9;43400:4;43396:20;43392:1;43381:9;43377:17;43370:47;43434:131;43560:4;43434:131;:::i;:::-;43426:139;;43153:419;;;:::o;43578:::-;43744:4;43782:2;43771:9;43767:18;43759:26;;43831:9;43825:4;43821:20;43817:1;43806:9;43802:17;43795:47;43859:131;43985:4;43859:131;:::i;:::-;43851:139;;43578:419;;;:::o;44003:::-;44169:4;44207:2;44196:9;44192:18;44184:26;;44256:9;44250:4;44246:20;44242:1;44231:9;44227:17;44220:47;44284:131;44410:4;44284:131;:::i;:::-;44276:139;;44003:419;;;:::o;44428:222::-;44521:4;44559:2;44548:9;44544:18;44536:26;;44572:71;44640:1;44629:9;44625:17;44616:6;44572:71;:::i;:::-;44428:222;;;;:::o;44656:332::-;44777:4;44815:2;44804:9;44800:18;44792:26;;44828:71;44896:1;44885:9;44881:17;44872:6;44828:71;:::i;:::-;44909:72;44977:2;44966:9;44962:18;44953:6;44909:72;:::i;:::-;44656:332;;;;;:::o;44994:214::-;45083:4;45121:2;45110:9;45106:18;45098:26;;45134:67;45198:1;45187:9;45183:17;45174:6;45134:67;:::i;:::-;44994:214;;;;:::o;45214:725::-;45292:4;45298:6;45354:11;45341:25;45454:1;45448:4;45444:12;45433:8;45417:14;45413:29;45409:48;45389:18;45385:73;45375:168;;45462:79;;:::i;:::-;45375:168;45574:18;45564:8;45560:33;45552:41;;45626:4;45613:18;45603:28;;45654:18;45646:6;45643:30;45640:117;;;45676:79;;:::i;:::-;45640:117;45784:2;45778:4;45774:13;45766:21;;45841:4;45833:6;45829:17;45813:14;45809:38;45803:4;45799:49;45796:136;;;45851:79;;:::i;:::-;45796:136;45305:634;45214:725;;;;;:::o;45945:129::-;45979:6;46006:20;;:::i;:::-;45996:30;;46035:33;46063:4;46055:6;46035:33;:::i;:::-;45945:129;;;:::o;46080:75::-;46113:6;46146:2;46140:9;46130:19;;46080:75;:::o;46161:308::-;46223:4;46313:18;46305:6;46302:30;46299:56;;;46335:18;;:::i;:::-;46299:56;46373:29;46395:6;46373:29;:::i;:::-;46365:37;;46457:4;46451;46447:15;46439:23;;46161:308;;;:::o;46475:99::-;46527:6;46561:5;46555:12;46545:22;;46475:99;;;:::o;46580:147::-;46681:11;46718:3;46703:18;;46580:147;;;;:::o;46733:169::-;46817:11;46851:6;46846:3;46839:19;46891:4;46886:3;46882:14;46867:29;;46733:169;;;;:::o;46908:148::-;47010:11;47047:3;47032:18;;46908:148;;;;:::o;47062:305::-;47102:3;47121:20;47139:1;47121:20;:::i;:::-;47116:25;;47155:20;47173:1;47155:20;:::i;:::-;47150:25;;47309:1;47241:66;47237:74;47234:1;47231:81;47228:107;;;47315:18;;:::i;:::-;47228:107;47359:1;47356;47352:9;47345:16;;47062:305;;;;:::o;47373:348::-;47413:7;47436:20;47454:1;47436:20;:::i;:::-;47431:25;;47470:20;47488:1;47470:20;:::i;:::-;47465:25;;47658:1;47590:66;47586:74;47583:1;47580:81;47575:1;47568:9;47561:17;47557:105;47554:131;;;47665:18;;:::i;:::-;47554:131;47713:1;47710;47706:9;47695:20;;47373:348;;;;:::o;47727:191::-;47767:4;47787:20;47805:1;47787:20;:::i;:::-;47782:25;;47821:20;47839:1;47821:20;:::i;:::-;47816:25;;47860:1;47857;47854:8;47851:34;;;47865:18;;:::i;:::-;47851:34;47910:1;47907;47903:9;47895:17;;47727:191;;;;:::o;47924:96::-;47961:7;47990:24;48008:5;47990:24;:::i;:::-;47979:35;;47924:96;;;:::o;48026:90::-;48060:7;48103:5;48096:13;48089:21;48078:32;;48026:90;;;:::o;48122:77::-;48159:7;48188:5;48177:16;;48122:77;;;:::o;48205:126::-;48242:7;48282:42;48275:5;48271:54;48260:65;;48205:126;;;:::o;48337:77::-;48374:7;48403:5;48392:16;;48337:77;;;:::o;48420:86::-;48455:7;48495:4;48488:5;48484:16;48473:27;;48420:86;;;:::o;48512:154::-;48596:6;48591:3;48586;48573:30;48658:1;48649:6;48644:3;48640:16;48633:27;48512:154;;;:::o;48672:307::-;48740:1;48750:113;48764:6;48761:1;48758:13;48750:113;;;48849:1;48844:3;48840:11;48834:18;48830:1;48825:3;48821:11;48814:39;48786:2;48783:1;48779:10;48774:15;;48750:113;;;48881:6;48878:1;48875:13;48872:101;;;48961:1;48952:6;48947:3;48943:16;48936:27;48872:101;48721:258;48672:307;;;:::o;48985:320::-;49029:6;49066:1;49060:4;49056:12;49046:22;;49113:1;49107:4;49103:12;49134:18;49124:81;;49190:4;49182:6;49178:17;49168:27;;49124:81;49252:2;49244:6;49241:14;49221:18;49218:38;49215:84;;;49271:18;;:::i;:::-;49215:84;49036:269;48985:320;;;:::o;49311:281::-;49394:27;49416:4;49394:27;:::i;:::-;49386:6;49382:40;49524:6;49512:10;49509:22;49488:18;49476:10;49473:34;49470:62;49467:88;;;49535:18;;:::i;:::-;49467:88;49575:10;49571:2;49564:22;49354:238;49311:281;;:::o;49598:233::-;49637:3;49660:24;49678:5;49660:24;:::i;:::-;49651:33;;49706:66;49699:5;49696:77;49693:103;;;49776:18;;:::i;:::-;49693:103;49823:1;49816:5;49812:13;49805:20;;49598:233;;;:::o;49837:180::-;49885:77;49882:1;49875:88;49982:4;49979:1;49972:15;50006:4;50003:1;49996:15;50023:180;50071:77;50068:1;50061:88;50168:4;50165:1;50158:15;50192:4;50189:1;50182:15;50209:180;50257:77;50254:1;50247:88;50354:4;50351:1;50344:15;50378:4;50375:1;50368:15;50395:180;50443:77;50440:1;50433:88;50540:4;50537:1;50530:15;50564:4;50561:1;50554:15;50581:117;50690:1;50687;50680:12;50704:117;50813:1;50810;50803:12;50827:117;50936:1;50933;50926:12;50950:117;51059:1;51056;51049:12;51073:117;51182:1;51179;51172:12;51196:117;51305:1;51302;51295:12;51319:117;51428:1;51425;51418:12;51442:117;51551:1;51548;51541:12;51565:117;51674:1;51671;51664:12;51688:102;51729:6;51780:2;51776:7;51771:2;51764:5;51760:14;51756:28;51746:38;;51688:102;;;:::o;51796:222::-;51936:34;51932:1;51924:6;51920:14;51913:58;52005:5;52000:2;51992:6;51988:15;51981:30;51796:222;:::o;52024:224::-;52164:34;52160:1;52152:6;52148:14;52141:58;52233:7;52228:2;52220:6;52216:15;52209:32;52024:224;:::o;52254:170::-;52394:22;52390:1;52382:6;52378:14;52371:46;52254:170;:::o;52430:229::-;52570:34;52566:1;52558:6;52554:14;52547:58;52639:12;52634:2;52626:6;52622:15;52615:37;52430:229;:::o;52665:221::-;52805:34;52801:1;52793:6;52789:14;52782:58;52874:4;52869:2;52861:6;52857:15;52850:29;52665:221;:::o;52892:225::-;53032:34;53028:1;53020:6;53016:14;53009:58;53101:8;53096:2;53088:6;53084:15;53077:33;52892:225;:::o;53123:221::-;53263:34;53259:1;53251:6;53247:14;53240:58;53332:4;53327:2;53319:6;53315:15;53308:29;53123:221;:::o;53350:236::-;53490:34;53486:1;53478:6;53474:14;53467:58;53559:19;53554:2;53546:6;53542:15;53535:44;53350:236;:::o;53592:179::-;53732:31;53728:1;53720:6;53716:14;53709:55;53592:179;:::o;53777:225::-;53917:34;53913:1;53905:6;53901:14;53894:58;53986:8;53981:2;53973:6;53969:15;53962:33;53777:225;:::o;54008:242::-;54148:34;54144:1;54136:6;54132:14;54125:58;54217:25;54212:2;54204:6;54200:15;54193:50;54008:242;:::o;54256:179::-;54396:31;54392:1;54384:6;54380:14;54373:55;54256:179;:::o;54441:250::-;54581:34;54577:1;54569:6;54565:14;54558:58;54650:33;54645:2;54637:6;54633:15;54626:58;54441:250;:::o;54697:246::-;54837:34;54833:1;54825:6;54821:14;54814:58;54906:29;54901:2;54893:6;54889:15;54882:54;54697:246;:::o;54949:166::-;55089:18;55085:1;55077:6;55073:14;55066:42;54949:166;:::o;55121:289::-;55261:34;55257:1;55249:6;55245:14;55238:58;55330:34;55325:2;55317:6;55313:15;55306:59;55399:3;55394:2;55386:6;55382:15;55375:28;55121:289;:::o;55416:169::-;55556:21;55552:1;55544:6;55540:14;55533:45;55416:169;:::o;55591:251::-;55731:34;55727:1;55719:6;55715:14;55708:58;55800:34;55795:2;55787:6;55783:15;55776:59;55591:251;:::o;55848:174::-;55988:26;55984:1;55976:6;55972:14;55965:50;55848:174;:::o;56028:230::-;56168:34;56164:1;56156:6;56152:14;56145:58;56237:13;56232:2;56224:6;56220:15;56213:38;56028:230;:::o;56264:242::-;56404:34;56400:1;56392:6;56388:14;56381:58;56473:25;56468:2;56460:6;56456:15;56449:50;56264:242;:::o;56512:182::-;56652:34;56648:1;56640:6;56636:14;56629:58;56512:182;:::o;56700:220::-;56840:34;56836:1;56828:6;56824:14;56817:58;56909:3;56904:2;56896:6;56892:15;56885:28;56700:220;:::o;56926:231::-;57066:34;57062:1;57054:6;57050:14;57043:58;57135:14;57130:2;57122:6;57118:15;57111:39;56926:231;:::o;57163:224::-;57303:34;57299:1;57291:6;57287:14;57280:58;57372:7;57367:2;57359:6;57355:15;57348:32;57163:224;:::o;57393:176::-;57533:28;57529:1;57521:6;57517:14;57510:52;57393:176;:::o;57575:178::-;57715:30;57711:1;57703:6;57699:14;57692:54;57575:178;:::o;57759:114::-;;:::o;57879:223::-;58019:34;58015:1;58007:6;58003:14;57996:58;58088:6;58083:2;58075:6;58071:15;58064:31;57879:223;:::o;58108:233::-;58248:34;58244:1;58236:6;58232:14;58225:58;58317:16;58312:2;58304:6;58300:15;58293:41;58108:233;:::o;58347:222::-;58487:34;58483:1;58475:6;58471:14;58464:58;58556:5;58551:2;58543:6;58539:15;58532:30;58347:222;:::o;58575:172::-;58715:24;58711:1;58703:6;58699:14;58692:48;58575:172;:::o;58753:224::-;58893:34;58889:1;58881:6;58877:14;58870:58;58962:7;58957:2;58949:6;58945:15;58938:32;58753:224;:::o;58983:235::-;59123:34;59119:1;59111:6;59107:14;59100:58;59192:18;59187:2;59179:6;59175:15;59168:43;58983:235;:::o;59224:181::-;59364:33;59360:1;59352:6;59348:14;59341:57;59224:181;:::o;59411:122::-;59484:24;59502:5;59484:24;:::i;:::-;59477:5;59474:35;59464:63;;59523:1;59520;59513:12;59464:63;59411:122;:::o;59539:116::-;59609:21;59624:5;59609:21;:::i;:::-;59602:5;59599:32;59589:60;;59645:1;59642;59635:12;59589:60;59539:116;:::o;59661:122::-;59734:24;59752:5;59734:24;:::i;:::-;59727:5;59724:35;59714:63;;59773:1;59770;59763:12;59714:63;59661:122;:::o;59789:::-;59862:24;59880:5;59862:24;:::i;:::-;59855:5;59852:35;59842:63;;59901:1;59898;59891:12;59842:63;59789:122;:::o

Swarm Source

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