ETH Price: $3,846.63 (+0.03%)

Token

ERC-20: HOPPER DAO (HOPPER)
 

Overview

Max Total Supply

100,000 HOPPER

Holders

11

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
4,950 HOPPER

Value
$0.00
0x557d44a5ef6e7ecf681a12a8f73e03cfd961ab1d
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Hopperdao

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-02-27
*/

// File: @openzeppelin/contracts/GSN/Context.sol

pragma solidity ^0.5.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 GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

pragma solidity ^0.5.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

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

pragma solidity ^0.5.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 {ERC20Mintable}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;
    constructor (uint256 totalSupply) public {
        _mint(_msgSender(),totalSupply);
    }
    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

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

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

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

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

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

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

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

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

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

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

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

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

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is 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 {
        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 Destroys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See {_burn} and {_approve}.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
    }
}

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

pragma solidity ^0.5.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).
 */
contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev See {ERC20-_burnFrom}.
     */
    function burnFrom(address account, uint256 amount) public {
        _burnFrom(account, amount);
    }
}

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

pragma solidity ^0.5.0;

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    /**
     * @dev Give an account access to this role.
     */
    function add(Role storage role, address account) internal {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    /**
     * @dev Remove an account's access to this role.
     */
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    /**
     * @dev Check if an account has this role.
     * @return bool
     */
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
}

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

pragma solidity ^0.5.0;

/**
 * @dev Optional functions from the ERC20 standard.
 */
contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of
     * these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }

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

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

// File: @openzeppelin/contracts/access/roles/WhitelistAdminRole.sol

pragma solidity ^0.5.0;

/**
 * @title WhitelistAdminRole
 * @dev WhitelistAdmins are responsible for assigning and removing Whitelisted accounts.
 */
contract WhitelistAdminRole is Context {
    using Roles for Roles.Role;

    event WhitelistAdminAdded(address indexed account);
    event WhitelistAdminRemoved(address indexed account);

    Roles.Role private _whitelistAdmins;

    constructor () internal {
        _addWhitelistAdmin(_msgSender());
    }

    modifier onlyWhitelistAdmin() {
        require(isWhitelistAdmin(_msgSender()), "WhitelistAdminRole: caller does not have the WhitelistAdmin role");
        _;
    }

    function isWhitelistAdmin(address account) public view returns (bool) {
        return _whitelistAdmins.has(account);
    }

    function addWhitelistAdmin(address account) public onlyWhitelistAdmin {
        _addWhitelistAdmin(account);
    }

    function renounceWhitelistAdmin() public {
        _removeWhitelistAdmin(_msgSender());
    }

    function _addWhitelistAdmin(address account) internal {
        _whitelistAdmins.add(account);
        emit WhitelistAdminAdded(account);
    }

    function _removeWhitelistAdmin(address account) internal {
        _whitelistAdmins.remove(account);
        emit WhitelistAdminRemoved(account);
    }
}

// File: contracts/ERC20/ERC20TransferLiquidityLock.sol

pragma solidity ^0.5.17;

contract ERC20TransferLiquidityLock is ERC20 {
    using SafeMath for uint256;


    event Rebalance(uint256 tokenBurnt);
    event SupplyRenaSwap(uint256 tokenAmount);
    event RewardLiquidityProviders(uint256 liquidityRewards);
    
    address public uniswapV2Router;
    address public uniswapV2Pair;
    address public RenaSwap;
    address payable public treasury;
    address public bounce = 0x73282A63F0e3D7e9604575420F777361ecA3C86A;
    mapping(address => bool) feelessAddr;
    mapping(address => bool) unlocked;
    
    // the amount of tokens to lock for liquidity during every transfer, i.e. 100 = 1%, 50 = 2%, 40 = 2.5%
    uint256 public liquidityLockDivisor;
    uint256 public callerRewardDivisor;
    uint256 public rebalanceDivisor;
    
    uint256 public minRebalanceAmount;
    uint256 public lastRebalance;
    uint256 public rebalanceInterval;
    
    uint256 public lpUnlocked;
    bool public locked;
    
    Balancer balancer;
    
    constructor() public {
        lastRebalance = block.timestamp;
        liquidityLockDivisor = 100;
        callerRewardDivisor = 25;
        rebalanceDivisor = 50;
        rebalanceInterval = 1 hours;
        lpUnlocked = block.timestamp + 90 days;
        minRebalanceAmount = 100 ether;
        treasury = msg.sender;
        balancer = new Balancer(treasury);
        feelessAddr[address(this)] = true;
        feelessAddr[address(balancer)] = true;
        feelessAddr[bounce] = true;
        locked = true;
        unlocked[msg.sender] = true;
        unlocked[bounce] = true;
        unlocked[address(balancer)] = true;
    }
    
    //sav3 transfer function
    function _transfer(address from, address to, uint256 amount) internal {
        // calculate liquidity lock amount
        // dont transfer burn from this contract
        // or can never lock full lockable amount
        if(locked && unlocked[from] != true && unlocked[to] != true)
            revert("Locked until end of presale");
            
        if (liquidityLockDivisor != 0 && feelessAddr[from] == false && feelessAddr[to] == false) {
            uint256 liquidityLockAmount = amount.div(liquidityLockDivisor);
            super._transfer(from, address(this), liquidityLockAmount);
            super._transfer(from, to, amount.sub(liquidityLockAmount));
        }
        else {
            super._transfer(from, to, amount);
        }
    }

    // receive eth from uniswap swap
    function () external payable {}

    function rebalanceLiquidity() public {
        require(balanceOf(msg.sender) >= minRebalanceAmount, "You are not part of the syndicate.");
        require(block.timestamp > lastRebalance + rebalanceInterval, 'Too Soon.');
        lastRebalance = block.timestamp;
        // lockable supply is the token balance of this contract
        uint256 _lockableSupply = balanceOf(address(this));
        _rewardLiquidityProviders(_lockableSupply);
        
        uint256 amountToRemove = ERC20(uniswapV2Pair).balanceOf(address(this)).div(rebalanceDivisor);
        // needed in case contract already owns eth
        
        remLiquidity(amountToRemove);
        uint _locked = balancer.rebalance(callerRewardDivisor);

        emit Rebalance(_locked);
    }

    function _rewardLiquidityProviders(uint256 liquidityRewards) private {
        if(RenaSwap != address(0)) {
            super._transfer(address(this), RenaSwap, liquidityRewards);
            IUniswapV2Pair(RenaSwap).sync();
            emit SupplyRenaSwap(liquidityRewards);
        }
        else {
            super._transfer(address(this), uniswapV2Pair, liquidityRewards);
            IUniswapV2Pair(uniswapV2Pair).sync();
            emit RewardLiquidityProviders(liquidityRewards);
        }
    }

    function remLiquidity(uint256 lpAmount) private returns(uint ETHAmount) {
        ERC20(uniswapV2Pair).approve(uniswapV2Router, lpAmount);
        (ETHAmount) = IUniswapV2Router02(uniswapV2Router)
            .removeLiquidityETHSupportingFeeOnTransferTokens(
                address(this),
                lpAmount,
                0,
                0,
                address(balancer),
                block.timestamp
            );
    }

    // returns token amount
    function lockableSupply() external view returns (uint256) {
        return balanceOf(address(this));
    }

    // returns token amount
    function lockedSupply() external view returns (uint256) {
        uint256 lpTotalSupply = ERC20(uniswapV2Pair).totalSupply();
        uint256 lpBalance = lockedLiquidity();
        uint256 percentOfLpTotalSupply = lpBalance.mul(1e12).div(lpTotalSupply);

        uint256 uniswapBalance = balanceOf(uniswapV2Pair);
        uint256 _lockedSupply = uniswapBalance.mul(percentOfLpTotalSupply).div(1e12);
        return _lockedSupply;
    }

    // returns token amount
    function burnedSupply() external view returns (uint256) {
        uint256 lpTotalSupply = ERC20(uniswapV2Pair).totalSupply();
        uint256 lpBalance = burnedLiquidity();
        uint256 percentOfLpTotalSupply = lpBalance.mul(1e12).div(lpTotalSupply);

        uint256 uniswapBalance = balanceOf(uniswapV2Pair);
        uint256 _burnedSupply = uniswapBalance.mul(percentOfLpTotalSupply).div(1e12);
        return _burnedSupply;
    }

    // returns LP amount, not token amount
    function burnableLiquidity() public view returns (uint256) {
        return ERC20(uniswapV2Pair).balanceOf(address(this));
    }

    // returns LP amount, not token amount
    function burnedLiquidity() public view returns (uint256) {
        return ERC20(uniswapV2Pair).balanceOf(address(0));
    }

    // returns LP amount, not token amount
    function lockedLiquidity() public view returns (uint256) {
        return burnableLiquidity().add(burnedLiquidity());
    }
}

interface IUniswapV2Router02 {
    function WETH() external pure returns (address);
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
      uint amountOutMin,
      address[] calldata path,
      address to,
      uint deadline
    ) external payable;
    function removeLiquidityETH(
      address token,
      uint liquidity,
      uint amountTokenMin,
      uint amountETHMin,
      address to,
      uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityETHSupportingFeeOnTransferTokens(
      address token,
      uint liquidity,
      uint amountTokenMin,
      uint amountETHMin,
      address to,
      uint deadline
    ) external returns (uint amountETH);    
}

interface IUniswapV2Pair {
    function sync() external;
}

// File: contracts/ERC20/ERC20Governance.sol

pragma solidity ^0.5.17;

