FTM Price: $0.98 (-4.46%)
Gas: 56 GWei

Contract

0xBBCA403C20aD0932d0509af0132897a25aB1ebe0
 

Overview

FTM Balance

Fantom LogoFantom LogoFantom Logo0 FTM

FTM Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Approve661651792023-07-22 1:22:11251 days ago1689988931IN
0xBBCA403C...25aB1ebe0
0 FTM0.0030865766.48949337
Transfer215870722021-11-10 0:04:02870 days ago1636502642IN
0xBBCA403C...25aB1ebe0
0 FTM0.02291716149.6719
Vote Exclude Fro...215870072021-11-10 0:03:04870 days ago1636502584IN
0xBBCA403C...25aB1ebe0
0 FTM0.02167443149.6719
Transfer215865032021-11-09 23:54:00870 days ago1636502040IN
0xBBCA403C...25aB1ebe0
0 FTM0.02167495130.3114
Vote Swap And Li...215095242021-11-09 5:10:07871 days ago1636434607IN
0xBBCA403C...25aB1ebe0
0 FTM0.0039954115.8994
Approve214876082021-11-08 23:40:15871 days ago1636414815IN
0xBBCA403C...25aB1ebe0
0 FTM0.01003349222.9913
Create Pool214871502021-11-08 23:33:36871 days ago1636414416IN
0xBBCA403C...25aB1ebe0
0 FTM0.6452376247.7518
Vote Exclude Fro...210076122021-11-04 3:46:42876 days ago1635997602IN
0xBBCA403C...25aB1ebe0
0 FTM0.01144517144.1912
Vote Exclude Fro...210075932021-11-04 3:46:26876 days ago1635997586IN
0xBBCA403C...25aB1ebe0
0 FTM0.00713804144.1912
Revoke Minter201989032021-10-26 22:53:34884 days ago1635288814IN
0xBBCA403C...25aB1ebe0
0 FTM0.00727725310
Mint201978522021-10-26 22:38:55884 days ago1635287935IN
0xBBCA403C...25aB1ebe0
0 FTM0.03903613310
Vote Minter201974342021-10-26 22:33:04884 days ago1635287584IN
0xBBCA403C...25aB1ebe0
0 FTM0.02937219310

Latest 1 internal transaction

Parent Txn Hash Block From To Value
192821972021-10-16 22:49:30894 days ago1634424570  Contract Creation0 FTM
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ShibiesWrappedTreats

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at ftmscan.com on 2021-10-16
*/

// SPDX-License-Identifier: Unlicensed

/**
  
   Shibies Wrapped TREATS
   
   #TREATS x #SAFEMOON x #ANYSWAPV4 = #WTREATS
   
   AMOUNT BASED FEE x REDISTRIBUTION x AUTO LIQUIDITY x MULTICHAIN READY
   
   Wrapped TREATS is not a new token or an update of TREATS. 
   It is another option and is intended to increase our reach. 
   It is not necessary to wrap TREATS to WTREATS. 
   Through CREATE2, we will deploy our contract with the same address 
   on different EVM compatible chains with 100% the same code. 
   TREATS will be to wrap 1:1 with WTREATS but do not forget the transaction fee of WTREATS. 
   The total supply will not increase because WTREATS can only be minted by wraping.
   With WTREATS we get the function to execute a swap over decentralized bridges. 
   So everyone can swap his tokens back and forth between the supported chains. 
   The bridges can mint new tokens and burn old ones via the external functions Swapin and Swapout, 
   so no bridge gets control over tokens. 
   Only added bridges and our wrapper will be allowed to call these functions.
   
   Variable transaction fee with auto rewards to all holders and auto liquidity:
   
   L   R
   1%  0%                    0+ TREATS
   1%  1%                  100+ TREATS
   2%  1%                1,000+ TREATS
   2%  2%               10,000+ TREATS
   3%  2%              100,000+ TREATS
   3%  3%            1,000,000+ TREATS
   4%  4%           10,000,000+ TREATS
   5%  5%          100,000,000+ TREATS
   6%  6%        1,000,000,000+ TREATS
   8%  7&       10,000,000,000+ TREATS
   10% 10%   1,000,000,000,000+ TREATS
   
   R=REDISTRIBUTION L=LIQUIDITY

 */