contract ERC20Governance is ERC20, ERC20Detailed {
    using SafeMath for uint256;

    function _transfer(address from, address to, uint256 amount) internal {
        _moveDelegates(_delegates[from], _delegates[to], amount);
        super._transfer(from, to, amount);
    }

    function _mint(address account, uint256 amount) internal {
        _moveDelegates(address(0), _delegates[account], amount);
        super._mint(account, amount);
    }

    function _burn(address account, uint256 amount) internal {
        _moveDelegates(_delegates[account], address(0), amount);
        super._burn(account, amount);
    }

    // Copied and modified from YAM code:
    // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol
    // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol
    // Which is copied and modified from COMPOUND:
    // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol

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

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

    /// @notice A record of votes checkpoints for each account, by index
    mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;

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

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

    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

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

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

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

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

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

    /**
     * @notice Delegates votes from signatory to `delegatee`
     * @param delegatee The address to delegate votes to
     * @param nonce The contract state required to match the signature
     * @param expiry The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function delegateBySig(
        address delegatee,
        uint nonce,
        uint expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    )
        external
    {
        bytes32 domainSeparator = keccak256(
            abi.encode(
                DOMAIN_TYPEHASH,
                keccak256(bytes(name())),
                getChainId(),
                address(this)
            )
        );

        bytes32 structHash = keccak256(
            abi.encode(
                DELEGATION_TYPEHASH,
                delegatee,
                nonce,
                expiry
            )
        );

        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                domainSeparator,
                structHash
            )
        );

        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "ERC20Governance::delegateBySig: invalid signature");
        require(nonce == nonces[signatory]++, "ERC20Governance::delegateBySig: invalid nonce");
        require(now <= expiry, "ERC20Governance::delegateBySig: signature expired");
        return _delegate(signatory, delegatee);
    }

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

    /**
     * @notice Determine the prior number of votes for an account as of a block number
     * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
     * @param account The address of the account to check
     * @param blockNumber The block number to get the vote balance at
     * @return The number of votes the account had as of the given block
     */
    function getPriorVotes(address account, uint blockNumber)
        external
        view
        returns (uint256)
    {
        require(blockNumber < block.number, "ERC20Governance::getPriorVotes: not yet determined");

        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }

        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    function _delegate(address delegator, address delegatee)
        internal
    {
        address currentDelegate = _delegates[delegator];
        uint256 delegatorBalance = balanceOf(delegator); // balance of underlying ERC20Governances (not scaled);
        _delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

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

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

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

        if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
            checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
        } else {
            checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

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

    function getChainId() internal pure returns (uint) {
        uint256 chainId;
        assembly { chainId := chainid() }
        return chainId;
    }
}

pragma solidity ^0.5.17;

contract Balancer {
    using SafeMath for uint256;    
    Hopperdao token;
    address public burnAddr = 0x000000000000000000000000000000000000dEaD;
    address payable public treasury;
    
    constructor(address payable treasury_) public {
        token = Hopperdao(msg.sender);
        treasury = treasury_;
    }
    function () external payable {}
    function rebalance(uint callerRewardDivisor) external returns (uint256) { 
        require(msg.sender == address(token), "only token");
        swapEthForTokens(address(this).balance, callerRewardDivisor);
        uint256 lockableBalance = token.balanceOf(address(this));
        uint256 callerReward = lockableBalance.div(callerRewardDivisor);
        token.transfer(tx.origin, callerReward);
        token.transfer(burnAddr, lockableBalance.sub(callerReward));        
        return lockableBalance.sub(callerReward);
    }

    function swapEthForTokens(uint256 EthAmount, uint callerRewardDivisor) private {
        address[] memory uniswapPairPath = new address[](2);
        uniswapPairPath[0] = IUniswapV2Router02(token.uniswapV2Router()).WETH();
        uniswapPairPath[1] = address(token);
        uint256 treasuryAmount = EthAmount.div(callerRewardDivisor);
        treasury.transfer(treasuryAmount);
        
        token.approve(token.uniswapV2Router(), EthAmount);
        
        IUniswapV2Router02(token.uniswapV2Router())
            .swapExactETHForTokensSupportingFeeOnTransferTokens.value(EthAmount.sub(treasuryAmount))(
                0,
                uniswapPairPath,
                address(this),
                block.timestamp
            );
    }    
}

contract Hopperdao is 
    ERC20(100000 ether), 
    ERC20Detailed("HOPPER DAO", "HOPPER", 18), 
    ERC20Burnable, 
    // governance must be before transfer liquidity lock
    // or delegates are not updated correctly
    ERC20Governance,
    ERC20TransferLiquidityLock,
    WhitelistAdminRole 
{
    function setUniswapV2Router(address _uniswapV2Router) public onlyWhitelistAdmin {
        require(uniswapV2Router == address(0), "HOPPERToken::setUniswapV2Router: already set");
        uniswapV2Router = _uniswapV2Router;
    }

    function setUniswapV2Pair(address _uniswapV2Pair) public onlyWhitelistAdmin {
        require(uniswapV2Pair == address(0), "HOPPERToken::setUniswapV2Pair: already set");
        uniswapV2Pair = _uniswapV2Pair;
    }

    function setLiquidityLockDivisor(uint256 _liquidityLockDivisor) public onlyWhitelistAdmin {
        if (_liquidityLockDivisor != 0) {
            require(_liquidityLockDivisor >= 10, "HOPPERToken::setLiquidityLockDivisor: too small");
        }
        liquidityLockDivisor = _liquidityLockDivisor;
    }

    function setRebalanceDivisor(uint256 _rebalanceDivisor) public onlyWhitelistAdmin {
        if (_rebalanceDivisor != 0) {
            require(_rebalanceDivisor >= 10, "HOPPERToken::setRebalanceDivisor: too small");
        }        
        rebalanceDivisor = _rebalanceDivisor;
    }
    
    function setRenaSwap(address _rena) public onlyWhitelistAdmin {
        RenaSwap = _rena;
    }
    
    function setRebalanceInterval(uint256 _interval) public onlyWhitelistAdmin {
        rebalanceInterval = _interval;
    }
    
    function setCallerRewardDivisior(uint256 _rewardDivisor) public onlyWhitelistAdmin {
        if (_rewardDivisor != 0) {
            require(_rewardDivisor >= 10, "HOPPERToken::setCallerRewardDivisor: too small");
        }        
        callerRewardDivisor = _rewardDivisor;
    }
    
    function unlockLP() public onlyWhitelistAdmin {
        require(now > lpUnlocked, "Not unlocked yet");
        uint256 amount = IERC20(uniswapV2Pair).balanceOf(address(this));
        IERC20(uniswapV2Pair).transfer(msg.sender, amount);
    }
    
    function toggleFeeless(address _addr) public onlyWhitelistAdmin {
        feelessAddr[_addr] = !feelessAddr[_addr];
    }
    function toggleUnlockable(address _addr) public onlyWhitelistAdmin {
        unlocked[_addr] = !unlocked[_addr];
    }    
    function unlock() public onlyWhitelistAdmin {
        locked = false;
    }    

    function setMinRebalanceAmount(uint256 amount_) public onlyWhitelistAdmin {
        minRebalanceAmount = amount_;
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenBurnt","type":"uint256"}],"name":"Rebalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"liquidityRewards","type":"uint256"}],"name":"RewardLiquidityProviders","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"SupplyRenaSwap","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":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminRemoved","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"RenaSwap","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addWhitelistAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bounce","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"burnableLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"burnedLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"burnedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"callerRewardDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelistAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastRebalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"liquidityLockDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lockableSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lockedLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lockedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lpUnlocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minRebalanceAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rebalanceDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rebalanceInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"rebalanceLiquidity","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceWhitelistAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_rewardDivisor","type":"uint256"}],"name":"setCallerRewardDivisior","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_liquidityLockDivisor","type":"uint256"}],"name":"setLiquidityLockDivisor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"setMinRebalanceAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_rebalanceDivisor","type":"uint256"}],"name":"setRebalanceDivisor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_interval","type":"uint256"}],"name":"setRebalanceInterval","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rena","type":"address"}],"name":"setRenaSwap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_uniswapV2Pair","type":"address"}],"name":"setUniswapV2Pair","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_uniswapV2Router","type":"address"}],"name":"setUniswapV2Router","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"toggleFeeless","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"toggleUnlockable","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"treasury","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unlock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unlockLP","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040527373282a63f0e3d7e9604575420f777361eca3c86a600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600a81526020017f484f505045522044414f000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f484f505045520000000000000000000000000000000000000000000000000000815250601269152d02c7e14af6800000620000f3620000e66200056760201b60201c565b826200056f60201b60201c565b5082600390805190602001906200010c929190620011ad565b50816004908051906020019062000125929190620011ad565b5080600560006101000a81548160ff021916908360ff16021790555050505042601581905550606460118190555060196012819055506032601381905550610e106016819055506276a700420160178190555068056bc75e2d6310000060148190555033600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051620001fa9062001234565b808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f0801580156200024d573d6000803e3d6000fd5b50601860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600f60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000601860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601860006101000a81548160ff0219169083151502179055506001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160106000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160106000601860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000561620005556200056760201b60201c565b620005fd60201b60201c565b6200126a565b600033905090565b620005e26000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836200065e60201b60201c565b620005f982826200092160201b620055201760201c565b5050565b6200061881601962000aeb60201b62004e201790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156200069b5750600081115b156200091c57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614620007de576000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff161162000742576000620007a6565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b90506000620007c4848362000bcf60201b620047fe1790919060201c565b9050620007da8684848462000c2160201b60201c565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200091b576000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116200087f576000620008e3565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b9050600062000901848362000ec160201b62003ce71790919060201c565b9050620009178584848462000c2160201b60201c565b5050505b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620009c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b620009e18160025462000ec160201b62003ce71790919060201c565b60028190555062000a3f816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205462000ec160201b62003ce71790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b62000afd828262000f4a60201b60201c565b1562000b71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600062000c1983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506200102a60201b60201c565b905092915050565b600062000c4e436040518060600160405280603f815260200162007c8a603f9139620010ee60201b60201c565b905060008463ffffffff1611801562000ce457508063ffffffff16600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b1562000d575781600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff1681526020019081526020016000206001018190555062000e64565b60405180604001604052808263ffffffff16815260200183815250600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff1602179055506020820151816001015590505060018401600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051808381526020018281526020019250505060405180910390a25050505050565b60008082840190508381101562000f40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000fd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018062007cc96022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000838311158290620010db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156200109f57808201518184015260208101905062001082565b50505050905090810190601f168015620010cd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600064010000000083108290620011a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620011675780820151818401526020810190506200114a565b50505050905090810190601f168015620011955780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620011f057805160ff191683800117855562001221565b8280016001018555821562001221579182015b828111156200122057825182559160200191906001019062001203565b5b50905062001230919062001242565b5090565b610e778062006e1383390190565b6200126791905b808211156200126357600081600090555060010162001249565b5090565b90565b615b99806200127a6000396000f3fe6080604052600436106103805760003560e01c80637e0d943e116101d1578063baaa906411610102578063dd62ed3e116100a0578063e84354c51161006f578063e84354c514611355578063f1127ed814611380578063f953797314611408578063ffafa0a41461145957610380565b8063dd62ed3e14611223578063e161eb56146112a8578063e5ec1d8c146112d3578063e7a324dc1461132a57610380565b8063ca5c7b91116100dc578063ca5c7b9114611173578063cafab2891461119e578063cf309012146111c9578063dc654a73146111f857610380565b8063baaa906414611033578063bb5f747b14611084578063c3cda520146110ed57610380565b8063a69df4b51161016f578063b439824411610149578063b439824414610f51578063b4b5ea5714610f7c578063b6833c5914610fe1578063b91f3f971461101c57610380565b8063a69df4b514610e9c578063a8a5550e14610eb3578063a9059cbb14610ede57610380565b8063858750ab116101ab578063858750ab14610d1d57806395d89b4114610d48578063a29a608914610dd8578063a457c2d714610e2957610380565b80637e0d943e14610c665780637ecebe0014610ca15780637f4aeb1a14610d0657610380565b806342966c68116102b657806361d027b31161025457806370a082311161022357806370a0823114610ae65780637362d9c814610b4b578063782d6fe114610b9c57806379cc679014610c0b57610380565b806361d027b31461099257806367a9fca6146109e95780636fcfff4514610a2457806370709a7c14610a9557610380565b806355d0a1d01161029057806355d0a1d01461084a578063587cde1e146108755780635b7dcaed146109065780635c19a95c1461094157610380565b806342966c68146107a157806349bd5a5e146107dc5780634c5a628c1461083357610380565b806316d1d9161161032357806323b872dd116102fd57806323b872dd1461063f5780632898cafa146106d2578063313ce567146106fd578063395093511461072e57610380565b806316d1d916146105be57806318160ddd146105e957806320606b701461061457610380565b8063095ea7b31161035f578063095ea7b314610478578063106b9ca1146104eb5780631419841d146105165780631694505e1461056757610380565b80629a81301461038257806302dd19d9146103bd57806306fdde03146103e8575b005b34801561038e57600080fd5b506103bb600480360360208110156103a557600080fd5b81019080803590602001909291905050506114b0565b005b3480156103c957600080fd5b506103d2611582565b6040518082815260200191505060405180910390f35b3480156103f457600080fd5b506103fd611588565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561043d578082015181840152602081019050610422565b50505050905090810190601f16801561046a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561048457600080fd5b506104d16004803603604081101561049b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061162a565b604051808215151515815260200191505060405180910390f35b3480156104f757600080fd5b50610500611648565b6040518082815260200191505060405180910390f35b34801561052257600080fd5b506105656004803603602081101561053957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061164e565b005b34801561057357600080fd5b5061057c61179e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105ca57600080fd5b506105d36117c4565b6040518082815260200191505060405180910390f35b3480156105f557600080fd5b506105fe6117ca565b6040518082815260200191505060405180910390f35b34801561062057600080fd5b506106296117d4565b6040518082815260200191505060405180910390f35b34801561064b57600080fd5b506106b86004803603606081101561066257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117f0565b604051808215151515815260200191505060405180910390f35b3480156106de57600080fd5b506106e76118c9565b6040518082815260200191505060405180910390f35b34801561070957600080fd5b506107126119ab565b604051808260ff1660ff16815260200191505060405180910390f35b34801561073a57600080fd5b506107876004803603604081101561075157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119c2565b604051808215151515815260200191505060405180910390f35b3480156107ad57600080fd5b506107da600480360360208110156107c457600080fd5b8101908080359060200190929190505050611a75565b005b3480156107e857600080fd5b506107f1611a89565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561083f57600080fd5b50610848611aaf565b005b34801561085657600080fd5b5061085f611ac1565b6040518082815260200191505060405180910390f35b34801561088157600080fd5b506108c46004803603602081101561089857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c0b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561091257600080fd5b5061093f6004803603602081101561092957600080fd5b8101908080359060200190929190505050611c74565b005b34801561094d57600080fd5b506109906004803603602081101561096457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ce3565b005b34801561099e57600080fd5b506109a7611cf0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109f557600080fd5b50610a2260048036036020811015610a0c57600080fd5b8101908080359060200190929190505050611d16565b005b348015610a3057600080fd5b50610a7360048036036020811015610a4757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611de8565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b348015610aa157600080fd5b50610ae460048036036020811015610ab857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e0b565b005b348015610af257600080fd5b50610b3560048036036020811015610b0957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f17565b6040518082815260200191505060405180910390f35b348015610b5757600080fd5b50610b9a60048036036020811015610b6e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f5f565b005b348015610ba857600080fd5b50610bf560048036036040811015610bbf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611fd0565b6040518082815260200191505060405180910390f35b348015610c1757600080fd5b50610c6460048036036040811015610c2e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612395565b005b348015610c7257600080fd5b50610c9f60048036036020811015610c8957600080fd5b81019080803590602001909291905050506123a3565b005b348015610cad57600080fd5b50610cf060048036036020811015610cc457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612475565b6040518082815260200191505060405180910390f35b348015610d1257600080fd5b50610d1b61248d565b005b348015610d2957600080fd5b50610d32612776565b6040518082815260200191505060405180910390f35b348015610d5457600080fd5b50610d5d612857565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d9d578082015181840152602081019050610d82565b50505050905090810190601f168015610dca5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610de457600080fd5b50610e2760048036036020811015610dfb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128f9565b005b348015610e3557600080fd5b50610e8260048036036040811015610e4c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612a49565b604051808215151515815260200191505060405180910390f35b348015610ea857600080fd5b50610eb1612b16565b005b348015610ebf57600080fd5b50610ec8612b98565b6040518082815260200191505060405180910390f35b348015610eea57600080fd5b50610f3760048036036040811015610f0157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612ba8565b604051808215151515815260200191505060405180910390f35b348015610f5d57600080fd5b50610f66612bc6565b6040518082815260200191505060405180910390f35b348015610f8857600080fd5b50610fcb60048036036020811015610f9f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612bee565b6040518082815260200191505060405180910390f35b348015610fed57600080fd5b5061101a6004803603602081101561100457600080fd5b8101908080359060200190929190505050612cc4565b005b34801561102857600080fd5b50611031612d33565b005b34801561103f57600080fd5b506110826004803603602081101561105657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612fd5565b005b34801561109057600080fd5b506110d3600480360360208110156110a757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061307e565b604051808215151515815260200191505060405180910390f35b3480156110f957600080fd5b50611171600480360360c081101561111057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803560ff169060200190929190803590602001909291908035906020019092919050505061309b565b005b34801561117f57600080fd5b5061118861341e565b6040518082815260200191505060405180910390f35b3480156111aa57600080fd5b506111b3613568565b6040518082815260200191505060405180910390f35b3480156111d557600080fd5b506111de61356e565b604051808215151515815260200191505060405180910390f35b34801561120457600080fd5b5061120d613581565b6040518082815260200191505060405180910390f35b34801561122f57600080fd5b506112926004803603604081101561124657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613587565b6040518082815260200191505060405180910390f35b3480156112b457600080fd5b506112bd61360e565b6040518082815260200191505060405180910390f35b3480156112df57600080fd5b506112e8613614565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561133657600080fd5b5061133f61363a565b6040518082815260200191505060405180910390f35b34801561136157600080fd5b5061136a613656565b6040518082815260200191505060405180910390f35b34801561138c57600080fd5b506113df600480360360408110156113a357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803563ffffffff16906020019092919050505061365c565b604051808363ffffffff1663ffffffff1681526020018281526020019250505060405180910390f35b34801561141457600080fd5b506114576004803603602081101561142b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061369d565b005b34801561146557600080fd5b5061146e6137a9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6114c06114bb6137cf565b61307e565b611515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b6000811461157857600a811015611577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806157c9602e913960400191505060405180910390fd5b5b8060128190555050565b60125481565b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116205780601f106115f557610100808354040283529160200191611620565b820191906000526020600020905b81548152906001019060200180831161160357829003601f168201915b5050505050905090565b600061163e6116376137cf565b84846137d7565b6001905092915050565b60155481565b61165e6116596137cf565b61307e565b6116b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461175a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615b14602c913960400191505060405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60165481565b6000600254905090565b60405180806158ac604391396043019050604051809103902081565b60006117fd8484846139ce565b6118be846118096137cf565b6118b98560405180606001604052806028815260200161591060289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061186f6137cf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c279092919063ffffffff16565b6137d7565b600190509392505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a0823160006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561196b57600080fd5b505afa15801561197f573d6000803e3d6000fd5b505050506040513d602081101561199557600080fd5b8101908080519060200190929190505050905090565b6000600560009054906101000a900460ff16905090565b6000611a6b6119cf6137cf565b84611a6685600160006119e06137cf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ce790919063ffffffff16565b6137d7565b6001905092915050565b611a86611a806137cf565b82613d6f565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611abf611aba6137cf565b613de8565b565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b2c57600080fd5b505afa158015611b40573d6000803e3d6000fd5b505050506040513d6020811015611b5657600080fd5b810190808051906020019092919050505090506000611b736118c9565b90506000611ba183611b9364e8d4a5100085613e4290919063ffffffff16565b613ec890919063ffffffff16565b90506000611bd0600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611f17565b90506000611bfe64e8d4a51000611bf08585613e4290919063ffffffff16565b613ec890919063ffffffff16565b9050809550505050505090565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611c84611c7f6137cf565b61307e565b611cd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b8060168190555050565b611ced3382613f12565b50565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d26611d216137cf565b61307e565b611d7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b60008114611dde57600a811015611ddd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806157f7602f913960400191505060405180910390fd5b5b8060118190555050565b60086020528060005260406000206000915054906101000a900463ffffffff1681565b611e1b611e166137cf565b61307e565b611e70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611f6f611f6a6137cf565b61307e565b611fc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b611fcd81614083565b50565b600043821061202a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180615a576032913960400191505060405180910390fd5b6000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff16141561209757600091505061238f565b82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161161218157600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff1681526020019081526020016000206001015491505061238f565b82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16111561220257600091505061238f565b600080905060006001830390505b8163ffffffff168163ffffffff161115612329576000600283830363ffffffff168161223857fe5b0482039050612245615500565b600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff1614156123015780602001519550505050505061238f565b86816000015163ffffffff16101561231b57819350612322565b6001820392505b5050612210565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b61239f82826140dd565b5050565b6123b36123ae6137cf565b61307e565b612408576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b6000811461246b57600a81101561246a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061574b602b913960400191505060405180910390fd5b5b8060138190555050565b60096020528060005260406000206000915090505481565b60145461249933611f17565b10156124f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806159be6022913960400191505060405180910390fd5b60165460155401421161256b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f546f6f20536f6f6e2e000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b42601581905550600061257d30611f17565b9050612588816141ac565b6000612678601354600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561262f57600080fd5b505afa158015612643573d6000803e3d6000fd5b505050506040513d602081101561265957600080fd5b8101908080519060200190929190505050613ec890919063ffffffff16565b9050612683816143d7565b506000601860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f49930186012546040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156126fd57600080fd5b505af1158015612711573d6000803e3d6000fd5b505050506040513d602081101561272757600080fd5b810190808051906020019092919050505090507f811d4760f1a92875eb76dbd3dc2359544b2f6a000ba5b78784c0b105b3469bd0816040518082815260200191505060405180910390a1505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561281757600080fd5b505afa15801561282b573d6000803e3d6000fd5b505050506040513d602081101561284157600080fd5b8101908080519060200190929190505050905090565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128ef5780601f106128c4576101008083540402835291602001916128ef565b820191906000526020600020905b8154815290600101906020018083116128d257829003601f168201915b5050505050905090565b6129096129046137cf565b61307e565b61295e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806156ff602a913960400191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612b0c612a566137cf565b84612b0785604051806060016040528060258152602001615b406025913960016000612a806137cf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c279092919063ffffffff16565b6137d7565b6001905092915050565b612b26612b216137cf565b61307e565b612b7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b6000601860006101000a81548160ff021916908315150217905550565b6000612ba330611f17565b905090565b6000612bbc612bb56137cf565b84846139ce565b6001905092915050565b6000612be9612bd36118c9565b612bdb612776565b613ce790919063ffffffff16565b905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff1611612c58576000612cbc565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b612cd4612ccf6137cf565b61307e565b612d29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b8060148190555050565b612d43612d3e6137cf565b61307e565b612d98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b6017544211612e0f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4e6f7420756e6c6f636b6564207965740000000000000000000000000000000081525060200191505060405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612eb057600080fd5b505afa158015612ec4573d6000803e3d6000fd5b505050506040513d6020811015612eda57600080fd5b81019080805190602001909291905050509050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612f9657600080fd5b505af1158015612faa573d6000803e3d6000fd5b505050506040513d6020811015612fc057600080fd5b81019080805190602001909291905050505050565b612fe5612fe06137cf565b61307e565b61303a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061309482601961463a90919063ffffffff16565b9050919050565b600060405180806158ac60439139604301905060405180910390206130be611588565b805190602001206130cd614718565b30604051602001808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405160208183030381529060405280519060200120905060006040518080615ada603a9139603a0190506040518091039020888888604051602001808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019450505050506040516020818303038152906040528051906020012090506000828260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015613278573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561330a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806157766031913960400191505060405180910390fd5b600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505589146133af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180615aad602d913960400191505060405180910390fd5b87421115613408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806159e06031913960400191505060405180910390fd5b613412818b613f12565b50505050505050505050565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561348957600080fd5b505afa15801561349d573d6000803e3d6000fd5b505050506040513d60208110156134b357600080fd5b8101908080519060200190929190505050905060006134d0612bc6565b905060006134fe836134f064e8d4a5100085613e4290919063ffffffff16565b613ec890919063ffffffff16565b9050600061352d600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611f17565b9050600061355b64e8d4a5100061354d8585613e4290919063ffffffff16565b613ec890919063ffffffff16565b9050809550505050505090565b60175481565b601860009054906101000a900460ff1681565b60115481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60135481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040518080615ada603a9139603a019050604051809103902081565b60145481565b6007602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b6136ad6136a86137cf565b61307e565b613702576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561385d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615a896024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156138e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806157a76022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b601860009054906101000a900460ff168015613a3b575060011515601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514155b8015613a98575060011515601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514155b15613b0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4c6f636b656420756e74696c20656e64206f662070726573616c65000000000081525060200191505060405180910390fd5b600060115414158015613b6e575060001515600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b8015613bca575060001515600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b15613c16576000613be660115483613ec890919063ffffffff16565b9050613bf3843083614725565b613c108484613c0b84866147fe90919063ffffffff16565b614725565b50613c22565b613c21838383614725565b5b505050565b6000838311158290613cd4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613c99578082015181840152602081019050613c7e565b50505050905090810190601f168015613cc65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015613d65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b613dda600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600083614848565b613de48282614ae5565b5050565b613dfc816019614c9d90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16560405160405180910390a250565b600080831415613e555760009050613ec2565b6000828402905082848281613e6657fe5b0414613ebd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806158ef6021913960400191505060405180910390fd5b809150505b92915050565b6000613f0a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614d5a565b905092915050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000613f8184611f17565b905082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a461407d828483614848565b50505050565b614097816019614e2090919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b6140e78282613d6f565b6141a8826140f36137cf565b6141a38460405180606001604052806024815260200161599a60249139600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006141596137cf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c279092919063ffffffff16565b6137d7565b5050565b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146142ed5761422f30600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683614725565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561429957600080fd5b505af11580156142ad573d6000803e3d6000fd5b505050507fcf550a3d0a19e4909b27127ccd7acb5f883a8c5490d06e7d62491736b30eceb1816040518082815260200191505060405180910390a16143d4565b61431a30600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683614725565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561438457600080fd5b505af1158015614398573d6000803e3d6000fd5b505050507f8765d2bb982ed6ee74d2b03c76c9c129aa4a4e3e6b17bd7cf7830088e9d49054816040518082815260200191505060405180910390a15b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156144a457600080fd5b505af11580156144b8573d6000803e3d6000fd5b505050506040513d60208110156144ce57600080fd5b810190808051906020019092919050505050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663af2979eb3084600080601860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518763ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019650505050505050602060405180830381600087803b1580156145f857600080fd5b505af115801561460c573d6000803e3d6000fd5b505050506040513d602081101561462257600080fd5b81019080805190602001909291905050509050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156146c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806159386022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000804690508091505090565b6147ee600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683614848565b6147f9838383614efb565b505050565b600061484083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613c27565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156148845750600081115b15614ae057600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146149b4576000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff161161492757600061498b565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b905060006149a284836147fe90919063ffffffff16565b90506149b0868484846151b1565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614614adf576000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611614a52576000614ab6565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b90506000614acd8483613ce790919063ffffffff16565b9050614adb858484846151b1565b5050505b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180615a116021913960400191505060405180910390fd5b614bd681604051806060016040528060228152602001615729602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c279092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614c2d816002546147fe90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b614ca7828261463a565b614cfc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061584c6021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008083118290614e06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614dcb578082015181840152602081019050614db0565b50505050905090810190601f168015614df85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581614e1257fe5b049050809150509392505050565b614e2a828261463a565b15614e9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615a326025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415615007576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806156dc6023913960400191505060405180910390fd5b61507281604051806060016040528060268152602001615826602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c279092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550615105816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ce790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60006151d5436040518060600160405280603f815260200161586d603f9139615445565b905060008463ffffffff1611801561526a57508063ffffffff16600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b156152db5781600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff168152602001908152602001600020600101819055506153e8565b60405180604001604052808263ffffffff16815260200183815250600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff1602179055506020820151816001015590505060018401600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051808381526020018281526020019250505060405180910390a25050505050565b6000640100000000831082906154f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156154bb5780820151818401526020810190506154a0565b50505050905090810190601f1680156154e85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082905092915050565b6040518060400160405280600063ffffffff168152602001600081525090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156155c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6155d881600254613ce790919063ffffffff16565b60028190555061562f816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ce790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373484f50504552546f6b656e3a3a736574556e69737761705632506169723a20616c72656164792073657445524332303a206275726e20616d6f756e7420657863656564732062616c616e6365484f50504552546f6b656e3a3a736574526562616c616e636544697669736f723a20746f6f20736d616c6c4552433230476f7665726e616e63653a3a64656c656761746542795369673a20696e76616c6964207369676e617475726545524332303a20617070726f766520746f20746865207a65726f2061646472657373484f50504552546f6b656e3a3a73657443616c6c657252657761726444697669736f723a20746f6f20736d616c6c484f50504552546f6b656e3a3a7365744c69717569646974794c6f636b44697669736f723a20746f6f20736d616c6c45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c654552433230476f7665726e616e63653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473454950373132446f6d61696e28737472696e67206e616d652c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f206164647265737357686974656c69737441646d696e526f6c653a2063616c6c657220646f6573206e6f742068617665207468652057686974656c69737441646d696e20726f6c6545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e6365596f7520617265206e6f742070617274206f66207468652073796e6469636174652e4552433230476f7665726e616e63653a3a64656c656761746542795369673a207369676e6174757265206578706972656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734552433230476f7665726e616e63653a3a6765745072696f72566f7465733a206e6f74207965742064657465726d696e656445524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734552433230476f7665726e616e63653a3a64656c656761746542795369673a20696e76616c6964206e6f6e636544656c65676174696f6e28616464726573732064656c6567617465652c75696e74323536206e6f6e63652c75696e743235362065787069727929484f50504552546f6b656e3a3a736574556e69737761705632526f757465723a20616c72656164792073657445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820442fbf88fb83a0bb7ac3c5ecc0e09dfd0f1c45881028a51877e4f75e8952222064736f6c63430005110032608060405261dead600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561005357600080fd5b50604051610e77380380610e778339818101604052602081101561007657600080fd5b8101908080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610d5f806101186000396000f3fe6080604052600436106100345760003560e01c806361d027b314610036578063d246d4111461008d578063f4993018146100e4575b005b34801561004257600080fd5b5061004b610133565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561009957600080fd5b506100a2610159565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156100f057600080fd5b5061011d6004803603602081101561010757600080fd5b810190808035906020019092919050505061017f565b6040518082815260200191505060405180910390f35b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f6f6e6c7920746f6b656e0000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61024d4783610559565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156102ed57600080fd5b505afa158015610301573d6000803e3d6000fd5b505050506040513d602081101561031757600080fd5b81019080805190602001909291905050509050600061033f8483610b1090919063ffffffff16565b90506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb32836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156103e957600080fd5b505af11580156103fd573d6000803e3d6000fd5b505050506040513d602081101561041357600080fd5b8101908080519060200190929190505050506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166104988486610b5a90919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561050157600080fd5b505af1158015610515573d6000803e3d6000fd5b505050506040513d602081101561052b57600080fd5b8101908080519060200190929190505050506105508183610b5a90919063ffffffff16565b92505050919050565b6060600260405190808252806020026020018201604052801561058b5781602001602082028038833980820191505090505b5090506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631694505e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156105f557600080fd5b505afa158015610609573d6000803e3d6000fd5b505050506040513d602081101561061f57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561067557600080fd5b505afa158015610689573d6000803e3d6000fd5b505050506040513d602081101561069f57600080fd5b8101908080519060200190929190505050816000815181106106bd57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160018151811061072657fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006107758385610b1090919063ffffffff16565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156107df573d6000803e3d6000fd5b506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b36000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631694505e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561088457600080fd5b505afa158015610898573d6000803e3d6000fd5b505050506040513d60208110156108ae57600080fd5b8101908080519060200190929190505050866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561092957600080fd5b505af115801561093d573d6000803e3d6000fd5b505050506040513d602081101561095357600080fd5b8101908080519060200190929190505050506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631694505e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156109cc57600080fd5b505afa1580156109e0573d6000803e3d6000fd5b505050506040513d60208110156109f657600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663b6f9de95610a358387610b5a90919063ffffffff16565b60008530426040518663ffffffff1660e01b815260040180858152602001806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015610aca578082015181840152602081019050610aaf565b50505050905001955050505050506000604051808303818588803b158015610af157600080fd5b505af1158015610b05573d6000803e3d6000fd5b505050505050505050565b6000610b5283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610ba4565b905092915050565b6000610b9c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610c6a565b905092915050565b60008083118290610c50576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610c15578082015181840152602081019050610bfa565b50505050905090810190601f168015610c425780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581610c5c57fe5b049050809150509392505050565b6000838311158290610d17576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610cdc578082015181840152602081019050610cc1565b50505050905090810190601f168015610d095780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838503905080915050939250505056fea265627a7a7231582073caa5442e5eb0155bf9dac27264faa9199176bcf19deff4cf1f6b990f709bc764736f6c634300051100324552433230476f7665726e616e63653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373

Deployed Bytecode

0x6080604052600436106103805760003560e01c80637e0d943e116101d1578063baaa906411610102578063dd62ed3e116100a0578063e84354c51161006f578063e84354c514611355578063f1127ed814611380578063f953797314611408578063ffafa0a41461145957610380565b8063dd62ed3e14611223578063e161eb56146112a8578063e5ec1d8c146112d3578063e7a324dc1461132a57610380565b8063ca5c7b91116100dc578063ca5c7b9114611173578063cafab2891461119e578063cf309012146111c9578063dc654a73146111f857610380565b8063baaa906414611033578063bb5f747b14611084578063c3cda520146110ed57610380565b8063a69df4b51161016f578063b439824411610149578063b439824414610f51578063b4b5ea5714610f7c578063b6833c5914610fe1578063b91f3f971461101c57610380565b8063a69df4b514610e9c578063a8a5550e14610eb3578063a9059cbb14610ede57610380565b8063858750ab116101ab578063858750ab14610d1d57806395d89b4114610d48578063a29a608914610dd8578063a457c2d714610e2957610380565b80637e0d943e14610c665780637ecebe0014610ca15780637f4aeb1a14610d0657610380565b806342966c68116102b657806361d027b31161025457806370a082311161022357806370a0823114610ae65780637362d9c814610b4b578063782d6fe114610b9c57806379cc679014610c0b57610380565b806361d027b31461099257806367a9fca6146109e95780636fcfff4514610a2457806370709a7c14610a9557610380565b806355d0a1d01161029057806355d0a1d01461084a578063587cde1e146108755780635b7dcaed146109065780635c19a95c1461094157610380565b806342966c68146107a157806349bd5a5e146107dc5780634c5a628c1461083357610380565b806316d1d9161161032357806323b872dd116102fd57806323b872dd1461063f5780632898cafa146106d2578063313ce567146106fd578063395093511461072e57610380565b806316d1d916146105be57806318160ddd146105e957806320606b701461061457610380565b8063095ea7b31161035f578063095ea7b314610478578063106b9ca1146104eb5780631419841d146105165780631694505e1461056757610380565b80629a81301461038257806302dd19d9146103bd57806306fdde03146103e8575b005b34801561038e57600080fd5b506103bb600480360360208110156103a557600080fd5b81019080803590602001909291905050506114b0565b005b3480156103c957600080fd5b506103d2611582565b6040518082815260200191505060405180910390f35b3480156103f457600080fd5b506103fd611588565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561043d578082015181840152602081019050610422565b50505050905090810190601f16801561046a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561048457600080fd5b506104d16004803603604081101561049b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061162a565b604051808215151515815260200191505060405180910390f35b3480156104f757600080fd5b50610500611648565b6040518082815260200191505060405180910390f35b34801561052257600080fd5b506105656004803603602081101561053957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061164e565b005b34801561057357600080fd5b5061057c61179e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105ca57600080fd5b506105d36117c4565b6040518082815260200191505060405180910390f35b3480156105f557600080fd5b506105fe6117ca565b6040518082815260200191505060405180910390f35b34801561062057600080fd5b506106296117d4565b6040518082815260200191505060405180910390f35b34801561064b57600080fd5b506106b86004803603606081101561066257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117f0565b604051808215151515815260200191505060405180910390f35b3480156106de57600080fd5b506106e76118c9565b6040518082815260200191505060405180910390f35b34801561070957600080fd5b506107126119ab565b604051808260ff1660ff16815260200191505060405180910390f35b34801561073a57600080fd5b506107876004803603604081101561075157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119c2565b604051808215151515815260200191505060405180910390f35b3480156107ad57600080fd5b506107da600480360360208110156107c457600080fd5b8101908080359060200190929190505050611a75565b005b3480156107e857600080fd5b506107f1611a89565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561083f57600080fd5b50610848611aaf565b005b34801561085657600080fd5b5061085f611ac1565b6040518082815260200191505060405180910390f35b34801561088157600080fd5b506108c46004803603602081101561089857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c0b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561091257600080fd5b5061093f6004803603602081101561092957600080fd5b8101908080359060200190929190505050611c74565b005b34801561094d57600080fd5b506109906004803603602081101561096457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ce3565b005b34801561099e57600080fd5b506109a7611cf0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109f557600080fd5b50610a2260048036036020811015610a0c57600080fd5b8101908080359060200190929190505050611d16565b005b348015610a3057600080fd5b50610a7360048036036020811015610a4757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611de8565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b348015610aa157600080fd5b50610ae460048036036020811015610ab857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e0b565b005b348015610af257600080fd5b50610b3560048036036020811015610b0957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f17565b6040518082815260200191505060405180910390f35b348015610b5757600080fd5b50610b9a60048036036020811015610b6e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f5f565b005b348015610ba857600080fd5b50610bf560048036036040811015610bbf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611fd0565b6040518082815260200191505060405180910390f35b348015610c1757600080fd5b50610c6460048036036040811015610c2e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612395565b005b348015610c7257600080fd5b50610c9f60048036036020811015610c8957600080fd5b81019080803590602001909291905050506123a3565b005b348015610cad57600080fd5b50610cf060048036036020811015610cc457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612475565b6040518082815260200191505060405180910390f35b348015610d1257600080fd5b50610d1b61248d565b005b348015610d2957600080fd5b50610d32612776565b6040518082815260200191505060405180910390f35b348015610d5457600080fd5b50610d5d612857565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d9d578082015181840152602081019050610d82565b50505050905090810190601f168015610dca5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610de457600080fd5b50610e2760048036036020811015610dfb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128f9565b005b348015610e3557600080fd5b50610e8260048036036040811015610e4c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612a49565b604051808215151515815260200191505060405180910390f35b348015610ea857600080fd5b50610eb1612b16565b005b348015610ebf57600080fd5b50610ec8612b98565b6040518082815260200191505060405180910390f35b348015610eea57600080fd5b50610f3760048036036040811015610f0157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612ba8565b604051808215151515815260200191505060405180910390f35b348015610f5d57600080fd5b50610f66612bc6565b6040518082815260200191505060405180910390f35b348015610f8857600080fd5b50610fcb60048036036020811015610f9f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612bee565b6040518082815260200191505060405180910390f35b348015610fed57600080fd5b5061101a6004803603602081101561100457600080fd5b8101908080359060200190929190505050612cc4565b005b34801561102857600080fd5b50611031612d33565b005b34801561103f57600080fd5b506110826004803603602081101561105657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612fd5565b005b34801561109057600080fd5b506110d3600480360360208110156110a757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061307e565b604051808215151515815260200191505060405180910390f35b3480156110f957600080fd5b50611171600480360360c081101561111057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803560ff169060200190929190803590602001909291908035906020019092919050505061309b565b005b34801561117f57600080fd5b5061118861341e565b6040518082815260200191505060405180910390f35b3480156111aa57600080fd5b506111b3613568565b6040518082815260200191505060405180910390f35b3480156111d557600080fd5b506111de61356e565b604051808215151515815260200191505060405180910390f35b34801561120457600080fd5b5061120d613581565b6040518082815260200191505060405180910390f35b34801561122f57600080fd5b506112926004803603604081101561124657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613587565b6040518082815260200191505060405180910390f35b3480156112b457600080fd5b506112bd61360e565b6040518082815260200191505060405180910390f35b3480156112df57600080fd5b506112e8613614565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561133657600080fd5b5061133f61363a565b6040518082815260200191505060405180910390f35b34801561136157600080fd5b5061136a613656565b6040518082815260200191505060405180910390f35b34801561138c57600080fd5b506113df600480360360408110156113a357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803563ffffffff16906020019092919050505061365c565b604051808363ffffffff1663ffffffff1681526020018281526020019250505060405180910390f35b34801561141457600080fd5b506114576004803603602081101561142b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061369d565b005b34801561146557600080fd5b5061146e6137a9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6114c06114bb6137cf565b61307e565b611515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b6000811461157857600a811015611577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806157c9602e913960400191505060405180910390fd5b5b8060128190555050565b60125481565b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116205780601f106115f557610100808354040283529160200191611620565b820191906000526020600020905b81548152906001019060200180831161160357829003601f168201915b5050505050905090565b600061163e6116376137cf565b84846137d7565b6001905092915050565b60155481565b61165e6116596137cf565b61307e565b6116b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461175a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615b14602c913960400191505060405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60165481565b6000600254905090565b60405180806158ac604391396043019050604051809103902081565b60006117fd8484846139ce565b6118be846118096137cf565b6118b98560405180606001604052806028815260200161591060289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061186f6137cf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c279092919063ffffffff16565b6137d7565b600190509392505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a0823160006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561196b57600080fd5b505afa15801561197f573d6000803e3d6000fd5b505050506040513d602081101561199557600080fd5b8101908080519060200190929190505050905090565b6000600560009054906101000a900460ff16905090565b6000611a6b6119cf6137cf565b84611a6685600160006119e06137cf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ce790919063ffffffff16565b6137d7565b6001905092915050565b611a86611a806137cf565b82613d6f565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611abf611aba6137cf565b613de8565b565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b2c57600080fd5b505afa158015611b40573d6000803e3d6000fd5b505050506040513d6020811015611b5657600080fd5b810190808051906020019092919050505090506000611b736118c9565b90506000611ba183611b9364e8d4a5100085613e4290919063ffffffff16565b613ec890919063ffffffff16565b90506000611bd0600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611f17565b90506000611bfe64e8d4a51000611bf08585613e4290919063ffffffff16565b613ec890919063ffffffff16565b9050809550505050505090565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611c84611c7f6137cf565b61307e565b611cd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b8060168190555050565b611ced3382613f12565b50565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d26611d216137cf565b61307e565b611d7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b60008114611dde57600a811015611ddd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806157f7602f913960400191505060405180910390fd5b5b8060118190555050565b60086020528060005260406000206000915054906101000a900463ffffffff1681565b611e1b611e166137cf565b61307e565b611e70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611f6f611f6a6137cf565b61307e565b611fc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b611fcd81614083565b50565b600043821061202a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180615a576032913960400191505060405180910390fd5b6000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff16141561209757600091505061238f565b82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161161218157600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff1681526020019081526020016000206001015491505061238f565b82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16111561220257600091505061238f565b600080905060006001830390505b8163ffffffff168163ffffffff161115612329576000600283830363ffffffff168161223857fe5b0482039050612245615500565b600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff1614156123015780602001519550505050505061238f565b86816000015163ffffffff16101561231b57819350612322565b6001820392505b5050612210565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b61239f82826140dd565b5050565b6123b36123ae6137cf565b61307e565b612408576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b6000811461246b57600a81101561246a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061574b602b913960400191505060405180910390fd5b5b8060138190555050565b60096020528060005260406000206000915090505481565b60145461249933611f17565b10156124f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806159be6022913960400191505060405180910390fd5b60165460155401421161256b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f546f6f20536f6f6e2e000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b42601581905550600061257d30611f17565b9050612588816141ac565b6000612678601354600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561262f57600080fd5b505afa158015612643573d6000803e3d6000fd5b505050506040513d602081101561265957600080fd5b8101908080519060200190929190505050613ec890919063ffffffff16565b9050612683816143d7565b506000601860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f49930186012546040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156126fd57600080fd5b505af1158015612711573d6000803e3d6000fd5b505050506040513d602081101561272757600080fd5b810190808051906020019092919050505090507f811d4760f1a92875eb76dbd3dc2359544b2f6a000ba5b78784c0b105b3469bd0816040518082815260200191505060405180910390a1505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561281757600080fd5b505afa15801561282b573d6000803e3d6000fd5b505050506040513d602081101561284157600080fd5b8101908080519060200190929190505050905090565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128ef5780601f106128c4576101008083540402835291602001916128ef565b820191906000526020600020905b8154815290600101906020018083116128d257829003601f168201915b5050505050905090565b6129096129046137cf565b61307e565b61295e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806156ff602a913960400191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612b0c612a566137cf565b84612b0785604051806060016040528060258152602001615b406025913960016000612a806137cf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c279092919063ffffffff16565b6137d7565b6001905092915050565b612b26612b216137cf565b61307e565b612b7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b6000601860006101000a81548160ff021916908315150217905550565b6000612ba330611f17565b905090565b6000612bbc612bb56137cf565b84846139ce565b6001905092915050565b6000612be9612bd36118c9565b612bdb612776565b613ce790919063ffffffff16565b905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff1611612c58576000612cbc565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b612cd4612ccf6137cf565b61307e565b612d29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b8060148190555050565b612d43612d3e6137cf565b61307e565b612d98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b6017544211612e0f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4e6f7420756e6c6f636b6564207965740000000000000000000000000000000081525060200191505060405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612eb057600080fd5b505afa158015612ec4573d6000803e3d6000fd5b505050506040513d6020811015612eda57600080fd5b81019080805190602001909291905050509050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612f9657600080fd5b505af1158015612faa573d6000803e3d6000fd5b505050506040513d6020811015612fc057600080fd5b81019080805190602001909291905050505050565b612fe5612fe06137cf565b61307e565b61303a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061309482601961463a90919063ffffffff16565b9050919050565b600060405180806158ac60439139604301905060405180910390206130be611588565b805190602001206130cd614718565b30604051602001808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405160208183030381529060405280519060200120905060006040518080615ada603a9139603a0190506040518091039020888888604051602001808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019450505050506040516020818303038152906040528051906020012090506000828260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015613278573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561330a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806157766031913960400191505060405180910390fd5b600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505589146133af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180615aad602d913960400191505060405180910390fd5b87421115613408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806159e06031913960400191505060405180910390fd5b613412818b613f12565b50505050505050505050565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561348957600080fd5b505afa15801561349d573d6000803e3d6000fd5b505050506040513d60208110156134b357600080fd5b8101908080519060200190929190505050905060006134d0612bc6565b905060006134fe836134f064e8d4a5100085613e4290919063ffffffff16565b613ec890919063ffffffff16565b9050600061352d600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611f17565b9050600061355b64e8d4a5100061354d8585613e4290919063ffffffff16565b613ec890919063ffffffff16565b9050809550505050505090565b60175481565b601860009054906101000a900460ff1681565b60115481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60135481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040518080615ada603a9139603a019050604051809103902081565b60145481565b6007602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b6136ad6136a86137cf565b61307e565b613702576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061595a6040913960400191505060405180910390fd5b601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561385d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615a896024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156138e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806157a76022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b601860009054906101000a900460ff168015613a3b575060011515601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514155b8015613a98575060011515601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514155b15613b0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4c6f636b656420756e74696c20656e64206f662070726573616c65000000000081525060200191505060405180910390fd5b600060115414158015613b6e575060001515600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b8015613bca575060001515600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b15613c16576000613be660115483613ec890919063ffffffff16565b9050613bf3843083614725565b613c108484613c0b84866147fe90919063ffffffff16565b614725565b50613c22565b613c21838383614725565b5b505050565b6000838311158290613cd4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613c99578082015181840152602081019050613c7e565b50505050905090810190601f168015613cc65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015613d65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b613dda600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600083614848565b613de48282614ae5565b5050565b613dfc816019614c9d90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16560405160405180910390a250565b600080831415613e555760009050613ec2565b6000828402905082848281613e6657fe5b0414613ebd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806158ef6021913960400191505060405180910390fd5b809150505b92915050565b6000613f0a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614d5a565b905092915050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000613f8184611f17565b905082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a461407d828483614848565b50505050565b614097816019614e2090919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b6140e78282613d6f565b6141a8826140f36137cf565b6141a38460405180606001604052806024815260200161599a60249139600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006141596137cf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c279092919063ffffffff16565b6137d7565b5050565b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146142ed5761422f30600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683614725565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561429957600080fd5b505af11580156142ad573d6000803e3d6000fd5b505050507fcf550a3d0a19e4909b27127ccd7acb5f883a8c5490d06e7d62491736b30eceb1816040518082815260200191505060405180910390a16143d4565b61431a30600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683614725565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561438457600080fd5b505af1158015614398573d6000803e3d6000fd5b505050507f8765d2bb982ed6ee74d2b03c76c9c129aa4a4e3e6b17bd7cf7830088e9d49054816040518082815260200191505060405180910390a15b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156144a457600080fd5b505af11580156144b8573d6000803e3d6000fd5b505050506040513d60208110156144ce57600080fd5b810190808051906020019092919050505050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663af2979eb3084600080601860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518763ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019650505050505050602060405180830381600087803b1580156145f857600080fd5b505af115801561460c573d6000803e3d6000fd5b505050506040513d602081101561462257600080fd5b81019080805190602001909291905050509050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156146c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806159386022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000804690508091505090565b6147ee600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683614848565b6147f9838383614efb565b505050565b600061484083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613c27565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156148845750600081115b15614ae057600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146149b4576000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff161161492757600061498b565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b905060006149a284836147fe90919063ffffffff16565b90506149b0868484846151b1565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614614adf576000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611614a52576000614ab6565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b90506000614acd8483613ce790919063ffffffff16565b9050614adb858484846151b1565b5050505b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180615a116021913960400191505060405180910390fd5b614bd681604051806060016040528060228152602001615729602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c279092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614c2d816002546147fe90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b614ca7828261463a565b614cfc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061584c6021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008083118290614e06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614dcb578082015181840152602081019050614db0565b50505050905090810190601f168015614df85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581614e1257fe5b049050809150509392505050565b614e2a828261463a565b15614e9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615a326025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415615007576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806156dc6023913960400191505060405180910390fd5b61507281604051806060016040528060268152602001615826602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c279092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550615105816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ce790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60006151d5436040518060600160405280603f815260200161586d603f9139615445565b905060008463ffffffff1611801561526a57508063ffffffff16600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b156152db5781600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff168152602001908152602001600020600101819055506153e8565b60405180604001604052808263ffffffff16815260200183815250600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff1602179055506020820151816001015590505060018401600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051808381526020018281526020019250505060405180910390a25050505050565b6000640100000000831082906154f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156154bb5780820151818401526020810190506154a0565b50505050905090810190601f1680156154e85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082905092915050565b6040518060400160405280600063ffffffff168152602001600081525090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156155c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6155d881600254613ce790919063ffffffff16565b60028190555061562f816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613ce790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373484f50504552546f6b656e3a3a736574556e69737761705632506169723a20616c72656164792073657445524332303a206275726e20616d6f756e7420657863656564732062616c616e6365484f50504552546f6b656e3a3a736574526562616c616e636544697669736f723a20746f6f20736d616c6c4552433230476f7665726e616e63653a3a64656c656761746542795369673a20696e76616c6964207369676e617475726545524332303a20617070726f766520746f20746865207a65726f2061646472657373484f50504552546f6b656e3a3a73657443616c6c657252657761726444697669736f723a20746f6f20736d616c6c484f50504552546f6b656e3a3a7365744c69717569646974794c6f636b44697669736f723a20746f6f20736d616c6c45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c654552433230476f7665726e616e63653a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473454950373132446f6d61696e28737472696e67206e616d652c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f206164647265737357686974656c69737441646d696e526f6c653a2063616c6c657220646f6573206e6f742068617665207468652057686974656c69737441646d696e20726f6c6545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e6365596f7520617265206e6f742070617274206f66207468652073796e6469636174652e4552433230476f7665726e616e63653a3a64656c656761746542795369673a207369676e6174757265206578706972656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734552433230476f7665726e616e63653a3a6765745072696f72566f7465733a206e6f74207965742064657465726d696e656445524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734552433230476f7665726e616e63653a3a64656c656761746542795369673a20696e76616c6964206e6f6e636544656c65676174696f6e28616464726573732064656c6567617465652c75696e74323536206e6f6e63652c75696e743235362065787069727929484f50504552546f6b656e3a3a736574556e69737761705632526f757465723a20616c72656164792073657445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820442fbf88fb83a0bb7ac3c5ecc0e09dfd0f1c45881028a51877e4f75e8952222064736f6c63430005110032