pragma solidity ^0.8.2;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function permit(address target, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
    function transferWithPermit(address target, address to, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// interface for start voting in the voting contract
interface Voter {
    function startVote(bytes32 hash, string memory vote) external returns (bool);
}

/**
 * @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.
     */
    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.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
    }

    /**
     * @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.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

/**
 * @dev Interface of the ERC2612 standard as defined in the EIP.
 *
 * Adds the {permit} method, which can be used to change one's
 * {IERC20-allowance} without having to send a transaction, by signing a
 * message. This allows users to spend tokens without having to hold Ether.
 *
 * See https://eips.ethereum.org/EIPS/eip-2612.
 */
interface IERC2612 {

    /**
     * @dev Returns the current ERC2612 nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);
}

/// @dev Wrapped ERC-20 v10 (AnyswapV3ERC20) is an ERC-20 ERC-20 wrapper. You can `deposit` ERC-20 and obtain an AnyswapV3ERC20 balance which can then be operated as an ERC-20 token. You can
/// `withdraw` ERC-20 from AnyswapV3ERC20, which will then burn AnyswapV3ERC20 token in your wallet. The amount of AnyswapV3ERC20 token in any wallet is always identical to the
/// balance of ERC-20 deposited minus the ERC-20 withdrawn with that specific wallet.
interface IAnyswapV3ERC20 is IERC20, IERC2612 {

    /// @dev Sets `value` as allowance of `spender` account over caller account's AnyswapV3ERC20 token,
    /// after which a call is executed to an ERC677-compliant contract with the `data` parameter.
    /// Emits {Approval} event.
    /// Returns boolean value indicating whether operation succeeded.
    /// For more information on approveAndCall format, see https://github.com/ethereum/EIPs/issues/677.
    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);

    /// @dev Moves `value` AnyswapV3ERC20 token from caller's account to account (`to`),
    /// after which a call is executed to an ERC677-compliant contract with the `data` parameter.
    /// A transfer to `address(0)` triggers an ERC-20 withdraw matching the sent AnyswapV3ERC20 token in favor of caller.
    /// Emits {Transfer} event.
    /// Returns boolean value indicating whether operation succeeded.
    /// Requirements:
    ///   - caller account must have at least `value` AnyswapV3ERC20 token.
    /// For more information on transferAndCall format, see https://github.com/ethereum/EIPs/issues/677.
    function transferAndCall(address to, uint value, bytes calldata data) external returns (bool);
}

interface ITransferReceiver {
    function onTokenTransfer(address, uint, bytes calldata) external returns (bool);
}

interface IApprovalReceiver {
    function onTokenApproval(address, uint, bytes calldata) external returns (bool);
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

library SafeERC20 {
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint value) internal {
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// pragma solidity >=0.5.0;

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

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

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

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

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


// pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

// pragma solidity >=0.6.2;

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

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

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

// pragma solidity >=0.6.2;

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

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

contract ShibiesWrappedTreats is Context, IERC20, IAnyswapV3ERC20 {
    using SafeMath for uint256;
    using Address for address;
    using SafeERC20 for IERC20;
    
    /// @dev Records current ERC2612 nonce for account. This value must be included whenever signature is generated for {permit}.
    /// Every successful call to {permit} increases account's nonce by one. This prevents signature from being used multiple times.
    mapping (address => uint256) public override nonces;

    bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public constant TRANSFER_TYPEHASH = keccak256("Transfer(address owner,address to,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public immutable DOMAIN_SEPARATOR;

    /// @dev Records number of AnyswapV3ERC20 token that account (second) will be allowed to spend on behalf of another account (first) through {transferFrom}.
    mapping (address => mapping (address => uint256)) public override allowance;

    // primary controller of the token contract
    address public vault;
    
    // burn address of lp-token
    address public burnAddress = 0xdEAD000000000000000042069420694206942069;

    // set of minters, can be this bridge or other bridges
    mapping(address => bool) public isMinter;
    
    // set of operators, can be this address or other addresses
    mapping(address => bool) public isOperator;

     // list of minters for call mint and burn of the token contract
    address[] public minters;

    // list of operators for votes of the token contract
    address[] public operators;

    // flag to enable/disable swapout vs vault.burn so multiple events are triggered
    bool private _authOnly;

    // configurable delay for timelock functions and voting
    uint public delay = 7*24*3600;
    
    // voting variables
    uint public delayVote;
    uint private votingFunction;
    
    bytes32 public pendingVote;
    
    string public lastVote;
    
    bool private voteBool;
    bool private voteAddr;
    bool private votingBool;
    
    address private votingAddr;
    
    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;

    mapping (address => bool) private _isExcludedFromFee;

    mapping (address => bool) private _isExcluded;
    address[] private _excluded;
   
    uint256 private constant MAX = ~uint256(0);
    uint256 private _tMaxTotal = 544000000000000 * 10**18;
    uint256 private _tTotal = 0;
    uint256 private _rMaxTotal = (MAX - (MAX % _tMaxTotal));
    uint256 private _rTotal = 0;
    uint256 private _tFeeTotal;
    uint256 private _rFeeTotal;
    uint256 private _taxFee;
    uint256 private _liquidityFee;

    string private _name = "Shibies Wrapped Treats";
    string private _symbol = "WTREATS";
    
    uint8 private _decimals = 18;

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair = address(0);
    
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    
    uint256 private numTokensSellToAddToLiquidity = 400000000 * 10**18;
    
    event LogSwapin(bytes32 indexed txhash, address indexed account, uint amount);
    event LogSwapout(address indexed account, address indexed bindaddr, uint amount);
    event LogChangeVault(address indexed auth, uint timestamp);
    event LogAddOperator(address indexed auth, uint timestamp);
    event LogAddAuth(address indexed auth, uint timestamp);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity);
    
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }
    
    modifier onlyOperator() {
        require(isOperator[msg.sender], "FORBIDDEN, only operator!");
        _;
    }
    
    modifier onlyAuth() {
        require(isMinter[msg.sender], "FORBIDDEN, only auth!");
        _;
    }

    modifier onlyVault() {
        require(msg.sender == vault, "FORBIDDEN, only vault!");
        _;
    }
    
    constructor() {
        vault = 0x480a891b2c60F73769c0A8a6b689DD63A5964172;
        isOperator[vault] = true;
        operators.push(vault);

        // Disable/Enable swapout for v1 tokens vs mint/burn for v3 tokens
        _authOnly = true;

        uint256 chainId;
        assembly {chainId := chainid()}
        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                keccak256(bytes(_name)),
                keccak256(bytes("1")),
                chainId,
                address(this)));
        
        // exclude vault and this contract from fee and reward
        _isExcludedFromFee[vault] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcluded[vault] = true;
        _isExcluded[address(this)] = true;
        _excluded.push(vault);
        _excluded.push(address(this));
    }
    
    function name() public view returns (string memory) {
        return _name;
    }

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

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

    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }
    
    function maxSupply() public view returns (uint256) {
        return _tMaxTotal.div(10**18);
    }
    
    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }
    
    
    function approve(address spender, uint256 amount) public override returns (bool) {
       _approve(_msgSender(), spender, amount);
       return true;
    }


    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), allowance[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

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

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

    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    // get total of reflected fees
    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }
    
    // get reflection of token amount
    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,,) = _getValues(tAmount);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,,) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    // get token amount of reflection
    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }
    
     // get list of minters
    function getAllMinters() external view returns (address[] memory) {
        return minters;
    }
     // get list of operators
    function getAllOperators() external view returns (address[] memory) {
        return operators;
    }
    
    // reflect a amount of tokens to holder
    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,,,,,) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }
    
    //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}
    
    /// @dev Sets `value` as allowance of `spender` account over caller account's AnyswapV3ERC20 token,
    /// after which a call is executed to an ERC677-compliant contract with the `data` parameter.
    /// Emits {Approval} event.
    /// Returns boolean value indicating whether operation succeeded.
    /// For more information on approveAndCall format, see https://github.com/ethereum/EIPs/issues/677.
    function approveAndCall(address spender, uint256 value, bytes calldata data) external override returns (bool) {
        allowance[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return IApprovalReceiver(spender).onTokenApproval(msg.sender, value, data);
    }

    /// @dev Sets `value` as allowance of `spender` account over `owner` account's AnyswapV3ERC20 token, given `owner` account's signed approval.
    /// Emits {Approval} event.
    /// Requirements:
    ///   - `deadline` must be timestamp in future.
    ///   - `v`, `r` and `s` must be valid `secp256k1` signature from `owner` account over EIP712-formatted function arguments.
    ///   - the signature must use `owner` account's current nonce (see {nonces}).
    ///   - the signer cannot be zero address and must be `owner` account.
    /// For more information on signature format, see https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP section].
    /// AnyswapV3ERC20 token implementation adapted from https://github.com/albertocuestacanada/ERC20Permit/blob/master/contracts/ERC20Permit.sol.
    function permit(address target, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external override {
        require(block.timestamp <= deadline, "Expired permit");
        bytes32 hashStruct = keccak256(
            abi.encode(
                PERMIT_TYPEHASH,
                target,
                spender,
                value,
                nonces[target]++,
                deadline));

        require(verifyEIP712(target, hashStruct, v, r, s) || verifyPersonalSign(target, hashStruct, v, r, s));
        allowance[target][spender] = value;
        emit Approval(target, spender, value);
    }

    function transferWithPermit(address target, address to, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external override returns (bool) {
        require(block.timestamp <= deadline, "Expired permit");
        bytes32 hashStruct = keccak256(
            abi.encode(
                TRANSFER_TYPEHASH,
                target,
                to,
                value,
                nonces[target]++,
                deadline));

        require(verifyEIP712(target, hashStruct, v, r, s) || verifyPersonalSign(target, hashStruct, v, r, s));
        require(to != address(0) || to != address(this));
        uint256 balance = balanceOf(target);
        require(balance >= value, "Transfer amount exceeds balance");
        _transfer(target, to, value);
        return true;
    }

    function verifyEIP712(address target, bytes32 hashStruct, uint8 v, bytes32 r, bytes32 s) internal view returns (bool) {
        bytes32 hash = keccak256(
            abi.encodePacked(
                "\x19\x01",
                DOMAIN_SEPARATOR,
                hashStruct));
        address signer = ecrecover(hash, v, r, s);
        return (signer != address(0) && signer == target);
    }

    function verifyPersonalSign(address target, bytes32 hashStruct, uint8 v, bytes32 r, bytes32 s) internal pure returns (bool) {
        bytes32 hash = prefixed(hashStruct);
        address signer = ecrecover(hash, v, r, s);
        return (signer != address(0) && signer == target);
    }

    // Builds a prefixed hash to mimic the behavior of eth_sign.
    function prefixed(bytes32 hash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /// @dev Moves `value` AnyswapV3ERC20 token from caller's account to account (`to`),
    /// after which a call is executed to an ERC677-compliant contract with the `data` parameter.
    /// A transfer to `address(0)` triggers an ETH withdraw matching the sent AnyswapV3ERC20 token in favor of caller.
    /// Emits {Transfer} event.
    /// Returns boolean value indicating whether operation succeeded.
    /// Requirements:
    ///   - caller account must have at least `value` AnyswapV3ERC20 token.
    /// For more information on transferAndCall format, see https://github.com/ethereum/EIPs/issues/677.
    function transferAndCall(address to, uint value, bytes calldata data) external override returns (bool) {
        require(to != address(0) || to != address(this));
        uint256 balance = balanceOf(msg.sender);
        require(balance >= value, "AnyswapV3ERC20: transfer amount exceeds balance");
        _transfer(msg.sender, to, value);
        return ITransferReceiver(to).onTokenTransfer(msg.sender, value, data);
    }
    
    // no time delay revoke minter emergency function
    function revokeMinter(address _auth) external onlyOperator {
        require(isMinter[_auth], "Address is no minter!");
        isMinter[_auth] = false;
        for (uint256 i = 0; i < minters.length; i++) {
            if (minters[i] == _auth) {
                if(i != (minters.length - 1)){minters[i] = minters[minters.length - 1];}
                minters.pop();
                break;
            }
        }
    }
    
    // start community voting to set AuthOnly variables
    function voteAuthOnly(bool enabled) external onlyOperator {
        require(pendingVote == "", "One vote is still running!");
        require(_authOnly != enabled, "AuthOnly is already set so!");
        if(isOperator[vault]){
           setAuthOnly(enabled); 
           return;
        }
        string memory voteName = "Swap out for Auth only to ";
        uint functionId = 1;
        setVoteTitelBool(voteName, enabled, functionId);
    }
    
    // start community voting to set auto liquidity
    function voteSwapAndLiquifyEnabled(bool enabled) external onlyOperator {
        require(pendingVote == "", "One vote is still running!");
        require(swapAndLiquifyEnabled != enabled, "SwapAndLiquify is already set so!");
        if(isOperator[vault]){
           setSwapAndLiquifyEnabled(enabled); 
           return;
        }
        string memory voteName = "Swap and liquify to ";
        uint256 functionId = 2;
        setVoteTitelBool(voteName, enabled, functionId);
        return;
    }
    
    // start community voting for add minter
    function voteMinter(address account) external onlyOperator {
        require(pendingVote == "", "One vote is still running!");
        require(!isMinter[account], "Address is already minter!");
        if(isOperator[vault]){
           setMinter(account); 
           return;
        }
        string memory voteName = "Mint authorization to ";
        uint functionId = 3;
        setVoteTitelAddr(voteName, account, functionId);
    }
    
    // start community voting to exclude address from reward
    function voteExcludeFromReward(address account) external onlyOperator {
        require(pendingVote == "", "One vote is still running!");
        require(account != address(uniswapV2Router), 'We can not exclude main DEX router.');
        require(!_isExcluded[account], "Account is already excluded");
        if(isOperator[vault]){
           excludeFromReward(account); 
           return;
        }
        string memory voteName = "Exclude from reward ";
        uint functionId = 4;
        setVoteTitelAddr(voteName, account, functionId);
    }
    
    // start community voting to include address in reward
    function voteIncludeInReward(address account) external onlyOperator {
        require(pendingVote == "", "One vote is still running!");
        require(_isExcluded[account], "Account is already excluded");
        if(isOperator[vault]){
           includeInReward(account); 
           return;
        }
        string memory voteName = "Include in reward ";
        uint functionId = 5;
        setVoteTitelAddr(voteName, account, functionId);
    }
    
    // start community voting to exclude address from fee
    function voteExcludeFromFee(address account) external onlyOperator {
        require(pendingVote == "", "One vote is still running!");
        require(!_isExcludedFromFee[account], "Address is already excluded from fee!");
        if(isOperator[vault]){
           excludeFromFee(account); 
           return;
        }
        string memory voteName = "Exclude from fee ";
        uint functionId = 6;
        setVoteTitelAddr(voteName, account, functionId);
    }
    
    // start community voting to include address in fee
    function voteIncludeInFee(address account) external onlyOperator {
        require(pendingVote == "", "One vote is still running!");
        require(_isExcludedFromFee[account], "Address is already included in fee!");
        if(isOperator[vault]){
           includeInFee(account); 
           return;
        }
        string memory voteName = "Include in fee ";
        uint functionId = 7;
        setVoteTitelAddr(voteName, account, functionId);
    }
    
    //Get vote result from voting contract
    function endVote(bytes32 hash, bool result) external onlyVault returns (bool) {
        require(pendingVote == hash, "Vote could not be found!");
        require(block.timestamp >= delayVote, "Voting time not over!");
        if(result){
            if(voteBool){
                voteBool = false;
                if(votingFunction == 1){
                    setAuthOnly(votingBool);
                }else if(votingFunction == 2){
                    setSwapAndLiquifyEnabled(votingBool);
                }
            }else if(voteAddr){
                voteAddr = false;
                if(votingFunction == 3){
                    setMinter(votingAddr);
                }else if(votingFunction == 4){
                    excludeFromReward(votingAddr);
                }else if(votingFunction == 5){
                    includeInReward(votingAddr);
                }else if(votingFunction == 6){
                    excludeFromFee(votingAddr);
                }else if(votingFunction == 7){
                    includeInFee(votingAddr);
                }
            }
        }else{
            if(voteBool){
               voteBool = false;
            }else if(voteAddr){
               voteAddr = false;
            }
        }
        pendingVote = "";
        return true;
    }
    
    //Set delay via community voting
    function setDelay(uint256 day) external onlyVault returns (bool) {
        require(day >= 3, "Delay cannot be less than 3 days!");
        require(day <= 30, "Delay cannot be more than 30 days!");
        delay = day*24*3600;
        return true;
    }
    
    //Set new operator via community voting
    function setOperator(address _auth) external onlyVault returns (bool) {
        isOperator[_auth] = true;
        operators.push(_auth);
        emit LogAddOperator(_auth, block.timestamp);
        return true;
    }
    
    //Set new owner via community voting
    function setVault(address _vault) external onlyVault returns (bool) {
        vault = _vault;
        emit LogChangeVault(_vault, block.timestamp);
        return true;
    }
    
    //Revoke operator via community voting
    function revokeOperator(address _auth) external onlyVault returns (bool) {
        isOperator[_auth] = false;
        for (uint256 i = 0; i < operators.length; i++) {
            if (operators[i] == _auth) {
                if(i != (operators.length - 1)){operators[i] = operators[operators.length - 1];}
                operators.pop();
                break;
            }
        }
        return true;
    }
    
    // creates a new pool once for this token
    function createPool(address router) public onlyVault {
        require(uniswapV2Pair == address(0), "Pool is already created");
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(router);
        // Create a uniswap pair for this new token
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
              .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
    }

    function mint(address to, uint256 amount) external onlyAuth returns (bool) {
        require(amount <= _tMaxTotal.sub(_tTotal), "Amount must be less than total supply!");
        _mint(to, amount);
        return true;
    }

    function burn(address from, uint256 amount) external onlyAuth returns (bool) {
        require(from != address(0), "Not address(0x0)");
        _burn(from, amount);
        return true;
    }

    function Swapin(bytes32 txhash, address account, uint256 amount) public onlyAuth returns (bool) {
        _mint(account, amount);
        emit LogSwapin(txhash, account, amount);
        return true;
    }

    function Swapout(uint256 amount, address bindaddr) public returns (bool) {
        require(!_authOnly, "Forbidden: only Auth");
        require(bindaddr != address(0), "Not address(0x0)");
        _burn(msg.sender, amount);
        emit LogSwapout(msg.sender, bindaddr, amount);
        return true;
    }
    
    function setAuthOnly(bool enabled) private {
        _authOnly = enabled;
    }
    
    function setMinter(address _auth) private {
        isMinter[_auth] = true;
        minters.push(_auth);
        emit LogAddAuth(_auth, block.timestamp);
    }

    
    // set vote titel and hash id and save voting variables for bool votes
    function setVoteTitelBool(string memory titel, bool changeTo, uint number) private {
        string memory result;
        
        if(changeTo){
            result="true";
        }else{
            result="false";
        }
        
        lastVote = string(abi.encodePacked(titel, result));
        pendingVote = getHash(lastVote);
        Voter(vault).startVote(pendingVote, lastVote);
        voteBool = true;
        votingBool = changeTo;
        votingFunction = number;
        delayVote = block.timestamp + delay;
        return;
    }
    
    // set vote titel and hash id and save voting variables for address votes
    function setVoteTitelAddr(string memory titel, address changeTo, uint number) private {
        lastVote = string(abi.encodePacked(titel, toString(abi.encodePacked(changeTo))));
        pendingVote = getHash(lastVote);
        Voter(vault).startVote(pendingVote, lastVote);
        voteAddr = true;
        votingAddr = changeTo;
        votingFunction = number;
        delayVote = block.timestamp + delay;
        return;
    }
    
    function getHash(string memory titel) private view returns (bytes32) {
        bytes32 hash = keccak256(
                abi.encode(keccak256(bytes(titel)),
                keccak256(abi.encodePacked(block.timestamp)),
                keccak256(abi.encodePacked(address(this)))));
                
        return hash;
    }

   /** @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), "No mint to the zero address");
        (uint256 rAmount,,,,,) = _getValues(amount);
         _rTotal = _rTotal.add(rAmount);
         _tTotal = _tTotal.add(amount);
        _rOwned[account] = _rOwned[account].add(rAmount);
        if(_isExcluded[account])
            _tOwned[account] = _tOwned[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), "No burn from the zero address");
        (uint256 rAmount,,,,, ) = _getValues(amount);
        _rOwned[account] = _rOwned[account].sub(rAmount);
        if(_isExcluded[account])
            _tOwned[account] = _tOwned[account].sub(amount);
         
         _rTotal = _rTotal.sub(rAmount);
         _tTotal = _tTotal.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    function excludeFromReward(address account) private {
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) private {
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                if(i != (_excluded.length - 1)){_excluded[i] = _excluded[_excluded.length - 1];}
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }
        
    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }
    
    function excludeFromFee(address account) private {
        _isExcludedFromFee[account] = true;
    }
    
    function includeInFee(address account) private {
        _isExcludedFromFee[account] = false;
    }

    function setSwapAndLiquifyEnabled(bool _enabled) private {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal += tFee;
    }

    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, _getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity);
    }

    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256) {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);
        return (tTransferAmount, tFee, tLiquidity);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        if (_tTotal == 0) return (_rMaxTotal, _tMaxTotal);
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }
    
    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if(_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }
    
    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxFee).div(
            10**2
        );
    }

    function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_liquidityFee).div(
            10**2
        );
    }
    
    function removeAllFee() private {
        if(_taxFee == 0 && _liquidityFee == 0){ return;}
        _taxFee = 0;
        _liquidityFee = 0;
    }
    
    function setFee(uint256 amount) private {
         //determine fee according to transaction amount
        if(amount > (100*10**18)){
                if(amount > 1000000000000*10**18){
                    _taxFee = 10;
                    _liquidityFee = 10;
                }else if(amount > 10000000000*10**18){
                    _taxFee = 7;
                    _liquidityFee = 8;
                }else if(amount > 10000000000*10**18){
                    _taxFee = 6;
                    _liquidityFee = 6;
                }else if(amount > 1000000000*10**18){
                    _taxFee = 5;
                    _liquidityFee = 5;
                }else if(amount > 100000000*10**18){
                    _taxFee = 4;
                    _liquidityFee = 4;
                }else if(amount > 10000000*10**18){
                    _taxFee = 3;
                    _liquidityFee = 3;
                }else if(amount > 1000000*10**18){
                    _taxFee = 2;
                    _liquidityFee = 3;
                }else if(amount > 10000*10**18){
                    _taxFee = 2;
                    _liquidityFee = 2;
                }else if(amount > 1000*10**18){
                    _taxFee = 1;
                    _liquidityFee = 2;
                }else{
                    _taxFee = 1;
                    _liquidityFee = 1;
                }
             }else{
                 _taxFee = 0;
                 _liquidityFee = 1;
             }
    }
    
    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }

    function _approve(address holder, address spender, uint256 amount) private {
        require(holder != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        allowance[holder][spender] = amount;
        emit Approval(holder, spender, amount);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinTokenBalance = contractTokenBalance >= numTokensSellToAddToLiquidity;
        if (
            overMinTokenBalance &&
            !inSwapAndLiquify &&
            from != uniswapV2Pair &&
            swapAndLiquifyEnabled &&
            uniswapV2Pair != address(0)
        ) {
            contractTokenBalance = numTokensSellToAddToLiquidity;
            //add liquidity
            swapAndLiquify(contractTokenBalance);
        }
        
        //indicates if fee should be deducted from transfer
        bool takeFee = true;
        
        //if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;
        }
        
        //transfer amount, it will take tax, burn, liquidity fee
        _tokenTransfer(from,to,amount,takeFee);
    }

    function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        // split the contract balance into halves
        uint256 half = contractTokenBalance.div(2);
        uint256 otherHalf = contractTokenBalance.sub(half);

        // capture the contract's current ETH balance.
        // this is so that we can capture exactly the amount of ETH that the
        // swap creates, and not make the liquidity event include any ETH that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;

        // swap tokens for ETH
        swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered

        // how much ETH did we just swap into?
        uint256 newBalance = address(this).balance.sub(initialBalance);

        // add liquidity to uniswap
        addLiquidity(otherHalf, newBalance);
        
        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

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

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

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            burnAddress,
            block.timestamp
        );
    }

    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) private {
        if(!takeFee){
            removeAllFee();
        }else {
            //determine fee according to transaction amount
            setFee(amount);
        }
        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
        
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); 
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); 
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    // generate string from bytes data
    function toString(bytes memory data) private pure returns(string memory) {
        bytes memory alphabet = "0123456789abcdef";
        bytes memory str = new bytes(2 + data.length * 2);
        str[0] = "0";
        str[1] = "x";
        for (uint i = 0; i < data.length; i++) {
            str[2+i*2] = alphabet[uint(uint8(data[i] >> 4))];
            str[3+i*2] = alphabet[uint(uint8(data[i] & 0x0f))];
        }
        return string(str);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"auth","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LogAddAuth","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"auth","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LogAddOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"auth","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LogChangeVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"txhash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogSwapin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"bindaddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogSwapout","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txhash","type":"bytes32"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Swapin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"bindaddr","type":"address"}],"name":"Swapout","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TRANSFER_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"approveAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"createPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"delay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delayVote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bool","name":"result","type":"bool"}],"name":"endVote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAllMinters","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllOperators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastVote","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"minters","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"operators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingVote","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_auth","type":"address"}],"name":"revokeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_auth","type":"address"}],"name":"revokeOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"day","type":"uint256"}],"name":"setDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_auth","type":"address"}],"name":"setOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"setVault","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"transferWithPermit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"voteAuthOnly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"voteExcludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"voteExcludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"voteIncludeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"voteIncludeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"voteMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"voteSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a0604052600380546001600160a01b03191673dead00000000000000004206942069420694206917905562093a806009556d1ad23ecd3a95b87991c800000000601481905560006015556200005890600019620004e6565b620000669060001962000485565b60169081556000601755604080518082019091528181527f53686962696573205772617070656420547265617473000000000000000000006020909101908152620000b591601c91906200033c565b50604080518082019091526007808252665754524541545360c81b6020909201918252620000e691601d916200033c565b50601e805460ff19166012179055601f8054600161ff0160a01b031916600160a81b1790556b014adf4b7320334b900000006020553480156200012857600080fd5b50600280546001600160a01b031990811673480a891b2c60f73769c0a8a6b689dd63a5964172178083556001600160a01b03908116600090815260056020526040808220805460ff199081166001908117909255955460078054808401825594527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889093018054909516929093169190911790925560088054909316179091555146907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90620001fb90601c90620003e2565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018290523060a082015260c00160408051808303601f190181529181528151602092830120608052600280546001600160a01b039081166000908152601185528381208054600160ff19918216811790925530808452868420805483168417905585548516845260129097528583208054821683179055868352948220805490951681179094559154601380548086018255938190527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0909384018054929093166001600160a01b03199283161790925581549384019091559101805490911690911790555062000507565b8280546200034a90620004a9565b90600052602060002090601f0160209004810192826200036e5760008555620003b9565b82601f106200038957805160ff1916838001178555620003b9565b82800160010185558215620003b9579182015b82811115620003b95782518255916020019190600101906200039c565b50620003c7929150620003cb565b5090565b5b80821115620003c75760008155600101620003cc565b8154600090819060028104600180831680620003ff57607f831692505b60208084108214156200042057634e487b7160e01b87526022600452602487fd5b818015620004375760018114620004495762000477565b60ff1986168952848901965062000477565b60008a815260209020885b868110156200046f5781548b82015290850190830162000454565b505084890196505b509498975050505050505050565b600082821015620004a457634e487b7160e01b81526011600452602481fd5b500390565b600281046001821680620004be57607f821691505b60208210811415620004e057634e487b7160e01b600052602260045260246000fd5b50919050565b6000826200050257634e487b7160e01b81526012600452602481fd5b500690565b6080516153166200052a6000396000818161056501526135b101526153166000f3fe60806040526004361061038f5760003560e01c806370a08231116101dc578063b3509e8d11610102578063dd62ed3e116100a0578063ec126c771161006f578063ec126c7714610b21578063f9decb5a14610b41578063fad8b32a14610b57578063fbfa77cf14610b7757610396565b8063dd62ed3e14610a89578063e177246e14610ac1578063e28d490614610ae1578063e7cb799414610b0157610396565b8063cfbd4885116100dc578063cfbd488514610a1f578063d505accf14610a3f578063d5abeb0114610a5f578063d911c63214610a7457610396565b8063b3509e8d146109ca578063b3ab15fb146109df578063cae9ca51146109ff57610396565b80639049f9d21161017a578063a457c2d711610149578063a457c2d71461093a578063a8dd3f4d1461095a578063a9059cbb1461097a578063aa271e1a1461099a57610396565b80639049f9d2146108c357806395d89b41146108e35780639dc29fac146108f8578063a045442c1461091857610396565b80637ecebe00116101b65780637ecebe001461081d57806385eeee851461084a5780638623ec7b1461086a57806388f820201461088a57610396565b806370a08231146107bd57806370d5ae05146107dd5780637c649865146107fd57610396565b80634000aea0116102c1578063605629d61161025f5780636817031b1161022e5780636817031b146107375780636a42b8f8146107575780636cb8bc861461076d5780636d70f7ae1461078d57610396565b8063605629d6146106c1578063625c65f2146106e1578063628d6cba146106f757806363767d2b1461071757610396565b806349bd5a5e1161029b57806349bd5a5e146106275780634a74bb02146106475780635342acb4146106685780636022618d146106a157610396565b80634000aea0146105c757806340c10f19146105e75780634549b0391461060757610396565b80632d73ba571161032e578063313ce56711610308578063313ce567146105315780633644e5151461055357806339509351146105875780633bd5d173146105a757610396565b80632d73ba57146104bb5780632d838119146104dd57806330adf81f146104fd57610396565b806313114a9d1161036a57806313114a9d146104345780631694505e1461044957806318160ddd1461048657806323b872dd1461049b57610396565b8062bf26f41461039b57806306fdde03146103e2578063095ea7b31461040457610396565b3661039657005b600080fd5b3480156103a757600080fd5b506103cf7f42ce63790c28229c123925d83266e77c04d28784552ab68b350a9003226cbd5981565b6040519081526020015b60405180910390f35b3480156103ee57600080fd5b506103f7610b97565b6040516103d99190615053565b34801561041057600080fd5b5061042461041f366004614d3c565b610c29565b60405190151581526020016103d9565b34801561044057600080fd5b506018546103cf565b34801561045557600080fd5b50601e5461046e9061010090046001600160a01b031681565b6040516001600160a01b0390911681526020016103d9565b34801561049257600080fd5b506015546103cf565b3480156104a757600080fd5b506104246104b6366004614c87565b610c40565b3480156104c757600080fd5b506104db6104d6366004614deb565b610ca9565b005b3480156104e957600080fd5b506103cf6104f8366004614e6d565b610dd8565b34801561050957600080fd5b506103cf7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b34801561053d57600080fd5b50601e5460405160ff90911681526020016103d9565b34801561055f57600080fd5b506103cf7f000000000000000000000000000000000000000000000000000000000000000081565b34801561059357600080fd5b506104246105a2366004614d3c565b610e5e565b3480156105b357600080fd5b506104db6105c2366004614e6d565b610e94565b3480156105d357600080fd5b506104246105e2366004614d67565b610f7e565b3480156105f357600080fd5b50610424610602366004614d3c565b6110b7565b34801561061357600080fd5b506103cf610622366004614e49565b61115d565b34801561063357600080fd5b50601f5461046e906001600160a01b031681565b34801561065357600080fd5b50601f5461042490600160a81b900460ff1681565b34801561067457600080fd5b50610424610683366004614c17565b6001600160a01b031660009081526011602052604090205460ff1690565b3480156106ad57600080fd5b506104db6106bc366004614c17565b6111ea565b3480156106cd57600080fd5b506104246106dc366004614cc7565b611311565b3480156106ed57600080fd5b506103cf600a5481565b34801561070357600080fd5b50610424610712366004614e85565b6114bf565b34801561072357600080fd5b506104db610732366004614c17565b6115a8565b34801561074357600080fd5b50610424610752366004614c17565b611733565b34801561076357600080fd5b506103cf60095481565b34801561077957600080fd5b50610424610788366004614e49565b6117ba565b34801561079957600080fd5b506104246107a8366004614c17565b60056020526000908152604090205460ff1681565b3480156107c957600080fd5b506103cf6107d8366004614c17565b611a15565b3480156107e957600080fd5b5060035461046e906001600160a01b031681565b34801561080957600080fd5b506104db610818366004614c17565b611a77565b34801561082957600080fd5b506103cf610838366004614c17565b60006020819052908152604090205481565b34801561085657600080fd5b506104db610865366004614c17565b611b90565b34801561087657600080fd5b5061046e610885366004614e6d565b611cae565b34801561089657600080fd5b506104246108a5366004614c17565b6001600160a01b031660009081526012602052604090205460ff1690565b3480156108cf57600080fd5b506104db6108de366004614c17565b611cd8565b3480156108ef57600080fd5b506103f7611f0d565b34801561090457600080fd5b50610424610913366004614d3c565b611f1c565b34801561092457600080fd5b5061092d611f9e565b6040516103d99190614f90565b34801561094657600080fd5b50610424610955366004614d3c565b611fff565b34801561096657600080fd5b506104db610975366004614deb565b61207c565b34801561098657600080fd5b50610424610995366004614d3c565b61219a565b3480156109a657600080fd5b506104246109b5366004614c17565b60046020526000908152604090205460ff1681565b3480156109d657600080fd5b506103f76121a7565b3480156109eb57600080fd5b506104246109fa366004614c17565b612235565b348015610a0b57600080fd5b50610424610a1a366004614d67565b6122f9565b348015610a2b57600080fd5b506104db610a3a366004614c17565b6123e7565b348015610a4b57600080fd5b506104db610a5a366004614cc7565b6125ef565b348015610a6b57600080fd5b506103cf612760565b348015610a8057600080fd5b5061092d61277d565b348015610a9557600080fd5b506103cf610aa4366004614c4f565b600160209081526000928352604080842090915290825290205481565b348015610acd57600080fd5b50610424610adc366004614e6d565b6127dd565b348015610aed57600080fd5b5061046e610afc366004614e6d565b6128e3565b348015610b0d57600080fd5b506104db610b1c366004614c17565b6128f3565b348015610b2d57600080fd5b50610424610b3c366004614e23565b612a15565b348015610b4d57600080fd5b506103cf600c5481565b348015610b6357600080fd5b50610424610b72366004614c17565b612a9c565b348015610b8357600080fd5b5060025461046e906001600160a01b031681565b6060601c8054610ba690615229565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd290615229565b8015610c1f5780601f10610bf457610100808354040283529160200191610c1f565b820191906000526020600020905b815481529060010190602001808311610c0257829003601f168201915b5050505050905090565b6000610c36338484612c3e565b5060015b92915050565b6000610c4d848484612d63565b610c9f8433610c9a856040518060600160405280602881526020016152b9602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612f6e565b612c3e565b5060019392505050565b3360009081526005602052604090205460ff16610ce15760405162461bcd60e51b8152600401610cd8906150bd565b60405180910390fd5b600c5415610d015760405162461bcd60e51b8152600401610cd890615086565b60085460ff1615158115151415610d5a5760405162461bcd60e51b815260206004820152601b60248201527f417574684f6e6c7920697320616c72656164792073657420736f2100000000006044820152606401610cd8565b6002546001600160a01b031660009081526005602052604090205460ff1615610d91576008805460ff19168215151790555b610dd5565b60408051808201909152601a81527f53776170206f757420666f722041757468206f6e6c7920746f2000000000000060208201526001610dd2828483612f9f565b50505b50565b6000601754821115610e3f5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610cd8565b6000610e49613174565b9050610e558382613197565b9150505b919050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c36918590610c9a90866131e0565b3360008181526012602052604090205460ff1615610f095760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610cd8565b6000610f148361323f565b505050506001600160a01b0384166000908152600f6020526040902054919250610f409190508261328e565b6001600160a01b0383166000908152600f6020526040902055601754610f66908261328e565b601755601854610f7690846131e0565b601855505050565b60006001600160a01b038516151580610fa057506001600160a01b0385163014155b610fa957600080fd5b6000610fb433611a15565b90508481101561101e5760405162461bcd60e51b815260206004820152602f60248201527f416e7973776170563345524332303a207472616e7366657220616d6f756e742060448201526e657863656564732062616c616e636560881b6064820152608401610cd8565b611029338787612d63565b604051635260769b60e11b81526001600160a01b0387169063a4c0ed369061105b903390899089908990600401614f48565b602060405180830381600087803b15801561107557600080fd5b505af1158015611089573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ad9190614e07565b9695505050505050565b3360009081526004602052604081205460ff166110e65760405162461bcd60e51b8152600401610cd8906150f4565b6015546014546110f59161328e565b8211156111535760405162461bcd60e51b815260206004820152602660248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c20736044820152657570706c792160d01b6064820152608401610cd8565b610c3683836132d0565b60006015548311156111b15760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610cd8565b816111d05760006111c18461323f565b50939550610c3a945050505050565b60006111db8461323f565b50929550610c3a945050505050565b3360009081526005602052604090205460ff166112195760405162461bcd60e51b8152600401610cd8906150bd565b600c54156112395760405162461bcd60e51b8152600401610cd890615086565b6001600160a01b03811660009081526011602052604090205460ff16156112b05760405162461bcd60e51b815260206004820152602560248201527f4164647265737320697320616c7265616479206578636c756465642066726f6d604482015264206665652160d81b6064820152608401610cd8565b6002546001600160a01b031660009081526005602052604090205460ff16156112dc57610d8c8161342b565b604080518082019091526011815270022bc31b63ab23290333937b6903332b29607d1b60208201526006610dd282848361344f565b6000844211156113545760405162461bcd60e51b815260206004820152600e60248201526d115e1c1a5c9959081c195c9b5a5d60921b6044820152606401610cd8565b6001600160a01b038816600090815260208190526040812080547f42ce63790c28229c123925d83266e77c04d28784552ab68b350a9003226cbd59918b918b918b9190866113a183615264565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120905061140289828787876135a1565b8061141557506114158982878787613692565b61141e57600080fd5b6001600160a01b03881615158061143e57506001600160a01b0388163014155b61144757600080fd5b60006114528a611a15565b9050878110156114a45760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657220616d6f756e7420657863656564732062616c616e6365006044820152606401610cd8565b6114af8a8a8a612d63565b5060019998505050505050505050565b60085460009060ff161561150c5760405162461bcd60e51b815260206004820152601460248201527308cdee4c4d2c8c8cadc7440dedcd8f24082eae8d60631b6044820152606401610cd8565b6001600160a01b0382166115555760405162461bcd60e51b815260206004820152601060248201526f4e6f742061646472657373283078302960801b6044820152606401610cd8565b61155f3384613727565b6040518381526001600160a01b0383169033907f6b616089d04950dc06c45c6dd787d657980543f89651aec47924752c7d16c8889060200160405180910390a350600192915050565b3360009081526005602052604090205460ff166115d75760405162461bcd60e51b8152600401610cd8906150bd565b600c54156115f75760405162461bcd60e51b8152600401610cd890615086565b601e546001600160a01b038281166101009092041614156116665760405162461bcd60e51b815260206004820152602360248201527f57652063616e206e6f74206578636c756465206d61696e2044455820726f757460448201526232b91760e91b6064820152608401610cd8565b6001600160a01b03811660009081526012602052604090205460ff16156116cf5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610cd8565b6002546001600160a01b031660009081526005602052604090205460ff16156116fb57610d8c8161387c565b604080518082019091526014815273022bc31b63ab23290333937b6903932bbb0b932160651b60208201526004610dd282848361344f565b6002546000906001600160a01b031633146117605760405162461bcd60e51b8152600401610cd890615123565b600280546001600160a01b0319166001600160a01b0384169081179091556040514281527ff6a38a0d3e3e5c313a93e1d091bd4a4421a5b70d8a85ba6272f3c0b43de4c923906020015b60405180910390a2506001919050565b6002546000906001600160a01b031633146117e75760405162461bcd60e51b8152600401610cd890615123565b82600c54146118385760405162461bcd60e51b815260206004820152601860248201527f566f746520636f756c64206e6f7420626520666f756e642100000000000000006044820152606401610cd8565b600a544210156118825760405162461bcd60e51b8152602060048201526015602482015274566f74696e672074696d65206e6f74206f7665722160581b6044820152606401610cd8565b81156119d257600e5460ff16156118ef57600e805460ff19169055600b54600114156118ca57600e546008805460ff19166201000090920460ff1615159190911790556118ea565b600b54600214156118ea57600e546118ea9062010000900460ff1661393c565b6119cd565b600e54610100900460ff16156119cd57600e805461ff0019169055600b546003141561193157600e546118ea90630100000090046001600160a01b0316613994565b600b546004141561195857600e546118ea90630100000090046001600160a01b031661387c565b600b546005141561197f57600e546118ea90630100000090046001600160a01b0316613a36565b600b54600614156119a657600e546118ea90630100000090046001600160a01b031661342b565b600b54600714156119cd57600e546119cd90630100000090046001600160a01b0316613b93565b611a08565b600e5460ff16156119ec57600e805460ff19169055611a08565b600e54610100900460ff1615611a0857600e805461ff00191690555b50506000600c5550600190565b6001600160a01b03811660009081526012602052604081205460ff1615611a5557506001600160a01b038116600090815260106020526040902054610e59565b6001600160a01b0382166000908152600f6020526040902054610c3a90610dd8565b3360009081526005602052604090205460ff16611aa65760405162461bcd60e51b8152600401610cd8906150bd565b600c5415611ac65760405162461bcd60e51b8152600401610cd890615086565b6001600160a01b03811660009081526012602052604090205460ff16611b2e5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610cd8565b6002546001600160a01b031660009081526005602052604090205460ff1615611b5a57610d8c81613a36565b604080518082019091526012815271024b731b63ab2329034b7103932bbb0b932160751b60208201526005610dd282848361344f565b3360009081526005602052604090205460ff16611bbf5760405162461bcd60e51b8152600401610cd8906150bd565b600c5415611bdf5760405162461bcd60e51b8152600401610cd890615086565b6001600160a01b03811660009081526004602052604090205460ff1615611c485760405162461bcd60e51b815260206004820152601a60248201527f4164647265737320697320616c7265616479206d696e746572210000000000006044820152606401610cd8565b6002546001600160a01b031660009081526005602052604090205460ff1615611c7457610d8c81613994565b604080518082019091526016815275026b4b73a1030baba3437b934bd30ba34b7b7103a37960551b60208201526003610dd282848361344f565b60068181548110611cbe57600080fd5b6000918252602090912001546001600160a01b0316905081565b6002546001600160a01b03163314611d025760405162461bcd60e51b8152600401610cd890615123565b601f546001600160a01b031615611d5b5760405162461bcd60e51b815260206004820152601760248201527f506f6f6c20697320616c726561647920637265617465640000000000000000006044820152606401610cd8565b6000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015611d9957600080fd5b505afa158015611dad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd19190614c33565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015611e1957600080fd5b505afa158015611e2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e519190614c33565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015611e9957600080fd5b505af1158015611ead573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed19190614c33565b601f80546001600160a01b0319166001600160a01b03928316179055601e8054610100600160a81b031916610100939092169290920217905550565b6060601d8054610ba690615229565b3360009081526004602052604081205460ff16611f4b5760405162461bcd60e51b8152600401610cd8906150f4565b6001600160a01b038316611f945760405162461bcd60e51b815260206004820152601060248201526f4e6f742061646472657373283078302960801b6044820152606401610cd8565b610c368383613727565b60606006805480602002602001604051908101604052809291908181526020018280548015610c1f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611fd8575050505050905090565b6000610c363384610c9a856040518060400160405280601e81526020017f44656372656173656420616c6c6f77616e63652062656c6f77207a65726f00008152506001600061204b3390565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612f6e565b3360009081526005602052604090205460ff166120ab5760405162461bcd60e51b8152600401610cd8906150bd565b600c54156120cb5760405162461bcd60e51b8152600401610cd890615086565b601f5460ff600160a81b90910416151581151514156121365760405162461bcd60e51b815260206004820152602160248201527f53776170416e644c69717569667920697320616c72656164792073657420736f6044820152602160f81b6064820152608401610cd8565b6002546001600160a01b031660009081526005602052604090205460ff161561216257610d8c8161393c565b604080518082019091526014815273029bbb0b81030b732103634b8bab4b33c903a37960651b60208201526002610dd2828483612f9f565b6000610c36338484612d63565b600d80546121b490615229565b80601f01602080910402602001604051908101604052809291908181526020018280546121e090615229565b801561222d5780601f106122025761010080835404028352916020019161222d565b820191906000526020600020905b81548152906001019060200180831161221057829003601f168201915b505050505081565b6002546000906001600160a01b031633146122625760405162461bcd60e51b8152600401610cd890615123565b6001600160a01b038216600081815260056020526040808220805460ff191660019081179091556007805491820181559092527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68890910180546001600160a01b03191683179055517fe1241abba044cac28e389c09c793d7ace51a709c7309cac5e475d8a8c8fd48cc906117aa9042815260200190565b3360008181526001602090815260408083206001600160a01b038916808552925280832087905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906123549088815260200190565b60405180910390a360405162ba451f60e01b81526001600160a01b0386169062ba451f9061238c903390889088908890600401614f48565b602060405180830381600087803b1580156123a657600080fd5b505af11580156123ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123de9190614e07565b95945050505050565b3360009081526005602052604090205460ff166124165760405162461bcd60e51b8152600401610cd8906150bd565b6001600160a01b03811660009081526004602052604090205460ff166124765760405162461bcd60e51b815260206004820152601560248201527441646472657373206973206e6f206d696e7465722160581b6044820152606401610cd8565b6001600160a01b0381166000908152600460205260408120805460ff191690555b6006548110156125eb57816001600160a01b0316600682815481106124cc57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614156125d9576006546124f6906001906151e6565b8114612593576006805461250c906001906151e6565b8154811061252a57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600680546001600160a01b03909216918390811061256457634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b60068054806125b257634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190556125eb565b806125e381615264565b915050612497565b5050565b834211156126305760405162461bcd60e51b815260206004820152600e60248201526d115e1c1a5c9959081c195c9b5a5d60921b6044820152606401610cd8565b6001600160a01b038716600090815260208190526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661267d83615264565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506126de88828686866135a1565b806126f157506126f18882868686613692565b6126fa57600080fd5b6001600160a01b038881166000818152600160209081526040808320948c16808452948252918290208a905590518981527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35050505050505050565b60145460009061277890670de0b6b3a7640000613197565b905090565b60606007805480602002602001604051908101604052809291908181526020018280548015610c1f576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611fd8575050505050905090565b6002546000906001600160a01b0316331461280a5760405162461bcd60e51b8152600401610cd890615123565b60038210156128655760405162461bcd60e51b815260206004820152602160248201527f44656c61792063616e6e6f74206265206c657373207468616e203320646179736044820152602160f81b6064820152608401610cd8565b601e8211156128c15760405162461bcd60e51b815260206004820152602260248201527f44656c61792063616e6e6f74206265206d6f7265207468616e20333020646179604482015261732160f01b6064820152608401610cd8565b6128cc8260186151c7565b6128d890610e106151c7565b600955506001919050565b60078181548110611cbe57600080fd5b3360009081526005602052604090205460ff166129225760405162461bcd60e51b8152600401610cd8906150bd565b600c54156129425760405162461bcd60e51b8152600401610cd890615086565b6001600160a01b03811660009081526011602052604090205460ff166129b65760405162461bcd60e51b815260206004820152602360248201527f4164647265737320697320616c726561647920696e636c7564656420696e206660448201526265652160e81b6064820152608401610cd8565b6002546001600160a01b031660009081526005602052604090205460ff16156129e257610d8c81613b93565b60408051808201909152600f81526e024b731b63ab2329034b7103332b29608d1b60208201526007610dd282848361344f565b3360009081526004602052604081205460ff16612a445760405162461bcd60e51b8152600401610cd8906150f4565b612a4e83836132d0565b826001600160a01b0316847f05d0634fe981be85c22e2942a880821b70095d84e152c3ea3c17a4e4250d9d6184604051612a8a91815260200190565b60405180910390a35060019392505050565b6002546000906001600160a01b03163314612ac95760405162461bcd60e51b8152600401610cd890615123565b6001600160a01b0382166000908152600560205260408120805460ff191690555b600754811015610c3657826001600160a01b031660078281548110612b1f57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415612c2c57600754612b49906001906151e6565b8114612be65760078054612b5f906001906151e6565b81548110612b7d57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600780546001600160a01b039092169183908110612bb757634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6007805480612c0557634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b0319169055019055610c36565b80612c3681615264565b915050612aea565b6001600160a01b038316612ca05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cd8565b6001600160a01b038216612d015760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cd8565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316612dc75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610cd8565b6001600160a01b038216612e295760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610cd8565b60008111612e8b5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610cd8565b6000612e9630611a15565b60205490915081108015908190612eb75750601f54600160a01b900460ff16155b8015612ed15750601f546001600160a01b03868116911614155b8015612ee65750601f54600160a81b900460ff165b8015612efc5750601f546001600160a01b031615155b15612f0f576020549150612f0f82613bb4565b6001600160a01b03851660009081526011602052604090205460019060ff1680612f5157506001600160a01b03851660009081526011602052604090205460ff165b15612f5a575060005b612f6686868684613c5b565b505050505050565b60008184841115612f925760405162461bcd60e51b8152600401610cd89190615053565b5060006123de84866151e6565b60608215612fc857506040805180820190915260048152637472756560e01b6020820152612fe6565b5060408051808201909152600581526466616c736560d81b60208201525b8381604051602001612ff9929190614f19565b604051602081830303815290604052600d908051906020019061301d929190614b7e565b506130b1600d805461302e90615229565b80601f016020809104026020016040519081016040528092919081815260200182805461305a90615229565b80156130a75780601f1061307c576101008083540402835291602001916130a7565b820191906000526020600020905b81548152906001019060200180831161308a57829003601f168201915b5050505050613dd0565b600c819055600254604051632fd377d760e21b81526001600160a01b039091169163bf4ddf5c916130e89190600d90600401614fa3565b602060405180830381600087803b15801561310257600080fd5b505af1158015613116573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061313a9190614e07565b50600e8054600160ff199091161762ff000019166201000085151502179055600b82905560095461316b904261518f565b600a5550505050565b6000806000613181613e66565b90925090506131908282613197565b9250505090565b60006131d983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061403a565b9392505050565b6000806131ed838561518f565b9050838110156131d95760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610cd8565b60008060008060008060008060006132568a614068565b92509250925060008060006132748d868661326f613174565b6140aa565b919f909e50909c50959a5093985091965092945050505050565b60006131d983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612f6e565b6001600160a01b0382166133265760405162461bcd60e51b815260206004820152601b60248201527f4e6f206d696e7420746f20746865207a65726f206164647265737300000000006044820152606401610cd8565b60006133318261323f565b5050505050905061334d816017546131e090919063ffffffff16565b60175560155461335d90836131e0565b6015556001600160a01b0383166000908152600f602052604090205461338390826131e0565b6001600160a01b0384166000908152600f602090815260408083209390935560129052205460ff16156133ed576001600160a01b0383166000908152601060205260409020546133d390836131e0565b6001600160a01b0384166000908152601060205260409020555b6040518281526001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612d56565b6001600160a01b03166000908152601160205260409020805460ff19166001179055565b6040516bffffffffffffffffffffffff19606084901b1660208201528390613488906034016040516020818303038152906040526140fa565b604051602001613499929190614f19565b604051602081830303815290604052600d90805190602001906134bd929190614b7e565b506134ce600d805461302e90615229565b600c819055600254604051632fd377d760e21b81526001600160a01b039091169163bf4ddf5c916135059190600d90600401614fa3565b602060405180830381600087803b15801561351f57600080fd5b505af1158015613533573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135579190614e07565b50600e805461010061ff0019909116176301000000600160b81b03191663010000006001600160a01b03851602179055600b819055600954613599904261518f565b600a55505050565b60405161190160f01b60208201527f0000000000000000000000000000000000000000000000000000000000000000602282015260428101859052600090819060620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0015b6020604051602081039080840390855afa158015613650573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906136865750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b6000806136ec866040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b6040805160008082526020820180845284905260ff89169282019290925260608101879052608081018690529192509060019060a00161362e565b6001600160a01b03821661377d5760405162461bcd60e51b815260206004820152601d60248201527f4e6f206275726e2066726f6d20746865207a65726f20616464726573730000006044820152606401610cd8565b60006137888261323f565b505050506001600160a01b0385166000908152600f60205260409020549192506137b49190508261328e565b6001600160a01b0384166000908152600f602090815260408083209390935560129052205460ff161561381e576001600160a01b038316600090815260106020526040902054613804908361328e565b6001600160a01b0384166000908152601060205260409020555b60175461382b908261328e565b60175560155461383b908361328e565b6015556040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612d56565b6001600160a01b0381166000908152600f6020526040902054156138d6576001600160a01b0381166000908152600f60205260409020546138bc90610dd8565b6001600160a01b0382166000908152601060205260409020555b6001600160a01b03166000818152601260205260408120805460ff191660019081179091556013805491820181559091527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0900180546001600160a01b0319169091179055565b601f8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061398990831515815260200190565b60405180910390a150565b6001600160a01b038116600081815260046020526040808220805460ff191660019081179091556006805491820181559092527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90910180546001600160a01b03191683179055517fff9be4a5a0b9027fd253167d4c170ef1bbf8403af21bf06a0ed87ac8c8ecb5c690613a2b9042815260200190565b60405180910390a250565b60005b6013548110156125eb57816001600160a01b031660138281548110613a6e57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415613b8157601354613a98906001906151e6565b8114613b355760138054613aae906001906151e6565b81548110613acc57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154601380546001600160a01b039092169183908110613b0657634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6001600160a01b038216600090815260106020908152604080832083905560129091529020805460ff1916905560138054806125b257634e487b7160e01b600052603160045260246000fd5b80613b8b81615264565b915050613a39565b6001600160a01b03166000908152601160205260409020805460ff19169055565b601f805460ff60a01b1916600160a01b1790556000613bd4826002613197565b90506000613be2838361328e565b905047613bee83614391565b6000613bfa478361328e565b9050613c068382614531565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050601f805460ff60a01b19169055505050565b80613c6d57613c686145fe565b613c76565b613c7682614625565b6001600160a01b03841660009081526012602052604090205460ff168015613cb757506001600160a01b03831660009081526012602052604090205460ff16155b15613ccc57613cc7848484614785565b613dca565b6001600160a01b03841660009081526012602052604090205460ff16158015613d0d57506001600160a01b03831660009081526012602052604090205460ff165b15613d1d57613cc78484846148ab565b6001600160a01b03841660009081526012602052604090205460ff16158015613d5f57506001600160a01b03831660009081526012602052604090205460ff16155b15613d6f57613cc7848484614954565b6001600160a01b03841660009081526012602052604090205460ff168015613daf57506001600160a01b03831660009081526012602052604090205460ff165b15613dbf57613cc7848484614998565b613dca848484614954565b50505050565b600080828051906020012042604051602001613dee91815260200190565b60408051808303601f1901815282825280516020918201203060601b6bffffffffffffffffffffffff19168285015282516014818603018152603485018452805190830120605485019590955260748401526094808401949094528151808403909401845260b4909201905281519101209392505050565b601754601554600091829180613e8757601654601454935093505050614036565b60005b6013548110156140085782600f600060138481548110613eba57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020541180613f335750816010600060138481548110613f0c57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15613f4a5760175460155494509450505050614036565b613f9e600f600060138481548110613f7257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054849061328e565b9250613ff46010600060138481548110613fc857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054839061328e565b91508061400081615264565b915050613e8a565b5060155460175461401891613197565b82101561403057601754601554935093505050614036565b90925090505b9091565b6000818361405b5760405162461bcd60e51b8152600401610cd89190615053565b5060006123de84866151a7565b60008060008061407785614a0b565b9050600061408486614a2d565b9050600061409c82614096898661328e565b9061328e565b979296509094509092505050565b60008080806140b98886614a49565b905060006140c78887614a49565b905060006140d58888614a49565b905060006140e782614096868661328e565b939b939a50919850919650505050505050565b60408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b60208201528151606091906000906141359060026151c7565b61414090600261518f565b67ffffffffffffffff81111561416657634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015614190576020820181803683370190505b509050600360fc1b816000815181106141b957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106141f657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060005b84518110156143895782600486838151811061423c57634e487b7160e01b600052603260045260246000fd5b016020015182516001600160f81b031990911690911c60f81c90811061427257634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b0319168261428d8360026151c7565b61429890600261518f565b815181106142b657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350828582815181106142ee57634e487b7160e01b600052603260045260246000fd5b602091010151815160f89190911c600f1690811061431c57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b031916826143378360026151c7565b61434290600361518f565b8151811061436057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508061438181615264565b915050614210565b509392505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106143d457634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050601e60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561444257600080fd5b505afa158015614456573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061447a9190614c33565b8160018151811061449b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601e546144c691309161010090041684612c3e565b601e5460405163791ac94760e01b81526101009091046001600160a01b03169063791ac94790614503908590600090869030904290600401615153565b600060405180830381600087803b15801561451d57600080fd5b505af1158015612f66573d6000803e3d6000fd5b601e5461454e90309061010090046001600160a01b031684612c3e565b601e5460035460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a4820152610100909204169063f305d71990839060c4016060604051808303818588803b1580156145be57600080fd5b505af11580156145d2573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906145f79190614ea9565b5050505050565b601a5415801561460e5750601b54155b1561461857614623565b6000601a819055601b555b565b68056bc75e2d63100000811115614778576c0c9f2c9cd04674edea4000000081111561465a57600a601a819055601b55610d8c565b6b204fce5e3e2502611000000081111561467d576007601a556008601b55610d8c565b6b204fce5e3e250261100000008111156146a0576006601a819055601b55610d8c565b6b033b2e3c9fd0803ce80000008111156146c3576005601a819055601b55610d8c565b6a52b7d2dcc80cd2e40000008111156146e5576004601a819055601b55610d8c565b6a084595161401484a000000811115614707576003601a819055601b55610d8c565b69d3c21bcecceda1000000811115614728576002601a556003601b55610d8c565b69021e19e0c9bab2400000811115614749576002601a819055601b55610d8c565b683635c9adc5dea00000811115614769576001601a556002601b55610d8c565b6001601a819055601b55610dd5565b6000601a556001601b5550565b6000806000806000806147978761323f565b6001600160a01b038f16600090815260106020526040902054959b509399509197509550935091506147c9908861328e565b6001600160a01b038a16600090815260106020908152604080832093909355600f905220546147f8908761328e565b6001600160a01b03808b166000908152600f602052604080822093909355908a168152205461482790866131e0565b6001600160a01b0389166000908152600f602052604090205561484981614ac8565b6148538483614b50565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161489891815260200190565b60405180910390a3505050505050505050565b6000806000806000806148bd8761323f565b6001600160a01b038f166000908152600f6020526040902054959b509399509197509550935091506148ef908761328e565b6001600160a01b03808b166000908152600f6020908152604080832094909455918b1681526010909152205461492590846131e0565b6001600160a01b038916600090815260106020908152604080832093909355600f9052205461482790866131e0565b6000806000806000806149668761323f565b6001600160a01b038f166000908152600f6020526040902054959b509399509197509550935091506147f8908761328e565b6000806000806000806149aa8761323f565b6001600160a01b038f16600090815260106020526040902054959b509399509197509550935091506149dc908861328e565b6001600160a01b038a16600090815260106020908152604080832093909355600f905220546148ef908761328e565b6000610c3a6064614a27601a5485614a4990919063ffffffff16565b90613197565b6000610c3a6064614a27601b5485614a4990919063ffffffff16565b600082614a5857506000610c3a565b6000614a6483856151c7565b905082614a7185836151a7565b146131d95760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610cd8565b6000614ad2613174565b90506000614ae08383614a49565b306000908152600f6020526040902054909150614afd90826131e0565b306000908152600f602090815260408083209390935560129052205460ff1615610dd25730600090815260106020526040902054614b3b90846131e0565b30600090815260106020526040902055505050565b601754614b5d908361328e565b6017819055508060186000828254614b75919061518f565b90915550505050565b828054614b8a90615229565b90600052602060002090601f016020900481019282614bac5760008555614bf2565b82601f10614bc557805160ff1916838001178555614bf2565b82800160010185558215614bf2579182015b82811115614bf2578251825591602001919060010190614bd7565b50614bfe929150614c02565b5090565b5b80821115614bfe5760008155600101614c03565b600060208284031215614c28578081fd5b81356131d981615295565b600060208284031215614c44578081fd5b81516131d981615295565b60008060408385031215614c61578081fd5b8235614c6c81615295565b91506020830135614c7c81615295565b809150509250929050565b600080600060608486031215614c9b578081fd5b8335614ca681615295565b92506020840135614cb681615295565b929592945050506040919091013590565b600080600080600080600060e0888a031215614ce1578283fd5b8735614cec81615295565b96506020880135614cfc81615295565b95506040880135945060608801359350608088013560ff81168114614d1f578384fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215614d4e578182fd5b8235614d5981615295565b946020939093013593505050565b60008060008060608587031215614d7c578384fd5b8435614d8781615295565b935060208501359250604085013567ffffffffffffffff80821115614daa578384fd5b818701915087601f830112614dbd578384fd5b813581811115614dcb578485fd5b886020828501011115614ddc578485fd5b95989497505060200194505050565b600060208284031215614dfc578081fd5b81356131d9816152aa565b600060208284031215614e18578081fd5b81516131d9816152aa565b600080600060608486031215614e37578283fd5b833592506020840135614cb681615295565b60008060408385031215614e5b578182fd5b823591506020830135614c7c816152aa565b600060208284031215614e7e578081fd5b5035919050565b60008060408385031215614e97578182fd5b823591506020830135614c7c81615295565b600080600060608486031215614ebd578081fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b83811015614f0e5781516001600160a01b031687529582019590820190600101614ee9565b509495945050505050565b60008351614f2b8184602088016151fd565b835190830190614f3f8183602088016151fd565b01949350505050565b6001600160a01b0385168152602081018490526060604082018190528101829052600082846080840137818301608090810191909152601f909201601f191601019392505050565b6000602082526131d96020830184614ed6565b6000838252602060408184015281845483600282049050600180831680614fcb57607f831692505b858310811415614fe957634e487b7160e01b87526022600452602487fd5b6040880183905260608801818015615008576001811461501957615043565b60ff19861682528782019650615043565b60008b815260209020895b8681101561503d57815484820152908501908901615024565b83019750505b50949a9950505050505050505050565b60006020825282518060208401526150728160408501602087016151fd565b601f01601f19169190910160400192915050565b6020808252601a908201527f4f6e6520766f7465206973207374696c6c2072756e6e696e6721000000000000604082015260600190565b60208082526019908201527f464f5242494444454e2c206f6e6c79206f70657261746f722100000000000000604082015260600190565b602080825260159082015274464f5242494444454e2c206f6e6c7920617574682160581b604082015260600190565b602080825260169082015275464f5242494444454e2c206f6e6c79207661756c742160501b604082015260600190565b600086825285602083015260a0604083015261517260a0830186614ed6565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156151a2576151a261527f565b500190565b6000826151c257634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156151e1576151e161527f565b500290565b6000828210156151f8576151f861527f565b500390565b60005b83811015615218578181015183820152602001615200565b83811115613dca5750506000910152565b60028104600182168061523d57607f821691505b6020821081141561525e57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156152785761527861527f565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610dd557600080fd5b8015158114610dd557600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a264697066735822122080522b66438987362ffd57112e7fd707f60deedc7f0fe295e6a77fbd6f5dbc5964736f6c63430008020033

Deployed Bytecode

0x60806040526004361061038f5760003560e01c806370a08231116101dc578063b3509e8d11610102578063dd62ed3e116100a0578063ec126c771161006f578063ec126c7714610b21578063f9decb5a14610b41578063fad8b32a14610b57578063fbfa77cf14610b7757610396565b8063dd62ed3e14610a89578063e177246e14610ac1578063e28d490614610ae1578063e7cb799414610b0157610396565b8063cfbd4885116100dc578063cfbd488514610a1f578063d505accf14610a3f578063d5abeb0114610a5f578063d911c63214610a7457610396565b8063b3509e8d146109ca578063b3ab15fb146109df578063cae9ca51146109ff57610396565b80639049f9d21161017a578063a457c2d711610149578063a457c2d71461093a578063a8dd3f4d1461095a578063a9059cbb1461097a578063aa271e1a1461099a57610396565b80639049f9d2146108c357806395d89b41146108e35780639dc29fac146108f8578063a045442c1461091857610396565b80637ecebe00116101b65780637ecebe001461081d57806385eeee851461084a5780638623ec7b1461086a57806388f820201461088a57610396565b806370a08231146107bd57806370d5ae05146107dd5780637c649865146107fd57610396565b80634000aea0116102c1578063605629d61161025f5780636817031b1161022e5780636817031b146107375780636a42b8f8146107575780636cb8bc861461076d5780636d70f7ae1461078d57610396565b8063605629d6146106c1578063625c65f2146106e1578063628d6cba146106f757806363767d2b1461071757610396565b806349bd5a5e1161029b57806349bd5a5e146106275780634a74bb02146106475780635342acb4146106685780636022618d146106a157610396565b80634000aea0146105c757806340c10f19146105e75780634549b0391461060757610396565b80632d73ba571161032e578063313ce56711610308578063313ce567146105315780633644e5151461055357806339509351146105875780633bd5d173146105a757610396565b80632d73ba57146104bb5780632d838119146104dd57806330adf81f146104fd57610396565b806313114a9d1161036a57806313114a9d146104345780631694505e1461044957806318160ddd1461048657806323b872dd1461049b57610396565b8062bf26f41461039b57806306fdde03146103e2578063095ea7b31461040457610396565b3661039657005b600080fd5b3480156103a757600080fd5b506103cf7f42ce63790c28229c123925d83266e77c04d28784552ab68b350a9003226cbd5981565b6040519081526020015b60405180910390f35b3480156103ee57600080fd5b506103f7610b97565b6040516103d99190615053565b34801561041057600080fd5b5061042461041f366004614d3c565b610c29565b60405190151581526020016103d9565b34801561044057600080fd5b506018546103cf565b34801561045557600080fd5b50601e5461046e9061010090046001600160a01b031681565b6040516001600160a01b0390911681526020016103d9565b34801561049257600080fd5b506015546103cf565b3480156104a757600080fd5b506104246104b6366004614c87565b610c40565b3480156104c757600080fd5b506104db6104d6366004614deb565b610ca9565b005b3480156104e957600080fd5b506103cf6104f8366004614e6d565b610dd8565b34801561050957600080fd5b506103cf7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b34801561053d57600080fd5b50601e5460405160ff90911681526020016103d9565b34801561055f57600080fd5b506103cf7f6383ef9340795ad8d5d1e2d700514f0d7fe4cfd6c49c70c60bef32e8af108be381565b34801561059357600080fd5b506104246105a2366004614d3c565b610e5e565b3480156105b357600080fd5b506104db6105c2366004614e6d565b610e94565b3480156105d357600080fd5b506104246105e2366004614d67565b610f7e565b3480156105f357600080fd5b50610424610602366004614d3c565b6110b7565b34801561061357600080fd5b506103cf610622366004614e49565b61115d565b34801561063357600080fd5b50601f5461046e906001600160a01b031681565b34801561065357600080fd5b50601f5461042490600160a81b900460ff1681565b34801561067457600080fd5b50610424610683366004614c17565b6001600160a01b031660009081526011602052604090205460ff1690565b3480156106ad57600080fd5b506104db6106bc366004614c17565b6111ea565b3480156106cd57600080fd5b506104246106dc366004614cc7565b611311565b3480156106ed57600080fd5b506103cf600a5481565b34801561070357600080fd5b50610424610712366004614e85565b6114bf565b34801561072357600080fd5b506104db610732366004614c17565b6115a8565b34801561074357600080fd5b50610424610752366004614c17565b611733565b34801561076357600080fd5b506103cf60095481565b34801561077957600080fd5b50610424610788366004614e49565b6117ba565b34801561079957600080fd5b506104246107a8366004614c17565b60056020526000908152604090205460ff1681565b3480156107c957600080fd5b506103cf6107d8366004614c17565b611a15565b3480156107e957600080fd5b5060035461046e906001600160a01b031681565b34801561080957600080fd5b506104db610818366004614c17565b611a77565b34801561082957600080fd5b506103cf610838366004614c17565b60006020819052908152604090205481565b34801561085657600080fd5b506104db610865366004614c17565b611b90565b34801561087657600080fd5b5061046e610885366004614e6d565b611cae565b34801561089657600080fd5b506104246108a5366004614c17565b6001600160a01b031660009081526012602052604090205460ff1690565b3480156108cf57600080fd5b506104db6108de366004614c17565b611cd8565b3480156108ef57600080fd5b506103f7611f0d565b34801561090457600080fd5b50610424610913366004614d3c565b611f1c565b34801561092457600080fd5b5061092d611f9e565b6040516103d99190614f90565b34801561094657600080fd5b50610424610955366004614d3c565b611fff565b34801561096657600080fd5b506104db610975366004614deb565b61207c565b34801561098657600080fd5b50610424610995366004614d3c565b61219a565b3480156109a657600080fd5b506104246109b5366004614c17565b60046020526000908152604090205460ff1681565b3480156109d657600080fd5b506103f76121a7565b3480156109eb57600080fd5b506104246109fa366004614c17565b612235565b348015610a0b57600080fd5b50610424610a1a366004614d67565b6122f9565b348015610a2b57600080fd5b506104db610a3a366004614c17565b6123e7565b348015610a4b57600080fd5b506104db610a5a366004614cc7565b6125ef565b348015610a6b57600080fd5b506103cf612760565b348015610a8057600080fd5b5061092d61277d565b348015610a9557600080fd5b506103cf610aa4366004614c4f565b600160209081526000928352604080842090915290825290205481565b348015610acd57600080fd5b50610424610adc366004614e6d565b6127dd565b348015610aed57600080fd5b5061046e610afc366004614e6d565b6128e3565b348015610b0d57600080fd5b506104db610b1c366004614c17565b6128f3565b348015610b2d57600080fd5b50610424610b3c366004614e23565b612a15565b348015610b4d57600080fd5b506103cf600c5481565b348015610b6357600080fd5b50610424610b72366004614c17565b612a9c565b348015610b8357600080fd5b5060025461046e906001600160a01b031681565b6060601c8054610ba690615229565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd290615229565b8015610c1f5780601f10610bf457610100808354040283529160200191610c1f565b820191906000526020600020905b815481529060010190602001808311610c0257829003601f168201915b5050505050905090565b6000610c36338484612c3e565b5060015b92915050565b6000610c4d848484612d63565b610c9f8433610c9a856040518060600160405280602881526020016152b9602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612f6e565b612c3e565b5060019392505050565b3360009081526005602052604090205460ff16610ce15760405162461bcd60e51b8152600401610cd8906150bd565b60405180910390fd5b600c5415610d015760405162461bcd60e51b8152600401610cd890615086565b60085460ff1615158115151415610d5a5760405162461bcd60e51b815260206004820152601b60248201527f417574684f6e6c7920697320616c72656164792073657420736f2100000000006044820152606401610cd8565b6002546001600160a01b031660009081526005602052604090205460ff1615610d91576008805460ff19168215151790555b610dd5565b60408051808201909152601a81527f53776170206f757420666f722041757468206f6e6c7920746f2000000000000060208201526001610dd2828483612f9f565b50505b50565b6000601754821115610e3f5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610cd8565b6000610e49613174565b9050610e558382613197565b9150505b919050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c36918590610c9a90866131e0565b3360008181526012602052604090205460ff1615610f095760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610cd8565b6000610f148361323f565b505050506001600160a01b0384166000908152600f6020526040902054919250610f409190508261328e565b6001600160a01b0383166000908152600f6020526040902055601754610f66908261328e565b601755601854610f7690846131e0565b601855505050565b60006001600160a01b038516151580610fa057506001600160a01b0385163014155b610fa957600080fd5b6000610fb433611a15565b90508481101561101e5760405162461bcd60e51b815260206004820152602f60248201527f416e7973776170563345524332303a207472616e7366657220616d6f756e742060448201526e657863656564732062616c616e636560881b6064820152608401610cd8565b611029338787612d63565b604051635260769b60e11b81526001600160a01b0387169063a4c0ed369061105b903390899089908990600401614f48565b602060405180830381600087803b15801561107557600080fd5b505af1158015611089573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ad9190614e07565b9695505050505050565b3360009081526004602052604081205460ff166110e65760405162461bcd60e51b8152600401610cd8906150f4565b6015546014546110f59161328e565b8211156111535760405162461bcd60e51b815260206004820152602660248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c20736044820152657570706c792160d01b6064820152608401610cd8565b610c3683836132d0565b60006015548311156111b15760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610cd8565b816111d05760006111c18461323f565b50939550610c3a945050505050565b60006111db8461323f565b50929550610c3a945050505050565b3360009081526005602052604090205460ff166112195760405162461bcd60e51b8152600401610cd8906150bd565b600c54156112395760405162461bcd60e51b8152600401610cd890615086565b6001600160a01b03811660009081526011602052604090205460ff16156112b05760405162461bcd60e51b815260206004820152602560248201527f4164647265737320697320616c7265616479206578636c756465642066726f6d604482015264206665652160d81b6064820152608401610cd8565b6002546001600160a01b031660009081526005602052604090205460ff16156112dc57610d8c8161342b565b604080518082019091526011815270022bc31b63ab23290333937b6903332b29607d1b60208201526006610dd282848361344f565b6000844211156113545760405162461bcd60e51b815260206004820152600e60248201526d115e1c1a5c9959081c195c9b5a5d60921b6044820152606401610cd8565b6001600160a01b038816600090815260208190526040812080547f42ce63790c28229c123925d83266e77c04d28784552ab68b350a9003226cbd59918b918b918b9190866113a183615264565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120905061140289828787876135a1565b8061141557506114158982878787613692565b61141e57600080fd5b6001600160a01b03881615158061143e57506001600160a01b0388163014155b61144757600080fd5b60006114528a611a15565b9050878110156114a45760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657220616d6f756e7420657863656564732062616c616e6365006044820152606401610cd8565b6114af8a8a8a612d63565b5060019998505050505050505050565b60085460009060ff161561150c5760405162461bcd60e51b815260206004820152601460248201527308cdee4c4d2c8c8cadc7440dedcd8f24082eae8d60631b6044820152606401610cd8565b6001600160a01b0382166115555760405162461bcd60e51b815260206004820152601060248201526f4e6f742061646472657373283078302960801b6044820152606401610cd8565b61155f3384613727565b6040518381526001600160a01b0383169033907f6b616089d04950dc06c45c6dd787d657980543f89651aec47924752c7d16c8889060200160405180910390a350600192915050565b3360009081526005602052604090205460ff166115d75760405162461bcd60e51b8152600401610cd8906150bd565b600c54156115f75760405162461bcd60e51b8152600401610cd890615086565b601e546001600160a01b038281166101009092041614156116665760405162461bcd60e51b815260206004820152602360248201527f57652063616e206e6f74206578636c756465206d61696e2044455820726f757460448201526232b91760e91b6064820152608401610cd8565b6001600160a01b03811660009081526012602052604090205460ff16156116cf5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610cd8565b6002546001600160a01b031660009081526005602052604090205460ff16156116fb57610d8c8161387c565b604080518082019091526014815273022bc31b63ab23290333937b6903932bbb0b932160651b60208201526004610dd282848361344f565b6002546000906001600160a01b031633146117605760405162461bcd60e51b8152600401610cd890615123565b600280546001600160a01b0319166001600160a01b0384169081179091556040514281527ff6a38a0d3e3e5c313a93e1d091bd4a4421a5b70d8a85ba6272f3c0b43de4c923906020015b60405180910390a2506001919050565b6002546000906001600160a01b031633146117e75760405162461bcd60e51b8152600401610cd890615123565b82600c54146118385760405162461bcd60e51b815260206004820152601860248201527f566f746520636f756c64206e6f7420626520666f756e642100000000000000006044820152606401610cd8565b600a544210156118825760405162461bcd60e51b8152602060048201526015602482015274566f74696e672074696d65206e6f74206f7665722160581b6044820152606401610cd8565b81156119d257600e5460ff16156118ef57600e805460ff19169055600b54600114156118ca57600e546008805460ff19166201000090920460ff1615159190911790556118ea565b600b54600214156118ea57600e546118ea9062010000900460ff1661393c565b6119cd565b600e54610100900460ff16156119cd57600e805461ff0019169055600b546003141561193157600e546118ea90630100000090046001600160a01b0316613994565b600b546004141561195857600e546118ea90630100000090046001600160a01b031661387c565b600b546005141561197f57600e546118ea90630100000090046001600160a01b0316613a36565b600b54600614156119a657600e546118ea90630100000090046001600160a01b031661342b565b600b54600714156119cd57600e546119cd90630100000090046001600160a01b0316613b93565b611a08565b600e5460ff16156119ec57600e805460ff19169055611a08565b600e54610100900460ff1615611a0857600e805461ff00191690555b50506000600c5550600190565b6001600160a01b03811660009081526012602052604081205460ff1615611a5557506001600160a01b038116600090815260106020526040902054610e59565b6001600160a01b0382166000908152600f6020526040902054610c3a90610dd8565b3360009081526005602052604090205460ff16611aa65760405162461bcd60e51b8152600401610cd8906150bd565b600c5415611ac65760405162461bcd60e51b8152600401610cd890615086565b6001600160a01b03811660009081526012602052604090205460ff16611b2e5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610cd8565b6002546001600160a01b031660009081526005602052604090205460ff1615611b5a57610d8c81613a36565b604080518082019091526012815271024b731b63ab2329034b7103932bbb0b932160751b60208201526005610dd282848361344f565b3360009081526005602052604090205460ff16611bbf5760405162461bcd60e51b8152600401610cd8906150bd565b600c5415611bdf5760405162461bcd60e51b8152600401610cd890615086565b6001600160a01b03811660009081526004602052604090205460ff1615611c485760405162461bcd60e51b815260206004820152601a60248201527f4164647265737320697320616c7265616479206d696e746572210000000000006044820152606401610cd8565b6002546001600160a01b031660009081526005602052604090205460ff1615611c7457610d8c81613994565b604080518082019091526016815275026b4b73a1030baba3437b934bd30ba34b7b7103a37960551b60208201526003610dd282848361344f565b60068181548110611cbe57600080fd5b6000918252602090912001546001600160a01b0316905081565b6002546001600160a01b03163314611d025760405162461bcd60e51b8152600401610cd890615123565b601f546001600160a01b031615611d5b5760405162461bcd60e51b815260206004820152601760248201527f506f6f6c20697320616c726561647920637265617465640000000000000000006044820152606401610cd8565b6000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015611d9957600080fd5b505afa158015611dad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd19190614c33565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015611e1957600080fd5b505afa158015611e2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e519190614c33565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015611e9957600080fd5b505af1158015611ead573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed19190614c33565b601f80546001600160a01b0319166001600160a01b03928316179055601e8054610100600160a81b031916610100939092169290920217905550565b6060601d8054610ba690615229565b3360009081526004602052604081205460ff16611f4b5760405162461bcd60e51b8152600401610cd8906150f4565b6001600160a01b038316611f945760405162461bcd60e51b815260206004820152601060248201526f4e6f742061646472657373283078302960801b6044820152606401610cd8565b610c368383613727565b60606006805480602002602001604051908101604052809291908181526020018280548015610c1f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611fd8575050505050905090565b6000610c363384610c9a856040518060400160405280601e81526020017f44656372656173656420616c6c6f77616e63652062656c6f77207a65726f00008152506001600061204b3390565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612f6e565b3360009081526005602052604090205460ff166120ab5760405162461bcd60e51b8152600401610cd8906150bd565b600c54156120cb5760405162461bcd60e51b8152600401610cd890615086565b601f5460ff600160a81b90910416151581151514156121365760405162461bcd60e51b815260206004820152602160248201527f53776170416e644c69717569667920697320616c72656164792073657420736f6044820152602160f81b6064820152608401610cd8565b6002546001600160a01b031660009081526005602052604090205460ff161561216257610d8c8161393c565b604080518082019091526014815273029bbb0b81030b732103634b8bab4b33c903a37960651b60208201526002610dd2828483612f9f565b6000610c36338484612d63565b600d80546121b490615229565b80601f01602080910402602001604051908101604052809291908181526020018280546121e090615229565b801561222d5780601f106122025761010080835404028352916020019161222d565b820191906000526020600020905b81548152906001019060200180831161221057829003601f168201915b505050505081565b6002546000906001600160a01b031633146122625760405162461bcd60e51b8152600401610cd890615123565b6001600160a01b038216600081815260056020526040808220805460ff191660019081179091556007805491820181559092527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68890910180546001600160a01b03191683179055517fe1241abba044cac28e389c09c793d7ace51a709c7309cac5e475d8a8c8fd48cc906117aa9042815260200190565b3360008181526001602090815260408083206001600160a01b038916808552925280832087905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906123549088815260200190565b60405180910390a360405162ba451f60e01b81526001600160a01b0386169062ba451f9061238c903390889088908890600401614f48565b602060405180830381600087803b1580156123a657600080fd5b505af11580156123ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123de9190614e07565b95945050505050565b3360009081526005602052604090205460ff166124165760405162461bcd60e51b8152600401610cd8906150bd565b6001600160a01b03811660009081526004602052604090205460ff166124765760405162461bcd60e51b815260206004820152601560248201527441646472657373206973206e6f206d696e7465722160581b6044820152606401610cd8565b6001600160a01b0381166000908152600460205260408120805460ff191690555b6006548110156125eb57816001600160a01b0316600682815481106124cc57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614156125d9576006546124f6906001906151e6565b8114612593576006805461250c906001906151e6565b8154811061252a57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600680546001600160a01b03909216918390811061256457634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b60068054806125b257634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190556125eb565b806125e381615264565b915050612497565b5050565b834211156126305760405162461bcd60e51b815260206004820152600e60248201526d115e1c1a5c9959081c195c9b5a5d60921b6044820152606401610cd8565b6001600160a01b038716600090815260208190526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661267d83615264565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506126de88828686866135a1565b806126f157506126f18882868686613692565b6126fa57600080fd5b6001600160a01b038881166000818152600160209081526040808320948c16808452948252918290208a905590518981527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35050505050505050565b60145460009061277890670de0b6b3a7640000613197565b905090565b60606007805480602002602001604051908101604052809291908181526020018280548015610c1f576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611fd8575050505050905090565b6002546000906001600160a01b0316331461280a5760405162461bcd60e51b8152600401610cd890615123565b60038210156128655760405162461bcd60e51b815260206004820152602160248201527f44656c61792063616e6e6f74206265206c657373207468616e203320646179736044820152602160f81b6064820152608401610cd8565b601e8211156128c15760405162461bcd60e51b815260206004820152602260248201527f44656c61792063616e6e6f74206265206d6f7265207468616e20333020646179604482015261732160f01b6064820152608401610cd8565b6128cc8260186151c7565b6128d890610e106151c7565b600955506001919050565b60078181548110611cbe57600080fd5b3360009081526005602052604090205460ff166129225760405162461bcd60e51b8152600401610cd8906150bd565b600c54156129425760405162461bcd60e51b8152600401610cd890615086565b6001600160a01b03811660009081526011602052604090205460ff166129b65760405162461bcd60e51b815260206004820152602360248201527f4164647265737320697320616c726561647920696e636c7564656420696e206660448201526265652160e81b6064820152608401610cd8565b6002546001600160a01b031660009081526005602052604090205460ff16156129e257610d8c81613b93565b60408051808201909152600f81526e024b731b63ab2329034b7103332b29608d1b60208201526007610dd282848361344f565b3360009081526004602052604081205460ff16612a445760405162461bcd60e51b8152600401610cd8906150f4565b612a4e83836132d0565b826001600160a01b0316847f05d0634fe981be85c22e2942a880821b70095d84e152c3ea3c17a4e4250d9d6184604051612a8a91815260200190565b60405180910390a35060019392505050565b6002546000906001600160a01b03163314612ac95760405162461bcd60e51b8152600401610cd890615123565b6001600160a01b0382166000908152600560205260408120805460ff191690555b600754811015610c3657826001600160a01b031660078281548110612b1f57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415612c2c57600754612b49906001906151e6565b8114612be65760078054612b5f906001906151e6565b81548110612b7d57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600780546001600160a01b039092169183908110612bb757634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6007805480612c0557634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b0319169055019055610c36565b80612c3681615264565b915050612aea565b6001600160a01b038316612ca05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cd8565b6001600160a01b038216612d015760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cd8565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316612dc75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610cd8565b6001600160a01b038216612e295760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610cd8565b60008111612e8b5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610cd8565b6000612e9630611a15565b60205490915081108015908190612eb75750601f54600160a01b900460ff16155b8015612ed15750601f546001600160a01b03868116911614155b8015612ee65750601f54600160a81b900460ff165b8015612efc5750601f546001600160a01b031615155b15612f0f576020549150612f0f82613bb4565b6001600160a01b03851660009081526011602052604090205460019060ff1680612f5157506001600160a01b03851660009081526011602052604090205460ff165b15612f5a575060005b612f6686868684613c5b565b505050505050565b60008184841115612f925760405162461bcd60e51b8152600401610cd89190615053565b5060006123de84866151e6565b60608215612fc857506040805180820190915260048152637472756560e01b6020820152612fe6565b5060408051808201909152600581526466616c736560d81b60208201525b8381604051602001612ff9929190614f19565b604051602081830303815290604052600d908051906020019061301d929190614b7e565b506130b1600d805461302e90615229565b80601f016020809104026020016040519081016040528092919081815260200182805461305a90615229565b80156130a75780601f1061307c576101008083540402835291602001916130a7565b820191906000526020600020905b81548152906001019060200180831161308a57829003601f168201915b5050505050613dd0565b600c819055600254604051632fd377d760e21b81526001600160a01b039091169163bf4ddf5c916130e89190600d90600401614fa3565b602060405180830381600087803b15801561310257600080fd5b505af1158015613116573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061313a9190614e07565b50600e8054600160ff199091161762ff000019166201000085151502179055600b82905560095461316b904261518f565b600a5550505050565b6000806000613181613e66565b90925090506131908282613197565b9250505090565b60006131d983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061403a565b9392505050565b6000806131ed838561518f565b9050838110156131d95760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610cd8565b60008060008060008060008060006132568a614068565b92509250925060008060006132748d868661326f613174565b6140aa565b919f909e50909c50959a5093985091965092945050505050565b60006131d983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612f6e565b6001600160a01b0382166133265760405162461bcd60e51b815260206004820152601b60248201527f4e6f206d696e7420746f20746865207a65726f206164647265737300000000006044820152606401610cd8565b60006133318261323f565b5050505050905061334d816017546131e090919063ffffffff16565b60175560155461335d90836131e0565b6015556001600160a01b0383166000908152600f602052604090205461338390826131e0565b6001600160a01b0384166000908152600f602090815260408083209390935560129052205460ff16156133ed576001600160a01b0383166000908152601060205260409020546133d390836131e0565b6001600160a01b0384166000908152601060205260409020555b6040518281526001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612d56565b6001600160a01b03166000908152601160205260409020805460ff19166001179055565b6040516bffffffffffffffffffffffff19606084901b1660208201528390613488906034016040516020818303038152906040526140fa565b604051602001613499929190614f19565b604051602081830303815290604052600d90805190602001906134bd929190614b7e565b506134ce600d805461302e90615229565b600c819055600254604051632fd377d760e21b81526001600160a01b039091169163bf4ddf5c916135059190600d90600401614fa3565b602060405180830381600087803b15801561351f57600080fd5b505af1158015613533573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135579190614e07565b50600e805461010061ff0019909116176301000000600160b81b03191663010000006001600160a01b03851602179055600b819055600954613599904261518f565b600a55505050565b60405161190160f01b60208201527f6383ef9340795ad8d5d1e2d700514f0d7fe4cfd6c49c70c60bef32e8af108be3602282015260428101859052600090819060620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0015b6020604051602081039080840390855afa158015613650573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906136865750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b6000806136ec866040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b6040805160008082526020820180845284905260ff89169282019290925260608101879052608081018690529192509060019060a00161362e565b6001600160a01b03821661377d5760405162461bcd60e51b815260206004820152601d60248201527f4e6f206275726e2066726f6d20746865207a65726f20616464726573730000006044820152606401610cd8565b60006137888261323f565b505050506001600160a01b0385166000908152600f60205260409020549192506137b49190508261328e565b6001600160a01b0384166000908152600f602090815260408083209390935560129052205460ff161561381e576001600160a01b038316600090815260106020526040902054613804908361328e565b6001600160a01b0384166000908152601060205260409020555b60175461382b908261328e565b60175560155461383b908361328e565b6015556040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612d56565b6001600160a01b0381166000908152600f6020526040902054156138d6576001600160a01b0381166000908152600f60205260409020546138bc90610dd8565b6001600160a01b0382166000908152601060205260409020555b6001600160a01b03166000818152601260205260408120805460ff191660019081179091556013805491820181559091527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0900180546001600160a01b0319169091179055565b601f8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061398990831515815260200190565b60405180910390a150565b6001600160a01b038116600081815260046020526040808220805460ff191660019081179091556006805491820181559092527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90910180546001600160a01b03191683179055517fff9be4a5a0b9027fd253167d4c170ef1bbf8403af21bf06a0ed87ac8c8ecb5c690613a2b9042815260200190565b60405180910390a250565b60005b6013548110156125eb57816001600160a01b031660138281548110613a6e57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415613b8157601354613a98906001906151e6565b8114613b355760138054613aae906001906151e6565b81548110613acc57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154601380546001600160a01b039092169183908110613b0657634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6001600160a01b038216600090815260106020908152604080832083905560129091529020805460ff1916905560138054806125b257634e487b7160e01b600052603160045260246000fd5b80613b8b81615264565b915050613a39565b6001600160a01b03166000908152601160205260409020805460ff19169055565b601f805460ff60a01b1916600160a01b1790556000613bd4826002613197565b90506000613be2838361328e565b905047613bee83614391565b6000613bfa478361328e565b9050613c068382614531565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050601f805460ff60a01b19169055505050565b80613c6d57613c686145fe565b613c76565b613c7682614625565b6001600160a01b03841660009081526012602052604090205460ff168015613cb757506001600160a01b03831660009081526012602052604090205460ff16155b15613ccc57613cc7848484614785565b613dca565b6001600160a01b03841660009081526012602052604090205460ff16158015613d0d57506001600160a01b03831660009081526012602052604090205460ff165b15613d1d57613cc78484846148ab565b6001600160a01b03841660009081526012602052604090205460ff16158015613d5f57506001600160a01b03831660009081526012602052604090205460ff16155b15613d6f57613cc7848484614954565b6001600160a01b03841660009081526012602052604090205460ff168015613daf57506001600160a01b03831660009081526012602052604090205460ff165b15613dbf57613cc7848484614998565b613dca848484614954565b50505050565b600080828051906020012042604051602001613dee91815260200190565b60408051808303601f1901815282825280516020918201203060601b6bffffffffffffffffffffffff19168285015282516014818603018152603485018452805190830120605485019590955260748401526094808401949094528151808403909401845260b4909201905281519101209392505050565b601754601554600091829180613e8757601654601454935093505050614036565b60005b6013548110156140085782600f600060138481548110613eba57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020541180613f335750816010600060138481548110613f0c57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15613f4a5760175460155494509450505050614036565b613f9e600f600060138481548110613f7257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054849061328e565b9250613ff46010600060138481548110613fc857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054839061328e565b91508061400081615264565b915050613e8a565b5060155460175461401891613197565b82101561403057601754601554935093505050614036565b90925090505b9091565b6000818361405b5760405162461bcd60e51b8152600401610cd89190615053565b5060006123de84866151a7565b60008060008061407785614a0b565b9050600061408486614a2d565b9050600061409c82614096898661328e565b9061328e565b979296509094509092505050565b60008080806140b98886614a49565b905060006140c78887614a49565b905060006140d58888614a49565b905060006140e782614096868661328e565b939b939a50919850919650505050505050565b60408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b60208201528151606091906000906141359060026151c7565b61414090600261518f565b67ffffffffffffffff81111561416657634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015614190576020820181803683370190505b509050600360fc1b816000815181106141b957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106141f657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060005b84518110156143895782600486838151811061423c57634e487b7160e01b600052603260045260246000fd5b016020015182516001600160f81b031990911690911c60f81c90811061427257634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b0319168261428d8360026151c7565b61429890600261518f565b815181106142b657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350828582815181106142ee57634e487b7160e01b600052603260045260246000fd5b602091010151815160f89190911c600f1690811061431c57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b031916826143378360026151c7565b61434290600361518f565b8151811061436057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508061438181615264565b915050614210565b509392505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106143d457634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050601e60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561444257600080fd5b505afa158015614456573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061447a9190614c33565b8160018151811061449b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601e546144c691309161010090041684612c3e565b601e5460405163791ac94760e01b81526101009091046001600160a01b03169063791ac94790614503908590600090869030904290600401615153565b600060405180830381600087803b15801561451d57600080fd5b505af1158015612f66573d6000803e3d6000fd5b601e5461454e90309061010090046001600160a01b031684612c3e565b601e5460035460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a4820152610100909204169063f305d71990839060c4016060604051808303818588803b1580156145be57600080fd5b505af11580156145d2573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906145f79190614ea9565b5050505050565b601a5415801561460e5750601b54155b1561461857614623565b6000601a819055601b555b565b68056bc75e2d63100000811115614778576c0c9f2c9cd04674edea4000000081111561465a57600a601a819055601b55610d8c565b6b204fce5e3e2502611000000081111561467d576007601a556008601b55610d8c565b6b204fce5e3e250261100000008111156146a0576006601a819055601b55610d8c565b6b033b2e3c9fd0803ce80000008111156146c3576005601a819055601b55610d8c565b6a52b7d2dcc80cd2e40000008111156146e5576004601a819055601b55610d8c565b6a084595161401484a000000811115614707576003601a819055601b55610d8c565b69d3c21bcecceda1000000811115614728576002601a556003601b55610d8c565b69021e19e0c9bab2400000811115614749576002601a819055601b55610d8c565b683635c9adc5dea00000811115614769576001601a556002601b55610d8c565b6001601a819055601b55610dd5565b6000601a556001601b5550565b6000806000806000806147978761323f565b6001600160a01b038f16600090815260106020526040902054959b509399509197509550935091506147c9908861328e565b6001600160a01b038a16600090815260106020908152604080832093909355600f905220546147f8908761328e565b6001600160a01b03808b166000908152600f602052604080822093909355908a168152205461482790866131e0565b6001600160a01b0389166000908152600f602052604090205561484981614ac8565b6148538483614b50565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161489891815260200190565b60405180910390a3505050505050505050565b6000806000806000806148bd8761323f565b6001600160a01b038f166000908152600f6020526040902054959b509399509197509550935091506148ef908761328e565b6001600160a01b03808b166000908152600f6020908152604080832094909455918b1681526010909152205461492590846131e0565b6001600160a01b038916600090815260106020908152604080832093909355600f9052205461482790866131e0565b6000806000806000806149668761323f565b6001600160a01b038f166000908152600f6020526040902054959b509399509197509550935091506147f8908761328e565b6000806000806000806149aa8761323f565b6001600160a01b038f16600090815260106020526040902054959b509399509197509550935091506149dc908861328e565b6001600160a01b038a16600090815260106020908152604080832093909355600f905220546148ef908761328e565b6000610c3a6064614a27601a5485614a4990919063ffffffff16565b90613197565b6000610c3a6064614a27601b5485614a4990919063ffffffff16565b600082614a5857506000610c3a565b6000614a6483856151c7565b905082614a7185836151a7565b146131d95760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610cd8565b6000614ad2613174565b90506000614ae08383614a49565b306000908152600f6020526040902054909150614afd90826131e0565b306000908152600f602090815260408083209390935560129052205460ff1615610dd25730600090815260106020526040902054614b3b90846131e0565b30600090815260106020526040902055505050565b601754614b5d908361328e565b6017819055508060186000828254614b75919061518f565b90915550505050565b828054614b8a90615229565b90600052602060002090601f016020900481019282614bac5760008555614bf2565b82601f10614bc557805160ff1916838001178555614bf2565b82800160010185558215614bf2579182015b82811115614bf2578251825591602001919060010190614bd7565b50614bfe929150614c02565b5090565b5b80821115614bfe5760008155600101614c03565b600060208284031215614c28578081fd5b81356131d981615295565b600060208284031215614c44578081fd5b81516131d981615295565b60008060408385031215614c61578081fd5b8235614c6c81615295565b91506020830135614c7c81615295565b809150509250929050565b600080600060608486031215614c9b578081fd5b8335614ca681615295565b92506020840135614cb681615295565b929592945050506040919091013590565b600080600080600080600060e0888a031215614ce1578283fd5b8735614cec81615295565b96506020880135614cfc81615295565b95506040880135945060608801359350608088013560ff81168114614d1f578384fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215614d4e578182fd5b8235614d5981615295565b946020939093013593505050565b60008060008060608587031215614d7c578384fd5b8435614d8781615295565b935060208501359250604085013567ffffffffffffffff80821115614daa578384fd5b818701915087601f830112614dbd578384fd5b813581811115614dcb578485fd5b886020828501011115614ddc578485fd5b95989497505060200194505050565b600060208284031215614dfc578081fd5b81356131d9816152aa565b600060208284031215614e18578081fd5b81516131d9816152aa565b600080600060608486031215614e37578283fd5b833592506020840135614cb681615295565b60008060408385031215614e5b578182fd5b823591506020830135614c7c816152aa565b600060208284031215614e7e578081fd5b5035919050565b60008060408385031215614e97578182fd5b823591506020830135614c7c81615295565b600080600060608486031215614ebd578081fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b83811015614f0e5781516001600160a01b031687529582019590820190600101614ee9565b509495945050505050565b60008351614f2b8184602088016151fd565b835190830190614f3f8183602088016151fd565b01949350505050565b6001600160a01b0385168152602081018490526060604082018190528101829052600082846080840137818301608090810191909152601f909201601f191601019392505050565b6000602082526131d96020830184614ed6565b6000838252602060408184015281845483600282049050600180831680614fcb57607f831692505b858310811415614fe957634e487b7160e01b87526022600452602487fd5b6040880183905260608801818015615008576001811461501957615043565b60ff19861682528782019650615043565b60008b815260209020895b8681101561503d57815484820152908501908901615024565b83019750505b50949a9950505050505050505050565b60006020825282518060208401526150728160408501602087016151fd565b601f01601f19169190910160400192915050565b6020808252601a908201527f4f6e6520766f7465206973207374696c6c2072756e6e696e6721000000000000604082015260600190565b60208082526019908201527f464f5242494444454e2c206f6e6c79206f70657261746f722100000000000000604082015260600190565b602080825260159082015274464f5242494444454e2c206f6e6c7920617574682160581b604082015260600190565b602080825260169082015275464f5242494444454e2c206f6e6c79207661756c742160501b604082015260600190565b600086825285602083015260a0604083015261517260a0830186614ed6565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156151a2576151a261527f565b500190565b6000826151c257634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156151e1576151e161527f565b500290565b6000828210156151f8576151f861527f565b500390565b60005b83811015615218578181015183820152602001615200565b83811115613dca5750506000910152565b60028104600182168061523d57607f821691505b6020821081141561525e57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156152785761527861527f565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610dd557600080fd5b8015158114610dd557600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a264697066735822122080522b66438987362ffd57112e7fd707f60deedc7f0fe295e6a77fbd6f5dbc5964736f6c63430008020033

Deployed Bytecode Sourcemap

27049:39188:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27694:136;;;;;;;;;;;;27738:92;27694:136;;;;;10303:25:1;;;10291:2;10276:18;27694:136:0;;;;;;;;32277:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33172:159::-;;;;;;;;;;-1:-1:-1;33172:159:0;;;;;:::i;:::-;;:::i;:::-;;;10130:14:1;;10123:22;10105:41;;10093:2;10078:18;33172:159:0;10060:92:1;34316:87:0;;;;;;;;;;-1:-1:-1;34385:10:0;;34316:87;;30037:41;;;;;;;;;;-1:-1:-1;30037:41:0;;;;;;;-1:-1:-1;;;;;30037:41:0;;;;;;-1:-1:-1;;;;;8167:32:1;;;8149:51;;8137:2;8122:18;30037:41:0;8104:102:1;32563:95:0;;;;;;;;;;-1:-1:-1;32643:7:0;;32563:95;;33341:311;;;;;;;;;;-1:-1:-1;33341:311:0;;;;;:::i;:::-;;:::i;41594:454::-;;;;;;;;;;-1:-1:-1;41594:454:0;;;;;:::i;:::-;;:::i;:::-;;34937:253;;;;;;;;;;-1:-1:-1;34937:253:0;;;;;:::i;:::-;;:::i;27550:137::-;;;;;;;;;;;;27592:95;27550:137;;32463:92;;;;;;;;;;-1:-1:-1;32538:9:0;;32463:92;;32538:9;;;;28008:36:1;;27996:2;27981:18;32463:92:0;27963:87:1;27837:41:0;;;;;;;;;;;;;;;33660:216;;;;;;;;;;-1:-1:-1;33660:216:0;;;;;:::i;:::-;;:::i;35527:377::-;;;;;;;;;;-1:-1:-1;35527:377:0;;;;;:::i;:::-;;:::i;40599:430::-;;;;;;;;;;-1:-1:-1;40599:430:0;;;;;:::i;:::-;;:::i;48563:228::-;;;;;;;;;;-1:-1:-1;48563:228:0;;;;;:::i;:::-;;:::i;34454:436::-;;;;;;;;;;-1:-1:-1;34454:436:0;;;;;:::i;:::-;;:::i;30085:41::-;;;;;;;;;;-1:-1:-1;30085:41:0;;;;-1:-1:-1;;;;;30085:41:0;;;30167:40;;;;;;;;;;-1:-1:-1;30167:40:0;;;;-1:-1:-1;;;30167:40:0;;;;;;59204:123;;;;;;;;;;-1:-1:-1;59204:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;59292:27:0;59268:4;59292:27;;;:18;:27;;;;;;;;;59204:123;44367:475;;;;;;;;;;-1:-1:-1;44367:475:0;;;;;:::i;:::-;;:::i;38221:813::-;;;;;;;;;;-1:-1:-1;38221:813:0;;;;;:::i;:::-;;:::i;28997:21::-;;;;;;;;;;;;;;;;49219:311;;;;;;;;;;-1:-1:-1;49219:311:0;;;;;:::i;:::-;;:::i;43203:561::-;;;;;;;;;;-1:-1:-1;43203:561:0;;;;;:::i;:::-;;:::i;47392:178::-;;;;;;;;;;-1:-1:-1;47392:178:0;;;;;:::i;:::-;;:::i;28930:29::-;;;;;;;;;;;;;;;;45433:1320;;;;;;;;;;-1:-1:-1;45433:1320:0;;;;;:::i;:::-;;:::i;28505:42::-;;;;;;;;;;-1:-1:-1;28505:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;32781:198;;;;;;;;;;-1:-1:-1;32781:198:0;;;;;:::i;:::-;;:::i;28247:71::-;;;;;;;;;;-1:-1:-1;28247:71:0;;;;-1:-1:-1;;;;;28247:71:0;;;43836:460;;;;;;;;;;-1:-1:-1;43836:460:0;;;;;:::i;:::-;;:::i;27490:51::-;;;;;;;;;;-1:-1:-1;27490:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;42683:446;;;;;;;;;;-1:-1:-1;42683:446:0;;;;;:::i;:::-;;:::i;28626:24::-;;;;;;;;;;-1:-1:-1;28626:24:0;;;;;:::i;:::-;;:::i;34152:120::-;;;;;;;;;;-1:-1:-1;34152:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;34244:20:0;34220:4;34244:20;;;:11;:20;;;;;;;;;34152:120;48106:449;;;;;;;;;;-1:-1:-1;48106:449:0;;;;;:::i;:::-;;:::i;32368:87::-;;;;;;;;;;;;;:::i;48799:195::-;;;;;;;;;;-1:-1:-1;48799:195:0;;;;;:::i;:::-;;:::i;35231:99::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33884:260::-;;;;;;;;;;-1:-1:-1;33884:260:0;;;;;:::i;:::-;;:::i;42113:512::-;;;;;;;;;;-1:-1:-1;42113:512:0;;;;;:::i;:::-;;:::i;32987:167::-;;;;;;;;;;-1:-1:-1;32987:167:0;;;;;:::i;:::-;;:::i;28387:40::-;;;;;;;;;;-1:-1:-1;28387:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29104:22;;;;;;;;;;;;;:::i;47117:221::-;;;;;;;;;;-1:-1:-1;47117:221:0;;;;;:::i;:::-;;:::i;36426:304::-;;;;;;;;;;-1:-1:-1;36426:304:0;;;;;:::i;:::-;;:::i;41096:429::-;;;;;;;;;;-1:-1:-1;41096:429:0;;;;;:::i;:::-;;:::i;37563:650::-;;;;;;;;;;-1:-1:-1;37563:650:0;;;;;:::i;:::-;;:::i;32670:99::-;;;;;;;;;;;;;:::i;35367:103::-;;;;;;;;;;;;;:::i;28048:75::-;;;;;;;;;;-1:-1:-1;28048:75:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;46803:257;;;;;;;;;;-1:-1:-1;46803:257:0;;;;;:::i;:::-;;:::i;28717:26::-;;;;;;;;;;-1:-1:-1;28717:26:0;;;;;:::i;:::-;;:::i;44911:466::-;;;;;;;;;;-1:-1:-1;44911:466:0;;;;;:::i;:::-;;:::i;49002:209::-;;;;;;;;;;-1:-1:-1;49002:209:0;;;;;:::i;:::-;;:::i;29065:26::-;;;;;;;;;;;;;;;;47626:421;;;;;;;;;;-1:-1:-1;47626:421:0;;;;;:::i;:::-;;:::i;28181:20::-;;;;;;;;;;-1:-1:-1;28181:20:0;;;;-1:-1:-1;;;;;28181:20:0;;;32277:83;32314:13;32347:5;32340:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32277:83;:::o;33172:159::-;33247:4;33263:39;8370:10;33286:7;33295:6;33263:8;:39::i;:::-;-1:-1:-1;33319:4:0;33172:159;;;;;:::o;33341:311::-;33439:4;33456:36;33466:6;33474:9;33485:6;33456:9;:36::i;:::-;33503:119;33512:6;8370:10;33534:87;33570:6;33534:87;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33534:17:0;;;;;;:9;:17;;;;;;;;8370:10;33534:31;;;;;;;;;;:35;:87::i;:::-;33503:8;:119::i;:::-;-1:-1:-1;33640:4:0;33341:311;;;;;:::o;41594:454::-;30997:10;30986:22;;;;:10;:22;;;;;;;;30978:60;;;;-1:-1:-1;;;30978:60:0;;;;;;;:::i;:::-;;;;;;;;;41671:11:::1;::::0;:17;41663:56:::1;;;;-1:-1:-1::0;;;41663:56:0::1;;;;;;;:::i;:::-;41738:9;::::0;::::1;;:20;;::::0;::::1;;;;41730:60;;;::::0;-1:-1:-1;;;41730:60:0;;22534:2:1;41730:60:0::1;::::0;::::1;22516:21:1::0;22573:2;22553:18;;;22546:30;22612:29;22592:18;;;22585:57;22659:18;;41730:60:0::1;22506:177:1::0;41730:60:0::1;41815:5;::::0;-1:-1:-1;;;;;41815:5:0::1;41804:17;::::0;;;:10:::1;:17;::::0;;;;;::::1;;41801:88;;;49596:9:::0;:19;;-1:-1:-1;;49596:19:0;;;;;;;41836:20:::1;41871:7;;41801:88;41899:53;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;;::::0;::::1;::::0;41981:1:::1;41993:47;41899:53:::0;42020:7;41981:1;41993:16:::1;:47::i;:::-;31049:1;;;41594:454:::0;:::o;34937:253::-;35003:7;35042;;35031;:18;;35023:73;;;;-1:-1:-1;;;35023:73:0;;14926:2:1;35023:73:0;;;14908:21:1;14965:2;14945:18;;;14938:30;15004:34;14984:18;;;14977:62;-1:-1:-1;;;15055:18:1;;;15048:40;15105:19;;35023:73:0;14898:232:1;35023:73:0;35107:19;35130:10;:8;:10::i;:::-;35107:33;-1:-1:-1;35158:24:0;:7;35107:33;35158:11;:24::i;:::-;35151:31;;;34937:253;;;;:::o;33660:216::-;8370:10;33748:4;33797:23;;;:9;:23;;;;;;;;-1:-1:-1;;;;;33797:32:0;;;;;;;;;;33748:4;;33765:81;;33788:7;;33797:48;;33834:10;33797:36;:48::i;35527:377::-;8370:10;35579:14;35628:19;;;:11;:19;;;;;;;;35627:20;35619:77;;;;-1:-1:-1;;;35619:77:0;;25458:2:1;35619:77:0;;;25440:21:1;25497:2;25477:18;;;25470:30;25536:34;25516:18;;;25509:62;-1:-1:-1;;;25587:18:1;;;25580:42;25639:19;;35619:77:0;25430:234:1;35619:77:0;35708:15;35732:19;35743:7;35732:10;:19::i;:::-;-1:-1:-1;;;;;;;;;35780:15:0;;;;;;:7;:15;;;;;;35707:44;;-1:-1:-1;35780:28:0;;:15;-1:-1:-1;35707:44:0;35780:19;:28::i;:::-;-1:-1:-1;;;;;35762:15:0;;;;;;:7;:15;;;;;:46;35829:7;;:20;;35841:7;35829:11;:20::i;:::-;35819:7;:30;35873:10;;:23;;35888:7;35873:14;:23::i;:::-;35860:10;:36;-1:-1:-1;;;35527:377:0:o;40599:430::-;40696:4;-1:-1:-1;;;;;40721:16:0;;;;;:39;;-1:-1:-1;;;;;;40741:19:0;;40755:4;40741:19;;40721:39;40713:48;;;;;;40772:15;40790:21;40800:10;40790:9;:21::i;:::-;40772:39;;40841:5;40830:7;:16;;40822:76;;;;-1:-1:-1;;;40822:76:0;;17972:2:1;40822:76:0;;;17954:21:1;18011:2;17991:18;;;17984:30;18050:34;18030:18;;;18023:62;-1:-1:-1;;;18101:18:1;;;18094:45;18156:19;;40822:76:0;17944:237:1;40822:76:0;40909:32;40919:10;40931:2;40935:5;40909:9;:32::i;:::-;40959:62;;-1:-1:-1;;;40959:62:0;;-1:-1:-1;;;;;40959:37:0;;;;;:62;;40997:10;;41009:5;;41016:4;;;;40959:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40952:69;40599:430;-1:-1:-1;;;;;;40599:430:0:o;48563:228::-;31118:10;48632:4;31109:20;;;:8;:20;;;;;;;;31101:54;;;;-1:-1:-1;;;31101:54:0;;;;;;;:::i;:::-;48682:7:::1;::::0;48667:10:::1;::::0;:23:::1;::::0;:14:::1;:23::i;:::-;48657:6;:33;;48649:84;;;::::0;-1:-1:-1;;;48649:84:0;;17209:2:1;48649:84:0::1;::::0;::::1;17191:21:1::0;17248:2;17228:18;;;17221:30;17287:34;17267:18;;;17260:62;-1:-1:-1;;;17338:18:1;;;17331:36;17384:19;;48649:84:0::1;17181:228:1::0;48649:84:0::1;48744:17;48750:2;48754:6;48744:5;:17::i;34454:436::-:0;34544:7;34583;;34572;:18;;34564:62;;;;-1:-1:-1;;;34564:62:0;;18731:2:1;34564:62:0;;;18713:21:1;18770:2;18750:18;;;18743:30;18809:33;18789:18;;;18782:61;18860:18;;34564:62:0;18703:181:1;34564:62:0;34642:17;34637:246;;34677:15;34701:19;34712:7;34701:10;:19::i;:::-;-1:-1:-1;34676:44:0;;-1:-1:-1;34735:14:0;;-1:-1:-1;;;;;34735:14:0;34637:246;34784:23;34815:19;34826:7;34815:10;:19::i;:::-;-1:-1:-1;34782:52:0;;-1:-1:-1;34849:22:0;;-1:-1:-1;;;;;34849:22:0;44367:475;30997:10;30986:22;;;;:10;:22;;;;;;;;30978:60;;;;-1:-1:-1;;;30978:60:0;;;;;;;:::i;:::-;44453:11:::1;::::0;:17;44445:56:::1;;;;-1:-1:-1::0;;;44445:56:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;44521:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;44520:28;44512:78;;;::::0;-1:-1:-1;;;44512:78:0;;20912:2:1;44512:78:0::1;::::0;::::1;20894:21:1::0;20951:2;20931:18;;;20924:30;20990:34;20970:18;;;20963:62;-1:-1:-1;;;21041:18:1;;;21034:35;21086:19;;44512:78:0::1;20884:227:1::0;44512:78:0::1;44615:5;::::0;-1:-1:-1;;;;;44615:5:0::1;44604:17;::::0;;;:10:::1;:17;::::0;;;;;::::1;;44601:91;;;44636:23;44651:7;44636:14;:23::i;44601:91::-;44702:44;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;44702:44:0::1;::::0;::::1;::::0;44775:1:::1;44787:47;44702:44:::0;44814:7;44775:1;44787:16:::1;:47::i;38221:813::-:0;38368:4;38412:8;38393:15;:27;;38385:54;;;;-1:-1:-1;;;38385:54:0;;18388:2:1;38385:54:0;;;18370:21:1;18427:2;18407:18;;;18400:30;-1:-1:-1;;;18446:18:1;;;18439:44;18500:18;;38385:54:0;18360:164:1;38385:54:0;-1:-1:-1;;;;;38630:14:0;;38450:18;38630:14;;;;;;;;;;:16;;27738:92;;38560:6;;38585:2;;38606:5;;38630:16;38450:18;38630:16;;;:::i;:::-;;;;-1:-1:-1;38495:179:0;;;;;;10626:25:1;;;;-1:-1:-1;;;;;10725:15:1;;;10705:18;;;10698:43;10777:15;;;;10757:18;;;10750:43;10809:18;;;10802:34;10852:19;;;10845:35;10896:19;;;10889:35;;;10598:19;;38495:179:0;;;;;;;;;;;;38471:204;;;;;;38450:225;;38696:41;38709:6;38717:10;38729:1;38732;38735;38696:12;:41::i;:::-;:92;;;;38741:47;38760:6;38768:10;38780:1;38783;38786;38741:18;:47::i;:::-;38688:101;;;;;;-1:-1:-1;;;;;38808:16:0;;;;;:39;;-1:-1:-1;;;;;;38828:19:0;;38842:4;38828:19;;38808:39;38800:48;;;;;;38859:15;38877:17;38887:6;38877:9;:17::i;:::-;38859:35;;38924:5;38913:7;:16;;38905:60;;;;-1:-1:-1;;;38905:60:0;;19446:2:1;38905:60:0;;;19428:21:1;19485:2;19465:18;;;19458:30;19524:33;19504:18;;;19497:61;19575:18;;38905:60:0;19418:181:1;38905:60:0;38976:28;38986:6;38994:2;38998:5;38976:9;:28::i;:::-;-1:-1:-1;39022:4:0;;38221:813;-1:-1:-1;;;;;;;;;38221:813:0:o;49219:311::-;49312:9;;49286:4;;49312:9;;49311:10;49303:43;;;;-1:-1:-1;;;49303:43:0;;26626:2:1;49303:43:0;;;26608:21:1;26665:2;26645:18;;;26638:30;-1:-1:-1;;;26684:18:1;;;26677:50;26744:18;;49303:43:0;26598:170:1;49303:43:0;-1:-1:-1;;;;;49365:22:0;;49357:51;;;;-1:-1:-1;;;49357:51:0;;23701:2:1;49357:51:0;;;23683:21:1;23740:2;23720:18;;;23713:30;-1:-1:-1;;;23759:18:1;;;23752:46;23815:18;;49357:51:0;23673:166:1;49357:51:0;49419:25;49425:10;49437:6;49419:5;:25::i;:::-;49460:40;;10303:25:1;;;-1:-1:-1;;;;;49460:40:0;;;49471:10;;49460:40;;10291:2:1;10276:18;49460:40:0;;;;;;;-1:-1:-1;49518:4:0;49219:311;;;;:::o;43203:561::-;30997:10;30986:22;;;;:10;:22;;;;;;;;30978:60;;;;-1:-1:-1;;;30978:60:0;;;;;;;:::i;:::-;43292:11:::1;::::0;:17;43284:56:::1;;;;-1:-1:-1::0;;;43284:56:0::1;;;;;;;:::i;:::-;43378:15;::::0;-1:-1:-1;;;;;43359:35:0;;::::1;43378:15;::::0;;::::1;;43359:35;;43351:83;;;::::0;-1:-1:-1;;;43351:83:0;;14172:2:1;43351:83:0::1;::::0;::::1;14154:21:1::0;14211:2;14191:18;;;14184:30;14250:34;14230:18;;;14223:62;-1:-1:-1;;;14301:18:1;;;14294:33;14344:19;;43351:83:0::1;14144:225:1::0;43351:83:0::1;-1:-1:-1::0;;;;;43454:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;43453:21;43445:61;;;::::0;-1:-1:-1;;;43445:61:0;;17616:2:1;43445:61:0::1;::::0;::::1;17598:21:1::0;17655:2;17635:18;;;17628:30;17694:29;17674:18;;;17667:57;17741:18;;43445:61:0::1;17588:177:1::0;43445:61:0::1;43531:5;::::0;-1:-1:-1;;;;;43531:5:0::1;43520:17;::::0;;;:10:::1;:17;::::0;;;;;::::1;;43517:94;;;43552:26;43570:7;43552:17;:26::i;43517:94::-;43621:47;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;43621:47:0::1;::::0;::::1;::::0;43697:1:::1;43709:47;43621::::0;43736:7;43697:1;43709:16:::1;:47::i;47392:178::-:0;31237:5;;47454:4;;-1:-1:-1;;;;;31237:5:0;31223:10;:19;31215:54;;;;-1:-1:-1;;;31215:54:0;;;;;;;:::i;:::-;47471:5:::1;:14:::0;;-1:-1:-1;;;;;;47471:14:0::1;-1:-1:-1::0;;;;;47471:14:0;::::1;::::0;;::::1;::::0;;;47501:39:::1;::::0;47524:15:::1;10303:25:1::0;;47501:39:0::1;::::0;10291:2:1;10276:18;47501:39:0::1;;;;;;;;-1:-1:-1::0;47558:4:0::1;47392:178:::0;;;:::o;45433:1320::-;31237:5;;45505:4;;-1:-1:-1;;;;;31237:5:0;31223:10;:19;31215:54;;;;-1:-1:-1;;;31215:54:0;;;;;;;:::i;:::-;45545:4:::1;45530:11;;:19;45522:56;;;::::0;-1:-1:-1;;;45522:56:0;;24046:2:1;45522:56:0::1;::::0;::::1;24028:21:1::0;24085:2;24065:18;;;24058:30;24124:26;24104:18;;;24097:54;24168:18;;45522:56:0::1;24018:174:1::0;45522:56:0::1;45616:9;;45597:15;:28;;45589:62;;;::::0;-1:-1:-1;;;45589:62:0;;20160:2:1;45589:62:0::1;::::0;::::1;20142:21:1::0;20199:2;20179:18;;;20172:30;-1:-1:-1;;;20218:18:1;;;20211:51;20279:18;;45589:62:0::1;20132:171:1::0;45589:62:0::1;45665:6;45662:1035;;;45690:8;::::0;::::1;;45687:840;;;45718:8;:16:::0;;-1:-1:-1;;45718:16:0::1;::::0;;45756:14:::1;::::0;45718:16;45756:19:::1;45753:196;;;45811:10;::::0;49596:9;:19;;-1:-1:-1;;49596:19:0;45811:10;;;::::1;;;49596:19:::0;;;;;;;;45753:196:::1;;;45850:14;;45868:1;45850:19;45847:102;;;45918:10;::::0;45893:36:::1;::::0;45918:10;;::::1;;;45893:24;:36::i;:::-;45687:840;;;45972:8;::::0;::::1;::::0;::::1;;;45969:558;;;46000:8;:16:::0;;-1:-1:-1;;46000:16:0::1;::::0;;46038:14:::1;::::0;46056:1:::1;46038:19;46035:477;;;46091:10;::::0;46081:21:::1;::::0;46091:10;;::::1;-1:-1:-1::0;;;;;46091:10:0::1;46081:9;:21::i;46035:477::-;46130:14;;46148:1;46130:19;46127:385;;;46191:10;::::0;46173:29:::1;::::0;46191:10;;::::1;-1:-1:-1::0;;;;;46191:10:0::1;46173:17;:29::i;46127:385::-;46230:14;;46248:1;46230:19;46227:285;;;46289:10;::::0;46273:27:::1;::::0;46289:10;;::::1;-1:-1:-1::0;;;;;46289:10:0::1;46273:15;:27::i;46227:285::-;46328:14;;46346:1;46328:19;46325:187;;;46386:10;::::0;46371:26:::1;::::0;46386:10;;::::1;-1:-1:-1::0;;;;;46386:10:0::1;46371:14;:26::i;46325:187::-;46425:14;;46443:1;46425:19;46422:90;;;46481:10;::::0;46468:24:::1;::::0;46481:10;;::::1;-1:-1:-1::0;;;;;46481:10:0::1;46468:12;:24::i;:::-;45662:1035;;;46560:8;::::0;::::1;;46557:129;;;46587:8;:16:::0;;-1:-1:-1;;46587:16:0::1;::::0;;46557:129:::1;;;46627:8;::::0;::::1;::::0;::::1;;;46624:62;;;46654:8;:16:::0;;-1:-1:-1;;46654:16:0::1;::::0;;46624:62:::1;-1:-1:-1::0;;46707:16:0::1;:11;:16:::0;-1:-1:-1;46741:4:0::1;::::0;45433:1320::o;32781:198::-;-1:-1:-1;;;;;32871:20:0;;32847:7;32871:20;;;:11;:20;;;;;;;;32867:49;;;-1:-1:-1;;;;;;32900:16:0;;;;;;:7;:16;;;;;;32893:23;;32867:49;-1:-1:-1;;;;;32954:16:0;;;;;;:7;:16;;;;;;32934:37;;:19;:37::i;43836:460::-;30997:10;30986:22;;;;:10;:22;;;;;;;;30978:60;;;;-1:-1:-1;;;30978:60:0;;;;;;;:::i;:::-;43923:11:::1;::::0;:17;43915:56:::1;;;;-1:-1:-1::0;;;43915:56:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;43990:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;43982:60;;;::::0;-1:-1:-1;;;43982:60:0;;17616:2:1;43982:60:0::1;::::0;::::1;17598:21:1::0;17655:2;17635:18;;;17628:30;17694:29;17674:18;;;17667:57;17741:18;;43982:60:0::1;17588:177:1::0;43982:60:0::1;44067:5;::::0;-1:-1:-1;;;;;44067:5:0::1;44056:17;::::0;;;:10:::1;:17;::::0;;;;;::::1;;44053:92;;;44088:24;44104:7;44088:15;:24::i;44053:92::-;44155:45;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;44155:45:0::1;::::0;::::1;::::0;44229:1:::1;44241:47;44155:45:::0;44268:7;44229:1;44241:16:::1;:47::i;42683:446::-:0;30997:10;30986:22;;;;:10;:22;;;;;;;;30978:60;;;;-1:-1:-1;;;30978:60:0;;;;;;;:::i;:::-;42761:11:::1;::::0;:17;42753:56:::1;;;;-1:-1:-1::0;;;42753:56:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;42829:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;;::::1;;42828:18;42820:57;;;::::0;-1:-1:-1;;;42820:57:0;;15740:2:1;42820:57:0::1;::::0;::::1;15722:21:1::0;15779:2;15759:18;;;15752:30;15818:28;15798:18;;;15791:56;15864:18;;42820:57:0::1;15712:176:1::0;42820:57:0::1;42902:5;::::0;-1:-1:-1;;;;;42902:5:0::1;42891:17;::::0;;;:10:::1;:17;::::0;;;;;::::1;;42888:86;;;42923:18;42933:7;42923:9;:18::i;42888:86::-;42984:49;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;42984:49:0::1;::::0;::::1;::::0;43062:1:::1;43074:47;42984:49:::0;43101:7;43062:1;43074:16:::1;:47::i;28626:24::-:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28626:24:0;;-1:-1:-1;28626:24:0;:::o;48106:449::-;31237:5;;-1:-1:-1;;;;;31237:5:0;31223:10;:19;31215:54;;;;-1:-1:-1;;;31215:54:0;;;;;;;:::i;:::-;48178:13:::1;::::0;-1:-1:-1;;;;;48178:13:0::1;:27:::0;48170:63:::1;;;::::0;-1:-1:-1;;;48170:63:0;;25871:2:1;48170:63:0::1;::::0;::::1;25853:21:1::0;25910:2;25890:18;;;25883:30;25949:25;25929:18;;;25922:53;25992:18;;48170:63:0::1;25843:173:1::0;48170:63:0::1;48244:35;48301:6;48244:64;;48406:16;-1:-1:-1::0;;;;;48406:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;48388:72:0::1;;48469:4;48476:16;-1:-1:-1::0;;;;;48476:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48388:112;::::0;-1:-1:-1;;;;;;48388:112:0::1;::::0;;;;;;-1:-1:-1;;;;;8441:15:1;;;48388:112:0::1;::::0;::::1;8423:34:1::0;8493:15;;8473:18;;;8466:43;8358:18;;48388:112:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48372:13;:128:::0;;-1:-1:-1;;;;;;48372:128:0::1;-1:-1:-1::0;;;;;48372:128:0;;::::1;;::::0;;48513:15:::1;:34:::0;;-1:-1:-1;;;;;;48513:34:0::1;48372:128;48513:34:::0;;;::::1;::::0;;;::::1;;::::0;;-1:-1:-1;48106:449:0:o;32368:87::-;32407:13;32440:7;32433:14;;;;;:::i;48799:195::-;31118:10;48870:4;31109:20;;;:8;:20;;;;;;;;31101:54;;;;-1:-1:-1;;;31101:54:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48895:18:0;::::1;48887:47;;;::::0;-1:-1:-1;;;48887:47:0;;23701:2:1;48887:47:0::1;::::0;::::1;23683:21:1::0;23740:2;23720:18;;;23713:30;-1:-1:-1;;;23759:18:1;;;23752:46;23815:18;;48887:47:0::1;23673:166:1::0;48887:47:0::1;48945:19;48951:4;48957:6;48945:5;:19::i;35231:99::-:0;35279:16;35315:7;35308:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35308:14:0;;;;;;;;;;;;;;;;;;;;;;35231:99;:::o;33884:260::-;33977:4;33994:120;8370:10;34017:7;34026:87;34063:15;34026:87;;;;;;;;;;;;;;;;;:9;:23;34036:12;8370:10;8290:98;;34036:12;-1:-1:-1;;;;;34026:23:0;;;;;;;;;;;;;;;;;-1:-1:-1;34026:23:0;;;:32;;;;;;;;;;;:87;:36;:87::i;42113:512::-;30997:10;30986:22;;;;:10;:22;;;;;;;;30978:60;;;;-1:-1:-1;;;30978:60:0;;;;;;;:::i;:::-;42203:11:::1;::::0;:17;42195:56:::1;;;;-1:-1:-1::0;;;42195:56:0::1;;;;;;;:::i;:::-;42270:21;::::0;::::1;-1:-1:-1::0;;;42270:21:0;;::::1;;:32;;::::0;::::1;;;;42262:78;;;::::0;-1:-1:-1;;;42262:78:0;;16451:2:1;42262:78:0::1;::::0;::::1;16433:21:1::0;16490:2;16470:18;;;16463:30;16529:34;16509:18;;;16502:62;-1:-1:-1;;;16580:18:1;;;16573:31;16621:19;;42262:78:0::1;16423:223:1::0;42262:78:0::1;42365:5;::::0;-1:-1:-1;;;;;42365:5:0::1;42354:17;::::0;;;:10:::1;:17;::::0;;;;;::::1;;42351:101;;;42386:33;42411:7;42386:24;:33::i;42351:101::-;42462:47;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;42462:47:0::1;::::0;::::1;::::0;42541:1:::1;42553:47;42462::::0;42580:7;42541:1;42553:16:::1;:47::i;32987:167::-:0;33065:4;33082:42;8370:10;33106:9;33117:6;33082:9;:42::i;29104:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47117:221::-;31237:5;;47181:4;;-1:-1:-1;;;;;31237:5:0;31223:10;:19;31215:54;;;;-1:-1:-1;;;31215:54:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47198:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;:24;;-1:-1:-1;;47198:24:0::1;47218:4;47198:24:::0;;::::1;::::0;;;47233:9:::1;:21:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;47233:21:0::1;::::0;::::1;::::0;;47270:38;::::1;::::0;::::1;::::0;47292:15:::1;10303:25:1::0;;10291:2;10276:18;;10258:76;36426:304:0;36557:10;36530:4;36547:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;36547:30:0;;;;;;;;;;:38;;;36601:36;36530:4;;36547:30;;36601:36;;;;36580:5;10303:25:1;;10291:2;10276:18;;10258:76;36601:36:0;;;;;;;;36655:67;;-1:-1:-1;;;36655:67:0;;-1:-1:-1;;;;;36655:42:0;;;;;:67;;36698:10;;36710:5;;36717:4;;;;36655:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36648:74;36426:304;-1:-1:-1;;;;;36426:304:0:o;41096:429::-;30997:10;30986:22;;;;:10;:22;;;;;;;;30978:60;;;;-1:-1:-1;;;30978:60:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41174:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;;::::1;;41166:49;;;::::0;-1:-1:-1;;;41166:49:0;;14576:2:1;41166:49:0::1;::::0;::::1;14558:21:1::0;14615:2;14595:18;;;14588:30;-1:-1:-1;;;14634:18:1;;;14627:51;14695:18;;41166:49:0::1;14548:171:1::0;41166:49:0::1;-1:-1:-1::0;;;;;41226:15:0;::::1;41244:5;41226:15:::0;;;:8:::1;:15;::::0;;;;:23;;-1:-1:-1;;41226:23:0::1;::::0;;41260:258:::1;41284:7;:14:::0;41280:18;::::1;41260:258;;;41338:5;-1:-1:-1::0;;;;;41324:19:0::1;:7;41332:1;41324:10;;;;;;-1:-1:-1::0;;;41324:10:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;41324:10:0::1;:19;41320:187;;;41373:7;:14:::0;:18:::1;::::0;41390:1:::1;::::0;41373:18:::1;:::i;:::-;41367:1;:25;41364:72;;41407:7;41415:14:::0;;:18:::1;::::0;41432:1:::1;::::0;41415:18:::1;:::i;:::-;41407:27;;;;;;-1:-1:-1::0;;;41407:27:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;41394:7:::1;:10:::0;;-1:-1:-1;;;;;41407:27:0;;::::1;::::0;41402:1;;41394:10;::::1;;;-1:-1:-1::0;;;41394:10:0::1;;;;;;;;;;;;;;;;;:40;;;;;-1:-1:-1::0;;;;;41394:40:0::1;;;;;-1:-1:-1::0;;;;;41394:40:0::1;;;;;;41364:72;41454:7;:13;;;;;-1:-1:-1::0;;;41454:13:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;41454:13:0;;;;;-1:-1:-1;;;;;;41454:13:0::1;::::0;;;;;41486:5:::1;;41320:187;41300:3:::0;::::1;::::0;::::1;:::i;:::-;;;;41260:258;;;;41096:429:::0;:::o;37563:650::-;37732:8;37713:15;:27;;37705:54;;;;-1:-1:-1;;;37705:54:0;;18388:2:1;37705:54:0;;;18370:21:1;18427:2;18407:18;;;18400:30;-1:-1:-1;;;18446:18:1;;;18439:44;18500:18;;37705:54:0;18360:164:1;37705:54:0;-1:-1:-1;;;;;37953:14:0;;37770:18;37953:14;;;;;;;;;;:16;;27592:95;;37878:6;;37903:7;;37929:5;;37953:16;37770:18;37953:16;;;:::i;:::-;;;;-1:-1:-1;37815:182:0;;;;;;10626:25:1;;;;-1:-1:-1;;;;;10725:15:1;;;10705:18;;;10698:43;10777:15;;;;10757:18;;;10750:43;10809:18;;;10802:34;10852:19;;;10845:35;10896:19;;;10889:35;;;10598:19;;37815:182:0;;;;;;;;;;;;37791:207;;;;;;37770:228;;38019:41;38032:6;38040:10;38052:1;38055;38058;38019:12;:41::i;:::-;:92;;;;38064:47;38083:6;38091:10;38103:1;38106;38109;38064:18;:47::i;:::-;38011:101;;;;;;-1:-1:-1;;;;;38123:17:0;;;;;;;:9;:17;;;;;;;;:26;;;;;;;;;;;;;:34;;;38173:32;;10303:25:1;;;38173:32:0;;10276:18:1;38173:32:0;;;;;;;37563:650;;;;;;;;:::o;32670:99::-;32739:10;;32712:7;;32739:22;;32754:6;32739:14;:22::i;:::-;32732:29;;32670:99;:::o;35367:103::-;35417:16;35453:9;35446:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35446:16:0;;;;;;;;;;;;;;;;;;;;;;35367:103;:::o;46803:257::-;31237:5;;46862:4;;-1:-1:-1;;;;;31237:5:0;31223:10;:19;31215:54;;;;-1:-1:-1;;;31215:54:0;;;;;;;:::i;:::-;46894:1:::1;46887:3;:8;;46879:54;;;::::0;-1:-1:-1;;;46879:54:0;;22132:2:1;46879:54:0::1;::::0;::::1;22114:21:1::0;22171:2;22151:18;;;22144:30;22210:34;22190:18;;;22183:62;-1:-1:-1;;;22261:18:1;;;22254:31;22302:19;;46879:54:0::1;22104:223:1::0;46879:54:0::1;46959:2;46952:3;:9;;46944:56;;;::::0;-1:-1:-1;;;46944:56:0;;26223:2:1;46944:56:0::1;::::0;::::1;26205:21:1::0;26262:2;26242:18;;;26235:30;26301:34;26281:18;;;26274:62;-1:-1:-1;;;26352:18:1;;;26345:32;26394:19;;46944:56:0::1;26195:224:1::0;46944:56:0::1;47019:6;:3:::0;47023:2:::1;47019:6;:::i;:::-;:11;::::0;47026:4:::1;47019:11;:::i;:::-;47011:5;:19:::0;-1:-1:-1;47048:4:0::1;46803:257:::0;;;:::o;28717:26::-;;;;;;;;;;;;44911:466;30997:10;30986:22;;;;:10;:22;;;;;;;;30978:60;;;;-1:-1:-1;;;30978:60:0;;;;;;;:::i;:::-;44995:11:::1;::::0;:17;44987:56:::1;;;;-1:-1:-1::0;;;44987:56:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;45062:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;45054:75;;;::::0;-1:-1:-1;;;45054:75:0;;21728:2:1;45054:75:0::1;::::0;::::1;21710:21:1::0;21767:2;21747:18;;;21740:30;21806:34;21786:18;;;21779:62;-1:-1:-1;;;21857:18:1;;;21850:33;21900:19;;45054:75:0::1;21700:225:1::0;45054:75:0::1;45154:5;::::0;-1:-1:-1;;;;;45154:5:0::1;45143:17;::::0;;;:10:::1;:17;::::0;;;;;::::1;;45140:89;;;45175:21;45188:7;45175:12;:21::i;45140:89::-;45239:42;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;45239:42:0::1;::::0;::::1;::::0;45310:1:::1;45322:47;45239:42:::0;45349:7;45310:1;45322:16:::1;:47::i;49002:209::-:0;31118:10;49092:4;31109:20;;;:8;:20;;;;;;;;31101:54;;;;-1:-1:-1;;;31101:54:0;;;;;;;:::i;:::-;49109:22:::1;49115:7;49124:6;49109:5;:22::i;:::-;49165:7;-1:-1:-1::0;;;;;49147:34:0::1;49157:6;49147:34;49174:6;49147:34;;;;10303:25:1::0;;10291:2;10276:18;;10258:76;49147:34:0::1;;;;;;;;-1:-1:-1::0;49199:4:0::1;49002:209:::0;;;;;:::o;47626:421::-;31237:5;;47693:4;;-1:-1:-1;;;;;31237:5:0;31223:10;:19;31215:54;;;;-1:-1:-1;;;31215:54:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47710:17:0;::::1;47730:5;47710:17:::0;;;:10:::1;:17;::::0;;;;:25;;-1:-1:-1;;47710:25:0::1;::::0;;47746:272:::1;47770:9;:16:::0;47766:20;::::1;47746:272;;;47828:5;-1:-1:-1::0;;;;;47812:21:0::1;:9;47822:1;47812:12;;;;;;-1:-1:-1::0;;;47812:12:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;47812:12:0::1;:21;47808:199;;;47863:9;:16:::0;:20:::1;::::0;47882:1:::1;::::0;47863:20:::1;:::i;:::-;47857:1;:27;47854:80;;47901:9;47911:16:::0;;:20:::1;::::0;47930:1:::1;::::0;47911:20:::1;:::i;:::-;47901:31;;;;;;-1:-1:-1::0;;;47901:31:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;47886:9:::1;:12:::0;;-1:-1:-1;;;;;47901:31:0;;::::1;::::0;47896:1;;47886:12;::::1;;;-1:-1:-1::0;;;47886:12:0::1;;;;;;;;;;;;;;;;;:46;;;;;-1:-1:-1::0;;;;;47886:46:0::1;;;;;-1:-1:-1::0;;;;;47886:46:0::1;;;;;;47854:80;47952:9;:15;;;;;-1:-1:-1::0;;;47952:15:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;47952:15:0;;;;;-1:-1:-1;;;;;;47952:15:0::1;::::0;;;;;47986:5:::1;;47808:199;47788:3:::0;::::1;::::0;::::1;:::i;:::-;;;;47746:272;;59335:337:::0;-1:-1:-1;;;;;59429:20:0;;59421:69;;;;-1:-1:-1;;;59421:69:0;;23296:2:1;59421:69:0;;;23278:21:1;23335:2;23315:18;;;23308:30;23374:34;23354:18;;;23347:62;-1:-1:-1;;;23425:18:1;;;23418:34;23469:19;;59421:69:0;23268:226:1;59421:69:0;-1:-1:-1;;;;;59509:21:0;;59501:68;;;;-1:-1:-1;;;59501:68:0;;15337:2:1;59501:68:0;;;15319:21:1;15376:2;15356:18;;;15349:30;15415:34;15395:18;;;15388:62;-1:-1:-1;;;15466:18:1;;;15459:32;15508:19;;59501:68:0;15309:224:1;59501:68:0;-1:-1:-1;;;;;59580:17:0;;;;;;;:9;:17;;;;;;;;:26;;;;;;;;;;;;;:35;;;59631:33;;10303:25:1;;;59631:33:0;;10276:18:1;59631:33:0;;;;;;;;59335:337;;;:::o;59680:1295::-;-1:-1:-1;;;;;59802:18:0;;59794:68;;;;-1:-1:-1;;;59794:68:0;;22890:2:1;59794:68:0;;;22872:21:1;22929:2;22909:18;;;22902:30;22968:34;22948:18;;;22941:62;-1:-1:-1;;;23019:18:1;;;23012:35;23064:19;;59794:68:0;22862:227:1;59794:68:0;-1:-1:-1;;;;;59881:16:0;;59873:64;;;;-1:-1:-1;;;59873:64:0;;13768:2:1;59873:64:0;;;13750:21:1;13807:2;13787:18;;;13780:30;13846:34;13826:18;;;13819:62;-1:-1:-1;;;13897:18:1;;;13890:33;13940:19;;59873:64:0;13740:225:1;59873:64:0;59965:1;59956:6;:10;59948:64;;;;-1:-1:-1;;;59948:64:0;;21318:2:1;59948:64:0;;;21300:21:1;21357:2;21337:18;;;21330:30;21396:34;21376:18;;;21369:62;-1:-1:-1;;;21447:18:1;;;21440:39;21496:19;;59948:64:0;21290:231:1;59948:64:0;60023:28;60054:24;60072:4;60054:9;:24::i;:::-;60140:29;;60023:55;;-1:-1:-1;60116:53:0;;;;;;;60198;;-1:-1:-1;60235:16:0;;-1:-1:-1;;;60235:16:0;;;;60234:17;60198:53;:91;;;;-1:-1:-1;60276:13:0;;-1:-1:-1;;;;;60268:21:0;;;60276:13;;60268:21;;60198:91;:129;;;;-1:-1:-1;60306:21:0;;-1:-1:-1;;;60306:21:0;;;;60198:129;:173;;;;-1:-1:-1;60344:13:0;;-1:-1:-1;;;;;60344:13:0;:27;;60198:173;60180:362;;;60421:29;;60398:52;;60494:36;60509:20;60494:14;:36::i;:::-;-1:-1:-1;;;;;60750:24:0;;60623:12;60750:24;;;:18;:24;;;;;;60638:4;;60750:24;;;:50;;-1:-1:-1;;;;;;60778:22:0;;;;;;:18;:22;;;;;;;;60750:50;60747:96;;;-1:-1:-1;60826:5:0;60747:96;60929:38;60944:4;60949:2;60952:6;60959:7;60929:14;:38::i;:::-;59680:1295;;;;;;:::o;4708:190::-;4794:7;4830:12;4822:6;;;;4814:29;;;;-1:-1:-1;;;4814:29:0;;;;;;;;:::i;:::-;-1:-1:-1;4854:9:0;4866:5;4870:1;4866;:5;:::i;49888:563::-;49982:20;50026:8;50023:97;;;-1:-1:-1;50050:13:0;;;;;;;;;;;;-1:-1:-1;;;50050:13:0;;;;50023:97;;;-1:-1:-1;50094:14:0;;;;;;;;;;;;-1:-1:-1;;;50094:14:0;;;;50023:97;50175:5;50182:6;50158:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50140:8;:50;;;;;;;;;;;;:::i;:::-;;50215:17;50223:8;50215:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:17::i;:::-;50201:11;:31;;;50249:5;;50243:45;;-1:-1:-1;;;50243:45:0;;-1:-1:-1;;;;;50249:5:0;;;;50243:22;;:45;;50201:31;50279:8;;50243:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;50299:8:0;:15;;50310:4;-1:-1:-1;;50299:15:0;;;;-1:-1:-1;;50325:21:0;;;;;;;;;50357:14;:23;;;50421:5;;50403:23;;:15;:23;:::i;:::-;50391:9;:35;-1:-1:-1;49888:563:0;;;:::o;56018:163::-;56059:7;56080:15;56097;56116:19;:17;:19::i;:::-;56079:56;;-1:-1:-1;56079:56:0;-1:-1:-1;56153:20:0;56079:56;;56153:11;:20::i;:::-;56146:27;;;;56018:163;:::o;6100:132::-;6158:7;6185:39;6189:1;6192;6185:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;6178:46;6100:132;-1:-1:-1;;;6100:132:0:o;3807:179::-;3865:7;;3897:5;3901:1;3897;:5;:::i;:::-;3885:17;;3926:1;3921;:6;;3913:46;;;;-1:-1:-1;;;3913:46:0;;16853:2:1;3913:46:0;;;16835:21:1;16892:2;16872:18;;;16865:30;16931:29;16911:18;;;16904:57;16978:18;;3913:46:0;16825:177:1;54816:419:0;54875:7;54884;54893;54902;54911;54920;54941:23;54966:12;54980:18;55002:20;55014:7;55002:11;:20::i;:::-;54940:82;;;;;;55034:15;55051:23;55076:12;55092:50;55104:7;55113:4;55119:10;55131;:8;:10::i;:::-;55092:11;:50::i;:::-;55033:109;;;;-1:-1:-1;55033:109:0;;-1:-1:-1;55193:15:0;;-1:-1:-1;55210:4:0;;-1:-1:-1;55216:10:0;;-1:-1:-1;54816:419:0;;-1:-1:-1;;;;;54816:419:0:o;4269:136::-;4327:7;4354:43;4358:1;4361;4354:43;;;;;;;;;;;;;;;;;:3;:43::i;51603:496::-;-1:-1:-1;;;;;51679:21:0;;51671:61;;;;-1:-1:-1;;;51671:61:0;;16095:2:1;51671:61:0;;;16077:21:1;16134:2;16114:18;;;16107:30;16173:29;16153:18;;;16146:57;16220:18;;51671:61:0;16067:177:1;51671:61:0;51744:15;51768:18;51779:6;51768:10;:18::i;:::-;51743:43;;;;;;;51808:20;51820:7;51808;;:11;;:20;;;;:::i;:::-;51798:7;:30;51850:7;;:19;;51862:6;51850:11;:19::i;:::-;51840:7;:29;-1:-1:-1;;;;;51899:16:0;;;;;;:7;:16;;;;;;:29;;51920:7;51899:20;:29::i;:::-;-1:-1:-1;;;;;51880:16:0;;;;;;:7;:16;;;;;;;;:48;;;;51942:11;:20;;;;;;51939:85;;;-1:-1:-1;;;;;51996:16:0;;;;;;:7;:16;;;;;;:28;;52017:6;51996:20;:28::i;:::-;-1:-1:-1;;;;;51977:16:0;;;;;;:7;:16;;;;;:47;51939:85;52054:37;;10303:25:1;;;-1:-1:-1;;;;;52054:37:0;;;52071:1;;52054:37;;10291:2:1;10276:18;52054:37:0;10258:76:1;54283:102:0;-1:-1:-1;;;;;54343:27:0;;;;;:18;:27;;;;;:34;;-1:-1:-1;;54343:34:0;54373:4;54343:34;;;54283:102::o;50542:438::-;50690:26;;-1:-1:-1;;6474:2:1;6470:15;;;6466:53;50690:26:0;;;6454:66:1;50674:5:0;;50681:36;;6536:12:1;;50690:26:0;;;;;;;;;;;;50681:8;:36::i;:::-;50657:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50639:8;:80;;;;;;;;;;;;:::i;:::-;;50744:17;50752:8;50744:17;;;;;:::i;:::-;50730:11;:31;;;50778:5;;50772:45;;-1:-1:-1;;;50772:45:0;;-1:-1:-1;;;;;50778:5:0;;;;50772:22;;:45;;50730:31;50808:8;;50772:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;50828:8:0;:15;;;-1:-1:-1;;50828:15:0;;;;-1:-1:-1;;;;;;50854:21:0;;-1:-1:-1;;;;;50854:21:0;;;;;;50886:14;:23;;;50950:5;;50932:23;;:15;:23;:::i;:::-;50920:9;:35;50542:438;;;:::o;39042:399::-;39210:110;;-1:-1:-1;;;39210:110:0;;;7677:27:1;39274:16:0;7720:11:1;;;7713:27;7756:12;;;7749:28;;;39154:4:0;;;;7793:12:1;;39210:110:0;;;-1:-1:-1;;39210:110:0;;;;;;;;;39186:135;;39210:110;39186:135;;;;39332:14;39349:24;;;;;;;;;12767:25:1;;;12840:4;12828:17;;12808:18;;;12801:45;;;;12862:18;;;12855:34;;;12905:18;;;12898:34;;;39186:135:0;;-1:-1:-1;39332:14:0;39349:24;;12739:19:1;;39349:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39349:24:0;;-1:-1:-1;;39349:24:0;;;-1:-1:-1;;;;;;;39392:20:0;;;;;;:40;;;39426:6;-1:-1:-1;;;;;39416:16:0;:6;-1:-1:-1;;;;;39416:16:0;;39392:40;39384:49;39042:399;-1:-1:-1;;;;;;;;39042:399:0:o;39449:290::-;39567:4;39584:12;39599:20;39608:10;39905:58;;7276:66:1;39905:58:0;;;7264:79:1;7359:12;;;7352:28;;;39868:7:0;;7396:12:1;;39905:58:0;;;;;;;;;;;;39895:69;;;;;;39888:76;;39813:159;;;;39599:20;39647:24;;;39630:14;39647:24;;;;;;;;;12767:25:1;;;12840:4;12828:17;;12808:18;;;12801:45;;;;12862:18;;;12855:34;;;12905:18;;;12898:34;;;39584:35:0;;-1:-1:-1;39630:14:0;39647:24;;12739:19:1;;39647:24:0;12721:217:1;52431:496:0;-1:-1:-1;;;;;52507:21:0;;52499:63;;;;-1:-1:-1;;;52499:63:0;;24399:2:1;52499:63:0;;;24381:21:1;24438:2;24418:18;;;24411:30;24477:31;24457:18;;;24450:59;24526:18;;52499:63:0;24371:179:1;52499:63:0;52574:15;52599:18;52610:6;52599:10;:18::i;:::-;-1:-1:-1;;;;;;;;;52647:16:0;;;;;;:7;:16;;;;;;52573:44;;-1:-1:-1;52647:29:0;;:16;-1:-1:-1;52573:44:0;52647:20;:29::i;:::-;-1:-1:-1;;;;;52628:16:0;;;;;;:7;:16;;;;;;;;:48;;;;52690:11;:20;;;;;;52687:85;;;-1:-1:-1;;;;;52744:16:0;;;;;;:7;:16;;;;;;:28;;52765:6;52744:20;:28::i;:::-;-1:-1:-1;;;;;52725:16:0;;;;;;:7;:16;;;;;:47;52687:85;52805:7;;:20;;52817:7;52805:11;:20::i;:::-;52795:7;:30;52847:7;;:19;;52859:6;52847:11;:19::i;:::-;52837:7;:29;52882:37;;10303:25:1;;;52908:1:0;;-1:-1:-1;;;;;52882:37:0;;;;;10291:2:1;10276:18;52882:37:0;10258:76:1;52935:250:0;-1:-1:-1;;;;;53001:16:0;;53020:1;53001:16;;;:7;:16;;;;;;:20;52998:108;;-1:-1:-1;;;;;53077:16:0;;;;;;:7;:16;;;;;;53057:37;;:19;:37::i;:::-;-1:-1:-1;;;;;53038:16:0;;;;;;:7;:16;;;;;:56;52998:108;-1:-1:-1;;;;;53116:20:0;;;;;:11;:20;;;;;:27;;-1:-1:-1;;53116:27:0;53139:4;53116:27;;;;;;53154:9;:23;;;;;;;;;;;;;;-1:-1:-1;;;;;;53154:23:0;;;;;;52935:250::o;54506:162::-;54574:21;:32;;;;;-1:-1:-1;;;54574:32:0;-1:-1:-1;;;;54574:32:0;;;;;;54622:38;;;;;;54598:8;10130:14:1;10123:22;10105:41;;10093:2;10078:18;;10060:92;54622:38:0;;;;;;;;54506:162;:::o;49635:163::-;-1:-1:-1;;;;;49688:15:0;;;;;;:8;:15;;;;;;:22;;-1:-1:-1;;49688:22:0;49706:4;49688:22;;;;;;49721:7;:19;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;49721:19:0;;;;;49756:34;;;;;49774:15;10303:25:1;;10291:2;10276:18;;10258:76;49756:34:0;;;;;;;;49635:163;:::o;53193:428::-;53259:9;53254:360;53278:9;:16;53274:20;;53254:360;;;53336:7;-1:-1:-1;;;;;53320:23:0;:9;53330:1;53320:12;;;;;;-1:-1:-1;;;53320:12:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53320:12:0;:23;53316:287;;;53373:9;:16;:20;;53392:1;;53373:20;:::i;:::-;53367:1;:27;53364:80;;53411:9;53421:16;;:20;;53440:1;;53421:20;:::i;:::-;53411:31;;;;;;-1:-1:-1;;;53411:31:0;;;;;;;;;;;;;;;;;;;53396:9;:12;;-1:-1:-1;;;;;53411:31:0;;;;53406:1;;53396:12;;;;-1:-1:-1;;;53396:12:0;;;;;;;;;;;;;;;;;:46;;;;;-1:-1:-1;;;;;53396:46:0;;;;;-1:-1:-1;;;;;53396:46:0;;;;;;53364:80;-1:-1:-1;;;;;53462:16:0;;53481:1;53462:16;;;:7;:16;;;;;;;;:20;;;53501:11;:20;;;;;:28;;-1:-1:-1;;53501:28:0;;;53548:9;:15;;;;;-1:-1:-1;;;53548:15:0;;;;;;;;53316:287;53296:3;;;;:::i;:::-;;;;53254:360;;54397:101;-1:-1:-1;;;;;54455:27:0;54485:5;54455:27;;;:18;:27;;;;;:35;;-1:-1:-1;;54455:35:0;;;54397:101::o;60983:985::-;30853:16;:23;;-1:-1:-1;;;;30853:23:0;-1:-1:-1;;;30853:23:0;;;;61134:27:::1;:20:::0;61159:1:::1;61134:24;:27::i;:::-;61119:42:::0;-1:-1:-1;61172:17:0::1;61192:30;:20:::0;61119:42;61192:24:::1;:30::i;:::-;61172:50:::0;-1:-1:-1;61525:21:0::1;61591:22;61608:4:::0;61591:16:::1;:22::i;:::-;61744:18;61765:41;:21;61791:14:::0;61765:25:::1;:41::i;:::-;61744:62;;61856:35;61869:9;61880:10;61856:12;:35::i;:::-;61917:43;::::0;;11137:25:1;;;11193:2;11178:18;;11171:34;;;11221:18;;;11214:34;;;61917:43:0::1;::::0;11125:2:1;11110:18;61917:43:0::1;;;;;;;-1:-1:-1::0;;30899:16:0;:24;;-1:-1:-1;;;;30899:24:0;;;-1:-1:-1;;;60983:985:0:o;63171:891::-;63282:7;63278:160;;63305:14;:12;:14::i;:::-;63278:160;;;63412:14;63419:6;63412;:14::i;:::-;-1:-1:-1;;;;;63452:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;63476:22:0;;;;;;:11;:22;;;;;;;;63475:23;63452:46;63448:597;;;63515:48;63537:6;63545:9;63556:6;63515:21;:48::i;:::-;63448:597;;;-1:-1:-1;;;;;63586:19:0;;;;;;:11;:19;;;;;;;;63585:20;:46;;;;-1:-1:-1;;;;;;63609:22:0;;;;;;:11;:22;;;;;;;;63585:46;63581:464;;;63648:46;63668:6;63676:9;63687:6;63648:19;:46::i;63581:464::-;-1:-1:-1;;;;;63717:19:0;;;;;;:11;:19;;;;;;;;63716:20;:47;;;;-1:-1:-1;;;;;;63741:22:0;;;;;;:11;:22;;;;;;;;63740:23;63716:47;63712:333;;;63780:44;63798:6;63806:9;63817:6;63780:17;:44::i;63712:333::-;-1:-1:-1;;;;;63846:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;63869:22:0;;;;;;:11;:22;;;;;;;;63846:45;63842:203;;;63908:48;63930:6;63938:9;63949:6;63908:21;:48::i;63842:203::-;63989:44;64007:6;64015:9;64026:6;63989:17;:44::i;:::-;63171:891;;;;:::o;50992:331::-;51052:7;51072:12;51142:5;51126:23;;;;;;51195:15;51178:33;;;;;;7945:19:1;;7989:2;7980:12;;7935:63;51178:33:0;;;;;;;-1:-1:-1;;51178:33:0;;;;;;51168:44;;51178:33;51168:44;;;;51266:4;6474:2:1;6470:15;-1:-1:-1;;6466:53:1;51241:31:0;;;6454:66:1;51241:31:0;;;;;;;;;6536:12:1;;;51241:31:0;;51231:42;;;;;;51115:159;;;11137:25:1;;;;11178:18;;;11171:34;11221:18;;;;11214:34;;;;51115:159:0;;;;;;;;;;11110:18:1;;;;51115:159:0;;51087:188;;;;;;;-1:-1:-1;;;50992:331:0:o;56189:615::-;56286:7;;56322;;56239;;;;56344:12;56340:49;;56366:10;;56378;;56358:31;;;;;;;;56340:49;56405:9;56400:289;56424:9;:16;56420:20;;56400:289;;;56490:7;56466;:21;56474:9;56484:1;56474:12;;;;;;-1:-1:-1;;;56474:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56474:12:0;56466:21;;;;;;;;;;;;;:31;;:66;;;56525:7;56501;:21;56509:9;56519:1;56509:12;;;;;;-1:-1:-1;;;56509:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56509:12:0;56501:21;;;;;;;;;;;;;:31;56466:66;56462:97;;;56542:7;;56551;;56534:25;;;;;;;;;56462:97;56584:34;56596:7;:21;56604:9;56614:1;56604:12;;;;;;-1:-1:-1;;;56604:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56604:12:0;56596:21;;;;;;;;;;;;;56584:7;;:11;:34::i;:::-;56574:44;;56643:34;56655:7;:21;56663:9;56673:1;56663:12;;;;;;-1:-1:-1;;;56663:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56663:12:0;56655:21;;;;;;;;;;;;;56643:7;;:11;:34::i;:::-;56633:44;-1:-1:-1;56442:3:0;;;;:::i;:::-;;;;56400:289;;;-1:-1:-1;56725:7:0;;56713;;:20;;:11;:20::i;:::-;56703:7;:30;56699:61;;;56743:7;;56752;;56735:25;;;;;;;;56699:61;56779:7;;-1:-1:-1;56788:7:0;-1:-1:-1;56189:615:0;;;:::o;6728:276::-;6814:7;6849:12;6842:5;6834:28;;;;-1:-1:-1;;;6834:28:0;;;;;;;;:::i;:::-;-1:-1:-1;6873:9:0;6885:5;6889:1;6885;:5;:::i;55243:330::-;55303:7;55312;55321;55341:12;55356:24;55372:7;55356:15;:24::i;:::-;55341:39;;55391:18;55412:30;55434:7;55412:21;:30::i;:::-;55391:51;-1:-1:-1;55453:23:0;55479:33;55391:51;55479:17;:7;55491:4;55479:11;:17::i;:::-;:21;;:33::i;:::-;55453:59;55548:4;;-1:-1:-1;55554:10:0;;-1:-1:-1;55243:330:0;;-1:-1:-1;;;55243:330:0:o;55581:429::-;55696:7;;;;55752:24;:7;55764:11;55752;:24::i;:::-;55734:42;-1:-1:-1;55787:12:0;55802:21;:4;55811:11;55802:8;:21::i;:::-;55787:36;-1:-1:-1;55834:18:0;55855:27;:10;55870:11;55855:14;:27::i;:::-;55834:48;-1:-1:-1;55893:23:0;55919:33;55834:48;55919:17;:7;55931:4;55919:11;:17::i;:33::-;55971:7;;;;-1:-1:-1;55997:4:0;;-1:-1:-1;55581:429:0;;-1:-1:-1;;;;;;;55581:429:0:o;65776:458::-;65860:42;;;;;;;;;;;;-1:-1:-1;;;65860:42:0;;;;65946:11;;65834:13;;65860:42;:21;;65946:15;;65960:1;65946:15;:::i;:::-;65942:19;;:1;:19;:::i;:::-;65932:30;;;;;;-1:-1:-1;;;65932:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65932:30:0;;65913:49;;-1:-1:-1;;;65973:3:0;65977:1;65973:6;;;;;;-1:-1:-1;;;65973:6:0;;;;;;;;;;;;:12;-1:-1:-1;;;;;65973:12:0;;;;;;;;;-1:-1:-1;;;65996:3:0;66000:1;65996:6;;;;;;-1:-1:-1;;;65996:6:0;;;;;;;;;;;;:12;-1:-1:-1;;;;;65996:12:0;;;;;;;;;66024:6;66019:179;66040:4;:11;66036:1;:15;66019:179;;;66086:8;66117:1;66106:4;66111:1;66106:7;;;;;;-1:-1:-1;;;66106:7:0;;;;;;;;;;;;;66086:35;;-1:-1:-1;;;;;;66106:7:0;;;:12;;;:7;66100:19;;66086:35;;;;-1:-1:-1;;;66086:35:0;;;;;;;;;;;;;-1:-1:-1;;;;;;66086:35:0;66073:3;66079;:1;66081;66079:3;:::i;:::-;66077:5;;:1;:5;:::i;:::-;66073:10;;;;;;-1:-1:-1;;;66073:10:0;;;;;;;;;;;;:48;-1:-1:-1;;;;;66073:48:0;;;;;;;;;66149:8;66169:4;66174:1;66169:7;;;;;;-1:-1:-1;;;66169:7:0;;;;;;;;;;;;;;66149:37;;66169:7;;;;;66179:4;66163:21;;66149:37;;;;-1:-1:-1;;;66149:37:0;;;;;;;;;;;;;-1:-1:-1;;;;;;66149:37:0;66136:3;66142;:1;66144;66142:3;:::i;:::-;66140:5;;:1;:5;:::i;:::-;66136:10;;;;;;-1:-1:-1;;;66136:10:0;;;;;;;;;;;;:50;-1:-1:-1;;;;;66136:50:0;;;;;;;;-1:-1:-1;66053:3:0;;;;:::i;:::-;;;;66019:179;;;-1:-1:-1;66222:3:0;65776:458;-1:-1:-1;;;65776:458:0:o;61976:589::-;62126:16;;;62140:1;62126:16;;;;;;;;62102:21;;62126:16;;;;;;;;;;-1:-1:-1;62126:16:0;62102:40;;62171:4;62153;62158:1;62153:7;;;;;;-1:-1:-1;;;62153:7:0;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;62153:23:0;;;-1:-1:-1;;;;;62153:23:0;;;;;62197:15;;;;;;;;;-1:-1:-1;;;;;62197:15:0;-1:-1:-1;;;;;62197:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62187:4;62192:1;62187:7;;;;;;-1:-1:-1;;;62187:7:0;;;;;;;;;-1:-1:-1;;;;;62187:32:0;;;:7;;;;;;;;;:32;62264:15;;62232:62;;62249:4;;62264:15;;;;62282:11;62232:8;:62::i;:::-;62333:15;;:224;;-1:-1:-1;;;62333:224:0;;:15;;;;-1:-1:-1;;;;;62333:15:0;;:66;;:224;;62414:11;;62440:1;;62484:4;;62511;;62531:15;;62333:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62573:517;62753:15;;62721:62;;62738:4;;62753:15;;;-1:-1:-1;;;;;62753:15:0;62771:11;62721:8;:62::i;:::-;62826:15;;63030:11;;62826:256;;-1:-1:-1;;;62826:256:0;;62898:4;62826:256;;;9428:34:1;9478:18;;;9471:34;;;62944:1:0;9521:18:1;;;9514:34;;;9564:18;;;9557:34;-1:-1:-1;;;;;63030:11:0;;;9607:19:1;;;9600:44;63056:15:0;9660:19:1;;;9653:35;62826:15:0;;;;;;:31;;62865:9;;9362:19:1;;62826:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;62573:517;;:::o;57523:148::-;57569:7;;:12;:34;;;;-1:-1:-1;57585:13:0;;:18;57569:34;57566:48;;;57606:7;;57566:48;57634:1;57624:7;:11;;;57646:13;:17;57523:148;:::o;57683:1509::-;57805:10;57795:6;:21;57792:1393;;;57848:20;57839:6;:29;57836:1244;;;57902:2;57892:7;:12;;;57927:13;:18;57836:1244;;;57982:18;57973:6;:27;57970:1110;;;58034:1;58024:7;:11;58074:1;58058:13;:17;57970:1110;;;58112:18;58103:6;:27;58100:980;;;58164:1;58154:7;:11;;;58188:13;:17;58100:980;;;58242:17;58233:6;:26;58230:850;;;58293:1;58283:7;:11;;;58317:13;:17;58230:850;;;58371:16;58362:6;:25;58359:721;;;58421:1;58411:7;:11;;;58445:13;:17;58359:721;;;58499:15;58490:6;:24;58487:593;;;58548:1;58538:7;:11;;;58572:13;:17;58487:593;;;58626:14;58617:6;:23;58614:466;;;58674:1;58664:7;:11;58714:1;58698:13;:17;58614:466;;;58752:12;58743:6;:21;58740:340;;;58798:1;58788:7;:11;;;58822:13;:17;58740:340;;;58876:11;58867:6;:20;58864:216;;;58921:1;58911:7;:11;58961:1;58945:13;:17;58864:216;;;59019:1;59009:7;:11;;;59043:13;:17;57792:1393;;;59130:1;59120:7;:11;59167:1;59151:13;:17;57683:1509;:::o;65164:564::-;65267:15;65284:23;65309:12;65323:23;65348:12;65362:18;65384:19;65395:7;65384:10;:19::i;:::-;-1:-1:-1;;;;;65432:15:0;;;;;;:7;:15;;;;;;65266:137;;-1:-1:-1;65266:137:0;;-1:-1:-1;65266:137:0;;-1:-1:-1;65266:137:0;-1:-1:-1;65266:137:0;-1:-1:-1;65266:137:0;-1:-1:-1;65432:28:0;;65452:7;65432:19;:28::i;:::-;-1:-1:-1;;;;;65414:15:0;;;;;;:7;:15;;;;;;;;:46;;;;65489:7;:15;;;;:28;;65509:7;65489:19;:28::i;:::-;-1:-1:-1;;;;;65471:15:0;;;;;;;:7;:15;;;;;;:46;;;;65549:18;;;;;;;:39;;65572:15;65549:22;:39::i;:::-;-1:-1:-1;;;;;65528:18:0;;;;;;:7;:18;;;;;:60;65600:26;65615:10;65600:14;:26::i;:::-;65637:23;65649:4;65655;65637:11;:23::i;:::-;65693:9;-1:-1:-1;;;;;65676:44:0;65685:6;-1:-1:-1;;;;;65676:44:0;;65704:15;65676:44;;;;10303:25:1;;10291:2;10276:18;;10258:76;65676:44:0;;;;;;;;65164:564;;;;;;;;;:::o;64580:576::-;64681:15;64698:23;64723:12;64737:23;64762:12;64776:18;64798:19;64809:7;64798:10;:19::i;:::-;-1:-1:-1;;;;;64846:15:0;;;;;;:7;:15;;;;;;64680:137;;-1:-1:-1;64680:137:0;;-1:-1:-1;64680:137:0;;-1:-1:-1;64680:137:0;-1:-1:-1;64680:137:0;-1:-1:-1;64680:137:0;-1:-1:-1;64846:28:0;;64680:137;64846:19;:28::i;:::-;-1:-1:-1;;;;;64828:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;64906:18;;;;;:7;:18;;;;;:39;;64929:15;64906:22;:39::i;:::-;-1:-1:-1;;;;;64885:18:0;;;;;;:7;:18;;;;;;;;:60;;;;64977:7;:18;;;;:39;;65000:15;64977:22;:39::i;64070:502::-;64169:15;64186:23;64211:12;64225:23;64250:12;64264:18;64286:19;64297:7;64286:10;:19::i;:::-;-1:-1:-1;;;;;64334:15:0;;;;;;:7;:15;;;;;;64168:137;;-1:-1:-1;64168:137:0;;-1:-1:-1;64168:137:0;;-1:-1:-1;64168:137:0;-1:-1:-1;64168:137:0;-1:-1:-1;64168:137:0;-1:-1:-1;64334:28:0;;64168:137;64334:19;:28::i;53637:634::-;53740:15;53757:23;53782:12;53796:23;53821:12;53835:18;53857:19;53868:7;53857:10;:19::i;:::-;-1:-1:-1;;;;;53905:15:0;;;;;;:7;:15;;;;;;53739:137;;-1:-1:-1;53739:137:0;;-1:-1:-1;53739:137:0;;-1:-1:-1;53739:137:0;-1:-1:-1;53739:137:0;-1:-1:-1;53739:137:0;-1:-1:-1;53905:28:0;;53925:7;53905:19;:28::i;:::-;-1:-1:-1;;;;;53887:15:0;;;;;;:7;:15;;;;;;;;:46;;;;53962:7;:15;;;;:28;;53982:7;53962:19;:28::i;57183:154::-;57247:7;57274:55;57313:5;57274:20;57286:7;;57274;:11;;:20;;;;:::i;:::-;:24;;:55::i;57345:166::-;57415:7;57442:61;57487:5;57442:26;57454:13;;57442:7;:11;;:26;;;;:::i;5157:467::-;5215:7;5460:6;5456:47;;-1:-1:-1;5490:1:0;5483:8;;5456:47;5513:9;5525:5;5529:1;5525;:5;:::i;:::-;5513:17;-1:-1:-1;5558:1:0;5549:5;5553:1;5513:17;5549:5;:::i;:::-;:10;5541:56;;;;-1:-1:-1;;;5541:56:0;;20510:2:1;5541:56:0;;;20492:21:1;20549:2;20529:18;;;20522:30;20588:34;20568:18;;;20561:62;-1:-1:-1;;;20639:18:1;;;20632:31;20680:19;;5541:56:0;20482:223:1;56816:355:0;56879:19;56902:10;:8;:10::i;:::-;56879:33;-1:-1:-1;56923:18:0;56944:27;:10;56879:33;56944:14;:27::i;:::-;57023:4;57007:22;;;;:7;:22;;;;;;56923:48;;-1:-1:-1;57007:38:0;;56923:48;57007:26;:38::i;:::-;56998:4;56982:22;;;;:7;:22;;;;;;;;:63;;;;57059:11;:26;;;;;;57056:107;;;57141:4;57125:22;;;;:7;:22;;;;;;:38;;57152:10;57125:26;:38::i;:::-;57116:4;57100:22;;;;:7;:22;;;;;:63;56816:355;;;:::o;54676:132::-;54754:7;;:17;;54766:4;54754:11;:17::i;:::-;54744:7;:27;;;;54796:4;54782:10;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;54676:132:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:257:1;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;276:261::-;;399:2;387:9;378:7;374:23;370:32;367:2;;;420:6;412;405:22;367:2;457:9;451:16;476:31;501:5;476:31;:::i;542:398::-;;;671:2;659:9;650:7;646:23;642:32;639:2;;;692:6;684;677:22;639:2;736:9;723:23;755:31;780:5;755:31;:::i;:::-;805:5;-1:-1:-1;862:2:1;847:18;;834:32;875:33;834:32;875:33;:::i;:::-;927:7;917:17;;;629:311;;;;;:::o;945:466::-;;;;1091:2;1079:9;1070:7;1066:23;1062:32;1059:2;;;1112:6;1104;1097:22;1059:2;1156:9;1143:23;1175:31;1200:5;1175:31;:::i;:::-;1225:5;-1:-1:-1;1282:2:1;1267:18;;1254:32;1295:33;1254:32;1295:33;:::i;:::-;1049:362;;1347:7;;-1:-1:-1;;;1401:2:1;1386:18;;;;1373:32;;1049:362::o;1416:849::-;;;;;;;;1628:3;1616:9;1607:7;1603:23;1599:33;1596:2;;;1650:6;1642;1635:22;1596:2;1694:9;1681:23;1713:31;1738:5;1713:31;:::i;:::-;1763:5;-1:-1:-1;1820:2:1;1805:18;;1792:32;1833:33;1792:32;1833:33;:::i;:::-;1885:7;-1:-1:-1;1939:2:1;1924:18;;1911:32;;-1:-1:-1;1990:2:1;1975:18;;1962:32;;-1:-1:-1;2046:3:1;2031:19;;2018:33;2095:4;2082:18;;2070:31;;2060:2;;2120:6;2112;2105:22;2060:2;1586:679;;;;-1:-1:-1;1586:679:1;;;;2148:7;2202:3;2187:19;;2174:33;;-1:-1:-1;2254:3:1;2239:19;;;2226:33;;1586:679;-1:-1:-1;;1586:679:1:o;2270:325::-;;;2399:2;2387:9;2378:7;2374:23;2370:32;2367:2;;;2420:6;2412;2405:22;2367:2;2464:9;2451:23;2483:31;2508:5;2483:31;:::i;:::-;2533:5;2585:2;2570:18;;;;2557:32;;-1:-1:-1;;;2357:238:1:o;2600:844::-;;;;;2765:2;2753:9;2744:7;2740:23;2736:32;2733:2;;;2786:6;2778;2771:22;2733:2;2830:9;2817:23;2849:31;2874:5;2849:31;:::i;:::-;2899:5;-1:-1:-1;2951:2:1;2936:18;;2923:32;;-1:-1:-1;3006:2:1;2991:18;;2978:32;3029:18;3059:14;;;3056:2;;;3091:6;3083;3076:22;3056:2;3134:6;3123:9;3119:22;3109:32;;3179:7;3172:4;3168:2;3164:13;3160:27;3150:2;;3206:6;3198;3191:22;3150:2;3251;3238:16;3277:2;3269:6;3266:14;3263:2;;;3298:6;3290;3283:22;3263:2;3348:7;3343:2;3334:6;3330:2;3326:15;3322:24;3319:37;3316:2;;;3374:6;3366;3359:22;3316:2;2723:721;;;;-1:-1:-1;;3410:2:1;3402:11;;-1:-1:-1;;;2723:721:1:o;3449:251::-;;3558:2;3546:9;3537:7;3533:23;3529:32;3526:2;;;3579:6;3571;3564:22;3526:2;3623:9;3610:23;3642:28;3664:5;3642:28;:::i;3705:255::-;;3825:2;3813:9;3804:7;3800:23;3796:32;3793:2;;;3846:6;3838;3831:22;3793:2;3883:9;3877:16;3902:28;3924:5;3902:28;:::i;3965:393::-;;;;4111:2;4099:9;4090:7;4086:23;4082:32;4079:2;;;4132:6;4124;4117:22;4079:2;4173:9;4160:23;4150:33;;4233:2;4222:9;4218:18;4205:32;4246:31;4271:5;4246:31;:::i;4363:319::-;;;4489:2;4477:9;4468:7;4464:23;4460:32;4457:2;;;4510:6;4502;4495:22;4457:2;4551:9;4538:23;4528:33;;4611:2;4600:9;4596:18;4583:32;4624:28;4646:5;4624:28;:::i;4687:190::-;;4799:2;4787:9;4778:7;4774:23;4770:32;4767:2;;;4820:6;4812;4805:22;4767:2;-1:-1:-1;4848:23:1;;4757:120;-1:-1:-1;4757:120:1:o;4882:325::-;;;5011:2;4999:9;4990:7;4986:23;4982:32;4979:2;;;5032:6;5024;5017:22;4979:2;5073:9;5060:23;5050:33;;5133:2;5122:9;5118:18;5105:32;5146:31;5171:5;5146:31;:::i;5536:316::-;;;;5693:2;5681:9;5672:7;5668:23;5664:32;5661:2;;;5714:6;5706;5699:22;5661:2;5748:9;5742:16;5732:26;;5798:2;5787:9;5783:18;5777:25;5767:35;;5842:2;5831:9;5827:18;5821:25;5811:35;;5651:201;;;;;:::o;5857:463::-;;5948:5;5942:12;5975:6;5970:3;5963:19;6001:4;6030:2;6025:3;6021:12;6014:19;;6067:2;6060:5;6056:14;6088:3;6100:195;6114:6;6111:1;6108:13;6100:195;;;6179:13;;-1:-1:-1;;;;;6175:39:1;6163:52;;6235:12;;;;6270:15;;;;6211:1;6129:9;6100:195;;;-1:-1:-1;6311:3:1;;5918:402;-1:-1:-1;;;;;5918:402:1:o;6559:470::-;;6776:6;6770:13;6792:53;6838:6;6833:3;6826:4;6818:6;6814:17;6792:53;:::i;:::-;6908:13;;6867:16;;;;6930:57;6908:13;6867:16;6964:4;6952:17;;6930:57;:::i;:::-;7003:20;;6746:283;-1:-1:-1;;;;6746:283:1:o;8520:562::-;-1:-1:-1;;;;;8733:32:1;;8715:51;;8797:2;8782:18;;8775:34;;;8845:2;8840;8825:18;;8818:30;;;8864:18;;8857:34;;;8520:562;8884:6;8934;8928:3;8913:19;;8900:49;8969:22;;;8993:3;8965:32;;;8958:46;;;;9065:2;9044:15;;;-1:-1:-1;;9040:29:1;9025:45;9021:55;;8705:377;-1:-1:-1;;;8705:377:1:o;9699:261::-;;9878:2;9867:9;9860:21;9898:56;9950:2;9939:9;9935:18;9927:6;9898:56;:::i;11259:1276::-;;11433:6;11422:9;11415:25;11459:2;11497;11492;11481:9;11477:18;11470:30;11520:4;11556:6;11550:13;11586:4;11624:1;11613:9;11609:17;11599:27;;11645:1;11696:2;11685:9;11681:18;11718;11708:2;;11762:4;11754:6;11750:17;11740:27;;11708:2;11815;11807:6;11804:14;11784:18;11781:38;11778:2;;;-1:-1:-1;;;11842:34:1;;11899:4;11896:1;11889:15;11930:4;11849;11917:18;11778:2;12027;12012:18;;7945:19;;;7980:12;;;12055:18;12082:100;;;;12196:1;12191:318;;;;12048:461;;12082:100;-1:-1:-1;;12115:24:1;;12103:37;;12160:12;;;;-1:-1:-1;12082:100:1;;12191:318;28055:127;28121:17;;;28171:4;28155:21;;12286:4;12303:165;12317:6;12314:1;12311:13;12303:165;;;12395:14;;12382:11;;;12375:35;12438:16;;;;12332:10;;12303:165;;;12488:11;;;-1:-1:-1;;12048:461:1;-1:-1:-1;12526:3:1;;11405:1130;-1:-1:-1;;;;;;;;;;11405:1130:1:o;13178:383::-;;13327:2;13316:9;13309:21;13359:6;13353:13;13402:6;13397:2;13386:9;13382:18;13375:34;13418:66;13477:6;13472:2;13461:9;13457:18;13452:2;13444:6;13440:15;13418:66;:::i;:::-;13545:2;13524:15;-1:-1:-1;;13520:29:1;13505:45;;;;13552:2;13501:54;;13299:262;-1:-1:-1;;13299:262:1:o;18889:350::-;19091:2;19073:21;;;19130:2;19110:18;;;19103:30;19169:28;19164:2;19149:18;;19142:56;19230:2;19215:18;;19063:176::o;19604:349::-;19806:2;19788:21;;;19845:2;19825:18;;;19818:30;19884:27;19879:2;19864:18;;19857:55;19944:2;19929:18;;19778:175::o;24555:345::-;24757:2;24739:21;;;24796:2;24776:18;;;24769:30;-1:-1:-1;;;24830:2:1;24815:18;;24808:51;24891:2;24876:18;;24729:171::o;24905:346::-;25107:2;25089:21;;;25146:2;25126:18;;;25119:30;-1:-1:-1;;;25180:2:1;25165:18;;25158:52;25242:2;25227:18;;25079:172::o;26955:582::-;;27254:6;27243:9;27236:25;27297:6;27292:2;27281:9;27277:18;27270:34;27340:3;27335:2;27324:9;27320:18;27313:31;27361:57;27413:3;27402:9;27398:19;27390:6;27361:57;:::i;:::-;-1:-1:-1;;;;;27454:32:1;;;;27449:2;27434:18;;27427:60;-1:-1:-1;27518:3:1;27503:19;27496:35;27353:65;27226:311;-1:-1:-1;;;27226:311:1:o;28353:128::-;;28424:1;28420:6;28417:1;28414:13;28411:2;;;28430:18;;:::i;:::-;-1:-1:-1;28466:9:1;;28401:80::o;28486:217::-;;28552:1;28542:2;;-1:-1:-1;;;28577:31:1;;28631:4;28628:1;28621:15;28659:4;28584:1;28649:15;28542:2;-1:-1:-1;28688:9:1;;28532:171::o;28708:168::-;;28814:1;28810;28806:6;28802:14;28799:1;28796:21;28791:1;28784:9;28777:17;28773:45;28770:2;;;28821:18;;:::i;:::-;-1:-1:-1;28861:9:1;;28760:116::o;28881:125::-;;28949:1;28946;28943:8;28940:2;;;28954:18;;:::i;:::-;-1:-1:-1;28991:9:1;;28930:76::o;29011:258::-;29083:1;29093:113;29107:6;29104:1;29101:13;29093:113;;;29183:11;;;29177:18;29164:11;;;29157:39;29129:2;29122:10;29093:113;;;29224:6;29221:1;29218:13;29215:2;;;-1:-1:-1;;29259:1:1;29241:16;;29234:27;29064:205::o;29274:380::-;29359:1;29349:12;;29406:1;29396:12;;;29417:2;;29471:4;29463:6;29459:17;29449:27;;29417:2;29524;29516:6;29513:14;29493:18;29490:38;29487:2;;;29570:10;29565:3;29561:20;29558:1;29551:31;29605:4;29602:1;29595:15;29633:4;29630:1;29623:15;29487:2;;29329:325;;;:::o;29659:135::-;;-1:-1:-1;;29719:17:1;;29716:2;;;29739:18;;:::i;:::-;-1:-1:-1;29786:1:1;29775:13;;29706:88::o;29799:127::-;29860:10;29855:3;29851:20;29848:1;29841:31;29891:4;29888:1;29881:15;29915:4;29912:1;29905:15;29931:131;-1:-1:-1;;;;;30006:31:1;;29996:42;;29986:2;;30052:1;30049;30042:12;30067:118;30153:5;30146:13;30139:21;30132:5;30129:32;30119:2;;30175:1;30172;30165:12

Swarm Source

ipfs://80522b66438987362ffd57112e7fd707f60deedc7f0fe295e6a77fbd6f5dbc59

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.