Deployed Bytecode Sourcemap

40762:2667:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42401:287;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42401:287:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42401:287:0;;;;;;;;;;;;;;;;;:::i;:::-;;23605:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23605:34:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20470:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20470:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;20470:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12225:152;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12225:152:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12225:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23730:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23730:28:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41075:230;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41075:230:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41075:230:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;23153:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23153:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23765:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23765:32:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11246:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11246:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31400:122;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31400:122:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12849:304;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12849:304:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12849:304:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;28536:125;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28536:125:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21322:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21322:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13562:210;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13562:210:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13562:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;18432:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18432:83:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18432:83:0;;;;;;;;;;;;;;;;;:::i;:::-;;23190:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23190:28:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22400:95;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22400:95:0;;;:::i;:::-;;27859:443;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27859:443:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32383:149;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32383:149:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32383:149:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;42266:123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42266:123:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42266:123:0;;;;;;;;;;;;;;;;;:::i;:::-;;32676:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32676:104:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32676:104:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;23255:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23255:31:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;41539:309;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41539:309:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41539:309:0;;;;;;;;;;;;;;;;;:::i;:::-;;31278:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31278:49:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31278:49:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;42957:123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42957:123:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42957:123:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;11400:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11400:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11400:110:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22276:116;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22276:116:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22276:116:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;35312:1264;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35312:1264:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35312:1264:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18577:103;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18577:103:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18577:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41856:289;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41856:289:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41856:289:0;;;;;;;;;;;;;;;;;:::i;:::-;;31814:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31814:39:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31814:39:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25446:768;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25446:768:0;;;:::i;:::-;;28354:130;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28354:130:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20672:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20672:87:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;20672:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41313:218;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41313:218:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41313:218:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;14275:261;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14275:261:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14275:261:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;43216:77;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43216:77:0;;;:::i;:::-;;27234:108;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27234:108:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11723:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11723:158:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11723:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;28713:125;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28713:125:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34626:255;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34626:255:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34626:255:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43305:121;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43305:121:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;43305:121:0;;;;;;;;;;;;;;;;;:::i;:::-;;42700:245;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42700:245:0;;;:::i;:::-;;42157:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42157:97:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42157:97:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;22143:125;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22143:125:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22143:125:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33214:1211;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33214:1211:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;33214:1211:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27379:443;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27379:443:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23810:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23810:25:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23842:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23842:18:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23563:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23563:35:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11944:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11944:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11944:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23646:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23646:31:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23293:66;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23293:66:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31616:117;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31616:117:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23690:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23690:33:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31139:70;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31139:70:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31139:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43086:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43086:120:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;43086:120:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;23225:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23225:23:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;42401:287;22016:30;22033:12;:10;:12::i;:::-;22016:16;:30::i;:::-;22008:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42517:1;42499:14;:19;42495:131;;42561:2;42543:14;:20;;42535:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42495:131;42666:14;42644:19;:36;;;;42401:287;:::o;23605:34::-;;;;:::o;20470:83::-;20507:13;20540:5;20533:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20470:83;:::o;12225:152::-;12291:4;12308:39;12317:12;:10;:12::i;:::-;12331:7;12340:6;12308:8;:39::i;:::-;12365:4;12358:11;;12225:152;;;;:::o;23730:28::-;;;;:::o;41075:230::-;22016:30;22033:12;:10;:12::i;:::-;22016:16;:30::i;:::-;22008:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41201:1;41174:29;;:15;;;;;;;;;;;:29;;;41166:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41281:16;41263:15;;:34;;;;;;;;;;;;;;;;;;41075:230;:::o;23153:30::-;;;;;;;;;;;;;:::o;23765:32::-;;;;:::o;11246:91::-;11290:7;11317:12;;11310:19;;11246:91;:::o;31400:122::-;31442:80;;;;;;;;;;;;;;;;;;;31400:122;:::o;12849:304::-;12938:4;12955:36;12965:6;12973:9;12984:6;12955:9;:36::i;:::-;13002:121;13011:6;13019:12;:10;:12::i;:::-;13033:89;13071:6;13033:89;;;;;;;;;;;;;;;;;:11;:19;13045:6;13033:19;;;;;;;;;;;;;;;:33;13053:12;:10;:12::i;:::-;13033:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;13002:8;:121::i;:::-;13141:4;13134:11;;12849:304;;;;;:::o;28536:125::-;28584:7;28617:13;;;;;;;;;;;28611:30;;;28650:1;28611:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28611:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28611:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28611:42:0;;;;;;;;;;;;;;;;28604:49;;28536:125;:::o;21322:83::-;21363:5;21388:9;;;;;;;;;;;21381:16;;21322:83;:::o;13562:210::-;13642:4;13659:83;13668:12;:10;:12::i;:::-;13682:7;13691:50;13730:10;13691:11;:25;13703:12;:10;:12::i;:::-;13691:25;;;;;;;;;;;;;;;:34;13717:7;13691:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;13659:8;:83::i;:::-;13760:4;13753:11;;13562:210;;;;:::o;18432:83::-;18480:27;18486:12;:10;:12::i;:::-;18500:6;18480:5;:27::i;:::-;18432:83;:::o;23190:28::-;;;;;;;;;;;;;:::o;22400:95::-;22452:35;22474:12;:10;:12::i;:::-;22452:21;:35::i;:::-;22400:95::o;27859:443::-;27906:7;27926:21;27956:13;;;;;;;;;;;27950:32;;;:34;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27950:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27950:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27950:34:0;;;;;;;;;;;;;;;;27926:58;;27995:17;28015;:15;:17::i;:::-;27995:37;;28043:30;28076:38;28100:13;28076:19;28090:4;28076:9;:13;;:19;;;;:::i;:::-;:23;;:38;;;;:::i;:::-;28043:71;;28127:22;28152:24;28162:13;;;;;;;;;;;28152:9;:24::i;:::-;28127:49;;28187:21;28211:52;28258:4;28211:42;28230:22;28211:14;:18;;:42;;;;:::i;:::-;:46;;:52;;;;:::i;:::-;28187:76;;28281:13;28274:20;;;;;;;27859:443;:::o;32383:149::-;32471:7;32503:10;:21;32514:9;32503:21;;;;;;;;;;;;;;;;;;;;;;;;;32496:28;;32383:149;;;:::o;42266:123::-;22016:30;22033:12;:10;:12::i;:::-;22016:16;:30::i;:::-;22008:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42372:9;42352:17;:29;;;;42266:123;:::o;32676:104::-;32740:32;32750:10;32762:9;32740;:32::i;:::-;32676:104;:::o;23255:31::-;;;;;;;;;;;;;:::o;41539:309::-;22016:30;22033:12;:10;:12::i;:::-;22016:16;:30::i;:::-;22008:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41669:1;41644:21;:26;41640:146;;41720:2;41695:21;:27;;41687:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41640:146;41819:21;41796:20;:44;;;;41539:309;:::o;31278:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;42957:123::-;22016:30;22033:12;:10;:12::i;:::-;22016:16;:30::i;:::-;22008:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43054:11;:18;43066:5;43054:18;;;;;;;;;;;;;;;;;;;;;;;;;43053:19;43032:11;:18;43044:5;43032:18;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;42957:123;:::o;11400:110::-;11457:7;11484:9;:18;11494:7;11484:18;;;;;;;;;;;;;;;;11477:25;;11400:110;;;:::o;22276:116::-;22016:30;22033:12;:10;:12::i;:::-;22016:16;:30::i;:::-;22008:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22357:27;22376:7;22357:18;:27::i;:::-;22276:116;:::o;35312:1264::-;35420:7;35467:12;35453:11;:26;35445:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35547:19;35569:14;:23;35584:7;35569:23;;;;;;;;;;;;;;;;;;;;;;;;;35547:45;;35623:1;35607:12;:17;;;35603:58;;;35648:1;35641:8;;;;;35603:58;35773:11;35721;:20;35733:7;35721:20;;;;;;;;;;;;;;;:38;35757:1;35742:12;:16;35721:38;;;;;;;;;;;;;;;:48;;;;;;;;;;;;:63;;;35717:147;;35808:11;:20;35820:7;35808:20;;;;;;;;;;;;;;;:38;35844:1;35829:12;:16;35808:38;;;;;;;;;;;;;;;:44;;;35801:51;;;;;35717:147;35961:11;35925;:20;35937:7;35925:20;;;;;;;;;;;;;;;:23;35946:1;35925:23;;;;;;;;;;;;;:33;;;;;;;;;;;;:47;;;35921:88;;;35996:1;35989:8;;;;;35921:88;36021:12;36036:1;36021:16;;36048:12;36078:1;36063:12;:16;36048:31;;36090:428;36105:5;36097:13;;:5;:13;;;36090:428;;;36127:13;36169:1;36160:5;36152;:13;36151:19;;;;;;;;36143:5;:27;36127:43;;36212:20;;:::i;:::-;36235:11;:20;36247:7;36235:20;;;;;;;;;;;;;;;:28;36256:6;36235:28;;;;;;;;;;;;;;;36212:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36298:11;36282:2;:12;;;:27;;;36278:229;;;36337:2;:8;;;36330:15;;;;;;;;;36278:229;36386:11;36371:2;:12;;;:26;;;36367:140;;;36426:6;36418:14;;36367:140;;;36490:1;36481:6;:10;36473:18;;36367:140;36090:428;;;;;36535:11;:20;36547:7;36535:20;;;;;;;;;;;;;;;:27;36556:5;36535:27;;;;;;;;;;;;;;;:33;;;36528:40;;;;;35312:1264;;;;;:::o;18577:103::-;18646:26;18656:7;18665:6;18646:9;:26::i;:::-;18577:103;;:::o;41856:289::-;22016:30;22033:12;:10;:12::i;:::-;22016:16;:30::i;:::-;22008:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41974:1;41953:17;:22;41949:134;;42021:2;42000:17;:23;;41992:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41949:134;42120:17;42101:16;:36;;;;41856:289;:::o;31814:39::-;;;;;;;;;;;;;;;;;:::o;25446:768::-;25527:18;;25502:21;25512:10;25502:9;:21::i;:::-;:43;;25494:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25637:17;;25621:13;;:33;25603:15;:51;25595:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25695:15;25679:13;:31;;;;25787:23;25813:24;25831:4;25813:9;:24::i;:::-;25787:50;;25848:42;25874:15;25848:25;:42::i;:::-;25911:22;25936:67;25986:16;;25942:13;;;;;;;;;;;25936:30;;;25975:4;25936:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25936:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25936:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25936:45:0;;;;;;;;;;;;;;;;:49;;:67;;;;:::i;:::-;25911:92;;26077:28;26090:14;26077:12;:28::i;:::-;;26116:12;26131:8;;;;;;;;;;;:18;;;26150:19;;26131:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26131:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26131:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26131:39:0;;;;;;;;;;;;;;;;26116:54;;26188:18;26198:7;26188:18;;;;;;;;;;;;;;;;;;25446:768;;;:::o;28354:130::-;28404:7;28437:13;;;;;;;;;;;28431:30;;;28470:4;28431:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28431:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28431:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28431:45:0;;;;;;;;;;;;;;;;28424:52;;28354:130;:::o;20672:87::-;20711:13;20744:7;20737:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20672:87;:::o;41313:218::-;22016:30;22033:12;:10;:12::i;:::-;22016:16;:30::i;:::-;22008:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41433:1;41408:27;;:13;;;;;;;;;;;:27;;;41400:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41509:14;41493:13;;:30;;;;;;;;;;;;;;;;;;41313:218;:::o;14275:261::-;14360:4;14377:129;14386:12;:10;:12::i;:::-;14400:7;14409:96;14448:15;14409:96;;;;;;;;;;;;;;;;;:11;:25;14421:12;:10;:12::i;:::-;14409:25;;;;;;;;;;;;;;;:34;14435:7;14409:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;14377:8;:129::i;:::-;14524:4;14517:11;;14275:261;;;;:::o;43216:77::-;22016:30;22033:12;:10;:12::i;:::-;22016:16;:30::i;:::-;22008:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43280:5;43271:6;;:14;;;;;;;;;;;;;;;;;;43216:77::o;27234:108::-;27283:7;27310:24;27328:4;27310:9;:24::i;:::-;27303:31;;27234:108;:::o;11723:158::-;11792:4;11809:42;11819:12;:10;:12::i;:::-;11833:9;11844:6;11809:9;:42::i;:::-;11869:4;11862:11;;11723:158;;;;:::o;28713:125::-;28761:7;28788:42;28812:17;:15;:17::i;:::-;28788:19;:17;:19::i;:::-;:23;;:42;;;;:::i;:::-;28781:49;;28713:125;:::o;34626:255::-;34718:7;34743:19;34765:14;:23;34780:7;34765:23;;;;;;;;;;;;;;;;;;;;;;;;;34743:45;;34821:1;34806:12;:16;;;:67;;34872:1;34806:67;;;34825:11;:20;34837:7;34825:20;;;;;;;;;;;;;;;:38;34861:1;34846:12;:16;34825:38;;;;;;;;;;;;;;;:44;;;34806:67;34799:74;;;34626:255;;;:::o;43305:121::-;22016:30;22033:12;:10;:12::i;:::-;22016:16;:30::i;:::-;22008:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43411:7;43390:18;:28;;;;43305:121;:::o;42700:245::-;22016:30;22033:12;:10;:12::i;:::-;22016:16;:30::i;:::-;22008:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42771:10;;42765:3;:16;42757:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42813:14;42837:13;;;;;;;;;;;42830:31;;;42870:4;42830:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42830:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42830:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42830:46:0;;;;;;;;;;;;;;;;42813:63;;42894:13;;;;;;;;;;;42887:30;;;42918:10;42930:6;42887:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42887:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42887:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42887:50:0;;;;;;;;;;;;;;;;;22126:1;42700:245::o;42157:97::-;22016:30;22033:12;:10;:12::i;:::-;22016:16;:30::i;:::-;22008:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42241:5;42230:8;;:16;;;;;;;;;;;;;;;;;;42157:97;:::o;22143:125::-;22207:4;22231:29;22252:7;22231:16;:20;;:29;;;;:::i;:::-;22224:36;;22143:125;;;:::o;33214:1211::-;33407:23;31442:80;;;;;;;;;;;;;;;;;;;33536:6;:4;:6::i;:::-;33520:24;;;;;;33563:12;:10;:12::i;:::-;33602:4;33457:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;33457:165:0;;;33433:200;;;;;;33407:226;;33646:18;31662:71;;;;;;;;;;;;;;;;;;;33758:9;33786:5;33810:6;33691:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;33691:140:0;;;33667:175;;;;;;33646:196;;33855:14;33960:15;33994:10;33896:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;33896:123:0;;;33872:158;;;;;;33855:175;;34043:17;34063:26;34073:6;34081:1;34084;34087;34063:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34063:26:0;;;;;;;;34043:46;;34129:1;34108:23;;:9;:23;;;;34100:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34213:6;:17;34220:9;34213:17;;;;;;;;;;;;;;;;:19;;;;;;;;;;;;34204:5;:28;34196:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34308:6;34301:3;:13;;34293:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34386:31;34396:9;34407;34386;:31::i;:::-;34379:38;;;;33214:1211;;;;;;:::o;27379:443::-;27426:7;27446:21;27476:13;;;;;;;;;;;27470:32;;;:34;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27470:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27470:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27470:34:0;;;;;;;;;;;;;;;;27446:58;;27515:17;27535;:15;:17::i;:::-;27515:37;;27563:30;27596:38;27620:13;27596:19;27610:4;27596:9;:13;;:19;;;;:::i;:::-;:23;;:38;;;;:::i;:::-;27563:71;;27647:22;27672:24;27682:13;;;;;;;;;;;27672:9;:24::i;:::-;27647:49;;27707:21;27731:52;27778:4;27731:42;27750:22;27731:14;:18;;:42;;;;:::i;:::-;:46;;:52;;;;:::i;:::-;27707:76;;27801:13;27794:20;;;;;;;27379:443;:::o;23810:25::-;;;;:::o;23842:18::-;;;;;;;;;;;;;:::o;23563:35::-;;;;:::o;11944:134::-;12016:7;12043:11;:18;12055:5;12043:18;;;;;;;;;;;;;;;:27;12062:7;12043:27;;;;;;;;;;;;;;;;12036:34;;11944:134;;;;:::o;23646:31::-;;;;:::o;23293:66::-;;;;;;;;;;;;;:::o;31616:117::-;31662:71;;;;;;;;;;;;;;;;;;;31616:117;:::o;23690:33::-;;;;:::o;31139:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43086:120::-;22016:30;22033:12;:10;:12::i;:::-;22016:16;:30::i;:::-;22008:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43183:8;:15;43192:5;43183:15;;;;;;;;;;;;;;;;;;;;;;;;;43182:16;43164:8;:15;43173:5;43164:15;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;43086:120;:::o;23225:23::-;;;;;;;;;;;;;:::o;858:98::-;903:15;938:10;931:17;;858:98;:::o;17206:338::-;17317:1;17300:19;;:5;:19;;;;17292:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17398:1;17379:21;;:7;:21;;;;17371:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17482:6;17452:11;:18;17464:5;17452:18;;;;;;;;;;;;;;;:27;17471:7;17452:27;;;;;;;;;;;;;;;:36;;;;17520:7;17504:32;;17513:5;17504:32;;;17529:6;17504:32;;;;;;;;;;;;;;;;;;17206:338;;;:::o;24594:767::-;24823:6;;;;;;;;;;;:32;;;;;24851:4;24833:22;;:8;:14;24842:4;24833:14;;;;;;;;;;;;;;;;;;;;;;;;;:22;;;;24823:32;:56;;;;;24875:4;24859:20;;:8;:12;24868:2;24859:12;;;;;;;;;;;;;;;;;;;;;;;;;:20;;;;24823:56;24820:111;;;24894:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24820:111;24984:1;24960:20;;:25;;:55;;;;;25010:5;24989:26;;:11;:17;25001:4;24989:17;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;24960:55;:83;;;;;25038:5;25019:24;;:11;:15;25031:2;25019:15;;;;;;;;;;;;;;;;;;;;;;;;;:24;;;24960:83;24956:398;;;25060:27;25090:32;25101:20;;25090:6;:10;;:32;;;;:::i;:::-;25060:62;;25137:57;25153:4;25167;25174:19;25137:15;:57::i;:::-;25209:58;25225:4;25231:2;25235:31;25246:19;25235:6;:10;;:31;;;;:::i;:::-;25209:15;:58::i;:::-;24956:398;;;;25309:33;25325:4;25331:2;25335:6;25309:15;:33::i;:::-;24956:398;24594:767;;;:::o;5918:192::-;6004:7;6037:1;6032;:6;;6040:12;6024:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;6024:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6064:9;6080:1;6076;:5;6064:17;;6101:1;6094:8;;;5918:192;;;;;:::o;4989:181::-;5047:7;5067:9;5083:1;5079;:5;5067:17;;5108:1;5103;:6;;5095:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5161:1;5154:8;;;4989:181;;;;:::o;30212:170::-;30280:55;30295:10;:19;30306:7;30295:19;;;;;;;;;;;;;;;;;;;;;;;;;30324:1;30328:6;30280:14;:55::i;:::-;30346:28;30358:7;30367:6;30346:11;:28::i;:::-;30212:170;;:::o;22657:154::-;22725:32;22749:7;22725:16;:23;;:32;;;;:::i;:::-;22795:7;22773:30;;;;;;;;;;;;22657:154;:::o;6361:471::-;6419:7;6669:1;6664;:6;6660:47;;;6694:1;6687:8;;;;6660:47;6719:9;6735:1;6731;:5;6719:17;;6764:1;6759;6755;:5;;;;;;:10;6747:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6823:1;6816:8;;;6361:471;;;;;:::o;7300:132::-;7358:7;7385:39;7389:1;7392;7385:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;7378:46;;7300:132;;;;:::o;36584:449::-;36675:23;36701:10;:21;36712:9;36701:21;;;;;;;;;;;;;;;;;;;;;;;;;36675:47;;36733:24;36760:20;36770:9;36760;:20::i;:::-;36733:47;;36871:9;36847:10;:21;36858:9;36847:21;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;36942:9;36898:54;;36925:15;36898:54;;36914:9;36898:54;;;;;;;;;;;;36965:60;36980:15;36997:9;37008:16;36965:14;:60::i;:::-;36584:449;;;;:::o;22503:146::-;22568:29;22589:7;22568:16;:20;;:29;;;;:::i;:::-;22633:7;22613:28;;;;;;;;;;;;22503:146;:::o;17730:232::-;17802:22;17808:7;17817:6;17802:5;:22::i;:::-;17835:119;17844:7;17853:12;:10;:12::i;:::-;17867:86;17906:6;17867:86;;;;;;;;;;;;;;;;;:11;:20;17879:7;17867:20;;;;;;;;;;;;;;;:34;17888:12;:10;:12::i;:::-;17867:34;;;;;;;;;;;;;;;;:38;;:86;;;;;:::i;:::-;17835:8;:119::i;:::-;17730:232;;:::o;26222:515::-;26325:1;26305:22;;:8;;;;;;;;;;;:22;;;26302:428;;26344:58;26368:4;26375:8;;;;;;;;;;;26385:16;26344:15;:58::i;:::-;26432:8;;;;;;;;;;;26417:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26417:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26417:31:0;;;;26468:32;26483:16;26468:32;;;;;;;;;;;;;;;;;;26302:428;;;26542:63;26566:4;26573:13;;;;;;;;;;;26588:16;26542:15;:63::i;:::-;26635:13;;;;;;;;;;;26620:34;;;:36;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26620:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26620:36:0;;;;26676:42;26701:16;26676:42;;;;;;;;;;;;;;;;;;26302:428;26222:515;:::o;26745:452::-;26801:14;26834:13;;;;;;;;;;;26828:28;;;26857:15;;;;;;;;;;;26874:8;26828:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26828:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26828:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26828:55:0;;;;;;;;;;;;;;;;;26927:15;;;;;;;;;;;26908:97;;;27032:4;27056:8;27083:1;27103;27131:8;;;;;;;;;;;27159:15;26908:281;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26908:281:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26908:281:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26908:281:0;;;;;;;;;;;;;;;;26894:295;;26745:452;;;:::o;19550:203::-;19622:4;19666:1;19647:21;;:7;:21;;;;19639:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19725:4;:11;;:20;19737:7;19725:20;;;;;;;;;;;;;;;;;;;;;;;;;19718:27;;19550:203;;;;:::o;38888:153::-;38933:4;38950:15;38998:9;38987:20;;39026:7;39019:14;;;38888:153;:::o;29837:189::-;29918:56;29933:10;:16;29944:4;29933:16;;;;;;;;;;;;;;;;;;;;;;;;;29951:10;:14;29962:2;29951:14;;;;;;;;;;;;;;;;;;;;;;;;;29967:6;29918:14;:56::i;:::-;29985:33;30001:4;30007:2;30011:6;29985:15;:33::i;:::-;29837:189;;;:::o;5445:136::-;5503:7;5530:43;5534:1;5537;5530:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;5523:50;;5445:136;;;;:::o;37041:947::-;37147:6;37137:16;;:6;:16;;;;:30;;;;;37166:1;37157:6;:10;37137:30;37133:848;;;37206:1;37188:20;;:6;:20;;;37184:385;;37277:16;37296:14;:22;37311:6;37296:22;;;;;;;;;;;;;;;;;;;;;;;;;37277:41;;37337:17;37369:1;37357:9;:13;;;:60;;37416:1;37357:60;;;37373:11;:19;37385:6;37373:19;;;;;;;;;;;;;;;:34;37405:1;37393:9;:13;37373:34;;;;;;;;;;;;;;;:40;;;37357:60;37337:80;;37436:17;37456:21;37470:6;37456:9;:13;;:21;;;;:::i;:::-;37436:41;;37496:57;37513:6;37521:9;37532;37543;37496:16;:57::i;:::-;37184:385;;;;37607:1;37589:20;;:6;:20;;;37585:385;;37678:16;37697:14;:22;37712:6;37697:22;;;;;;;;;;;;;;;;;;;;;;;;;37678:41;;37738:17;37770:1;37758:9;:13;;;:60;;37817:1;37758:60;;;37774:11;:19;37786:6;37774:19;;;;;;;;;;;;;;;:34;37806:1;37794:9;:13;37774:34;;;;;;;;;;;;;;;:40;;;37758:60;37738:80;;37837:17;37857:21;37871:6;37857:9;:13;;:21;;;;:::i;:::-;37837:41;;37897:57;37914:6;37922:9;37933;37944;37897:16;:57::i;:::-;37585:385;;;;37133:848;37041:947;;;:::o;16418:348::-;16513:1;16494:21;;:7;:21;;;;16486:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16587:68;16610:6;16587:68;;;;;;;;;;;;;;;;;:9;:18;16597:7;16587:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;16566:9;:18;16576:7;16566:18;;;;;;;;;;;;;;;:89;;;;16681:24;16698:6;16681:12;;:16;;:24;;;;:::i;:::-;16666:12;:39;;;;16747:1;16721:37;;16730:7;16721:37;;;16751:6;16721:37;;;;;;;;;;;;;;;;;;16418:348;;:::o;19272:183::-;19352:18;19356:4;19362:7;19352:3;:18::i;:::-;19344:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19442:5;19419:4;:11;;:20;19431:7;19419:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;19272:183;;:::o;7962:345::-;8048:7;8147:1;8143;:5;8150:12;8135:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;8135:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8174:9;8190:1;8186;:5;;;;;;8174:17;;8298:1;8291:8;;;7962:345;;;;;:::o;19014:178::-;19092:18;19096:4;19102:7;19092:3;:18::i;:::-;19091:19;19083:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19180:4;19157;:11;;:20;19169:7;19157:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;19014:178;;:::o;15026:471::-;15142:1;15124:20;;:6;:20;;;;15116:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15226:1;15205:23;;:9;:23;;;;15197:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15301;15323:6;15301:71;;;;;;;;;;;;;;;;;:9;:17;15311:6;15301:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;15281:9;:17;15291:6;15281:17;;;;;;;;;;;;;;;:91;;;;15406:32;15431:6;15406:9;:20;15416:9;15406:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;15383:9;:20;15393:9;15383:20;;;;;;;;;;;;;;;:55;;;;15471:9;15454:35;;15463:6;15454:35;;;15482:6;15454:35;;;;;;;;;;;;;;;;;;15026:471;;;:::o;37996:715::-;38175:18;38196:87;38203:12;38196:87;;;;;;;;;;;;;;;;;:6;:87::i;:::-;38175:108;;38315:1;38300:12;:16;;;:85;;;;;38374:11;38320:65;;:11;:22;38332:9;38320:22;;;;;;;;;;;;;;;:40;38358:1;38343:12;:16;38320:40;;;;;;;;;;;;;;;:50;;;;;;;;;;;;:65;;;38300:85;38296:339;;;38451:8;38402:11;:22;38414:9;38402:22;;;;;;;;;;;;;;;:40;38440:1;38425:12;:16;38402:40;;;;;;;;;;;;;;;:46;;:57;;;;38296:339;;;38531:33;;;;;;;;38542:11;38531:33;;;;;;38555:8;38531:33;;;38492:11;:22;38504:9;38492:22;;;;;;;;;;;;;;;:36;38515:12;38492:36;;;;;;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38622:1;38607:12;:16;38579:14;:25;38594:9;38579:25;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;38296:339;38673:9;38652:51;;;38684:8;38694;38652:51;;;;;;;;;;;;;;;;;;;;;;;;37996:715;;;;;:::o;38719:161::-;38794:6;38825:5;38821:1;:9;38832:12;38813:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;38813:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38870:1;38856:16;;38719:161;;;;:::o;40762:2667::-;;;;;;;;;;;;;;;;;;;;;:::o;15778:308::-;15873:1;15854:21;;:7;:21;;;;15846:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15939:24;15956:6;15939:12;;:16;;:24;;;;:::i;:::-;15924:12;:39;;;;15995:30;16018:6;15995:9;:18;16005:7;15995:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;15974:9;:18;15984:7;15974:18;;;;;;;;;;;;;;;:51;;;;16062:7;16041:37;;16058:1;16041:37;;;16071:6;16041:37;;;;;;;;;;;;;;;;;;15778:308;;:::o

Swarm Source

bzzr://73caa5442e5eb0155bf9dac27264faa9199176bcf19deff4cf1f6b990f709bc7
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.