ETH Price: $3,341.03 (-1.08%)

Token

reKeep3r (REKP3R)
 

Overview

Max Total Supply

99,997.999999999999999947 REKP3R

Holders

126

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
artificial-intelligenceof.eth
Balance
5 REKP3R

Value
$0.00
0xe7d67aa6174b755b5f5d41440f7917ee6a09e4aa
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Keep3rV1

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-11-05
*/

/**
 *Submitted for verification at Etherscan.io on 2020-10-28
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.12;

// Subject to the MIT license.

/**
 * Rekeep3r.network 
 * A standard implementation of kp3rv1 protocol
 * Mint function capped 
 * Kept most of the original functionality
 */
library SafeMath {
   
    function add(uint a, uint b) internal pure returns (uint) {
        uint c = a + b;
        require(c >= a, "add: +");

        return c;
    }

    
    function add(uint a, uint b, string memory errorMessage) internal pure returns (uint) {
        uint c = a + b;
        require(c >= a, errorMessage);

        return c;
    }

    
    function sub(uint a, uint b) internal pure returns (uint) {
        return sub(a, b, "sub: -");
    }

    
    function sub(uint a, uint b, string memory errorMessage) internal pure returns (uint) {
        require(b <= a, errorMessage);
        uint c = a - b;

        return c;
    }

    
    function mul(uint a, uint b) internal pure returns (uint) {
        // 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;
        }

        uint c = a * b;
        require(c / a == b, "mul: *");

        return c;
    }

    
    function mul(uint a, uint b, string memory errorMessage) internal pure returns (uint) {
       
        if (a == 0) {
            return 0;
        }

        uint c = a * b;
        require(c / a == b, errorMessage);

        return c;
    }

    
    function div(uint a, uint b) internal pure returns (uint) {
        return div(a, b, "div: /");
    }

    
    function div(uint a, uint b, string memory errorMessage) internal pure returns (uint) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

   
    function mod(uint a, uint b) internal pure returns (uint) {
        return mod(a, b, "mod: %");
    }

    
    function mod(uint a, uint b, string memory errorMessage) internal pure returns (uint) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () internal {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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

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

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

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

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

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

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

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

/**
 * @dev 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 Converts an `address` into `address payable`. Note that this is
     * simply a type cast: the actual underlying value is not changed.
     *
     * _Available since v2.4.0._
     */
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }

    /**
     * @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].
     *
     * _Available since v2.4.0._
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient");

        // solhint-disable-next-line avoid-call-value
        (bool success, ) = recipient.call{value:amount}("");
        require(success, "Address: reverted");
    }
}

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

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

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

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        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 safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: < 0");
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length
        require(address(token).isContract(), "SafeERC20: !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: !succeed");
        }
    }
}

library Keep3rV1Library {
    function getReserve(address pair, address reserve) external view returns (uint) {
        (uint _r0, uint _r1,) = IUniswapV2Pair(pair).getReserves();
        if (IUniswapV2Pair(pair).token0() == reserve) {
            return _r0;
        } else if (IUniswapV2Pair(pair).token1() == reserve) {
            return _r1;
        } else {
            return 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;
}

interface IGovernance {
    function proposeJob(address job) external;
}

interface IKeep3rV1Helper {
    function getQuoteLimit(uint gasUsed) external view returns (uint);
}

contract Keep3rV1 is ReentrancyGuard {
    using SafeMath for uint;
    using SafeERC20 for IERC20;

    /// @notice Keep3r Helper to set max prices for the ecosystem
    IKeep3rV1Helper public KPRH;

    /// @notice EIP-20 token name for this token
    string public constant name = "reKeep3r";

    /// @notice EIP-20 token symbol for this token
    string public constant symbol = "REKP3R";

    /// @notice EIP-20 token decimals for this token
    uint8 public constant decimals = 18;
    
    // introducing max cap for owner 
    uint256 public maxCap;

    /// @notice Total number of tokens in circulation
    uint public totalSupply = 0; // Initial 0

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

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

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

    mapping (address => mapping (address => uint)) internal allowances;
    mapping (address => uint) internal balances;

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

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

    /// @notice The EIP-712 typehash for the permit struct used by the contract
    bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint value,uint nonce,uint deadline)");


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

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

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

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

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

    /**
     * @notice Delegates votes from signatory to `delegatee`
     * @param delegatee The address to delegate votes to
     * @param nonce The contract state required to match the signature
     * @param expiry The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function delegateBySig(address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s) public {
        bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry));
        bytes32 digest = keccak256(abi.encodePacked("\x19\x01", DOMAINSEPARATOR, structHash));
        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "delegateBySig: sig");
        require(nonce == nonces[signatory]++, "delegateBySig: nonce");
        require(now <= expiry, "delegateBySig: expired");
        _delegate(signatory, delegatee);
    }

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

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

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

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

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

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

    function _delegate(address delegator, address delegatee) internal {
        address currentDelegate = delegates[delegator];
        uint delegatorBalance = votes[delegator].add(bonds[delegator][address(this)]);
        delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _moveDelegates(address srcRep, address dstRep, uint amount) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
                uint srcRepNew = srcRepOld.sub(amount, "_moveVotes: underflows");
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

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

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

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

      emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

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

    /// @notice The standard EIP-20 transfer event
    event Transfer(address indexed from, address indexed to, uint amount);

    /// @notice The standard EIP-20 approval event
    event Approval(address indexed owner, address indexed spender, uint amount);

    /// @notice Submit a job
    event SubmitJob(address indexed job, address indexed liquidity, address indexed provider, uint block, uint credit);

    /// @notice Apply credit to a job
    event ApplyCredit(address indexed job, address indexed liquidity, address indexed provider, uint block, uint credit);

    /// @notice Remove credit for a job
    event RemoveJob(address indexed job, address indexed liquidity, address indexed provider, uint block, uint credit);

    /// @notice Unbond credit for a job
    event UnbondJob(address indexed job, address indexed liquidity, address indexed provider, uint block, uint credit);

    /// @notice Added a Job
    event JobAdded(address indexed job, uint block, address governance);

    /// @notice Removed a job
    event JobRemoved(address indexed job, uint block, address governance);

    /// @notice Worked a job
    event KeeperWorked(address indexed credit, address indexed job, address indexed keeper, uint block, uint amount);

    /// @notice Keeper bonding
    event KeeperBonding(address indexed keeper, uint block, uint active, uint bond);

    /// @notice Keeper bonded
    event KeeperBonded(address indexed keeper, uint block, uint activated, uint bond);

    /// @notice Keeper unbonding
    event KeeperUnbonding(address indexed keeper, uint block, uint deactive, uint bond);

    /// @notice Keeper unbound
    event KeeperUnbound(address indexed keeper, uint block, uint deactivated, uint bond);

    /// @notice Keeper slashed
    event KeeperSlashed(address indexed keeper, address indexed slasher, uint block, uint slash);

    /// @notice Keeper disputed
    event KeeperDispute(address indexed keeper, uint block);

    /// @notice Keeper resolved
    event KeeperResolved(address indexed keeper, uint block);

    event AddCredit(address indexed credit, address indexed job, address indexed creditor, uint block, uint amount);

    /// @notice 1 day to bond to become a keeper
    uint constant public BOND = 3 days;
    /// @notice 14 days to unbond to remove funds from being a keeper
    uint constant public UNBOND = 14 days;
    /// @notice 3 days till liquidity can be bound
    uint constant public LIQUIDITYBOND = 3 days;

    /// @notice direct liquidity fee 0.3%
    uint constant public FEE = 30;
    uint constant public BASE = 10000;

    /// @notice address used for ETH transfers
    address constant public ETH = address(0xE);

    /// @notice tracks all current bondings (time)
    mapping(address => mapping(address => uint)) public bondings;
    /// @notice tracks all current unbondings (time)
    mapping(address => mapping(address => uint)) public unbondings;
    /// @notice allows for partial unbonding
    mapping(address => mapping(address => uint)) public partialUnbonding;
    /// @notice tracks all current pending bonds (amount)
    mapping(address => mapping(address => uint)) public pendingbonds;
    /// @notice tracks how much a keeper has bonded
    mapping(address => mapping(address => uint)) public bonds;
    /// @notice tracks underlying votes (that don't have bond)
    mapping(address => uint) public votes;

    /// @notice total bonded (totalSupply for bonds)
    uint public totalBonded = 0;
    /// @notice tracks when a keeper was first registered
    mapping(address => uint) public firstSeen;

    /// @notice tracks if a keeper has a pending dispute
    mapping(address => bool) public disputes;

    /// @notice tracks last job performed for a keeper
    mapping(address => uint) public lastJob;
    /// @notice tracks the total job executions for a keeper
    mapping(address => uint) public workCompleted;
    /// @notice list of all jobs registered for the keeper system
    mapping(address => bool) public jobs;
    /// @notice the current credit available for a job
    mapping(address => mapping(address => uint)) public credits;
    /// @notice the balances for the liquidity providers
    mapping(address => mapping(address => mapping(address => uint))) public liquidityProvided;
    /// @notice liquidity unbonding days
    mapping(address => mapping(address => mapping(address => uint))) public liquidityUnbonding;
    /// @notice liquidity unbonding amounts
    mapping(address => mapping(address => mapping(address => uint))) public liquidityAmountsUnbonding;
    /// @notice job proposal delay
    mapping(address => uint) public jobProposalDelay;
    /// @notice liquidity apply date
    mapping(address => mapping(address => mapping(address => uint))) public liquidityApplied;
    /// @notice liquidity amount to apply
    mapping(address => mapping(address => mapping(address => uint))) public liquidityAmount;

    /// @notice list of all current keepers
    mapping(address => bool) public keepers;
    /// @notice blacklist of keepers not allowed to participate
    mapping(address => bool) public blacklist;

    /// @notice traversable array of keepers to make external management easier
    address[] public keeperList;
    /// @notice traversable array of jobs to make external management easier
    address[] public jobList;

    /// @notice governance address for the governance contract
    address public governance;
    address public pendingGovernance;

    /// @notice the liquidity token supplied by users paying for jobs
    mapping(address => bool) public liquidityAccepted;

    address[] public liquidityPairs;

    uint internal _gasUsed;

    constructor(address _kph, uint256 _maxCap) public {
        // Set governance for this token
		// There will only be a limited supply of tokens ever
        governance = msg.sender;
        DOMAINSEPARATOR = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), _getChainId(), address(this)));
        KPRH = IKeep3rV1Helper(_kph);
        maxCap = _maxCap;
    }

    /**
     * @notice Add ETH credit to a job to be paid out for work
     * @param job the job being credited
     */
    function addCreditETH(address job) external payable {
        require(jobs[job], "addCreditETH: !job");
        uint _fee = msg.value.mul(FEE).div(BASE);
        credits[job][ETH] = credits[job][ETH].add(msg.value.sub(_fee));
        payable(governance).transfer(_fee);

        emit AddCredit(ETH, job, msg.sender, block.number, msg.value);
    }

    /**
     * @notice Add credit to a job to be paid out for work
     * @param credit the credit being assigned to the job
     * @param job the job being credited
     * @param amount the amount of credit being added to the job
     */
    function addCredit(address credit, address job, uint amount) external nonReentrant {
        require(jobs[job], "addCreditETH: !job");
        uint _before = IERC20(credit).balanceOf(address(this));
        IERC20(credit).safeTransferFrom(msg.sender, address(this), amount);
        uint _received = IERC20(credit).balanceOf(address(this)).sub(_before);
        uint _fee = _received.mul(FEE).div(BASE);
        credits[job][credit] = credits[job][credit].add(_received.sub(_fee));
        IERC20(credit).safeTransfer(governance, _fee);

        emit AddCredit(credit, job, msg.sender, block.number, _received);
    }

    /**
     * @notice Add non transferable votes for governance
     * @param voter to add the votes to
     * @param amount of votes to add
     */
    function addVotes(address voter, uint amount) external {
        require(msg.sender == governance, "addVotes: !gov");
        _activate(voter, address(this));
        votes[voter] = votes[voter].add(amount);
        totalBonded = totalBonded.add(amount);
        _moveDelegates(address(0), delegates[voter], amount);
    }

    /**
     * @notice Remove non transferable votes for governance
     * @param voter to subtract the votes
     * @param amount of votes to remove
     */
    function removeVotes(address voter, uint amount) external {
        require(msg.sender == governance, "addVotes: !gov");
        votes[voter] = votes[voter].sub(amount);
        totalBonded = totalBonded.sub(amount);
        _moveDelegates(delegates[voter], address(0), amount);
    }

    /**
     * @notice Add credit to a job to be paid out for work
     * @param job the job being credited
     * @param amount the amount of credit being added to the job
     */
    function addKPRCredit(address job, uint amount) external {
        require(msg.sender == governance, "addKPRCredit: !gov");
        require(jobs[job], "addKPRCredit: !job");
        credits[job][address(this)] = credits[job][address(this)].add(amount);
        _mint(address(this), amount);
        emit AddCredit(address(this), job, msg.sender, block.number, amount);
    }

    /**
     * @notice Approve a liquidity pair for being accepted in future
     * @param liquidity the liquidity no longer accepted
     */
    function approveLiquidity(address liquidity) external {
        require(msg.sender == governance, "approveLiquidity: !gov");
        require(!liquidityAccepted[liquidity], "approveLiquidity: !pair");
        liquidityAccepted[liquidity] = true;
        liquidityPairs.push(liquidity);
    }

    /**
     * @notice Revoke a liquidity pair from being accepted in future
     * @param liquidity the liquidity no longer accepted
     */
    function revokeLiquidity(address liquidity) external {
        require(msg.sender == governance, "revokeLiquidity: !gov");
        liquidityAccepted[liquidity] = false;
    }

    /**
     * @notice Displays all accepted liquidity pairs
     */
    function pairs() external view returns (address[] memory) {
        return liquidityPairs;
    }

    /**
     * @notice Allows liquidity providers to submit jobs
     * @param liquidity the liquidity being added
     * @param job the job to assign credit to
     * @param amount the amount of liquidity tokens to use
     */
    function addLiquidityToJob(address liquidity, address job, uint amount) external nonReentrant {
        require(liquidityAccepted[liquidity], "addLiquidityToJob: !pair");
        IERC20(liquidity).safeTransferFrom(msg.sender, address(this), amount);
        liquidityProvided[msg.sender][liquidity][job] = liquidityProvided[msg.sender][liquidity][job].add(amount);

        liquidityApplied[msg.sender][liquidity][job] = now.add(LIQUIDITYBOND);
        liquidityAmount[msg.sender][liquidity][job] = liquidityAmount[msg.sender][liquidity][job].add(amount);

        if (!jobs[job] && jobProposalDelay[job] < now) {
            IGovernance(governance).proposeJob(job);
            jobProposalDelay[job] = now.add(UNBOND);
        }
        emit SubmitJob(job, liquidity, msg.sender, block.number, amount);
    }

    /**
     * @notice Applies the credit provided in addLiquidityToJob to the job
     * @param provider the liquidity provider
     * @param liquidity the pair being added as liquidity
     * @param job the job that is receiving the credit
     */
    function applyCreditToJob(address provider, address liquidity, address job) external {
        require(liquidityAccepted[liquidity], "addLiquidityToJob: !pair");
        require(liquidityApplied[provider][liquidity][job] != 0, "credit: no bond");
        require(liquidityApplied[provider][liquidity][job] < now, "credit: bonding");
        uint _liquidity = Keep3rV1Library.getReserve(liquidity, address(this));
        uint _credit = _liquidity.mul(liquidityAmount[provider][liquidity][job]).div(IERC20(liquidity).totalSupply());
        _mint(address(this), _credit);
        credits[job][address(this)] = credits[job][address(this)].add(_credit);
        liquidityAmount[provider][liquidity][job] = 0;

        emit ApplyCredit(job, liquidity, provider, block.number, _credit);
    }

    /**
     * @notice Unbond liquidity for a job
     * @param liquidity the pair being unbound
     * @param job the job being unbound from
     * @param amount the amount of liquidity being removed
     */
    function unbondLiquidityFromJob(address liquidity, address job, uint amount) external {
        require(liquidityAmount[msg.sender][liquidity][job] == 0, "credit: pending credit");
        liquidityUnbonding[msg.sender][liquidity][job] = now.add(UNBOND);
        liquidityAmountsUnbonding[msg.sender][liquidity][job] = liquidityAmountsUnbonding[msg.sender][liquidity][job].add(amount);
        require(liquidityAmountsUnbonding[msg.sender][liquidity][job] <= liquidityProvided[msg.sender][liquidity][job], "unbondLiquidityFromJob: insufficient funds");

        uint _liquidity = Keep3rV1Library.getReserve(liquidity, address(this));
        uint _credit = _liquidity.mul(amount).div(IERC20(liquidity).totalSupply());
        if (_credit > credits[job][address(this)]) {
            _burn(address(this), credits[job][address(this)]);
            credits[job][address(this)] = 0;
        } else {
            _burn(address(this), _credit);
            credits[job][address(this)] = credits[job][address(this)].sub(_credit);
        }

        emit UnbondJob(job, liquidity, msg.sender, block.number, amount);
    }

    /**
     * @notice Allows liquidity providers to remove liquidity
     * @param liquidity the pair being unbound
     * @param job the job being unbound from
     */
    function removeLiquidityFromJob(address liquidity, address job) external {
        require(liquidityUnbonding[msg.sender][liquidity][job] != 0, "removeJob: unbond");
        require(liquidityUnbonding[msg.sender][liquidity][job] < now, "removeJob: unbonding");
        uint _amount = liquidityAmountsUnbonding[msg.sender][liquidity][job];
        liquidityProvided[msg.sender][liquidity][job] = liquidityProvided[msg.sender][liquidity][job].sub(_amount);
        liquidityAmountsUnbonding[msg.sender][liquidity][job] = 0;
        IERC20(liquidity).safeTransfer(msg.sender, _amount);

        emit RemoveJob(job, liquidity, msg.sender, block.number, _amount);
    }

    /**
     * @notice Allows governance to mint new tokens to treasury
     * @param amount the amount of tokens to mint to treasury
	 * fork from the original implementation limiting the max supply of tokens 
     */
    function mint(uint amount) external {
        require(msg.sender == governance, "mint: !gov");
        require(totalSupply.add(amount) <= maxCap);
        _mint(governance, amount);
    }

    /**
     * @notice burn owned tokens
     * @param amount the amount of tokens to burn
     */
    function burn(uint amount) external {
        _burn(msg.sender, amount);
    }

    function _mint(address dst, uint amount) internal {
        // mint the amount
        totalSupply = totalSupply.add(amount);
        // transfer the amount to the recipient
        balances[dst] = balances[dst].add(amount);
        emit Transfer(address(0), dst, amount);
    }

    function _burn(address dst, uint amount) internal {
        require(dst != address(0), "_burn: zero address");
        balances[dst] = balances[dst].sub(amount, "_burn: exceeds balance");
        totalSupply = totalSupply.sub(amount);
        emit Transfer(dst, address(0), amount);
    }

    /**
     * @notice Implemented by jobs to show that a keeper performed work
     * @param keeper address of the keeper that performed the work
     */
    function worked(address keeper) external {
        workReceipt(keeper, KPRH.getQuoteLimit(_gasUsed.sub(gasleft())));
    }

    /**
     * @notice Implemented by jobs to show that a keeper performed work
     * @param keeper address of the keeper that performed the work
     * @param amount the reward that should be allocated
     */
    function workReceipt(address keeper, uint amount) public {
        require(jobs[msg.sender], "wRec: !job");
        require(amount <= KPRH.getQuoteLimit(_gasUsed.sub(gasleft())), "wRec: max limit");
        credits[msg.sender][address(this)] = credits[msg.sender][address(this)].sub(amount, "wRec: insuffient funds");
        lastJob[keeper] = now;
        _reward(keeper, amount);
        workCompleted[keeper] = workCompleted[keeper].add(amount);
        emit KeeperWorked(address(this), msg.sender, keeper, block.number, amount);
    }

    /**
     * @notice Implemented by jobs to show that a keeper performed work
     * @param credit the asset being awarded to the keeper
     * @param keeper address of the keeper that performed the work
     * @param amount the reward that should be allocated
     */
    function receipt(address credit, address keeper, uint amount) external {
        require(jobs[msg.sender], "receipt: !job");
        credits[msg.sender][credit] = credits[msg.sender][credit].sub(amount, "wRec: insuffient funds");
        lastJob[keeper] = now;
        IERC20(credit).safeTransfer(keeper, amount);
        emit KeeperWorked(credit, msg.sender, keeper, block.number, amount);
    }

    /**
     * @notice Implemented by jobs to show that a keeper performed work
     * @param keeper address of the keeper that performed the work
     * @param amount the amount of ETH sent to the keeper
     */
    function receiptETH(address keeper, uint amount) external {
        require(jobs[msg.sender], "receipt: !job");
        credits[msg.sender][ETH] = credits[msg.sender][ETH].sub(amount, "wRec: insuffient funds");
        lastJob[keeper] = now;
        payable(keeper).transfer(amount);
        emit KeeperWorked(ETH, msg.sender, keeper, block.number, amount);
    }

    function _reward(address _from, uint _amount) internal {
        bonds[_from][address(this)] = bonds[_from][address(this)].add(_amount);
        totalBonded = totalBonded.add(_amount);
        _moveDelegates(address(0), delegates[_from], _amount);
        emit Transfer(msg.sender, _from, _amount);
    }

    function _bond(address bonding, address _from, uint _amount) internal {
        bonds[_from][bonding] = bonds[_from][bonding].add(_amount);
        if (bonding == address(this)) {
            totalBonded = totalBonded.add(_amount);
            _moveDelegates(address(0), delegates[_from], _amount);
        }
    }

    function _unbond(address bonding, address _from, uint _amount) internal {
        bonds[_from][bonding] = bonds[_from][bonding].sub(_amount);
        if (bonding == address(this)) {
            totalBonded = totalBonded.sub(_amount);
            _moveDelegates(delegates[_from], address(0), _amount);
        }

    }

    /**
     * @notice Allows governance to add new job systems
     * @param job address of the contract for which work should be performed
     */
    function addJob(address job) external {
        require(msg.sender == governance, "addJob: !gov");
        require(!jobs[job], "addJob: job known");
        jobs[job] = true;
        jobList.push(job);
        emit JobAdded(job, block.number, msg.sender);
    }

    /**
     * @notice Full listing of all jobs ever added
     * @return array blob
     */
    function getJobs() external view returns (address[] memory) {
        return jobList;
    }

    /**
     * @notice Allows governance to remove a job from the systems
     * @param job address of the contract for which work should be performed
     */
    function removeJob(address job) external {
        require(msg.sender == governance, "removeJob: !gov");
        jobs[job] = false;
        emit JobRemoved(job, block.number, msg.sender);
    }

    /**
     * @notice Allows governance to change the Keep3rHelper for max spend
     * @param _kprh new helper address to set
     */
    function setKeep3rHelper(IKeep3rV1Helper _kprh) external {
        require(msg.sender == governance, "setKeep3rHelper: !gov");
        KPRH = _kprh;
    }

    /**
     * @notice Allows governance to change governance (for future upgradability)
     * @param _governance new governance address to set
     */
    function setGovernance(address _governance) external {
        require(msg.sender == governance, "setGovernance: !gov");
        pendingGovernance = _governance;
    }

    /**
     * @notice Allows pendingGovernance to accept their role as governance (protection pattern)
     */
    function acceptGovernance() external {
        require(msg.sender == pendingGovernance, "acceptGovernance: !pendingGov");
        governance = pendingGovernance;
    }

    /**
     * @notice confirms if the current keeper is registered, can be used for general (non critical) functions
     * @param keeper the keeper being investigated
     * @return true/false if the address is a keeper
     */
    function isKeeper(address keeper) external returns (bool) {
        _gasUsed = gasleft();
        return keepers[keeper];
    }

    /**
     * @notice confirms if the current keeper is registered and has a minimum bond, should be used for protected functions
     * @param keeper the keeper being investigated
     * @param minBond the minimum requirement for the asset provided in bond
     * @param earned the total funds earned in the keepers lifetime
     * @param age the age of the keeper in the system
     * @return true/false if the address is a keeper and has more than the bond
     */
    function isMinKeeper(address keeper, uint minBond, uint earned, uint age) external returns (bool) {
        _gasUsed = gasleft();
        return keepers[keeper]
                && bonds[keeper][address(this)].add(votes[keeper]) >= minBond
                && workCompleted[keeper] >= earned
                && now.sub(firstSeen[keeper]) >= age;
    }

    /**
     * @notice confirms if the current keeper is registered and has a minimum bond, should be used for protected functions
     * @param keeper the keeper being investigated
     * @param bond the bound asset being evaluated
     * @param minBond the minimum requirement for the asset provided in bond
     * @param earned the total funds earned in the keepers lifetime
     * @param age the age of the keeper in the system
     * @return true/false if the address is a keeper and has more than the bond
     */
    function isBondedKeeper(address keeper, address bond, uint minBond, uint earned, uint age) external returns (bool) {
        _gasUsed = gasleft();
        return keepers[keeper]
                && bonds[keeper][bond] >= minBond
                && workCompleted[keeper] >= earned
                && now.sub(firstSeen[keeper]) >= age;
    }

    /**
     * @notice begin the bonding process for a new keeper
     * @param bonding the asset being bound
     * @param amount the amount of bonding asset being bound
     */
    function bond(address bonding, uint amount) external nonReentrant {
        require(!blacklist[msg.sender], "bond: blacklisted");
        bondings[msg.sender][bonding] = now.add(BOND);
        if (bonding == address(this)) {
            _transferTokens(msg.sender, address(this), amount);
        } else {
            uint _before = IERC20(bonding).balanceOf(address(this));
            IERC20(bonding).safeTransferFrom(msg.sender, address(this), amount);
            amount = IERC20(bonding).balanceOf(address(this)).sub(_before);
        }
        pendingbonds[msg.sender][bonding] = pendingbonds[msg.sender][bonding].add(amount);
        emit KeeperBonding(msg.sender, block.number, bondings[msg.sender][bonding], amount);
    }

    /**
     * @notice get full list of keepers in the system
     */
    function getKeepers() external view returns (address[] memory) {
        return keeperList;
    }

    /**
     * @notice allows a keeper to activate/register themselves after bonding
     * @param bonding the asset being activated as bond collateral
     */
    function activate(address bonding) external {
        require(!blacklist[msg.sender], "activate: blacklisted");
        require(bondings[msg.sender][bonding] != 0 && bondings[msg.sender][bonding] < now, "activate: bonding");
        _activate(msg.sender, bonding);
    }
    
    function _activate(address keeper, address bonding) internal {
        if (firstSeen[keeper] == 0) {
          firstSeen[keeper] = now;
          keeperList.push(keeper);
          lastJob[keeper] = now;
        }
        keepers[keeper] = true;
        _bond(bonding, keeper, pendingbonds[keeper][bonding]);
        pendingbonds[keeper][bonding] = 0;
        emit KeeperBonded(keeper, block.number, block.timestamp, bonds[keeper][bonding]);
    }

    /**
     * @notice begin the unbonding process to stop being a keeper
     * @param bonding the asset being unbound
     * @param amount allows for partial unbonding
     */
    function unbond(address bonding, uint amount) external {
        unbondings[msg.sender][bonding] = now.add(UNBOND);
        _unbond(bonding, msg.sender, amount);
        partialUnbonding[msg.sender][bonding] = partialUnbonding[msg.sender][bonding].add(amount);
        emit KeeperUnbonding(msg.sender, block.number, unbondings[msg.sender][bonding], amount);
    }

    /**
     * @notice withdraw funds after unbonding has finished
     * @param bonding the asset to withdraw from the bonding pool
     */
    function withdraw(address bonding) external nonReentrant {
        require(unbondings[msg.sender][bonding] != 0 && unbondings[msg.sender][bonding] < now, "withdraw: unbonding");
        require(!disputes[msg.sender], "withdraw: disputes");

        if (bonding == address(this)) {
            _transferTokens(address(this), msg.sender, partialUnbonding[msg.sender][bonding]);
        } else {
            IERC20(bonding).safeTransfer(msg.sender, partialUnbonding[msg.sender][bonding]);
        }
        emit KeeperUnbound(msg.sender, block.number, block.timestamp, partialUnbonding[msg.sender][bonding]);
        partialUnbonding[msg.sender][bonding] = 0;
    }

    /**
     * @notice allows governance to create a dispute for a given keeper
     * @param keeper the address in dispute
     */
    function dispute(address keeper) external {
        require(msg.sender == governance, "dispute: !gov");
        disputes[keeper] = true;
        emit KeeperDispute(keeper, block.number);
    }

    /**
     * @notice allows governance to slash a keeper based on a dispute
     * @param bonded the asset being slashed
     * @param keeper the address being slashed
     * @param amount the amount being slashed
     */
    function slash(address bonded, address keeper, uint amount) public nonReentrant {
        require(msg.sender == governance, "slash: !gov");
        if (bonded == address(this)) {
            _transferTokens(address(this), governance, amount);
        } else {
            IERC20(bonded).safeTransfer(governance, amount);
        }
        _unbond(bonded, keeper, amount);
        disputes[keeper] = false;
        emit KeeperSlashed(keeper, msg.sender, block.number, amount);
    }

    /**
     * @notice blacklists a keeper from participating in the network
     * @param keeper the address being slashed
     */
    function revoke(address keeper) external {
        require(msg.sender == governance, "slash: !gov");
        keepers[keeper] = false;
        blacklist[keeper] = true;
        slash(address(this), keeper, bonds[keeper][address(this)]);
    }

    /**
     * @notice allows governance to resolve a dispute on a keeper
     * @param keeper the address cleared
     */
    function resolve(address keeper) external {
        require(msg.sender == governance, "resolve: !gov");
        disputes[keeper] = false;
        emit KeeperResolved(keeper, block.number);
    }

    /**
     * @notice Get the number of tokens `spender` is approved to spend on behalf of `account`
     * @param account The address of the account holding the funds
     * @param spender The address of the account spending the funds
     * @return The number of tokens approved
     */
    function allowance(address account, address spender) external view returns (uint) {
        return allowances[account][spender];
    }

    /**
     * @notice Approve `spender` to transfer up to `amount` from `src`
     * @dev This will overwrite the approval amount for `spender`
     *  and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
     * @param spender The address of the account which may transfer tokens
     * @param amount The number of tokens that are approved (2^256-1 means infinite)
     * @return Whether or not the approval succeeded
     */
    function approve(address spender, uint amount) public returns (bool) {
        allowances[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);
        return true;
    }

    /**
     * @notice Triggers an approval from owner to spends
     * @param owner The address to approve from
     * @param spender The address to be approved
     * @param amount The number of tokens that are approved (2^256-1 means infinite)
     * @param deadline The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function permit(address owner, address spender, uint amount, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
        bytes32 structHash = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, nonces[owner]++, deadline));
        bytes32 digest = keccak256(abi.encodePacked("\x19\x01", DOMAINSEPARATOR, structHash));
        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "permit: signature");
        require(signatory == owner, "permit: unauthorized");
        require(now <= deadline, "permit: expired");

        allowances[owner][spender] = amount;

        emit Approval(owner, spender, amount);
    }

    /**
     * @notice Get the number of tokens held by the `account`
     * @param account The address of the account to get the balance of
     * @return The number of tokens held
     */
    function balanceOf(address account) external view returns (uint) {
        return balances[account];
    }

    /**
     * @notice Transfer `amount` tokens from `msg.sender` to `dst`
     * @param dst The address of the destination account
     * @param amount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transfer(address dst, uint amount) public returns (bool) {
        _transferTokens(msg.sender, dst, amount);
        return true;
    }

    /**
     * @notice Transfer `amount` tokens from `src` to `dst`
     * @param src The address of the source account
     * @param dst The address of the destination account
     * @param amount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transferFrom(address src, address dst, uint amount) external returns (bool) {
        address spender = msg.sender;
        uint spenderAllowance = allowances[src][spender];

        if (spender != src && spenderAllowance != uint(-1)) {
            uint newAllowance = spenderAllowance.sub(amount, "transferFrom: exceeds spender allowance");
            allowances[src][spender] = newAllowance;

            emit Approval(src, spender, newAllowance);
        }

        _transferTokens(src, dst, amount);
        return true;
    }

    function _transferTokens(address src, address dst, uint amount) internal {
        require(src != address(0), "_transferTokens: zero address");
        require(dst != address(0), "_transferTokens: zero address");

        balances[src] = balances[src].sub(amount, "_transferTokens: exceeds balance");
        balances[dst] = balances[dst].add(amount, "_transferTokens: overflows");
        emit Transfer(src, dst, amount);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_kph","type":"address"},{"internalType":"uint256","name":"_maxCap","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"credit","type":"address"},{"indexed":true,"internalType":"address","name":"job","type":"address"},{"indexed":true,"internalType":"address","name":"creditor","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AddCredit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"job","type":"address"},{"indexed":true,"internalType":"address","name":"liquidity","type":"address"},{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"credit","type":"uint256"}],"name":"ApplyCredit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"job","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"address","name":"governance","type":"address"}],"name":"JobAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"job","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"address","name":"governance","type":"address"}],"name":"JobRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"keeper","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"activated","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bond","type":"uint256"}],"name":"KeeperBonded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"keeper","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"active","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bond","type":"uint256"}],"name":"KeeperBonding","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"keeper","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"}],"name":"KeeperDispute","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"keeper","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"}],"name":"KeeperResolved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"keeper","type":"address"},{"indexed":true,"internalType":"address","name":"slasher","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"slash","type":"uint256"}],"name":"KeeperSlashed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"keeper","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"deactive","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bond","type":"uint256"}],"name":"KeeperUnbonding","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"keeper","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"deactivated","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bond","type":"uint256"}],"name":"KeeperUnbound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"credit","type":"address"},{"indexed":true,"internalType":"address","name":"job","type":"address"},{"indexed":true,"internalType":"address","name":"keeper","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"KeeperWorked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"job","type":"address"},{"indexed":true,"internalType":"address","name":"liquidity","type":"address"},{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"credit","type":"uint256"}],"name":"RemoveJob","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"job","type":"address"},{"indexed":true,"internalType":"address","name":"liquidity","type":"address"},{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"credit","type":"uint256"}],"name":"SubmitJob","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":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"job","type":"address"},{"indexed":true,"internalType":"address","name":"liquidity","type":"address"},{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"credit","type":"uint256"}],"name":"UnbondJob","type":"event"},{"inputs":[],"name":"BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BOND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAINSEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KPRH","outputs":[{"internalType":"contract IKeep3rV1Helper","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIQUIDITYBOND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNBOND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"bonding","type":"address"}],"name":"activate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"credit","type":"address"},{"internalType":"address","name":"job","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"job","type":"address"}],"name":"addCreditETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"job","type":"address"}],"name":"addJob","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"job","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addKPRCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidity","type":"address"},{"internalType":"address","name":"job","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addLiquidityToJob","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"voter","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addVotes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"address","name":"liquidity","type":"address"},{"internalType":"address","name":"job","type":"address"}],"name":"applyCreditToJob","outputs":[],"stateMutability":"nonpayable","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":"liquidity","type":"address"}],"name":"approveLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"bonding","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"bond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"bondings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"bonds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"credits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"keeper","type":"address"}],"name":"dispute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"disputes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"firstSeen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getJobs","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getKeepers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"keeper","type":"address"},{"internalType":"address","name":"bond","type":"address"},{"internalType":"uint256","name":"minBond","type":"uint256"},{"internalType":"uint256","name":"earned","type":"uint256"},{"internalType":"uint256","name":"age","type":"uint256"}],"name":"isBondedKeeper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"keeper","type":"address"}],"name":"isKeeper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"keeper","type":"address"},{"internalType":"uint256","name":"minBond","type":"uint256"},{"internalType":"uint256","name":"earned","type":"uint256"},{"internalType":"uint256","name":"age","type":"uint256"}],"name":"isMinKeeper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"jobList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"jobProposalDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"jobs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"keeperList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"keepers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastJob","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"liquidityAccepted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"liquidityAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"liquidityAmountsUnbonding","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"liquidityApplied","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"liquidityPairs","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"liquidityProvided","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"liquidityUnbonding","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairs","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"partialUnbonding","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingGovernance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"pendingbonds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","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":"address","name":"credit","type":"address"},{"internalType":"address","name":"keeper","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"receipt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"keeper","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"receiptETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"job","type":"address"}],"name":"removeJob","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidity","type":"address"},{"internalType":"address","name":"job","type":"address"}],"name":"removeLiquidityFromJob","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"voter","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"removeVotes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"keeper","type":"address"}],"name":"resolve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"keeper","type":"address"}],"name":"revoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidity","type":"address"}],"name":"revokeLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IKeep3rV1Helper","name":"_kprh","type":"address"}],"name":"setKeep3rHelper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"bonded","type":"address"},{"internalType":"address","name":"keeper","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"slash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBonded","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":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"bonding","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unbond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidity","type":"address"},{"internalType":"address","name":"job","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unbondLiquidityFromJob","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"unbondings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"votes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"bonding","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"workCompleted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"keeper","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"workReceipt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"keeper","type":"address"}],"name":"worked","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a0604052600060035560006010553480156200001b57600080fd5b506040516200615138038062006151833981810160405260408110156200004157600080fd5b5080516020918201516001600055602180546001600160a01b031916331790556040805180820190915260088152673932a5b2b2b819b960c11b930192909252907f797cfab58fcb15f590eb8e4252d5c228ff88f94f907e119e80c4393a946e8f357f0aff78047cc386b4e751e4b0bf7b6c9205e5b4b2ed16be1af2ab087c4f2ec680620000ce62000138565b604080516020808201959095528082019390935260608301919091523060808084019190915281518084038201815260a0909301909152815191909201209052600180546001600160a01b0319166001600160a01b0393909316929092179091556002556200013c565b4690565b608051615ff06200016160003980611c4b5280614271528061470a5250615ff06000f3fe6080604052600436106105025760003560e01c80637724ff6811610297578063c5198abc11610165578063e74f8239116100cc578063f39c38a011610085578063f39c38a01461168f578063f75f9f7b146116a4578063f9d46cf2146116d7578063f9f92be414611726578063fede700814611759578063ffb0a4a01461179e57610502565b8063e74f823914611566578063e7a324dc146115a9578063eb421f3b146115be578063ec342ad0146115f1578063ec4515dd14611606578063f1127ed81461163057610502565b8063d8bff5a51161011e578063d8bff5a51461140c578063dd62ed3e1461143f578063de63298d1461147a578063deac3541146114b3578063def70844146114ee578063e326ac431461153357610502565b8063c5198abc146112c1578063c57981b5146112f4578063ce6a088014611309578063d454019d14611342578063d505accf14611375578063d8ae6faf146113d357610502565b8063a39744b511610209578063b105e39f116101c2578063b105e39f146111ad578063b4b5ea57146111c2578063b600702a146111f5578063bb49096d14611228578063c1c1d2181461078f578063c3cda5201461126d57610502565b8063a39744b514611061578063a515366a1461109c578063a5d059ca146110d5578063a9059cbb1461110e578063ab033ea914611147578063b0103b1a1461117a57610502565b806383baa6931161025b57806383baa69314610f1c57806388b4ac8314610f615780638d9acd2e14610fa457806395d89b4114610fe75780639af7728414610ffc578063a0712d681461103757610502565b80637724ff6814610e35578063782d6fe114610e685780637ecebe0014610ea15780638071198914610ed45780638322fff214610f0757610502565b806342966c68116103d4578063603b4d14116103465780636ba42aaa116102ff5780636ba42aaa14610cf75780636dab5dcf14610d2a5780636fcfff4514610d5057806370a0823114610d9c57806372da828a14610dcf57806374a8f10314610e0257610502565b8063603b4d1414610b99578063603c686014610bae578063637cd7f014610be957806364bb43ee14610c2457806367da318414610c5757806368581ebd14610c9257610502565b806352a4de291161039857806352a4de2914610a7557806355ea6c4714610ab8578063587cde1e14610aeb5780635aa6e67514610b1e5780635c19a95c14610b335780635feeb79414610b6657610502565b806342966c68146109855780634395d8ba146109af57806344d96e95146109f45780634b3fde2114610a0957806351cff8d914610a4257610502565b80631df0de131161047857806323b872dd1161043157806323b872dd1461086157806330adf81f146108a4578063313ce567146108b957806337feca84146108e45780633bbd64bc1461091f5780633d1f0bb91461095257610502565b80631df0de131461078f5780631ff5f3da146107a457806320606b70146107e95780632119a62a146107fe57806323548b8b14610837578063238efcbc1461084c57610502565b80631778e29c116104ca5780631778e29c1461067e57806318160ddd146106a55780631992d206146106ba5780631b44555e146106ff5780631b7a1fb2146107325780631c5a9d9c1461075c57610502565b806306fdde0314610507578063095ea7b31461059157806309aff02b146105de5780630c33c5221461060f5780631101eb4114610639575b600080fd5b34801561051357600080fd5b5061051c6117b3565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561055657818101518382015260200161053e565b50505050905090810190601f1680156105835780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561059d57600080fd5b506105ca600480360360408110156105b457600080fd5b506001600160a01b0381351690602001356117d7565b604080519115158252519081900360200190f35b3480156105ea57600080fd5b506105f361183e565b604080516001600160a01b039092168252519081900360200190f35b34801561061b57600080fd5b506105f36004803603602081101561063257600080fd5b503561184d565b34801561064557600080fd5b5061067c6004803603606081101561065c57600080fd5b506001600160a01b03813581169160208101359091169060400135611874565b005b34801561068a57600080fd5b50610693611c49565b60408051918252519081900360200190f35b3480156106b157600080fd5b50610693611c6d565b3480156106c657600080fd5b50610693600480360360608110156106dd57600080fd5b506001600160a01b038135811691602081013582169160409091013516611c73565b34801561070b57600080fd5b506106936004803603602081101561072257600080fd5b50356001600160a01b0316611c96565b34801561073e57600080fd5b506105f36004803603602081101561075557600080fd5b5035611ca8565b34801561076857600080fd5b5061067c6004803603602081101561077f57600080fd5b50356001600160a01b0316611cb5565b34801561079b57600080fd5b50610693611db8565b3480156107b057600080fd5b506105ca600480360360808110156107c757600080fd5b506001600160a01b038135169060208101359060408101359060600135611dbf565b3480156107f557600080fd5b50610693611e81565b34801561080a57600080fd5b5061067c6004803603604081101561082157600080fd5b506001600160a01b038135169060200135611ea5565b34801561084357600080fd5b50610693611ffc565b34801561085857600080fd5b5061067c612002565b34801561086d57600080fd5b506105ca6004803603606081101561088457600080fd5b506001600160a01b03813581169160208101359091169060400135612085565b3480156108b057600080fd5b50610693612167565b3480156108c557600080fd5b506108ce61218b565b6040805160ff9092168252519081900360200190f35b3480156108f057600080fd5b506106936004803603604081101561090757600080fd5b506001600160a01b0381358116916020013516612190565b34801561092b57600080fd5b506105ca6004803603602081101561094257600080fd5b50356001600160a01b03166121ad565b34801561095e57600080fd5b506105ca6004803603602081101561097557600080fd5b50356001600160a01b03166121c2565b34801561099157600080fd5b5061067c600480360360208110156109a857600080fd5b50356121d7565b3480156109bb57600080fd5b5061067c600480360360608110156109d257600080fd5b506001600160a01b0381358116916020810135821691604090910135166121e1565b348015610a0057600080fd5b50610693612539565b348015610a1557600080fd5b5061067c60048036036040811015610a2c57600080fd5b506001600160a01b03813516906020013561253f565b348015610a4e57600080fd5b5061067c60048036036020811015610a6557600080fd5b50356001600160a01b0316612764565b348015610a8157600080fd5b5061067c60048036036060811015610a9857600080fd5b506001600160a01b038135811691602081013590911690604001356129a8565b348015610ac457600080fd5b5061067c60048036036020811015610adb57600080fd5b50356001600160a01b0316612ca5565b348015610af757600080fd5b506105f360048036036020811015610b0e57600080fd5b50356001600160a01b0316612d4c565b348015610b2a57600080fd5b506105f3612d67565b348015610b3f57600080fd5b5061067c60048036036020811015610b5657600080fd5b50356001600160a01b0316612d76565b348015610b7257600080fd5b5061067c60048036036020811015610b8957600080fd5b50356001600160a01b0316612d80565b348015610ba557600080fd5b50610693612e09565b348015610bba57600080fd5b5061067c60048036036040811015610bd157600080fd5b506001600160a01b0381358116916020013516612e10565b348015610bf557600080fd5b5061069360048036036040811015610c0c57600080fd5b506001600160a01b0381358116916020013516613017565b348015610c3057600080fd5b5061067c60048036036020811015610c4757600080fd5b50356001600160a01b0316613034565b348015610c6357600080fd5b5061069360048036036040811015610c7a57600080fd5b506001600160a01b03813581169160200135166130ac565b348015610c9e57600080fd5b50610ca76130c9565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610ce3578181015183820152602001610ccb565b505050509050019250505060405180910390f35b348015610d0357600080fd5b506105ca60048036036020811015610d1a57600080fd5b50356001600160a01b031661312b565b61067c60048036036020811015610d4057600080fd5b50356001600160a01b0316613150565b348015610d5c57600080fd5b50610d8360048036036020811015610d7357600080fd5b50356001600160a01b03166132a9565b6040805163ffffffff9092168252519081900360200190f35b348015610da857600080fd5b5061069360048036036020811015610dbf57600080fd5b50356001600160a01b03166132c1565b348015610ddb57600080fd5b5061067c60048036036020811015610df257600080fd5b50356001600160a01b03166132dc565b348015610e0e57600080fd5b5061067c60048036036020811015610e2557600080fd5b50356001600160a01b0316613355565b348015610e4157600080fd5b5061069360048036036020811015610e5857600080fd5b50356001600160a01b03166133f6565b348015610e7457600080fd5b5061069360048036036040811015610e8b57600080fd5b506001600160a01b038135169060200135613408565b348015610ead57600080fd5b5061069360048036036020811015610ec457600080fd5b50356001600160a01b0316613617565b348015610ee057600080fd5b5061067c60048036036020811015610ef757600080fd5b50356001600160a01b0316613629565b348015610f1357600080fd5b506105f36136db565b348015610f2857600080fd5b5061069360048036036060811015610f3f57600080fd5b506001600160a01b0381358116916020810135821691604090910135166136e0565b348015610f6d57600080fd5b5061067c60048036036060811015610f8457600080fd5b506001600160a01b03813581169160208101359091169060400135613703565b348015610fb057600080fd5b5061067c60048036036060811015610fc757600080fd5b506001600160a01b038135811691602081013590911690604001356139ba565b348015610ff357600080fd5b5061051c613afe565b34801561100857600080fd5b506106936004803603604081101561101f57600080fd5b506001600160a01b0381358116916020013516613b20565b34801561104357600080fd5b5061067c6004803603602081101561105a57600080fd5b5035613b3d565b34801561106d57600080fd5b506106936004803603604081101561108457600080fd5b506001600160a01b0381358116916020013516613bba565b3480156110a857600080fd5b5061067c600480360360408110156110bf57600080fd5b506001600160a01b038135169060200135613bd7565b3480156110e157600080fd5b5061067c600480360360408110156110f857600080fd5b506001600160a01b038135169060200135613e60565b34801561111a57600080fd5b506105ca6004803603604081101561113157600080fd5b506001600160a01b038135169060200135613f4e565b34801561115357600080fd5b5061067c6004803603602081101561116a57600080fd5b50356001600160a01b0316613f64565b34801561118657600080fd5b506105ca6004803603602081101561119d57600080fd5b50356001600160a01b0316613fdb565b3480156111b957600080fd5b50610ca7613ff0565b3480156111ce57600080fd5b50610693600480360360208110156111e557600080fd5b50356001600160a01b0316614050565b34801561120157600080fd5b5061067c6004803603602081101561121857600080fd5b50356001600160a01b03166140b4565b34801561123457600080fd5b506106936004803603606081101561124b57600080fd5b506001600160a01b0381358116916020810135821691604090910135166141e0565b34801561127957600080fd5b5061067c600480360360c081101561129057600080fd5b506001600160a01b038135169060208101359060408101359060ff6060820135169060808101359060a00135614203565b3480156112cd57600080fd5b5061067c600480360360208110156112e457600080fd5b50356001600160a01b0316614441565b34801561130057600080fd5b50610693614596565b34801561131557600080fd5b5061067c6004803603604081101561132c57600080fd5b506001600160a01b03813516906020013561459b565b34801561134e57600080fd5b506106936004803603602081101561136557600080fd5b50356001600160a01b0316614661565b34801561138157600080fd5b5061067c600480360360e081101561139857600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135614673565b3480156113df57600080fd5b5061067c600480360360408110156113f657600080fd5b506001600160a01b038135169060200135614917565b34801561141857600080fd5b506106936004803603602081101561142f57600080fd5b50356001600160a01b0316614a7b565b34801561144b57600080fd5b506106936004803603604081101561146257600080fd5b506001600160a01b0381358116916020013516614a8d565b34801561148657600080fd5b5061067c6004803603604081101561149d57600080fd5b506001600160a01b038135169060200135614ab8565b3480156114bf57600080fd5b50610693600480360360408110156114d657600080fd5b506001600160a01b0381358116916020013516614b83565b3480156114fa57600080fd5b506106936004803603606081101561151157600080fd5b506001600160a01b038135811691602081013582169160409091013516614ba0565b34801561153f57600080fd5b506106936004803603602081101561155657600080fd5b50356001600160a01b0316614bc3565b34801561157257600080fd5b5061067c6004803603606081101561158957600080fd5b506001600160a01b03813581169160208101359091169060400135614bd5565b3480156115b557600080fd5b50610693614d26565b3480156115ca57600080fd5b506105ca600480360360208110156115e157600080fd5b50356001600160a01b0316614d4a565b3480156115fd57600080fd5b50610693614d5f565b34801561161257600080fd5b506105f36004803603602081101561162957600080fd5b5035614d65565b34801561163c57600080fd5b5061166f6004803603604081101561165357600080fd5b5080356001600160a01b0316906020013563ffffffff16614d72565b6040805163ffffffff909316835260208301919091528051918290030190f35b34801561169b57600080fd5b506105f3614d9f565b3480156116b057600080fd5b5061067c600480360360208110156116c757600080fd5b50356001600160a01b0316614dae565b3480156116e357600080fd5b506105ca600480360360a08110156116fa57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060800135614e58565b34801561173257600080fd5b506105ca6004803603602081101561174957600080fd5b50356001600160a01b0316614f09565b34801561176557600080fd5b506106936004803603606081101561177c57600080fd5b506001600160a01b038135811691602081013582169160409091013516614f1e565b3480156117aa57600080fd5b50610ca7614f41565b604051806040016040528060088152602001673932a5b2b2b819b960c11b81525081565b3360008181526007602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b6001546001600160a01b031681565b6020818154811061185a57fe5b6000918252602090912001546001600160a01b0316905081565b336000908152601c602090815260408083206001600160a01b0387811685529083528184209086168452909152902054156118ef576040805162461bcd60e51b815260206004820152601660248201527518dc99591a5d0e881c195b991a5b99c818dc99591a5d60521b604482015290519081900360640190fd5b6118fc4262127500614fa1565b3360008181526018602090815260408083206001600160a01b038981168086529184528285209089168086529084528285209690965593835260198252808320938352928152828220938252929092529020546119599082614fa1565b3360008181526019602090815260408083206001600160a01b03898116808652918452828520908916808652818552838620889055958552601784528285209185529083528184209484529382529091205491905210156119eb5760405162461bcd60e51b815260040180806020018281038252602a815260200180615f4a602a913960400191505060405180910390fd5b6040805163cbc3ab5360e01b81526001600160a01b03851660048201523060248201529051600091737e39d5cf0e0a25e76ae892fba71f6136973a40509163cbc3ab5391604480820192602092909190829003018186803b158015611a4f57600080fd5b505af4158015611a63573d6000803e3d6000fd5b505050506040513d6020811015611a7957600080fd5b5051604080516318160ddd60e01b81529051919250600091611b02916001600160a01b038816916318160ddd91600480820192602092909190829003018186803b158015611ac657600080fd5b505afa158015611ada573d6000803e3d6000fd5b505050506040513d6020811015611af057600080fd5b5051611afc8486614fe4565b9061503c565b6001600160a01b0385166000908152601660209081526040808320308452909152902054909150811115611b88576001600160a01b038416600090815260166020908152604080832030808552925290912054611b5f9190615067565b6001600160a01b0384166000908152601660209081526040808320308452909152812055611be5565b611b923082615067565b6001600160a01b0384166000908152601660209081526040808320308452909152902054611bc09082615168565b6001600160a01b03851660009081526016602090815260408083203084529091529020555b336001600160a01b0316856001600160a01b0316856001600160a01b03167f6d962fe34dd0cf9a9df3e12a7b8ddfe5f790b3f11668553455d7b52db70a07be4387604051808381526020018281526020019250505060405180910390a45050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60035481565b601c60209081526000938452604080852082529284528284209052825290205481565b60146020526000908152604090205481565b6024818154811061185a57fe5b336000908152601e602052604090205460ff1615611d12576040805162461bcd60e51b81526020600482015260156024820152741858dd1a5d985d194e88189b1858dadb1a5cdd1959605a1b604482015290519081900360640190fd5b336000908152600a602090815260408083206001600160a01b038516845290915290205415801590611d665750336000908152600a602090815260408083206001600160a01b038516845290915290205442115b611dab576040805162461bcd60e51b815260206004820152601160248201527061637469766174653a20626f6e64696e6760781b604482015290519081900360640190fd5b611db53382615193565b50565b6203f48081565b60005a6025556001600160a01b0385166000908152601d602052604090205460ff168015611e2457506001600160a01b0385166000908152600f6020908152604080832054600e8352818420308552909252909120548591611e219190614fa1565b10155b8015611e4857506001600160a01b0385166000908152601460205260409020548311155b8015611e7857506001600160a01b0385166000908152601160205260409020548290611e75904290615168565b10155b95945050505050565b7f797cfab58fcb15f590eb8e4252d5c228ff88f94f907e119e80c4393a946e8f3581565b3360009081526015602052604090205460ff16611ef9576040805162461bcd60e51b815260206004820152600d60248201526c3932b1b2b4b83a1d1010b537b160991b604482015290519081900360640190fd5b604080518082018252601680825275775265633a20696e7375666669656e742066756e647360501b602080840191909152336000908152918152838220600e835290529190912054611f4c9183906152e1565b336000908152601660209081526040808320600e84528252808320939093556001600160a01b0385168083526013909152828220429055915183156108fc0291849190818181858888f19350505050158015611fac573d6000803e3d6000fd5b50604080514381526020810183905281516001600160a01b038516923392600e927f3cda93551ad083704be19fabbd7c3eb94d88f6e72ff221bdea9017e52e4144e8929181900390910190a45050565b60025481565b6022546001600160a01b03163314612061576040805162461bcd60e51b815260206004820152601d60248201527f616363657074476f7665726e616e63653a202170656e64696e67476f76000000604482015290519081900360640190fd5b602254602180546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b0383166000818152600760209081526040808320338085529252822054919290919082148015906120bf57506000198114155b156121505760006120eb85604051806060016040528060278152602001615f94602791398491906152e1565b6001600160a01b0380891660008181526007602090815260408083209489168084529482529182902085905581518581529151949550929391927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92592918290030190a3505b61215b868686615378565b50600195945050505050565b7f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e981565b601281565b600a60209081526000928352604080842090915290825290205481565b601d6020526000908152604090205460ff1681565b60156020526000908152604090205460ff1681565b611db53382615067565b6001600160a01b03821660009081526023602052604090205460ff16612249576040805162461bcd60e51b815260206004820152601860248201527730b2322634b8bab4b234ba3caa37a537b11d1010b830b4b960411b604482015290519081900360640190fd5b6001600160a01b038084166000908152601b6020908152604080832086851684528252808320938516835292905220546122bc576040805162461bcd60e51b815260206004820152600f60248201526e18dc99591a5d0e881b9bc8189bdb99608a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152601b6020908152604080832086851684528252808320938516835292905220544211612331576040805162461bcd60e51b815260206004820152600f60248201526e6372656469743a20626f6e64696e6760881b604482015290519081900360640190fd5b6040805163cbc3ab5360e01b81526001600160a01b03841660048201523060248201529051600091737e39d5cf0e0a25e76ae892fba71f6136973a40509163cbc3ab5391604480820192602092909190829003018186803b15801561239557600080fd5b505af41580156123a9573d6000803e3d6000fd5b505050506040513d60208110156123bf57600080fd5b5051604080516318160ddd60e01b81529051919250600091612473916001600160a01b038716916318160ddd91600480820192602092909190829003018186803b15801561240c57600080fd5b505afa158015612420573d6000803e3d6000fd5b505050506040513d602081101561243657600080fd5b50516001600160a01b038088166000908152601c602090815260408083208a85168452825280832093891683529290522054611afc908590614fe4565b905061247f3082615535565b6001600160a01b03831660009081526016602090815260408083203084529091529020546124ad9082614fa1565b6001600160a01b038085166000818152601660209081526040808320308452825280832095909555898416808352601c8252858320948a168084529482528583208484528252858320929092558451438152908101869052845191947fa90666688fb32254f45a367c38fbcd5f2664432b061a4354d9d3c9a7abcbec5b92918290030190a45050505050565b60105481565b3360009081526015602052604090205460ff16612590576040805162461bcd60e51b815260206004820152600a6024820152693ba932b19d1010b537b160b11b604482015290519081900360640190fd5b6001546001600160a01b031663525ea6316125ae5a60255490615168565b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156125e257600080fd5b505afa1580156125f6573d6000803e3d6000fd5b505050506040513d602081101561260c57600080fd5b5051811115612654576040805162461bcd60e51b815260206004820152600f60248201526e1dd49958ce881b585e081b1a5b5a5d608a1b604482015290519081900360640190fd5b604080518082018252601680825275775265633a20696e7375666669656e742066756e647360501b602080840191909152336000908152918152838220308352905291909120546126a69183906152e1565b3360009081526016602090815260408083203084528252808320939093556001600160a01b038516825260139052204290556126e282826155ae565b6001600160a01b0382166000908152601460205260409020546127059082614fa1565b6001600160a01b03831660008181526014602090815260409182902093909355805143815292830184905280519192339230927f3cda93551ad083704be19fabbd7c3eb94d88f6e72ff221bdea9017e52e4144e8928290030190a45050565b600260005414156127aa576040805162461bcd60e51b815260206004820152601f6024820152600080516020615f2a833981519152604482015290519081900360640190fd5b60026000908155338152600b602090815260408083206001600160a01b0385168452909152902054158015906128025750336000908152600b602090815260408083206001600160a01b038516845290915290205442115b612849576040805162461bcd60e51b815260206004820152601360248201527277697468647261773a20756e626f6e64696e6760681b604482015290519081900360640190fd5b3360009081526012602052604090205460ff16156128a3576040805162461bcd60e51b815260206004820152601260248201527177697468647261773a20646973707574657360701b604482015290519081900360640190fd5b6001600160a01b0381163014156128e857336000818152600c602090815260408083206001600160a01b03861684529091529020546128e3913091615378565b612917565b336000818152600c602090815260408083206001600160a01b0386168085529252909120546129179290615667565b336000818152600c602090815260408083206001600160a01b038616845282529182902054825143815242928101929092528183015290517f095ae150bb74a0755c30809eb8d4aa810b63b66b9ca96a1945bbb03d809df2e99181900360600190a2336000908152600c602090815260408083206001600160a01b0394909416835292905290812081905560019055565b600260005414156129ee576040805162461bcd60e51b815260206004820152601f6024820152600080516020615f2a833981519152604482015290519081900360640190fd5b600260009081556001600160a01b03841681526023602052604090205460ff16612a5a576040805162461bcd60e51b815260206004820152601860248201527730b2322634b8bab4b234ba3caa37a537b11d1010b830b4b960411b604482015290519081900360640190fd5b612a6f6001600160a01b0384163330846156be565b3360009081526017602090815260408083206001600160a01b0387811685529083528184209086168452909152902054612aa99082614fa1565b3360009081526017602090815260408083206001600160a01b0388811685529083528184209087168452909152902055612ae6426203f480614fa1565b336000818152601b602090815260408083206001600160a01b0389811680865291845282852090891680865290845282852096909655938352601c825280832093835292815282822093825292909252902054612b439082614fa1565b336000908152601c602090815260408083206001600160a01b038881168552908352818420908716845282528083209390935560159052205460ff16158015612ba357506001600160a01b0382166000908152601a602052604090205442115b15612c3e576021546040805163dc380cbb60e01b81526001600160a01b0385811660048301529151919092169163dc380cbb91602480830192600092919082900301818387803b158015612bf657600080fd5b505af1158015612c0a573d6000803e3d6000fd5b50505050612c246212750042614fa190919063ffffffff16565b6001600160a01b0383166000908152601a60205260409020555b336001600160a01b0316836001600160a01b0316836001600160a01b03167fe1cb44a16adbd63a44f65c279b23b8f447b2c6e120a2bc7f004758b446e05ed14385604051808381526020018281526020019250505060405180910390a45050600160005550565b6021546001600160a01b03163314612cf4576040805162461bcd60e51b815260206004820152600d60248201526c3932b9b7b63b329d1010b3b7bb60991b604482015290519081900360640190fd5b6001600160a01b038116600081815260126020908152604091829020805460ff19169055815143815291517f7574a4a2c81b3099d59aaf15526ea966e1e2886afd21bf4a350af7af22db3a709281900390910190a250565b6004602052600090815260409020546001600160a01b031681565b6021546001600160a01b031681565b611db5338261571e565b600154611db59082906001600160a01b031663525ea631612da45a60255490615168565b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612dd857600080fd5b505afa158015612dec573d6000803e3d6000fd5b505050506040513d6020811015612e0257600080fd5b505161253f565b6212750081565b3360009081526018602090815260408083206001600160a01b0386811685529083528184209085168452909152902054612e85576040805162461bcd60e51b81526020600482015260116024820152701c995b5bdd99529bd88e881d5b989bdb99607a1b604482015290519081900360640190fd5b3360009081526018602090815260408083206001600160a01b03868116855290835281842090851684529091529020544211612eff576040805162461bcd60e51b815260206004820152601460248201527372656d6f76654a6f623a20756e626f6e64696e6760601b604482015290519081900360640190fd5b3360008181526019602090815260408083206001600160a01b038781168086529184528285209087168086529084528285205495855260178452828520918552908352818420908452909152902054612f589082615168565b3360008181526017602090815260408083206001600160a01b038981168086529184528285209089168086529084528285209690965584845260198352818420818552835281842095845294909152812055612fb5919083615667565b336001600160a01b0316836001600160a01b0316836001600160a01b03167fb69fc9f6d19ed402461251491f86c736bfcbe966e9584d3fb8a0057b313b69204385604051808381526020018281526020019250505060405180910390a4505050565b601660209081526000928352604080842090915290825290205481565b6021546001600160a01b0316331461308b576040805162461bcd60e51b81526020600482015260156024820152743932bb37b5b2a634b8bab4b234ba3c9d1010b3b7bb60591b604482015290519081900360640190fd5b6001600160a01b03166000908152602360205260409020805460ff19169055565b600c60209081526000928352604080842090915290825290205481565b6060602080548060200260200160405190810160405280929190818152602001828054801561312157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613103575b5050505050905090565b60005a602555506001600160a01b03166000908152601d602052604090205460ff1690565b6001600160a01b03811660009081526015602052604090205460ff166131b2576040805162461bcd60e51b815260206004820152601260248201527130b23221b932b234ba22aa241d1010b537b160711b604482015290519081900360640190fd5b60006131c5612710611afc34601e614fe4565b90506131ff6131d43483615168565b6001600160a01b0384166000908152601660209081526040808320600e845290915290205490614fa1565b6001600160a01b038084166000908152601660209081526040808320600e8452909152808220939093556021549251929091169183156108fc0291849190818181858888f1935050505015801561325a573d6000803e3d6000fd5b5060408051438152346020820152815133926001600160a01b03861692600e927fb97975ea9bf5ae2173b9ea765214622396032aba11cd5cc1450c760ac80d059a929181900390910190a45050565b60066020526000908152604090205463ffffffff1681565b6001600160a01b031660009081526008602052604090205490565b6021546001600160a01b03163314613333576040805162461bcd60e51b815260206004820152601560248201527439b2ba25b2b2b819b92432b63832b91d1010b3b7bb60591b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6021546001600160a01b031633146133a2576040805162461bcd60e51b815260206004820152600b60248201526a39b630b9b41d1010b3b7bb60a91b604482015290519081900360640190fd5b6001600160a01b0381166000908152601d60209081526040808320805460ff19908116909155601e835281842080549091166001179055600e825280832030808552925290912054611db591908390614bd5565b601a6020526000908152604090205481565b600043821061344f576040805162461bcd60e51b815260206004820152600e60248201526d33b2ba283934b7b92b37ba32b99d60911b604482015290519081900360640190fd5b6001600160a01b03831660009081526006602052604090205463ffffffff168061347d576000915050611838565b6001600160a01b038416600090815260056020908152604080832063ffffffff6000198601811685529252909120541683106134ec576001600160a01b03841660009081526005602090815260408083206000199490940163ffffffff16835292905220600101549050611838565b6001600160a01b038416600090815260056020908152604080832083805290915290205463ffffffff16831015613527576000915050611838565b600060001982015b8163ffffffff168163ffffffff1611156135e057600282820363ffffffff16048103613559615f12565b506001600160a01b038716600090815260056020908152604080832063ffffffff8086168552908352928190208151808301909252805490931680825260019093015491810191909152908714156135bb576020015194506118389350505050565b805163ffffffff168711156135d2578193506135d9565b6001820392505b505061352f565b506001600160a01b038516600090815260056020908152604080832063ffffffff9094168352929052206001015491505092915050565b60096020526000908152604090205481565b6021546001600160a01b0316331461367a576040805162461bcd60e51b815260206004820152600f60248201526e3932b6b7bb32a537b11d1010b3b7bb60891b604482015290519081900360640190fd5b6001600160a01b038116600081815260156020908152604091829020805460ff191690558151438152339181019190915281517f2ca18fdfae50f1042480d285d21f6706aa6abbd567d60a044b5bec07ccfee648929181900390910190a250565b600e81565b601960209081526000938452604080852082529284528284209052825290205481565b60026000541415613749576040805162461bcd60e51b815260206004820152601f6024820152600080516020615f2a833981519152604482015290519081900360640190fd5b600260009081556001600160a01b03831681526015602052604090205460ff166137af576040805162461bcd60e51b815260206004820152601260248201527130b23221b932b234ba22aa241d1010b537b160711b604482015290519081900360640190fd5b6000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156137fe57600080fd5b505afa158015613812573d6000803e3d6000fd5b505050506040513d602081101561382857600080fd5b505190506138416001600160a01b0385163330856156be565b60006138c682866001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561389457600080fd5b505afa1580156138a8573d6000803e3d6000fd5b505050506040513d60208110156138be57600080fd5b505190615168565b905060006138db612710611afc84601e614fe4565b90506139166138ea8383615168565b6001600160a01b038088166000908152601660209081526040808320938c168352929052205490614fa1565b6001600160a01b0380871660009081526016602090815260408083208b851680855292529091209290925560215461395092911683615667565b336001600160a01b0316856001600160a01b0316876001600160a01b03167fb97975ea9bf5ae2173b9ea765214622396032aba11cd5cc1450c760ac80d059a4386604051808381526020018281526020019250505060405180910390a45050600160005550505050565b3360009081526015602052604090205460ff16613a0e576040805162461bcd60e51b815260206004820152600d60248201526c3932b1b2b4b83a1d1010b537b160991b604482015290519081900360640190fd5b604080518082018252601680825275775265633a20696e7375666669656e742066756e647360501b6020808401919091523360009081529181528382206001600160a01b038816835290529190912054613a699183906152e1565b3360009081526016602090815260408083206001600160a01b0388811680865291845282852095909555938616835260139091529020429055613aad908383615667565b604080514381526020810183905281516001600160a01b03808616933393918816927f3cda93551ad083704be19fabbd7c3eb94d88f6e72ff221bdea9017e52e4144e89281900390910190a4505050565b604051806040016040528060068152602001652922a5a819a960d11b81525081565b600b60209081526000928352604080842090915290825290205481565b6021546001600160a01b03163314613b89576040805162461bcd60e51b815260206004820152600a60248201526936b4b73a1d1010b3b7bb60b11b604482015290519081900360640190fd5b600254600354613b999083614fa1565b1115613ba457600080fd5b602154611db5906001600160a01b031682615535565b600e60209081526000928352604080842090915290825290205481565b60026000541415613c1d576040805162461bcd60e51b815260206004820152601f6024820152600080516020615f2a833981519152604482015290519081900360640190fd5b60026000908155338152601e602052604090205460ff1615613c7a576040805162461bcd60e51b8152602060048201526011602482015270189bdb990e88189b1858dadb1a5cdd1959607a1b604482015290519081900360640190fd5b613c87426203f480614fa1565b336000908152600a602090815260408083206001600160a01b038716808552925290912091909155301415613cc657613cc1333083615378565b613dad565b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613d1557600080fd5b505afa158015613d29573d6000803e3d6000fd5b505050506040513d6020811015613d3f57600080fd5b50519050613d586001600160a01b0384163330856156be565b613da981846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561389457600080fd5b9150505b336000908152600d602090815260408083206001600160a01b0386168452909152902054613ddb9082614fa1565b336000818152600d602090815260408083206001600160a01b03881680855290835281842095909555838352600a82528083209483529381529083902054835143815291820152808301849052915190917fa150b7ad789014c0171a2873708daadbdbf87457d90d3896eaf0907e5b225ae4919081900360600190a250506001600055565b613e6d4262127500614fa1565b336000818152600b602090815260408083206001600160a01b0388168452909152902091909155613ea0908390836157cd565b336000908152600c602090815260408083206001600160a01b0386168452909152902054613ece9082614fa1565b336000818152600c602090815260408083206001600160a01b03881680855290835281842095909555838352600b82528083209483529381529083902054835143815291820152808301849052915190917f50eca01e7e4362bc0279a45c4fbe68f263771dd3418b0a29c93008759f433b2e919081900360600190a25050565b6000613f5b338484615378565b50600192915050565b6021546001600160a01b03163314613fb9576040805162461bcd60e51b815260206004820152601360248201527239b2ba23b7bb32b93730b731b29d1010b3b7bb60691b604482015290519081900360640190fd5b602280546001600160a01b0319166001600160a01b0392909216919091179055565b60126020526000908152604090205460ff1681565b6060601f805480602002602001604051908101604052809291908181526020018280548015613121576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311613103575050505050905090565b6001600160a01b03811660009081526006602052604081205463ffffffff168061407b5760006140ad565b6001600160a01b038316600090815260056020908152604080832063ffffffff60001986011684529091529020600101545b9392505050565b6021546001600160a01b0316331461410c576040805162461bcd60e51b815260206004820152601660248201527530b8383937bb32a634b8bab4b234ba3c9d1010b3b7bb60511b604482015290519081900360640190fd5b6001600160a01b03811660009081526023602052604090205460ff161561417a576040805162461bcd60e51b815260206004820152601760248201527f617070726f76654c69717569646974793a202170616972000000000000000000604482015290519081900360640190fd5b6001600160a01b03166000818152602360205260408120805460ff191660019081179091556024805491820181559091527f7cd332d19b93bcabe3cce7ca0c18a052f57e5fd03b4758a09f30f5ddc4b22ec40180546001600160a01b0319169091179055565b601860209081526000938452604080852082529284528284209052825290205481565b604080517f1ac861a6a8532f3704e1768564a53a32774f00d6cf20ccbbdf60ab61378302bc6020808301919091526001600160a01b038916828401526060820188905260808083018890528351808403909101815260a08301845280519082012061190160f01b60c08401527f000000000000000000000000000000000000000000000000000000000000000060c284015260e2808401829052845180850390910181526101028401808652815191840191909120600091829052610122850180875281905260ff891661014286015261016285018890526101828501879052945191949390926001926101a280840193601f198301929081900390910190855afa158015614316573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614373576040805162461bcd60e51b815260206004820152601260248201527164656c656761746542795369673a2073696760701b604482015290519081900360640190fd5b6001600160a01b038116600090815260096020526040902080546001810190915588146143de576040805162461bcd60e51b815260206004820152601460248201527364656c656761746542795369673a206e6f6e636560601b604482015290519081900360640190fd5b8642111561442c576040805162461bcd60e51b815260206004820152601660248201527519195b1959d85d19509e54da59ce88195e1c1a5c995960521b604482015290519081900360640190fd5b614436818a61571e565b505050505050505050565b6021546001600160a01b0316331461448f576040805162461bcd60e51b815260206004820152600c60248201526b30b2322537b11d1010b3b7bb60a11b604482015290519081900360640190fd5b6001600160a01b03811660009081526015602052604090205460ff16156144f1576040805162461bcd60e51b815260206004820152601160248201527030b2322537b11d103537b11035b737bbb760791b604482015290519081900360640190fd5b6001600160a01b0381166000818152601560209081526040808320805460ff1916600190811790915582549081018355928290527fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bb90920180546001600160a01b031916841790558151438152339181019190915281517f3d9884fbd11fce9188657c4bcfda7491d3316ce97bd234d981b7be1f012a852f929181900390910190a250565b601e81565b6021546001600160a01b031633146145eb576040805162461bcd60e51b815260206004820152600e60248201526d30b2322b37ba32b99d1010b3b7bb60911b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205461460e9082615168565b6001600160a01b0383166000908152600f60205260409020556010546146349082615168565b6010556001600160a01b0380831660009081526004602052604081205461465d92169083615862565b5050565b60136020526000908152604090205481565b6001600160a01b0380881660008181526009602090815260408083208054600180820190925582517f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e98186015280840196909652958c166060860152608085018b905260a085019590955260c08085018a90528151808603909101815260e08501825280519083012061190160f01b6101008601527f000000000000000000000000000000000000000000000000000000000000000061010286015261012280860182905282518087039091018152610142860180845281519185019190912090859052610162860180845281905260ff8a166101828701526101a286018990526101c2860188905291519095919491926101e2808401939192601f1981019281900390910190855afa1580156147ae573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661480a576040805162461bcd60e51b81526020600482015260116024820152707065726d69743a207369676e617475726560781b604482015290519081900360640190fd5b896001600160a01b0316816001600160a01b031614614867576040805162461bcd60e51b81526020600482015260146024820152731c195c9b5a5d0e881d5b985d5d1a1bdc9a5e995960621b604482015290519081900360640190fd5b864211156148ae576040805162461bcd60e51b815260206004820152600f60248201526e1c195c9b5a5d0e88195e1c1a5c9959608a1b604482015290519081900360640190fd5b6001600160a01b03808b166000818152600760209081526040808320948e16808452948252918290208c905581518c815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a350505050505050505050565b6021546001600160a01b0316331461496b576040805162461bcd60e51b815260206004820152601260248201527130b23225a82921b932b234ba1d1010b3b7bb60711b604482015290519081900360640190fd5b6001600160a01b03821660009081526015602052604090205460ff166149cd576040805162461bcd60e51b815260206004820152601260248201527130b23225a82921b932b234ba1d1010b537b160711b604482015290519081900360640190fd5b6001600160a01b03821660009081526016602090815260408083203084529091529020546149fb9082614fa1565b6001600160a01b038316600090815260166020908152604080832030808552925290912091909155614a2d9082615535565b6040805143815260208101839052815133926001600160a01b0386169230927fb97975ea9bf5ae2173b9ea765214622396032aba11cd5cc1450c760ac80d059a929181900390910190a45050565b600f6020526000908152604090205481565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b6021546001600160a01b03163314614b08576040805162461bcd60e51b815260206004820152600e60248201526d30b2322b37ba32b99d1010b3b7bb60911b604482015290519081900360640190fd5b614b128230615193565b6001600160a01b0382166000908152600f6020526040902054614b359082614fa1565b6001600160a01b0383166000908152600f6020526040902055601054614b5b9082614fa1565b6010556001600160a01b0380831660009081526004602052604081205461465d921683615862565b600d60209081526000928352604080842090915290825290205481565b601760209081526000938452604080852082529284528284209052825290205481565b60116020526000908152604090205481565b60026000541415614c1b576040805162461bcd60e51b815260206004820152601f6024820152600080516020615f2a833981519152604482015290519081900360640190fd5b60026000556021546001600160a01b03163314614c6d576040805162461bcd60e51b815260206004820152600b60248201526a39b630b9b41d1010b3b7bb60a91b604482015290519081900360640190fd5b6001600160a01b038316301415614c9b57602154614c969030906001600160a01b031683615378565b614cb5565b602154614cb5906001600160a01b03858116911683615667565b614cc08383836157cd565b6001600160a01b038216600081815260126020908152604091829020805460ff19169055815143815290810184905281513393927ff7e41ea76f0e7b22ba17dc4cc01fa75cff34ea24f5efe2874f5e175296259050928290030190a35050600160005550565b7f1ac861a6a8532f3704e1768564a53a32774f00d6cf20ccbbdf60ab61378302bc81565b60236020526000908152604090205460ff1681565b61271081565b601f818154811061185a57fe5b60056020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6022546001600160a01b031681565b6021546001600160a01b03163314614dfd576040805162461bcd60e51b815260206004820152600d60248201526c3234b9b83aba329d1010b3b7bb60991b604482015290519081900360640190fd5b6001600160a01b038116600081815260126020908152604091829020805460ff19166001179055815143815291517ffb2bdfce35c242f34d4f9633225d3c34a5892d5eae9ce102de6aac188dd25ba09281900390910190a250565b60005a6025556001600160a01b0386166000908152601d602052604090205460ff168015614eab57506001600160a01b038087166000908152600e60209081526040808320938916835292905220548411155b8015614ecf57506001600160a01b0386166000908152601460205260409020548311155b8015614eff57506001600160a01b0386166000908152601160205260409020548290614efc904290615168565b10155b9695505050505050565b601e6020526000908152604090205460ff1681565b601b60209081526000938452604080852082529284528284209052825290205481565b60606024805480602002602001604051908101604052809291908181526020018280548015613121576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311613103575050505050905090565b6000828201838110156140ad576040805162461bcd60e51b81526020600482015260066024820152656164643a202b60d01b604482015290519081900360640190fd5b600082614ff357506000611838565b8282028284828161500057fe5b04146140ad576040805162461bcd60e51b815260206004820152600660248201526536bab61d101560d11b604482015290519081900360640190fd5b60006140ad8383604051806040016040528060068152602001656469763a202f60d01b8152506159e0565b6001600160a01b0382166150b8576040805162461bcd60e51b81526020600482015260136024820152725f6275726e3a207a65726f206164647265737360681b604482015290519081900360640190fd5b60408051808201825260168152755f6275726e3a20657863656564732062616c616e636560501b6020808301919091526001600160a01b03851660009081526008909152919091205461510c9183906152e1565b6001600160a01b0383166000908152600860205260409020556003546151329082615168565b6003556040805182815290516000916001600160a01b03851691600080516020615f748339815191529181900360200190a35050565b60006140ad8383604051806040016040528060068152602001657375623a202d60d01b8152506152e1565b6001600160a01b038216600090815260116020526040902054615218576001600160a01b03821660008181526011602090815260408083204290819055601f8054600181019091557fa03837a25210ee280c2113ff4b77ca23440b19d4866cca721c801278fd08d8070180546001600160a01b03191690951790945560139091529020555b6001600160a01b038083166000908152601d60209081526040808320805460ff19166001179055600d82528083209385168352929052205461525d9082908490615a45565b6001600160a01b038083166000818152600d60209081526040808320948616808452948252808320839055838352600e825280832094835293815290839020548351438152429281019290925281840152915190917f3d80dd4660c08288217e88c2d45230220fcd3debf16898013243026e6a2aad05919081900360600190a25050565b600081848411156153705760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561533557818101518382015260200161531d565b50505050905090810190601f1680156153625780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b0383166153d3576040805162461bcd60e51b815260206004820152601d60248201527f5f7472616e73666572546f6b656e733a207a65726f2061646472657373000000604482015290519081900360640190fd5b6001600160a01b03821661542e576040805162461bcd60e51b815260206004820152601d60248201527f5f7472616e73666572546f6b656e733a207a65726f2061646472657373000000604482015290519081900360640190fd5b60408051808201825260208082527f5f7472616e73666572546f6b656e733a20657863656564732062616c616e6365818301526001600160a01b0386166000908152600890915291909120546154859183906152e1565b6001600160a01b0380851660009081526008602081815260408084209590955584518086018652601a81527f5f7472616e73666572546f6b656e733a206f766572666c6f77730000000000008183015293871683525291909120546154eb918390615add565b6001600160a01b038084166000818152600860209081526040918290209490945580518581529051919392871692600080516020615f7483398151915292918290030190a3505050565b6003546155429082614fa1565b6003556001600160a01b0382166000908152600860205260409020546155689082614fa1565b6001600160a01b0383166000818152600860209081526040808320949094558351858152935192939192600080516020615f748339815191529281900390910190a35050565b6001600160a01b0382166000908152600e602090815260408083203084529091529020546155dc9082614fa1565b6001600160a01b0383166000908152600e6020908152604080832030845290915290205560105461560d9082614fa1565b6010556001600160a01b03808316600090815260046020526040812054615635921683615862565b6040805182815290516001600160a01b038416913391600080516020615f748339815191529181900360200190a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526156b9908490615b3b565b505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052615718908590615b3b565b50505050565b6001600160a01b03808316600081815260046020908152604080832054600e8352818420308552835281842054948452600f90925282205493169290916157659190614fa1565b6001600160a01b0385811660008181526004602052604080822080546001600160a01b031916898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4615718828483615862565b6001600160a01b038083166000908152600e60209081526040808320938716835292905220546157fd9082615168565b6001600160a01b038084166000908152600e60209081526040808320938816808452939091529020919091553014156156b95760105461583d9082615168565b6010556001600160a01b038083166000908152600460205260408120546156b9921690835b816001600160a01b0316836001600160a01b0316141580156158845750600081115b156156b9576001600160a01b0383161561594f576001600160a01b03831660009081526006602052604081205463ffffffff1690816158c45760006158f6565b6001600160a01b038516600090815260056020908152604080832063ffffffff60001987011684529091529020600101545b9050600061593d84604051806040016040528060168152602001755f6d6f7665566f7465733a20756e646572666c6f777360501b815250846152e19092919063ffffffff16565b905061594b86848484615cf6565b5050505b6001600160a01b038216156156b9576001600160a01b03821660009081526006602052604081205463ffffffff16908161598a5760006159bc565b6001600160a01b038416600090815260056020908152604080832063ffffffff60001987011684529091529020600101545b905060006159ca8285614fa1565b90506159d885848484615cf6565b505050505050565b60008183615a2f5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561533557818101518382015260200161531d565b506000838581615a3b57fe5b0495945050505050565b6001600160a01b038083166000908152600e6020908152604080832093871683529290522054615a759082614fa1565b6001600160a01b038084166000908152600e60209081526040808320938816808452939091529020919091553014156156b957601054615ab59082614fa1565b6010556001600160a01b038083166000908152600460205260408120546156b9921683615862565b60008383018285821015615b325760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561533557818101518382015260200161531d565b50949350505050565b615b4d826001600160a01b0316615e78565b615b95576040805162461bcd60e51b815260206004820152601460248201527314d85999515490cc8c0e880858dbdb9d1c9858dd60621b604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310615bd35780518252601f199092019160209182019101615bb4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114615c35576040519150601f19603f3d011682016040523d82523d6000602084013e615c3a565b606091505b509150915081615c91576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561571857808060200190516020811015615cad57600080fd5b5051615718576040805162461bcd60e51b815260206004820152601360248201527214d85999515490cc8c0e88085cdd58d8d95959606a1b604482015290519081900360640190fd5b6000615d37436040518060400160405280601981526020017f5f7772697465436865636b706f696e743a203332206269747300000000000000815250615eb4565b905060008463ffffffff16118015615d8057506001600160a01b038516600090815260056020908152604080832063ffffffff6000198901811685529252909120548282169116145b15615dbd576001600160a01b038516600090815260056020908152604080832063ffffffff60001989011684529091529020600101829055615e2e565b60408051808201825263ffffffff808416825260208083018681526001600160a01b038a166000818152600584528681208b8616825284528681209551865490861663ffffffff19918216178755925160019687015590815260069092529390208054928801909116919092161790555b604080518481526020810184905281516001600160a01b038816927fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724928290030190a25050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590615eac57508115155b949350505050565b6000816401000000008410615f0a5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561533557818101518382015260200161531d565b509192915050565b60408051808201909152600080825260208201529056fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c00756e626f6e644c697175696469747946726f6d4a6f623a20696e73756666696369656e742066756e6473ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef7472616e7366657246726f6d3a2065786365656473207370656e64657220616c6c6f77616e6365a26469706673582212205e5ccd9c1630a48303264db588c9dba63ec7b2b2bb2a617f8d3218596613c30364736f6c634300060c0033000000000000000000000000253ab0eb036b17fad6b986d95b95e8e43d2aabed00000000000000000000000000000000000000000000152d02c7e14af6800000

Deployed Bytecode

0x6080604052600436106105025760003560e01c80637724ff6811610297578063c5198abc11610165578063e74f8239116100cc578063f39c38a011610085578063f39c38a01461168f578063f75f9f7b146116a4578063f9d46cf2146116d7578063f9f92be414611726578063fede700814611759578063ffb0a4a01461179e57610502565b8063e74f823914611566578063e7a324dc146115a9578063eb421f3b146115be578063ec342ad0146115f1578063ec4515dd14611606578063f1127ed81461163057610502565b8063d8bff5a51161011e578063d8bff5a51461140c578063dd62ed3e1461143f578063de63298d1461147a578063deac3541146114b3578063def70844146114ee578063e326ac431461153357610502565b8063c5198abc146112c1578063c57981b5146112f4578063ce6a088014611309578063d454019d14611342578063d505accf14611375578063d8ae6faf146113d357610502565b8063a39744b511610209578063b105e39f116101c2578063b105e39f146111ad578063b4b5ea57146111c2578063b600702a146111f5578063bb49096d14611228578063c1c1d2181461078f578063c3cda5201461126d57610502565b8063a39744b514611061578063a515366a1461109c578063a5d059ca146110d5578063a9059cbb1461110e578063ab033ea914611147578063b0103b1a1461117a57610502565b806383baa6931161025b57806383baa69314610f1c57806388b4ac8314610f615780638d9acd2e14610fa457806395d89b4114610fe75780639af7728414610ffc578063a0712d681461103757610502565b80637724ff6814610e35578063782d6fe114610e685780637ecebe0014610ea15780638071198914610ed45780638322fff214610f0757610502565b806342966c68116103d4578063603b4d14116103465780636ba42aaa116102ff5780636ba42aaa14610cf75780636dab5dcf14610d2a5780636fcfff4514610d5057806370a0823114610d9c57806372da828a14610dcf57806374a8f10314610e0257610502565b8063603b4d1414610b99578063603c686014610bae578063637cd7f014610be957806364bb43ee14610c2457806367da318414610c5757806368581ebd14610c9257610502565b806352a4de291161039857806352a4de2914610a7557806355ea6c4714610ab8578063587cde1e14610aeb5780635aa6e67514610b1e5780635c19a95c14610b335780635feeb79414610b6657610502565b806342966c68146109855780634395d8ba146109af57806344d96e95146109f45780634b3fde2114610a0957806351cff8d914610a4257610502565b80631df0de131161047857806323b872dd1161043157806323b872dd1461086157806330adf81f146108a4578063313ce567146108b957806337feca84146108e45780633bbd64bc1461091f5780633d1f0bb91461095257610502565b80631df0de131461078f5780631ff5f3da146107a457806320606b70146107e95780632119a62a146107fe57806323548b8b14610837578063238efcbc1461084c57610502565b80631778e29c116104ca5780631778e29c1461067e57806318160ddd146106a55780631992d206146106ba5780631b44555e146106ff5780631b7a1fb2146107325780631c5a9d9c1461075c57610502565b806306fdde0314610507578063095ea7b31461059157806309aff02b146105de5780630c33c5221461060f5780631101eb4114610639575b600080fd5b34801561051357600080fd5b5061051c6117b3565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561055657818101518382015260200161053e565b50505050905090810190601f1680156105835780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561059d57600080fd5b506105ca600480360360408110156105b457600080fd5b506001600160a01b0381351690602001356117d7565b604080519115158252519081900360200190f35b3480156105ea57600080fd5b506105f361183e565b604080516001600160a01b039092168252519081900360200190f35b34801561061b57600080fd5b506105f36004803603602081101561063257600080fd5b503561184d565b34801561064557600080fd5b5061067c6004803603606081101561065c57600080fd5b506001600160a01b03813581169160208101359091169060400135611874565b005b34801561068a57600080fd5b50610693611c49565b60408051918252519081900360200190f35b3480156106b157600080fd5b50610693611c6d565b3480156106c657600080fd5b50610693600480360360608110156106dd57600080fd5b506001600160a01b038135811691602081013582169160409091013516611c73565b34801561070b57600080fd5b506106936004803603602081101561072257600080fd5b50356001600160a01b0316611c96565b34801561073e57600080fd5b506105f36004803603602081101561075557600080fd5b5035611ca8565b34801561076857600080fd5b5061067c6004803603602081101561077f57600080fd5b50356001600160a01b0316611cb5565b34801561079b57600080fd5b50610693611db8565b3480156107b057600080fd5b506105ca600480360360808110156107c757600080fd5b506001600160a01b038135169060208101359060408101359060600135611dbf565b3480156107f557600080fd5b50610693611e81565b34801561080a57600080fd5b5061067c6004803603604081101561082157600080fd5b506001600160a01b038135169060200135611ea5565b34801561084357600080fd5b50610693611ffc565b34801561085857600080fd5b5061067c612002565b34801561086d57600080fd5b506105ca6004803603606081101561088457600080fd5b506001600160a01b03813581169160208101359091169060400135612085565b3480156108b057600080fd5b50610693612167565b3480156108c557600080fd5b506108ce61218b565b6040805160ff9092168252519081900360200190f35b3480156108f057600080fd5b506106936004803603604081101561090757600080fd5b506001600160a01b0381358116916020013516612190565b34801561092b57600080fd5b506105ca6004803603602081101561094257600080fd5b50356001600160a01b03166121ad565b34801561095e57600080fd5b506105ca6004803603602081101561097557600080fd5b50356001600160a01b03166121c2565b34801561099157600080fd5b5061067c600480360360208110156109a857600080fd5b50356121d7565b3480156109bb57600080fd5b5061067c600480360360608110156109d257600080fd5b506001600160a01b0381358116916020810135821691604090910135166121e1565b348015610a0057600080fd5b50610693612539565b348015610a1557600080fd5b5061067c60048036036040811015610a2c57600080fd5b506001600160a01b03813516906020013561253f565b348015610a4e57600080fd5b5061067c60048036036020811015610a6557600080fd5b50356001600160a01b0316612764565b348015610a8157600080fd5b5061067c60048036036060811015610a9857600080fd5b506001600160a01b038135811691602081013590911690604001356129a8565b348015610ac457600080fd5b5061067c60048036036020811015610adb57600080fd5b50356001600160a01b0316612ca5565b348015610af757600080fd5b506105f360048036036020811015610b0e57600080fd5b50356001600160a01b0316612d4c565b348015610b2a57600080fd5b506105f3612d67565b348015610b3f57600080fd5b5061067c60048036036020811015610b5657600080fd5b50356001600160a01b0316612d76565b348015610b7257600080fd5b5061067c60048036036020811015610b8957600080fd5b50356001600160a01b0316612d80565b348015610ba557600080fd5b50610693612e09565b348015610bba57600080fd5b5061067c60048036036040811015610bd157600080fd5b506001600160a01b0381358116916020013516612e10565b348015610bf557600080fd5b5061069360048036036040811015610c0c57600080fd5b506001600160a01b0381358116916020013516613017565b348015610c3057600080fd5b5061067c60048036036020811015610c4757600080fd5b50356001600160a01b0316613034565b348015610c6357600080fd5b5061069360048036036040811015610c7a57600080fd5b506001600160a01b03813581169160200135166130ac565b348015610c9e57600080fd5b50610ca76130c9565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610ce3578181015183820152602001610ccb565b505050509050019250505060405180910390f35b348015610d0357600080fd5b506105ca60048036036020811015610d1a57600080fd5b50356001600160a01b031661312b565b61067c60048036036020811015610d4057600080fd5b50356001600160a01b0316613150565b348015610d5c57600080fd5b50610d8360048036036020811015610d7357600080fd5b50356001600160a01b03166132a9565b6040805163ffffffff9092168252519081900360200190f35b348015610da857600080fd5b5061069360048036036020811015610dbf57600080fd5b50356001600160a01b03166132c1565b348015610ddb57600080fd5b5061067c60048036036020811015610df257600080fd5b50356001600160a01b03166132dc565b348015610e0e57600080fd5b5061067c60048036036020811015610e2557600080fd5b50356001600160a01b0316613355565b348015610e4157600080fd5b5061069360048036036020811015610e5857600080fd5b50356001600160a01b03166133f6565b348015610e7457600080fd5b5061069360048036036040811015610e8b57600080fd5b506001600160a01b038135169060200135613408565b348015610ead57600080fd5b5061069360048036036020811015610ec457600080fd5b50356001600160a01b0316613617565b348015610ee057600080fd5b5061067c60048036036020811015610ef757600080fd5b50356001600160a01b0316613629565b348015610f1357600080fd5b506105f36136db565b348015610f2857600080fd5b5061069360048036036060811015610f3f57600080fd5b506001600160a01b0381358116916020810135821691604090910135166136e0565b348015610f6d57600080fd5b5061067c60048036036060811015610f8457600080fd5b506001600160a01b03813581169160208101359091169060400135613703565b348015610fb057600080fd5b5061067c60048036036060811015610fc757600080fd5b506001600160a01b038135811691602081013590911690604001356139ba565b348015610ff357600080fd5b5061051c613afe565b34801561100857600080fd5b506106936004803603604081101561101f57600080fd5b506001600160a01b0381358116916020013516613b20565b34801561104357600080fd5b5061067c6004803603602081101561105a57600080fd5b5035613b3d565b34801561106d57600080fd5b506106936004803603604081101561108457600080fd5b506001600160a01b0381358116916020013516613bba565b3480156110a857600080fd5b5061067c600480360360408110156110bf57600080fd5b506001600160a01b038135169060200135613bd7565b3480156110e157600080fd5b5061067c600480360360408110156110f857600080fd5b506001600160a01b038135169060200135613e60565b34801561111a57600080fd5b506105ca6004803603604081101561113157600080fd5b506001600160a01b038135169060200135613f4e565b34801561115357600080fd5b5061067c6004803603602081101561116a57600080fd5b50356001600160a01b0316613f64565b34801561118657600080fd5b506105ca6004803603602081101561119d57600080fd5b50356001600160a01b0316613fdb565b3480156111b957600080fd5b50610ca7613ff0565b3480156111ce57600080fd5b50610693600480360360208110156111e557600080fd5b50356001600160a01b0316614050565b34801561120157600080fd5b5061067c6004803603602081101561121857600080fd5b50356001600160a01b03166140b4565b34801561123457600080fd5b506106936004803603606081101561124b57600080fd5b506001600160a01b0381358116916020810135821691604090910135166141e0565b34801561127957600080fd5b5061067c600480360360c081101561129057600080fd5b506001600160a01b038135169060208101359060408101359060ff6060820135169060808101359060a00135614203565b3480156112cd57600080fd5b5061067c600480360360208110156112e457600080fd5b50356001600160a01b0316614441565b34801561130057600080fd5b50610693614596565b34801561131557600080fd5b5061067c6004803603604081101561132c57600080fd5b506001600160a01b03813516906020013561459b565b34801561134e57600080fd5b506106936004803603602081101561136557600080fd5b50356001600160a01b0316614661565b34801561138157600080fd5b5061067c600480360360e081101561139857600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135614673565b3480156113df57600080fd5b5061067c600480360360408110156113f657600080fd5b506001600160a01b038135169060200135614917565b34801561141857600080fd5b506106936004803603602081101561142f57600080fd5b50356001600160a01b0316614a7b565b34801561144b57600080fd5b506106936004803603604081101561146257600080fd5b506001600160a01b0381358116916020013516614a8d565b34801561148657600080fd5b5061067c6004803603604081101561149d57600080fd5b506001600160a01b038135169060200135614ab8565b3480156114bf57600080fd5b50610693600480360360408110156114d657600080fd5b506001600160a01b0381358116916020013516614b83565b3480156114fa57600080fd5b506106936004803603606081101561151157600080fd5b506001600160a01b038135811691602081013582169160409091013516614ba0565b34801561153f57600080fd5b506106936004803603602081101561155657600080fd5b50356001600160a01b0316614bc3565b34801561157257600080fd5b5061067c6004803603606081101561158957600080fd5b506001600160a01b03813581169160208101359091169060400135614bd5565b3480156115b557600080fd5b50610693614d26565b3480156115ca57600080fd5b506105ca600480360360208110156115e157600080fd5b50356001600160a01b0316614d4a565b3480156115fd57600080fd5b50610693614d5f565b34801561161257600080fd5b506105f36004803603602081101561162957600080fd5b5035614d65565b34801561163c57600080fd5b5061166f6004803603604081101561165357600080fd5b5080356001600160a01b0316906020013563ffffffff16614d72565b6040805163ffffffff909316835260208301919091528051918290030190f35b34801561169b57600080fd5b506105f3614d9f565b3480156116b057600080fd5b5061067c600480360360208110156116c757600080fd5b50356001600160a01b0316614dae565b3480156116e357600080fd5b506105ca600480360360a08110156116fa57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060800135614e58565b34801561173257600080fd5b506105ca6004803603602081101561174957600080fd5b50356001600160a01b0316614f09565b34801561176557600080fd5b506106936004803603606081101561177c57600080fd5b506001600160a01b038135811691602081013582169160409091013516614f1e565b3480156117aa57600080fd5b50610ca7614f41565b604051806040016040528060088152602001673932a5b2b2b819b960c11b81525081565b3360008181526007602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b6001546001600160a01b031681565b6020818154811061185a57fe5b6000918252602090912001546001600160a01b0316905081565b336000908152601c602090815260408083206001600160a01b0387811685529083528184209086168452909152902054156118ef576040805162461bcd60e51b815260206004820152601660248201527518dc99591a5d0e881c195b991a5b99c818dc99591a5d60521b604482015290519081900360640190fd5b6118fc4262127500614fa1565b3360008181526018602090815260408083206001600160a01b038981168086529184528285209089168086529084528285209690965593835260198252808320938352928152828220938252929092529020546119599082614fa1565b3360008181526019602090815260408083206001600160a01b03898116808652918452828520908916808652818552838620889055958552601784528285209185529083528184209484529382529091205491905210156119eb5760405162461bcd60e51b815260040180806020018281038252602a815260200180615f4a602a913960400191505060405180910390fd5b6040805163cbc3ab5360e01b81526001600160a01b03851660048201523060248201529051600091737e39d5cf0e0a25e76ae892fba71f6136973a40509163cbc3ab5391604480820192602092909190829003018186803b158015611a4f57600080fd5b505af4158015611a63573d6000803e3d6000fd5b505050506040513d6020811015611a7957600080fd5b5051604080516318160ddd60e01b81529051919250600091611b02916001600160a01b038816916318160ddd91600480820192602092909190829003018186803b158015611ac657600080fd5b505afa158015611ada573d6000803e3d6000fd5b505050506040513d6020811015611af057600080fd5b5051611afc8486614fe4565b9061503c565b6001600160a01b0385166000908152601660209081526040808320308452909152902054909150811115611b88576001600160a01b038416600090815260166020908152604080832030808552925290912054611b5f9190615067565b6001600160a01b0384166000908152601660209081526040808320308452909152812055611be5565b611b923082615067565b6001600160a01b0384166000908152601660209081526040808320308452909152902054611bc09082615168565b6001600160a01b03851660009081526016602090815260408083203084529091529020555b336001600160a01b0316856001600160a01b0316856001600160a01b03167f6d962fe34dd0cf9a9df3e12a7b8ddfe5f790b3f11668553455d7b52db70a07be4387604051808381526020018281526020019250505060405180910390a45050505050565b7fb7b8df9e260851867e5332764a78c21df0ff06344c2c3e84236784212a8daead81565b60035481565b601c60209081526000938452604080852082529284528284209052825290205481565b60146020526000908152604090205481565b6024818154811061185a57fe5b336000908152601e602052604090205460ff1615611d12576040805162461bcd60e51b81526020600482015260156024820152741858dd1a5d985d194e88189b1858dadb1a5cdd1959605a1b604482015290519081900360640190fd5b336000908152600a602090815260408083206001600160a01b038516845290915290205415801590611d665750336000908152600a602090815260408083206001600160a01b038516845290915290205442115b611dab576040805162461bcd60e51b815260206004820152601160248201527061637469766174653a20626f6e64696e6760781b604482015290519081900360640190fd5b611db53382615193565b50565b6203f48081565b60005a6025556001600160a01b0385166000908152601d602052604090205460ff168015611e2457506001600160a01b0385166000908152600f6020908152604080832054600e8352818420308552909252909120548591611e219190614fa1565b10155b8015611e4857506001600160a01b0385166000908152601460205260409020548311155b8015611e7857506001600160a01b0385166000908152601160205260409020548290611e75904290615168565b10155b95945050505050565b7f797cfab58fcb15f590eb8e4252d5c228ff88f94f907e119e80c4393a946e8f3581565b3360009081526015602052604090205460ff16611ef9576040805162461bcd60e51b815260206004820152600d60248201526c3932b1b2b4b83a1d1010b537b160991b604482015290519081900360640190fd5b604080518082018252601680825275775265633a20696e7375666669656e742066756e647360501b602080840191909152336000908152918152838220600e835290529190912054611f4c9183906152e1565b336000908152601660209081526040808320600e84528252808320939093556001600160a01b0385168083526013909152828220429055915183156108fc0291849190818181858888f19350505050158015611fac573d6000803e3d6000fd5b50604080514381526020810183905281516001600160a01b038516923392600e927f3cda93551ad083704be19fabbd7c3eb94d88f6e72ff221bdea9017e52e4144e8929181900390910190a45050565b60025481565b6022546001600160a01b03163314612061576040805162461bcd60e51b815260206004820152601d60248201527f616363657074476f7665726e616e63653a202170656e64696e67476f76000000604482015290519081900360640190fd5b602254602180546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b0383166000818152600760209081526040808320338085529252822054919290919082148015906120bf57506000198114155b156121505760006120eb85604051806060016040528060278152602001615f94602791398491906152e1565b6001600160a01b0380891660008181526007602090815260408083209489168084529482529182902085905581518581529151949550929391927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92592918290030190a3505b61215b868686615378565b50600195945050505050565b7f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e981565b601281565b600a60209081526000928352604080842090915290825290205481565b601d6020526000908152604090205460ff1681565b60156020526000908152604090205460ff1681565b611db53382615067565b6001600160a01b03821660009081526023602052604090205460ff16612249576040805162461bcd60e51b815260206004820152601860248201527730b2322634b8bab4b234ba3caa37a537b11d1010b830b4b960411b604482015290519081900360640190fd5b6001600160a01b038084166000908152601b6020908152604080832086851684528252808320938516835292905220546122bc576040805162461bcd60e51b815260206004820152600f60248201526e18dc99591a5d0e881b9bc8189bdb99608a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152601b6020908152604080832086851684528252808320938516835292905220544211612331576040805162461bcd60e51b815260206004820152600f60248201526e6372656469743a20626f6e64696e6760881b604482015290519081900360640190fd5b6040805163cbc3ab5360e01b81526001600160a01b03841660048201523060248201529051600091737e39d5cf0e0a25e76ae892fba71f6136973a40509163cbc3ab5391604480820192602092909190829003018186803b15801561239557600080fd5b505af41580156123a9573d6000803e3d6000fd5b505050506040513d60208110156123bf57600080fd5b5051604080516318160ddd60e01b81529051919250600091612473916001600160a01b038716916318160ddd91600480820192602092909190829003018186803b15801561240c57600080fd5b505afa158015612420573d6000803e3d6000fd5b505050506040513d602081101561243657600080fd5b50516001600160a01b038088166000908152601c602090815260408083208a85168452825280832093891683529290522054611afc908590614fe4565b905061247f3082615535565b6001600160a01b03831660009081526016602090815260408083203084529091529020546124ad9082614fa1565b6001600160a01b038085166000818152601660209081526040808320308452825280832095909555898416808352601c8252858320948a168084529482528583208484528252858320929092558451438152908101869052845191947fa90666688fb32254f45a367c38fbcd5f2664432b061a4354d9d3c9a7abcbec5b92918290030190a45050505050565b60105481565b3360009081526015602052604090205460ff16612590576040805162461bcd60e51b815260206004820152600a6024820152693ba932b19d1010b537b160b11b604482015290519081900360640190fd5b6001546001600160a01b031663525ea6316125ae5a60255490615168565b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156125e257600080fd5b505afa1580156125f6573d6000803e3d6000fd5b505050506040513d602081101561260c57600080fd5b5051811115612654576040805162461bcd60e51b815260206004820152600f60248201526e1dd49958ce881b585e081b1a5b5a5d608a1b604482015290519081900360640190fd5b604080518082018252601680825275775265633a20696e7375666669656e742066756e647360501b602080840191909152336000908152918152838220308352905291909120546126a69183906152e1565b3360009081526016602090815260408083203084528252808320939093556001600160a01b038516825260139052204290556126e282826155ae565b6001600160a01b0382166000908152601460205260409020546127059082614fa1565b6001600160a01b03831660008181526014602090815260409182902093909355805143815292830184905280519192339230927f3cda93551ad083704be19fabbd7c3eb94d88f6e72ff221bdea9017e52e4144e8928290030190a45050565b600260005414156127aa576040805162461bcd60e51b815260206004820152601f6024820152600080516020615f2a833981519152604482015290519081900360640190fd5b60026000908155338152600b602090815260408083206001600160a01b0385168452909152902054158015906128025750336000908152600b602090815260408083206001600160a01b038516845290915290205442115b612849576040805162461bcd60e51b815260206004820152601360248201527277697468647261773a20756e626f6e64696e6760681b604482015290519081900360640190fd5b3360009081526012602052604090205460ff16156128a3576040805162461bcd60e51b815260206004820152601260248201527177697468647261773a20646973707574657360701b604482015290519081900360640190fd5b6001600160a01b0381163014156128e857336000818152600c602090815260408083206001600160a01b03861684529091529020546128e3913091615378565b612917565b336000818152600c602090815260408083206001600160a01b0386168085529252909120546129179290615667565b336000818152600c602090815260408083206001600160a01b038616845282529182902054825143815242928101929092528183015290517f095ae150bb74a0755c30809eb8d4aa810b63b66b9ca96a1945bbb03d809df2e99181900360600190a2336000908152600c602090815260408083206001600160a01b0394909416835292905290812081905560019055565b600260005414156129ee576040805162461bcd60e51b815260206004820152601f6024820152600080516020615f2a833981519152604482015290519081900360640190fd5b600260009081556001600160a01b03841681526023602052604090205460ff16612a5a576040805162461bcd60e51b815260206004820152601860248201527730b2322634b8bab4b234ba3caa37a537b11d1010b830b4b960411b604482015290519081900360640190fd5b612a6f6001600160a01b0384163330846156be565b3360009081526017602090815260408083206001600160a01b0387811685529083528184209086168452909152902054612aa99082614fa1565b3360009081526017602090815260408083206001600160a01b0388811685529083528184209087168452909152902055612ae6426203f480614fa1565b336000818152601b602090815260408083206001600160a01b0389811680865291845282852090891680865290845282852096909655938352601c825280832093835292815282822093825292909252902054612b439082614fa1565b336000908152601c602090815260408083206001600160a01b038881168552908352818420908716845282528083209390935560159052205460ff16158015612ba357506001600160a01b0382166000908152601a602052604090205442115b15612c3e576021546040805163dc380cbb60e01b81526001600160a01b0385811660048301529151919092169163dc380cbb91602480830192600092919082900301818387803b158015612bf657600080fd5b505af1158015612c0a573d6000803e3d6000fd5b50505050612c246212750042614fa190919063ffffffff16565b6001600160a01b0383166000908152601a60205260409020555b336001600160a01b0316836001600160a01b0316836001600160a01b03167fe1cb44a16adbd63a44f65c279b23b8f447b2c6e120a2bc7f004758b446e05ed14385604051808381526020018281526020019250505060405180910390a45050600160005550565b6021546001600160a01b03163314612cf4576040805162461bcd60e51b815260206004820152600d60248201526c3932b9b7b63b329d1010b3b7bb60991b604482015290519081900360640190fd5b6001600160a01b038116600081815260126020908152604091829020805460ff19169055815143815291517f7574a4a2c81b3099d59aaf15526ea966e1e2886afd21bf4a350af7af22db3a709281900390910190a250565b6004602052600090815260409020546001600160a01b031681565b6021546001600160a01b031681565b611db5338261571e565b600154611db59082906001600160a01b031663525ea631612da45a60255490615168565b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612dd857600080fd5b505afa158015612dec573d6000803e3d6000fd5b505050506040513d6020811015612e0257600080fd5b505161253f565b6212750081565b3360009081526018602090815260408083206001600160a01b0386811685529083528184209085168452909152902054612e85576040805162461bcd60e51b81526020600482015260116024820152701c995b5bdd99529bd88e881d5b989bdb99607a1b604482015290519081900360640190fd5b3360009081526018602090815260408083206001600160a01b03868116855290835281842090851684529091529020544211612eff576040805162461bcd60e51b815260206004820152601460248201527372656d6f76654a6f623a20756e626f6e64696e6760601b604482015290519081900360640190fd5b3360008181526019602090815260408083206001600160a01b038781168086529184528285209087168086529084528285205495855260178452828520918552908352818420908452909152902054612f589082615168565b3360008181526017602090815260408083206001600160a01b038981168086529184528285209089168086529084528285209690965584845260198352818420818552835281842095845294909152812055612fb5919083615667565b336001600160a01b0316836001600160a01b0316836001600160a01b03167fb69fc9f6d19ed402461251491f86c736bfcbe966e9584d3fb8a0057b313b69204385604051808381526020018281526020019250505060405180910390a4505050565b601660209081526000928352604080842090915290825290205481565b6021546001600160a01b0316331461308b576040805162461bcd60e51b81526020600482015260156024820152743932bb37b5b2a634b8bab4b234ba3c9d1010b3b7bb60591b604482015290519081900360640190fd5b6001600160a01b03166000908152602360205260409020805460ff19169055565b600c60209081526000928352604080842090915290825290205481565b6060602080548060200260200160405190810160405280929190818152602001828054801561312157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613103575b5050505050905090565b60005a602555506001600160a01b03166000908152601d602052604090205460ff1690565b6001600160a01b03811660009081526015602052604090205460ff166131b2576040805162461bcd60e51b815260206004820152601260248201527130b23221b932b234ba22aa241d1010b537b160711b604482015290519081900360640190fd5b60006131c5612710611afc34601e614fe4565b90506131ff6131d43483615168565b6001600160a01b0384166000908152601660209081526040808320600e845290915290205490614fa1565b6001600160a01b038084166000908152601660209081526040808320600e8452909152808220939093556021549251929091169183156108fc0291849190818181858888f1935050505015801561325a573d6000803e3d6000fd5b5060408051438152346020820152815133926001600160a01b03861692600e927fb97975ea9bf5ae2173b9ea765214622396032aba11cd5cc1450c760ac80d059a929181900390910190a45050565b60066020526000908152604090205463ffffffff1681565b6001600160a01b031660009081526008602052604090205490565b6021546001600160a01b03163314613333576040805162461bcd60e51b815260206004820152601560248201527439b2ba25b2b2b819b92432b63832b91d1010b3b7bb60591b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6021546001600160a01b031633146133a2576040805162461bcd60e51b815260206004820152600b60248201526a39b630b9b41d1010b3b7bb60a91b604482015290519081900360640190fd5b6001600160a01b0381166000908152601d60209081526040808320805460ff19908116909155601e835281842080549091166001179055600e825280832030808552925290912054611db591908390614bd5565b601a6020526000908152604090205481565b600043821061344f576040805162461bcd60e51b815260206004820152600e60248201526d33b2ba283934b7b92b37ba32b99d60911b604482015290519081900360640190fd5b6001600160a01b03831660009081526006602052604090205463ffffffff168061347d576000915050611838565b6001600160a01b038416600090815260056020908152604080832063ffffffff6000198601811685529252909120541683106134ec576001600160a01b03841660009081526005602090815260408083206000199490940163ffffffff16835292905220600101549050611838565b6001600160a01b038416600090815260056020908152604080832083805290915290205463ffffffff16831015613527576000915050611838565b600060001982015b8163ffffffff168163ffffffff1611156135e057600282820363ffffffff16048103613559615f12565b506001600160a01b038716600090815260056020908152604080832063ffffffff8086168552908352928190208151808301909252805490931680825260019093015491810191909152908714156135bb576020015194506118389350505050565b805163ffffffff168711156135d2578193506135d9565b6001820392505b505061352f565b506001600160a01b038516600090815260056020908152604080832063ffffffff9094168352929052206001015491505092915050565b60096020526000908152604090205481565b6021546001600160a01b0316331461367a576040805162461bcd60e51b815260206004820152600f60248201526e3932b6b7bb32a537b11d1010b3b7bb60891b604482015290519081900360640190fd5b6001600160a01b038116600081815260156020908152604091829020805460ff191690558151438152339181019190915281517f2ca18fdfae50f1042480d285d21f6706aa6abbd567d60a044b5bec07ccfee648929181900390910190a250565b600e81565b601960209081526000938452604080852082529284528284209052825290205481565b60026000541415613749576040805162461bcd60e51b815260206004820152601f6024820152600080516020615f2a833981519152604482015290519081900360640190fd5b600260009081556001600160a01b03831681526015602052604090205460ff166137af576040805162461bcd60e51b815260206004820152601260248201527130b23221b932b234ba22aa241d1010b537b160711b604482015290519081900360640190fd5b6000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156137fe57600080fd5b505afa158015613812573d6000803e3d6000fd5b505050506040513d602081101561382857600080fd5b505190506138416001600160a01b0385163330856156be565b60006138c682866001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561389457600080fd5b505afa1580156138a8573d6000803e3d6000fd5b505050506040513d60208110156138be57600080fd5b505190615168565b905060006138db612710611afc84601e614fe4565b90506139166138ea8383615168565b6001600160a01b038088166000908152601660209081526040808320938c168352929052205490614fa1565b6001600160a01b0380871660009081526016602090815260408083208b851680855292529091209290925560215461395092911683615667565b336001600160a01b0316856001600160a01b0316876001600160a01b03167fb97975ea9bf5ae2173b9ea765214622396032aba11cd5cc1450c760ac80d059a4386604051808381526020018281526020019250505060405180910390a45050600160005550505050565b3360009081526015602052604090205460ff16613a0e576040805162461bcd60e51b815260206004820152600d60248201526c3932b1b2b4b83a1d1010b537b160991b604482015290519081900360640190fd5b604080518082018252601680825275775265633a20696e7375666669656e742066756e647360501b6020808401919091523360009081529181528382206001600160a01b038816835290529190912054613a699183906152e1565b3360009081526016602090815260408083206001600160a01b0388811680865291845282852095909555938616835260139091529020429055613aad908383615667565b604080514381526020810183905281516001600160a01b03808616933393918816927f3cda93551ad083704be19fabbd7c3eb94d88f6e72ff221bdea9017e52e4144e89281900390910190a4505050565b604051806040016040528060068152602001652922a5a819a960d11b81525081565b600b60209081526000928352604080842090915290825290205481565b6021546001600160a01b03163314613b89576040805162461bcd60e51b815260206004820152600a60248201526936b4b73a1d1010b3b7bb60b11b604482015290519081900360640190fd5b600254600354613b999083614fa1565b1115613ba457600080fd5b602154611db5906001600160a01b031682615535565b600e60209081526000928352604080842090915290825290205481565b60026000541415613c1d576040805162461bcd60e51b815260206004820152601f6024820152600080516020615f2a833981519152604482015290519081900360640190fd5b60026000908155338152601e602052604090205460ff1615613c7a576040805162461bcd60e51b8152602060048201526011602482015270189bdb990e88189b1858dadb1a5cdd1959607a1b604482015290519081900360640190fd5b613c87426203f480614fa1565b336000908152600a602090815260408083206001600160a01b038716808552925290912091909155301415613cc657613cc1333083615378565b613dad565b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613d1557600080fd5b505afa158015613d29573d6000803e3d6000fd5b505050506040513d6020811015613d3f57600080fd5b50519050613d586001600160a01b0384163330856156be565b613da981846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561389457600080fd5b9150505b336000908152600d602090815260408083206001600160a01b0386168452909152902054613ddb9082614fa1565b336000818152600d602090815260408083206001600160a01b03881680855290835281842095909555838352600a82528083209483529381529083902054835143815291820152808301849052915190917fa150b7ad789014c0171a2873708daadbdbf87457d90d3896eaf0907e5b225ae4919081900360600190a250506001600055565b613e6d4262127500614fa1565b336000818152600b602090815260408083206001600160a01b0388168452909152902091909155613ea0908390836157cd565b336000908152600c602090815260408083206001600160a01b0386168452909152902054613ece9082614fa1565b336000818152600c602090815260408083206001600160a01b03881680855290835281842095909555838352600b82528083209483529381529083902054835143815291820152808301849052915190917f50eca01e7e4362bc0279a45c4fbe68f263771dd3418b0a29c93008759f433b2e919081900360600190a25050565b6000613f5b338484615378565b50600192915050565b6021546001600160a01b03163314613fb9576040805162461bcd60e51b815260206004820152601360248201527239b2ba23b7bb32b93730b731b29d1010b3b7bb60691b604482015290519081900360640190fd5b602280546001600160a01b0319166001600160a01b0392909216919091179055565b60126020526000908152604090205460ff1681565b6060601f805480602002602001604051908101604052809291908181526020018280548015613121576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311613103575050505050905090565b6001600160a01b03811660009081526006602052604081205463ffffffff168061407b5760006140ad565b6001600160a01b038316600090815260056020908152604080832063ffffffff60001986011684529091529020600101545b9392505050565b6021546001600160a01b0316331461410c576040805162461bcd60e51b815260206004820152601660248201527530b8383937bb32a634b8bab4b234ba3c9d1010b3b7bb60511b604482015290519081900360640190fd5b6001600160a01b03811660009081526023602052604090205460ff161561417a576040805162461bcd60e51b815260206004820152601760248201527f617070726f76654c69717569646974793a202170616972000000000000000000604482015290519081900360640190fd5b6001600160a01b03166000818152602360205260408120805460ff191660019081179091556024805491820181559091527f7cd332d19b93bcabe3cce7ca0c18a052f57e5fd03b4758a09f30f5ddc4b22ec40180546001600160a01b0319169091179055565b601860209081526000938452604080852082529284528284209052825290205481565b604080517f1ac861a6a8532f3704e1768564a53a32774f00d6cf20ccbbdf60ab61378302bc6020808301919091526001600160a01b038916828401526060820188905260808083018890528351808403909101815260a08301845280519082012061190160f01b60c08401527fb7b8df9e260851867e5332764a78c21df0ff06344c2c3e84236784212a8daead60c284015260e2808401829052845180850390910181526101028401808652815191840191909120600091829052610122850180875281905260ff891661014286015261016285018890526101828501879052945191949390926001926101a280840193601f198301929081900390910190855afa158015614316573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614373576040805162461bcd60e51b815260206004820152601260248201527164656c656761746542795369673a2073696760701b604482015290519081900360640190fd5b6001600160a01b038116600090815260096020526040902080546001810190915588146143de576040805162461bcd60e51b815260206004820152601460248201527364656c656761746542795369673a206e6f6e636560601b604482015290519081900360640190fd5b8642111561442c576040805162461bcd60e51b815260206004820152601660248201527519195b1959d85d19509e54da59ce88195e1c1a5c995960521b604482015290519081900360640190fd5b614436818a61571e565b505050505050505050565b6021546001600160a01b0316331461448f576040805162461bcd60e51b815260206004820152600c60248201526b30b2322537b11d1010b3b7bb60a11b604482015290519081900360640190fd5b6001600160a01b03811660009081526015602052604090205460ff16156144f1576040805162461bcd60e51b815260206004820152601160248201527030b2322537b11d103537b11035b737bbb760791b604482015290519081900360640190fd5b6001600160a01b0381166000818152601560209081526040808320805460ff1916600190811790915582549081018355928290527fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bb90920180546001600160a01b031916841790558151438152339181019190915281517f3d9884fbd11fce9188657c4bcfda7491d3316ce97bd234d981b7be1f012a852f929181900390910190a250565b601e81565b6021546001600160a01b031633146145eb576040805162461bcd60e51b815260206004820152600e60248201526d30b2322b37ba32b99d1010b3b7bb60911b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205461460e9082615168565b6001600160a01b0383166000908152600f60205260409020556010546146349082615168565b6010556001600160a01b0380831660009081526004602052604081205461465d92169083615862565b5050565b60136020526000908152604090205481565b6001600160a01b0380881660008181526009602090815260408083208054600180820190925582517f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e98186015280840196909652958c166060860152608085018b905260a085019590955260c08085018a90528151808603909101815260e08501825280519083012061190160f01b6101008601527fb7b8df9e260851867e5332764a78c21df0ff06344c2c3e84236784212a8daead61010286015261012280860182905282518087039091018152610142860180845281519185019190912090859052610162860180845281905260ff8a166101828701526101a286018990526101c2860188905291519095919491926101e2808401939192601f1981019281900390910190855afa1580156147ae573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661480a576040805162461bcd60e51b81526020600482015260116024820152707065726d69743a207369676e617475726560781b604482015290519081900360640190fd5b896001600160a01b0316816001600160a01b031614614867576040805162461bcd60e51b81526020600482015260146024820152731c195c9b5a5d0e881d5b985d5d1a1bdc9a5e995960621b604482015290519081900360640190fd5b864211156148ae576040805162461bcd60e51b815260206004820152600f60248201526e1c195c9b5a5d0e88195e1c1a5c9959608a1b604482015290519081900360640190fd5b6001600160a01b03808b166000818152600760209081526040808320948e16808452948252918290208c905581518c815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a350505050505050505050565b6021546001600160a01b0316331461496b576040805162461bcd60e51b815260206004820152601260248201527130b23225a82921b932b234ba1d1010b3b7bb60711b604482015290519081900360640190fd5b6001600160a01b03821660009081526015602052604090205460ff166149cd576040805162461bcd60e51b815260206004820152601260248201527130b23225a82921b932b234ba1d1010b537b160711b604482015290519081900360640190fd5b6001600160a01b03821660009081526016602090815260408083203084529091529020546149fb9082614fa1565b6001600160a01b038316600090815260166020908152604080832030808552925290912091909155614a2d9082615535565b6040805143815260208101839052815133926001600160a01b0386169230927fb97975ea9bf5ae2173b9ea765214622396032aba11cd5cc1450c760ac80d059a929181900390910190a45050565b600f6020526000908152604090205481565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b6021546001600160a01b03163314614b08576040805162461bcd60e51b815260206004820152600e60248201526d30b2322b37ba32b99d1010b3b7bb60911b604482015290519081900360640190fd5b614b128230615193565b6001600160a01b0382166000908152600f6020526040902054614b359082614fa1565b6001600160a01b0383166000908152600f6020526040902055601054614b5b9082614fa1565b6010556001600160a01b0380831660009081526004602052604081205461465d921683615862565b600d60209081526000928352604080842090915290825290205481565b601760209081526000938452604080852082529284528284209052825290205481565b60116020526000908152604090205481565b60026000541415614c1b576040805162461bcd60e51b815260206004820152601f6024820152600080516020615f2a833981519152604482015290519081900360640190fd5b60026000556021546001600160a01b03163314614c6d576040805162461bcd60e51b815260206004820152600b60248201526a39b630b9b41d1010b3b7bb60a91b604482015290519081900360640190fd5b6001600160a01b038316301415614c9b57602154614c969030906001600160a01b031683615378565b614cb5565b602154614cb5906001600160a01b03858116911683615667565b614cc08383836157cd565b6001600160a01b038216600081815260126020908152604091829020805460ff19169055815143815290810184905281513393927ff7e41ea76f0e7b22ba17dc4cc01fa75cff34ea24f5efe2874f5e175296259050928290030190a35050600160005550565b7f1ac861a6a8532f3704e1768564a53a32774f00d6cf20ccbbdf60ab61378302bc81565b60236020526000908152604090205460ff1681565b61271081565b601f818154811061185a57fe5b60056020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6022546001600160a01b031681565b6021546001600160a01b03163314614dfd576040805162461bcd60e51b815260206004820152600d60248201526c3234b9b83aba329d1010b3b7bb60991b604482015290519081900360640190fd5b6001600160a01b038116600081815260126020908152604091829020805460ff19166001179055815143815291517ffb2bdfce35c242f34d4f9633225d3c34a5892d5eae9ce102de6aac188dd25ba09281900390910190a250565b60005a6025556001600160a01b0386166000908152601d602052604090205460ff168015614eab57506001600160a01b038087166000908152600e60209081526040808320938916835292905220548411155b8015614ecf57506001600160a01b0386166000908152601460205260409020548311155b8015614eff57506001600160a01b0386166000908152601160205260409020548290614efc904290615168565b10155b9695505050505050565b601e6020526000908152604090205460ff1681565b601b60209081526000938452604080852082529284528284209052825290205481565b60606024805480602002602001604051908101604052809291908181526020018280548015613121576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311613103575050505050905090565b6000828201838110156140ad576040805162461bcd60e51b81526020600482015260066024820152656164643a202b60d01b604482015290519081900360640190fd5b600082614ff357506000611838565b8282028284828161500057fe5b04146140ad576040805162461bcd60e51b815260206004820152600660248201526536bab61d101560d11b604482015290519081900360640190fd5b60006140ad8383604051806040016040528060068152602001656469763a202f60d01b8152506159e0565b6001600160a01b0382166150b8576040805162461bcd60e51b81526020600482015260136024820152725f6275726e3a207a65726f206164647265737360681b604482015290519081900360640190fd5b60408051808201825260168152755f6275726e3a20657863656564732062616c616e636560501b6020808301919091526001600160a01b03851660009081526008909152919091205461510c9183906152e1565b6001600160a01b0383166000908152600860205260409020556003546151329082615168565b6003556040805182815290516000916001600160a01b03851691600080516020615f748339815191529181900360200190a35050565b60006140ad8383604051806040016040528060068152602001657375623a202d60d01b8152506152e1565b6001600160a01b038216600090815260116020526040902054615218576001600160a01b03821660008181526011602090815260408083204290819055601f8054600181019091557fa03837a25210ee280c2113ff4b77ca23440b19d4866cca721c801278fd08d8070180546001600160a01b03191690951790945560139091529020555b6001600160a01b038083166000908152601d60209081526040808320805460ff19166001179055600d82528083209385168352929052205461525d9082908490615a45565b6001600160a01b038083166000818152600d60209081526040808320948616808452948252808320839055838352600e825280832094835293815290839020548351438152429281019290925281840152915190917f3d80dd4660c08288217e88c2d45230220fcd3debf16898013243026e6a2aad05919081900360600190a25050565b600081848411156153705760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561533557818101518382015260200161531d565b50505050905090810190601f1680156153625780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b0383166153d3576040805162461bcd60e51b815260206004820152601d60248201527f5f7472616e73666572546f6b656e733a207a65726f2061646472657373000000604482015290519081900360640190fd5b6001600160a01b03821661542e576040805162461bcd60e51b815260206004820152601d60248201527f5f7472616e73666572546f6b656e733a207a65726f2061646472657373000000604482015290519081900360640190fd5b60408051808201825260208082527f5f7472616e73666572546f6b656e733a20657863656564732062616c616e6365818301526001600160a01b0386166000908152600890915291909120546154859183906152e1565b6001600160a01b0380851660009081526008602081815260408084209590955584518086018652601a81527f5f7472616e73666572546f6b656e733a206f766572666c6f77730000000000008183015293871683525291909120546154eb918390615add565b6001600160a01b038084166000818152600860209081526040918290209490945580518581529051919392871692600080516020615f7483398151915292918290030190a3505050565b6003546155429082614fa1565b6003556001600160a01b0382166000908152600860205260409020546155689082614fa1565b6001600160a01b0383166000818152600860209081526040808320949094558351858152935192939192600080516020615f748339815191529281900390910190a35050565b6001600160a01b0382166000908152600e602090815260408083203084529091529020546155dc9082614fa1565b6001600160a01b0383166000908152600e6020908152604080832030845290915290205560105461560d9082614fa1565b6010556001600160a01b03808316600090815260046020526040812054615635921683615862565b6040805182815290516001600160a01b038416913391600080516020615f748339815191529181900360200190a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526156b9908490615b3b565b505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052615718908590615b3b565b50505050565b6001600160a01b03808316600081815260046020908152604080832054600e8352818420308552835281842054948452600f90925282205493169290916157659190614fa1565b6001600160a01b0385811660008181526004602052604080822080546001600160a01b031916898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4615718828483615862565b6001600160a01b038083166000908152600e60209081526040808320938716835292905220546157fd9082615168565b6001600160a01b038084166000908152600e60209081526040808320938816808452939091529020919091553014156156b95760105461583d9082615168565b6010556001600160a01b038083166000908152600460205260408120546156b9921690835b816001600160a01b0316836001600160a01b0316141580156158845750600081115b156156b9576001600160a01b0383161561594f576001600160a01b03831660009081526006602052604081205463ffffffff1690816158c45760006158f6565b6001600160a01b038516600090815260056020908152604080832063ffffffff60001987011684529091529020600101545b9050600061593d84604051806040016040528060168152602001755f6d6f7665566f7465733a20756e646572666c6f777360501b815250846152e19092919063ffffffff16565b905061594b86848484615cf6565b5050505b6001600160a01b038216156156b9576001600160a01b03821660009081526006602052604081205463ffffffff16908161598a5760006159bc565b6001600160a01b038416600090815260056020908152604080832063ffffffff60001987011684529091529020600101545b905060006159ca8285614fa1565b90506159d885848484615cf6565b505050505050565b60008183615a2f5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561533557818101518382015260200161531d565b506000838581615a3b57fe5b0495945050505050565b6001600160a01b038083166000908152600e6020908152604080832093871683529290522054615a759082614fa1565b6001600160a01b038084166000908152600e60209081526040808320938816808452939091529020919091553014156156b957601054615ab59082614fa1565b6010556001600160a01b038083166000908152600460205260408120546156b9921683615862565b60008383018285821015615b325760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561533557818101518382015260200161531d565b50949350505050565b615b4d826001600160a01b0316615e78565b615b95576040805162461bcd60e51b815260206004820152601460248201527314d85999515490cc8c0e880858dbdb9d1c9858dd60621b604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310615bd35780518252601f199092019160209182019101615bb4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114615c35576040519150601f19603f3d011682016040523d82523d6000602084013e615c3a565b606091505b509150915081615c91576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561571857808060200190516020811015615cad57600080fd5b5051615718576040805162461bcd60e51b815260206004820152601360248201527214d85999515490cc8c0e88085cdd58d8d95959606a1b604482015290519081900360640190fd5b6000615d37436040518060400160405280601981526020017f5f7772697465436865636b706f696e743a203332206269747300000000000000815250615eb4565b905060008463ffffffff16118015615d8057506001600160a01b038516600090815260056020908152604080832063ffffffff6000198901811685529252909120548282169116145b15615dbd576001600160a01b038516600090815260056020908152604080832063ffffffff60001989011684529091529020600101829055615e2e565b60408051808201825263ffffffff808416825260208083018681526001600160a01b038a166000818152600584528681208b8616825284528681209551865490861663ffffffff19918216178755925160019687015590815260069092529390208054928801909116919092161790555b604080518481526020810184905281516001600160a01b038816927fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724928290030190a25050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590615eac57508115155b949350505050565b6000816401000000008410615f0a5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561533557818101518382015260200161531d565b509192915050565b60408051808201909152600080825260208201529056fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c00756e626f6e644c697175696469747946726f6d4a6f623a20696e73756666696369656e742066756e6473ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef7472616e7366657246726f6d3a2065786365656473207370656e64657220616c6c6f77616e6365a26469706673582212205e5ccd9c1630a48303264db588c9dba63ec7b2b2bb2a617f8d3218596613c30364736f6c634300060c0033

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

000000000000000000000000253ab0eb036b17fad6b986d95b95e8e43d2aabed00000000000000000000000000000000000000000000152d02c7e14af6800000

-----Decoded View---------------
Arg [0] : _kph (address): 0x253AB0eB036b17FAD6b986d95b95e8e43D2aAbeD
Arg [1] : _maxCap (uint256): 100000000000000000000000

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000253ab0eb036b17fad6b986d95b95e8e43d2aabed
Arg [1] : 00000000000000000000000000000000000000000000152d02c7e14af6800000


Libraries Used


Deployed Bytecode Sourcemap

17438:40472:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17700:40;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54358:205;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;54358:205:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;17614:27;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;17614:27:0;;;;;;;;;;;;;;30755:24;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30755:24:0;;:::i;37701:1130::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37701:1130:0;;;;;;;;;;;;;;;;;:::i;:::-;;18817:40;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;18076:27;;;;;;;;;;;;;:::i;30260:87::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30260:87:0;;;;;;;;;;;;;;;;;;;:::i;29267:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29267:45:0;-1:-1:-1;;;;;29267:45:0;;:::i;31054:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31054:31:0;;:::i;49523:274::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49523:274:0;-1:-1:-1;;;;;49523:274:0;;:::i;27807:43::-;;;;;;;;;;;;;:::i;47000:355::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;47000:355:0;;;;;;;;;;;;;;;;;;:::i;18691:119::-;;;;;;;;;;;;;:::i;42869:369::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42869:369:0;;;;;;;;:::i;17991:21::-;;;;;;;;;;;;;:::i;45972:170::-;;;;;;;;;;;;;:::i;56752:553::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;56752:553:0;;;;;;;;;;;;;;;;;:::i;19152:128::-;;;;;;;;;;;;;:::i;17904:35::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28131:60;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28131:60:0;;;;;;;;;;:::i;30401:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30401:39:0;-1:-1:-1;;;;;30401:39:0;;:::i;29386:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29386:36:0;-1:-1:-1;;;;;29386:36:0;;:::i;40221:80::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40221:80:0;;:::i;36680:798::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36680:798:0;;;;;;;;;;;;;;;;;;;:::i;28853:27::-;;;;;;;;;;;;;:::i;41410:546::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;41410:546:0;;;;;;;;:::i;50978:673::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50978:673:0;-1:-1:-1;;;;;50978:673:0;;:::i;35594:822::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35594:822:0;;;;;;;;;;;;;;;;;:::i;53245:198::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53245:198:0;-1:-1:-1;;;;;53245:198:0;;:::i;18177:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18177:45:0;-1:-1:-1;;;;;18177:45:0;;:::i;30852:25::-;;;;;;;;;;;;;:::i;20089:95::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20089:95:0;-1:-1:-1;;;;;20089:95:0;;:::i;41061:124::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41061:124:0;-1:-1:-1;;;;;41061:124:0;;:::i;27711:37::-;;;;;;;;;;;;;:::i;39014:673::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39014:673:0;;;;;;;;;;:::i;29485:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29485:59:0;;;;;;;;;;:::i;34997:177::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34997:177:0;-1:-1:-1;;;;;34997:177:0;;:::i;28367:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28367:68:0;;;;;;;;;;:::i;44748:93::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46385:130;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46385:130:0;-1:-1:-1;;;;;46385:130:0;;:::i;31635:354::-;;;;;;;;;;;;;;;;-1:-1:-1;31635:354:0;-1:-1:-1;;;;;31635:354:0;;:::i;18444:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18444:49:0;-1:-1:-1;;;;;18444:49:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;55929:108;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55929:108:0;-1:-1:-1;;;;;55929:108:0;;:::i;45357:157::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45357:157:0;-1:-1:-1;;;;;45357:157:0;;:::i;52864:246::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52864:246:0;-1:-1:-1;;;;;52864:246:0;;:::i;30029:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30029:48:0;-1:-1:-1;;;;;30029:48:0;;:::i;22074:1191::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22074:1191:0;;;;;;;;:::i;19363:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19363:39:0;-1:-1:-1;;;;;19363:39:0;;:::i;45012:197::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45012:197:0;-1:-1:-1;;;;;45012:197:0;;:::i;28028:42::-;;;;;;;;;;;;;:::i;29889:97::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29889:97:0;;;;;;;;;;;;;;;;;;;:::i;32242:627::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32242:627:0;;;;;;;;;;;;;;;;;:::i;42241:402::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42241:402:0;;;;;;;;;;;;;;;;;:::i;17801:40::-;;;;;;;;;;;;;:::i;28252:62::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28252:62:0;;;;;;;;;;:::i;39919:191::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39919:191:0;;:::i;28625:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28625:57:0;;;;;;;;;;:::i;48428:743::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;48428:743:0;;;;;;;;:::i;50457:368::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50457:368:0;;;;;;;;:::i;56298:147::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;56298:147:0;;;;;;;;:::i;45679:170::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45679:170:0;-1:-1:-1;;;;;45679:170:0;;:::i;29054:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29054:40:0;-1:-1:-1;;;;;29054:40:0;;:::i;49252:99::-;;;;;;;;;;;;;:::i;21423:220::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21423:220:0;-1:-1:-1;;;;;21423:220:0;;:::i;34548:295::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34548:295:0;-1:-1:-1;;;;;34548:295:0;;:::i;29747:90::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29747:90:0;;;;;;;;;;;;;;;;;;;:::i;20618:604::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20618:604:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;44376:267::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44376:267:0;-1:-1:-1;;;;;44376:267:0;;:::i;27902:29::-;;;;;;;;;;;;;:::i;33531:289::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33531:289:0;;;;;;;;:::i;29159:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29159:39:0;-1:-1:-1;;;;;29159:39:0;;:::i;55050:676::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;55050:676:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34014:380::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34014:380:0;;;;;;;;:::i;28753:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28753:37:0;-1:-1:-1;;;;;28753:37:0;;:::i;53747:136::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53747:136:0;;;;;;;;;;:::i;33032:328::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33032:328:0;;;;;;;;:::i;28501:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28501:64:0;;;;;;;;;;:::i;29609:89::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29609:89:0;;;;;;;;;;;;;;;;;;;:::i;28946:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28946:41:0;-1:-1:-1;;;;;28946:41:0;;:::i;52229:491::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52229:491:0;;;;;;;;;;;;;;;;;:::i;18951:111::-;;;;;;;;;;;;;:::i;30996:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30996:49:0;-1:-1:-1;;;;;30996:49:0;;:::i;27938:33::-;;;;;;;;;;;;;:::i;30643:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30643:27:0;;:::i;18305:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18305:70:0;;-1:-1:-1;;;;;18305:70:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;30884:32;;;;;;;;;;;;;:::i;51795:196::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51795:196:0;-1:-1:-1;;;;;51795:196:0;;:::i;47892:344::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;47892:344:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30512:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30512:41:0;-1:-1:-1;;;;;30512:41:0;;:::i;30122:88::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30122:88:0;;;;;;;;;;;;;;;;;;;:::i;35254:98::-;;;;;;;;;;;;;:::i;17700:40::-;;;;;;;;;;;;;;-1:-1:-1;;;17700:40:0;;;;:::o;54358:205::-;54449:10;54421:4;54438:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;54438:31:0;;;;;;;;;;;:40;;;54496:37;;;;;;;54421:4;;54438:31;;54449:10;;54496:37;;;;;;;;-1:-1:-1;54551:4:0;54358:205;;;;;:::o;17614:27::-;;;-1:-1:-1;;;;;17614:27:0;;:::o;30755:24::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30755:24:0;;-1:-1:-1;30755:24:0;:::o;37701:1130::-;37822:10;37806:27;;;;:15;:27;;;;;;;;-1:-1:-1;;;;;37806:38:0;;;;;;;;;;;:43;;;;;;;;;;;:48;37798:83;;;;;-1:-1:-1;;;37798:83:0;;;;;;;;;;;;-1:-1:-1;;;37798:83:0;;;;;;;;;;;;;;;37941:15;:3;27741:7;37941;:15::i;:::-;37911:10;37892:30;;;;:18;:30;;;;;;;;-1:-1:-1;;;;;37892:41:0;;;;;;;;;;;;:46;;;;;;;;;;;;:64;;;;38023:37;;;:25;:37;;;;;:48;;;;;;;;;:53;;;;;;;;;;:65;;38081:6;38023:57;:65::i;:::-;37993:10;37967:37;;;;:25;:37;;;;;;;;-1:-1:-1;;;;;37967:48:0;;;;;;;;;;;;:53;;;;;;;;;;;;:121;;;38164:29;;;:17;:29;;;;;:40;;;;;;;;;:45;;;;;;;;;;38107:53;;;-1:-1:-1;38107:102:0;38099:157;;;;-1:-1:-1;;;38099:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38287:52;;;-1:-1:-1;;;38287:52:0;;-1:-1:-1;;;;;38287:52:0;;;;;;38333:4;38287:52;;;;;;38269:15;;38287;;:26;;:52;;;;;;;;;;;;;;;:15;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38287:52:0;38392:31;;;-1:-1:-1;;;38392:31:0;;;;38287:52;;-1:-1:-1;38350:12:0;;38365:59;;-1:-1:-1;;;;;38392:29:0;;;;;:31;;;;;38287:52;;38392:31;;;;;;;;:29;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38392:31:0;38365:22;:10;38380:6;38365:14;:22::i;:::-;:26;;:59::i;:::-;-1:-1:-1;;;;;38449:12:0;;;;;;:7;:12;;;;;;;;38470:4;38449:27;;;;;;;;38350:74;;-1:-1:-1;38439:37:0;;38435:312;;;-1:-1:-1;;;;;38514:12:0;;;;;;:7;:12;;;;;;;;38507:4;38514:27;;;;;;;;;38493:49;;38507:4;38493:5;:49::i;:::-;-1:-1:-1;;;;;38557:12:0;;38587:1;38557:12;;;:7;:12;;;;;;;;38578:4;38557:27;;;;;;;:31;38435:312;;;38621:29;38635:4;38642:7;38621:5;:29::i;:::-;-1:-1:-1;;;;;38695:12:0;;;;;;:7;:12;;;;;;;;38716:4;38695:27;;;;;;;;:40;;38727:7;38695:31;:40::i;:::-;-1:-1:-1;;;;;38665:12:0;;;;;;:7;:12;;;;;;;;38686:4;38665:27;;;;;;;:70;38435:312;38790:10;-1:-1:-1;;;;;38764:59:0;38779:9;-1:-1:-1;;;;;38764:59:0;38774:3;-1:-1:-1;;;;;38764:59:0;;38802:12;38816:6;38764:59;;;;;;;;;;;;;;;;;;;;;;;;37701:1130;;;;;:::o;18817:40::-;;;:::o;18076:27::-;;;;:::o;30260:87::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29267:45::-;;;;;;;;;;;;;:::o;31054:31::-;;;;;;;;;;49523:274;49597:10;49587:21;;;;:9;:21;;;;;;;;49586:22;49578:56;;;;;-1:-1:-1;;;49578:56:0;;;;;;;;;;;;-1:-1:-1;;;49578:56:0;;;;;;;;;;;;;;;49662:10;49653:20;;;;:8;:20;;;;;;;;-1:-1:-1;;;;;49653:29:0;;;;;;;;;;:34;;;;:73;;-1:-1:-1;49700:10:0;49691:20;;;;:8;:20;;;;;;;;-1:-1:-1;;;;;49691:29:0;;;;;;;;;;49723:3;-1:-1:-1;49653:73:0;49645:103;;;;;-1:-1:-1;;;49645:103:0;;;;;;;;;;;;-1:-1:-1;;;49645:103:0;;;;;;;;;;;;;;;49759:30;49769:10;49781:7;49759:9;:30::i;:::-;49523:274;:::o;27807:43::-;27844:6;27807:43;:::o;47000:355::-;47092:4;47120:9;47109:8;:20;-1:-1:-1;;;;;47147:15:0;;;;;;:7;:15;;;;;;;;:94;;;;-1:-1:-1;;;;;;47216:13:0;;;;;;:5;:13;;;;;;;;;47183:5;:13;;;;;47205:4;47183:28;;;;;;;;;47234:7;;47183:47;;:28;:32;:47::i;:::-;:58;;47147:94;:146;;;;-1:-1:-1;;;;;;47262:21:0;;;;;;:13;:21;;;;;;:31;-1:-1:-1;47262:31:0;47147:146;:200;;;;-1:-1:-1;;;;;;47322:17:0;;;;;;:9;:17;;;;;;47344:3;;47314:26;;:3;;:7;:26::i;:::-;:33;;47147:200;47140:207;47000:355;-1:-1:-1;;;;;47000:355:0:o;18691:119::-;18733:77;18691:119;:::o;42869:369::-;42951:10;42946:16;;;;:4;:16;;;;;;;;42938:42;;;;;-1:-1:-1;;;42938:42:0;;;;;;;;;;;;-1:-1:-1;;;42938:42:0;;;;;;;;;;;;;;;43018:62;;;;;;;;;;;;-1:-1:-1;;;43018:62:0;;;;;;;;43026:10;-1:-1:-1;43018:19:0;;;;;;;;;28066:3;43018:24;;;;;;;;;:62;;43047:6;;43018:28;:62::i;:::-;42999:10;42991:19;;;;:7;:19;;;;;;;;28066:3;42991:24;;;;;;;:89;;;;-1:-1:-1;;;;;43091:15:0;;;;;:7;:15;;;;;;43109:3;43091:21;;43123:32;;;;;;;43148:6;;43123:32;;42991:19;43123:32;43148:6;43091:15;43123:32;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43171:59:0;;;43209:12;43171:59;;;;;;;;;;-1:-1:-1;;;;;43171:59:0;;;43189:10;;28066:3;;43171:59;;;;;;;;;;;42869:369;;:::o;17991:21::-;;;;:::o;45972:170::-;46042:17;;-1:-1:-1;;;;;46042:17:0;46028:10;:31;46020:73;;;;;-1:-1:-1;;;46020:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46117:17;;46104:10;:30;;-1:-1:-1;;;;;;46104:30:0;-1:-1:-1;;;;;46117:17:0;;;46104:30;;;;;;45972:170::o;56752:553::-;-1:-1:-1;;;;;56911:15:0;;56831:4;56911:15;;;:10;:15;;;;;;;;56866:10;56911:24;;;;;;;;56831:4;;56866:10;;56911:24;56952:14;;;;;:46;;;-1:-1:-1;;56970:16:0;:28;;56952:46;56948:282;;;57015:17;57035:71;57056:6;57035:71;;;;;;;;;;;;;;;;;:16;;:71;:20;:71::i;:::-;-1:-1:-1;;;;;57121:15:0;;;;;;;:10;:15;;;;;;;;:24;;;;;;;;;;;;;:39;;;57182:36;;;;;;;57015:91;;-1:-1:-1;57121:24:0;;:15;;57182:36;;;;;;;;;56948:282;;57242:33;57258:3;57263;57268:6;57242:15;:33::i;:::-;-1:-1:-1;57293:4:0;;56752:553;-1:-1:-1;;;;;56752:553:0:o;19152:128::-;19194:86;19152:128;:::o;17904:35::-;17937:2;17904:35;:::o;28131:60::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;30401:39::-;;;;;;;;;;;;;;;:::o;29386:36::-;;;;;;;;;;;;;;;:::o;40221:80::-;40268:25;40274:10;40286:6;40268:5;:25::i;36680:798::-;-1:-1:-1;;;;;36784:28:0;;;;;;:17;:28;;;;;;;;36776:65;;;;;-1:-1:-1;;;36776:65:0;;;;;;;;;;;;-1:-1:-1;;;36776:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36860:26:0;;;;;;;:16;:26;;;;;;;;:37;;;;;;;;;;:42;;;;;;;;;;36852:75;;;;;-1:-1:-1;;;36852:75:0;;;;;;;;;;;;-1:-1:-1;;;36852:75:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36946:26:0;;;;;;;:16;:26;;;;;;;;:37;;;;;;;;;;:42;;;;;;;;;;36991:3;-1:-1:-1;36938:76:0;;;;;-1:-1:-1;;;36938:76:0;;;;;;;;;;;;-1:-1:-1;;;36938:76:0;;;;;;;;;;;;;;;37043:52;;;-1:-1:-1;;;37043:52:0;;-1:-1:-1;;;;;37043:52:0;;;;;;37089:4;37043:52;;;;;;37025:15;;37043;;:26;;:52;;;;;;;;;;;;;;;:15;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37043:52:0;37183:31;;;-1:-1:-1;;;37183:31:0;;;;37043:52;;-1:-1:-1;37106:12:0;;37121:94;;-1:-1:-1;;;;;37183:29:0;;;;;:31;;;;;37043:52;;37183:31;;;;;;;;:29;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37183:31:0;-1:-1:-1;;;;;37136:25:0;;;;;;;:15;37183:31;37136:25;;;;;;;:36;;;;;;;;;;:41;;;;;;;;;;37121:57;;:10;;:14;:57::i;:94::-;37106:109;;37226:29;37240:4;37247:7;37226:5;:29::i;:::-;-1:-1:-1;;;;;37296:12:0;;;;;;:7;:12;;;;;;;;37317:4;37296:27;;;;;;;;:40;;37328:7;37296:31;:40::i;:::-;-1:-1:-1;;;;;37266:12:0;;;;;;;:7;:12;;;;;;;;37287:4;37266:27;;;;;;;:70;;;;37347:25;;;;;;:15;:25;;;;;:36;;;;;;;;;;;;:41;;;;;;;;:45;;;;37410:60;;37448:12;37410:60;;;;;;;;;;37347:25;;37410:60;;;;;;;;;36680:798;;;;;:::o;28853:27::-;;;;:::o;41410:546::-;41491:10;41486:16;;;;:4;:16;;;;;;;;41478:39;;;;;-1:-1:-1;;;41478:39:0;;;;;;;;;;;;-1:-1:-1;;;41478:39:0;;;;;;;;;;;;;;;41546:4;;-1:-1:-1;;;;;41546:4:0;:18;41565:23;41578:9;41565:8;;;:12;:23::i;:::-;41546:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41546:43:0;41536:53;;;41528:81;;;;;-1:-1:-1;;;41528:81:0;;;;;;;;;;;;-1:-1:-1;;;41528:81:0;;;;;;;;;;;;;;;41657:72;;;;;;;;;;;;-1:-1:-1;;;41657:72:0;;;;;;;;41665:10;-1:-1:-1;41657:19:0;;;;;;;;;41685:4;41657:34;;;;;;;;;:72;;41696:6;;41657:38;:72::i;:::-;41628:10;41620:19;;;;:7;:19;;;;;;;;41648:4;41620:34;;;;;;;:109;;;;-1:-1:-1;;;;;41740:15:0;;;;:7;:15;;;41758:3;41740:21;;41772:23;41748:6;41788;41772:7;:23::i;:::-;-1:-1:-1;;;;;41830:21:0;;;;;;:13;:21;;;;;;:33;;41856:6;41830:25;:33::i;:::-;-1:-1:-1;;;;;41806:21:0;;;;;;:13;:21;;;;;;;;;:57;;;;41879:69;;41927:12;41879:69;;;;;;;;;;41806:21;;41907:10;;41900:4;;41879:69;;;;;;;;41410:546;;:::o;50978:673::-;4111:1;4717:7;;:19;;4709:63;;;;;-1:-1:-1;;;4709:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4709:63:0;;;;;;;;;;;;;;;4111:1;4850:7;:18;;;51065:10:::1;51054:22:::0;;:10:::1;:22;::::0;;;;;;;-1:-1:-1;;;;;51054:31:0;::::1;::::0;;;;;;;;:36;;::::1;::::0;:77:::1;;-1:-1:-1::0;51105:10:0::1;51094:22;::::0;;;:10:::1;:22;::::0;;;;;;;-1:-1:-1;;;;;51094:31:0;::::1;::::0;;;;;;;;51128:3:::1;-1:-1:-1::0;51054:77:0::1;51046:109;;;::::0;;-1:-1:-1;;;51046:109:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;51046:109:0;;;;;;;;;;;;;::::1;;51184:10;51175:20;::::0;;;:8:::1;:20;::::0;;;;;::::1;;51174:21;51166:52;;;::::0;;-1:-1:-1;;;51166:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;51166:52:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;51235:24:0;::::1;51254:4;51235:24;51231:250;;;51307:10;51319:28;::::0;;;:16:::1;:28;::::0;;;;;;;-1:-1:-1;;;;;51319:37:0;::::1;::::0;;;;;;;;51276:81:::1;::::0;51300:4:::1;::::0;51276:15:::1;:81::i;:::-;51231:250;;;51419:10;51431:28;::::0;;;:16:::1;:28;::::0;;;;;;;-1:-1:-1;;;;;51431:37:0;::::1;::::0;;;;;;;;;51390:79:::1;::::0;51419:10;51390:28:::1;:79::i;:::-;51510:10;51553:28;::::0;;;:16:::1;:28;::::0;;;;;;;-1:-1:-1;;;;;51553:37:0;::::1;::::0;;;;;;;;;51496:95;;51522:12:::1;51496:95:::0;;51536:15:::1;51496:95:::0;;::::1;::::0;;;;;;;;;;::::1;::::0;;;;;;;::::1;51619:10;51642:1;51602:28:::0;;;:16:::1;:28;::::0;;;;;;;-1:-1:-1;;;;;51602:37:0;;;::::1;::::0;;;;;;;;:41;;;4067:1;5029:22;;50978:673::o;35594:822::-;4111:1;4717:7;;:19;;4709:63;;;;;-1:-1:-1;;;4709:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4709:63:0;;;;;;;;;;;;;;;4111:1;4850:7;:18;;;-1:-1:-1;;;;;35707:28:0;::::1;::::0;;:17:::1;:28;::::0;;;;;::::1;;35699:65;;;::::0;;-1:-1:-1;;;35699:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35699:65:0;;;;;;;;;;;;;::::1;;35775:69;-1:-1:-1::0;;;;;35775:34:0;::::1;35810:10;35830:4;35837:6:::0;35775:34:::1;:69::i;:::-;35921:10;35903:29;::::0;;;:17:::1;:29;::::0;;;;;;;-1:-1:-1;;;;;35903:40:0;;::::1;::::0;;;;;;;;:45;;::::1;::::0;;;;;;;;:57:::1;::::0;35953:6;35903:49:::1;:57::i;:::-;35873:10;35855:29;::::0;;;:17:::1;:29;::::0;;;;;;;-1:-1:-1;;;;;35855:40:0;;::::1;::::0;;;;;;;;:45;;::::1;::::0;;;;;;;:105;36020:22:::1;:3;27844:6;36020:7;:22::i;:::-;35990:10;35973:28;::::0;;;:16:::1;:28;::::0;;;;;;;-1:-1:-1;;;;;35973:39:0;;::::1;::::0;;;;;;;;;:44;;::::1;::::0;;;;;;;;;:69;;;;36099:27;;;:15:::1;:27:::0;;;;;:38;;;;;;;;;:43;;;;;;;;;;:55:::1;::::0;36147:6;36099:47:::1;:55::i;:::-;36069:10;36053:27;::::0;;;:15:::1;:27;::::0;;;;;;;-1:-1:-1;;;;;36053:38:0;;::::1;::::0;;;;;;;;:43;;::::1;::::0;;;;;;;:101;;;;36172:4:::1;:9:::0;;;;::::1;;36171:10;:41:::0;::::1;;;-1:-1:-1::0;;;;;;36185:21:0;::::1;;::::0;;;:16:::1;:21;::::0;;;;;36209:3:::1;-1:-1:-1::0;36171:41:0::1;36167:167;;;36241:10;::::0;36229:39:::1;::::0;;-1:-1:-1;;;36229:39:0;;-1:-1:-1;;;;;36229:39:0;;::::1;;::::0;::::1;::::0;;;36241:10;;;::::1;::::0;36229:34:::1;::::0;:39;;;;;36241:10:::1;::::0;36229:39;;;;;;;36241:10;;36229:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;36307:15;27741:7;36307:3;:7;;:15;;;;:::i;:::-;-1:-1:-1::0;;;;;36283:21:0;::::1;;::::0;;;:16:::1;:21;::::0;;;;:39;36167:167:::1;36375:10;-1:-1:-1::0;;;;;36349:59:0::1;36364:9;-1:-1:-1::0;;;;;36349:59:0::1;36359:3;-1:-1:-1::0;;;;;36349:59:0::1;;36387:12;36401:6;36349:59;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;4067:1:0;5029:7;:22;-1:-1:-1;35594:822:0:o;53245:198::-;53320:10;;-1:-1:-1;;;;;53320:10:0;53306;:24;53298:50;;;;;-1:-1:-1;;;53298:50:0;;;;;;;;;;;;-1:-1:-1;;;53298:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;53359:16:0;;53378:5;53359:16;;;:8;:16;;;;;;;;;:24;;-1:-1:-1;;53359:24:0;;;53399:36;;53422:12;53399:36;;;;;;;;;;;;;;53245:198;:::o;18177:45::-;;;;;;;;;;;;-1:-1:-1;;;;;18177:45:0;;:::o;30852:25::-;;;-1:-1:-1;;;;;30852:25:0;;:::o;20089:95::-;20144:32;20154:10;20166:9;20144;:32::i;41061:124::-;41133:4;;41113:64;;41125:6;;-1:-1:-1;;;;;41133:4:0;:18;41152:23;41165:9;41152:8;;;:12;:23::i;:::-;41133:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41133:43:0;41113:11;:64::i;27711:37::-;27741:7;27711:37;:::o;39014:673::-;39125:10;39106:30;;;;:18;:30;;;;;;;;-1:-1:-1;;;;;39106:41:0;;;;;;;;;;;:46;;;;;;;;;;;39098:81;;;;;-1:-1:-1;;;39098:81:0;;;;;;;;;;;;-1:-1:-1;;;39098:81:0;;;;;;;;;;;;;;;39217:10;39198:30;;;;:18;:30;;;;;;;;-1:-1:-1;;;;;39198:41:0;;;;;;;;;;;:46;;;;;;;;;;;39247:3;-1:-1:-1;39190:85:0;;;;;-1:-1:-1;;;39190:85:0;;;;;;;;;;;;-1:-1:-1;;;39190:85:0;;;;;;;;;;;;;;;39327:10;39286:12;39301:37;;;:25;:37;;;;;;;;-1:-1:-1;;;;;39301:48:0;;;;;;;;;;;;:53;;;;;;;;;;;;;39413:29;;;:17;:29;;;;;:40;;;;;;;;;:45;;;;;;;;;:58;;39301:53;39413:49;:58::i;:::-;39383:10;39365:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;39365:40:0;;;;;;;;;;;;:45;;;;;;;;;;;;:106;;;;39482:37;;;:25;:37;;;;;:48;;;;;;;;:53;;;;;;;;;:57;39550:51;;39365:40;39593:7;39550:30;:51::i;:::-;39645:10;-1:-1:-1;;;;;39619:60:0;39634:9;-1:-1:-1;;;;;39619:60:0;39629:3;-1:-1:-1;;;;;39619:60:0;;39657:12;39671:7;39619:60;;;;;;;;;;;;;;;;;;;;;;;;39014:673;;;:::o;29485:59::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;34997:177::-;35083:10;;-1:-1:-1;;;;;35083:10:0;35069;:24;35061:58;;;;;-1:-1:-1;;;35061:58:0;;;;;;;;;;;;-1:-1:-1;;;35061:58:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35130:28:0;35161:5;35130:28;;;:17;:28;;;;;:36;;-1:-1:-1;;35130:36:0;;;34997:177::o;28367:68::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;44748:93::-;44790:16;44826:7;44819:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44819:14:0;;;;;;;;;;;;;;;;;;;;;;;44748:93;:::o;46385:130::-;46437:4;46465:9;46454:8;:20;-1:-1:-1;;;;;;46492:15:0;;;;;:7;:15;;;;;;;;;46385:130::o;31635:354::-;-1:-1:-1;;;;;31706:9:0;;;;;;:4;:9;;;;;;;;31698:40;;;;;-1:-1:-1;;;31698:40:0;;;;;;;;;;;;-1:-1:-1;;;31698:40:0;;;;;;;;;;;;;;;31749:9;31761:28;27966:5;31761:18;:9;27929:2;31761:13;:18::i;:28::-;31749:40;-1:-1:-1;31820:42:0;31842:19;:9;31749:40;31842:13;:19::i;:::-;-1:-1:-1;;;;;31820:12:0;;;;;;:7;:12;;;;;;;;28066:3;31820:17;;;;;;;;;:21;:42::i;:::-;-1:-1:-1;;;;;31800:12:0;;;;;;;:7;:12;;;;;;;;28066:3;31800:17;;;;;;;;:62;;;;31881:10;;31873:34;;31881:10;;;;;31873:34;;;;;31902:4;;31873:34;;31800:12;31873:34;31902:4;31881:10;31873:34;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31925:56:0;;;31957:12;31925:56;;31971:9;31925:56;;;;;;31945:10;;-1:-1:-1;;;;;31925:56:0;;;28066:3;;31925:56;;;;;;;;;;;31635:354;;:::o;18444:49::-;;;;;;;;;;;;;;;:::o;55929:108::-;-1:-1:-1;;;;;56012:17:0;55988:4;56012:17;;;:8;:17;;;;;;;55929:108::o;45357:157::-;45447:10;;-1:-1:-1;;;;;45447:10:0;45433;:24;45425:58;;;;;-1:-1:-1;;;45425:58:0;;;;;;;;;;;;-1:-1:-1;;;45425:58:0;;;;;;;;;;;;;;;45494:4;:12;;-1:-1:-1;;;;;;45494:12:0;-1:-1:-1;;;;;45494:12:0;;;;;;;;;;45357:157::o;52864:246::-;52938:10;;-1:-1:-1;;;;;52938:10:0;52924;:24;52916:48;;;;;-1:-1:-1;;;52916:48:0;;;;;;;;;;;;-1:-1:-1;;;52916:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;52975:15:0;;52993:5;52975:15;;;:7;:15;;;;;;;;:23;;-1:-1:-1;;52975:23:0;;;;;;53009:9;:17;;;;;:24;;;;;52975:23;53009:24;;;53073:5;:13;;;;;53058:4;53073:28;;;;;;;;;53044:58;;53058:4;52983:6;;53044:5;:58::i;30029:48::-;;;;;;;;;;;;;:::o;22074:1191::-;22153:4;22192:12;22178:11;:26;22170:53;;;;;-1:-1:-1;;;22170:53:0;;;;;;;;;;;;-1:-1:-1;;;22170:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;22258:23:0;;22236:19;22258:23;;;:14;:23;;;;;;;;22296:17;22292:58;;22337:1;22330:8;;;;;22292:58;-1:-1:-1;;;;;22410:20:0;;;;;;:11;:20;;;;;;;;:38;-1:-1:-1;;22431:16:0;;22410:38;;;;;;;;;:48;;:63;-1:-1:-1;22406:147:0;;-1:-1:-1;;;;;22497:20:0;;;;;;:11;:20;;;;;;;;-1:-1:-1;;22518:16:0;;;;22497:38;;;;;;;;22533:1;22497:44;;;-1:-1:-1;22490:51:0;;22406:147;-1:-1:-1;;;;;22614:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;22610:88:0;;;22685:1;22678:8;;;;;22610:88;22710:12;-1:-1:-1;;22752:16:0;;22779:428;22794:5;22786:13;;:5;:13;;;22779:428;;;22858:1;22841:13;;;22840:19;;;22832:27;;22901:20;;:::i;:::-;-1:-1:-1;;;;;;22924:20:0;;;;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;22901:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22971:27;;22967:229;;;23026:8;;;;-1:-1:-1;23019:15:0;;-1:-1:-1;;;;23019:15:0;22967:229;23060:12;;:26;;;-1:-1:-1;23056:140:0;;;23115:6;23107:14;;23056:140;;;23179:1;23170:6;:10;23162:18;;23056:140;22779:428;;;;;-1:-1:-1;;;;;;23224:20:0;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;-1:-1:-1;;22074:1191:0;;;;:::o;19363:39::-;;;;;;;;;;;;;:::o;45012:197::-;45086:10;;-1:-1:-1;;;;;45086:10:0;45072;:24;45064:52;;;;;-1:-1:-1;;;45064:52:0;;;;;;;;;;;;-1:-1:-1;;;45064:52:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;45127:9:0;;45139:5;45127:9;;;:4;:9;;;;;;;;;:17;;-1:-1:-1;;45127:17:0;;;45160:41;;45176:12;45160:41;;45190:10;45160:41;;;;;;;;;;;;;;;;;;;;45012:197;:::o;28028:42::-;28066:3;28028:42;:::o;29889:97::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32242:627::-;4111:1;4717:7;;:19;;4709:63;;;;;-1:-1:-1;;;4709:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4709:63:0;;;;;;;;;;;;;;;4111:1;4850:7;:18;;;-1:-1:-1;;;;;32344:9:0;::::1;::::0;;:4:::1;:9;::::0;;;;;::::1;;32336:40;;;::::0;;-1:-1:-1;;;32336:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32336:40:0;;;;;;;;;;;;;::::1;;32387:12;32409:6;-1:-1:-1::0;;;;;32402:24:0::1;;32435:4;32402:39;;;;;;;;;;;;;-1:-1:-1::0;;;;;32402:39:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32402:39:0;;-1:-1:-1;32452:66:0::1;-1:-1:-1::0;;;;;32452:31:0;::::1;32484:10;32504:4;32511:6:::0;32452:31:::1;:66::i;:::-;32529:14;32546:52;32590:7;32553:6;-1:-1:-1::0;;;;;32546:24:0::1;;32579:4;32546:39;;;;;;;;;;;;;-1:-1:-1::0;;;;;32546:39:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32546:39:0;;:43:::1;:52::i;:::-;32529:69:::0;-1:-1:-1;32609:9:0::1;32621:28;27966:5;32621:18;32529:69:::0;27929:2:::1;32621:13;:18::i;:28::-;32609:40:::0;-1:-1:-1;32683:45:0::1;32708:19;:9:::0;32609:40;32708:13:::1;:19::i;:::-;-1:-1:-1::0;;;;;32683:12:0;;::::1;;::::0;;;:7:::1;:12;::::0;;;;;;;:20;;::::1;::::0;;;;;;;;:24:::1;:45::i;:::-;-1:-1:-1::0;;;;;32660:12:0;;::::1;;::::0;;;:7:::1;:12;::::0;;;;;;;:20;;::::1;::::0;;;;;;;;:68;;;;32767:10:::1;::::0;32739:45:::1;::::0;32660:20;32767:10:::1;32779:4:::0;32739:27:::1;:45::i;:::-;32825:10;-1:-1:-1::0;;;;;32802:59:0::1;32820:3;-1:-1:-1::0;;;;;32802:59:0::1;32812:6;-1:-1:-1::0;;;;;32802:59:0::1;;32837:12;32851:9;32802:59;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;4067:1:0;5029:7;:22;-1:-1:-1;;;;32242:627:0:o;42241:402::-;42336:10;42331:16;;;;:4;:16;;;;;;;;42323:42;;;;;-1:-1:-1;;;42323:42:0;;;;;;;;;;;;-1:-1:-1;;;42323:42:0;;;;;;;;;;;;;;;42406:65;;;;;;;;;;;;-1:-1:-1;;;42406:65:0;;;;;;;;42414:10;-1:-1:-1;42406:19:0;;;;;;;;;-1:-1:-1;;;;;42406:27:0;;;;;;;;;;;:65;;42438:6;;42406:31;:65::i;:::-;42384:10;42376:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;42376:27:0;;;;;;;;;;;;:95;;;;42482:15;;;;;:7;:15;;;;;42500:3;42482:21;;42514:43;;42490:6;42550;42514:27;:43::i;:::-;42573:62;;;42614:12;42573:62;;;;;;;;;;-1:-1:-1;;;;;42573:62:0;;;;42594:10;;42573:62;;;;;;;;;;;;;;42241:402;;;:::o;17801:40::-;;;;;;;;;;;;;;-1:-1:-1;;;17801:40:0;;;;:::o;28252:62::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;39919:191::-;39988:10;;-1:-1:-1;;;;;39988:10:0;39974;:24;39966:47;;;;;-1:-1:-1;;;39966:47:0;;;;;;;;;;;;-1:-1:-1;;;39966:47:0;;;;;;;;;;;;;;;40059:6;;40032:11;;:23;;40048:6;40032:15;:23::i;:::-;:33;;40024:42;;;;;;40083:10;;40077:25;;-1:-1:-1;;;;;40083:10:0;40095:6;40077:5;:25::i;28625:57::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;48428:743::-;4111:1;4717:7;;:19;;4709:63;;;;;-1:-1:-1;;;4709:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4709:63:0;;;;;;;;;;;;;;;4111:1;4850:7;:18;;;48524:10:::1;48514:21:::0;;:9:::1;:21;::::0;;;;;::::1;;48513:22;48505:52;;;::::0;;-1:-1:-1;;;48505:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;48505:52:0;;;;;;;;;;;;;::::1;;48600:13;:3;27627:6;48600:7;:13::i;:::-;48577:10;48568:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;48568:29:0;::::1;::::0;;;;;;;;:45;;;;48647:4:::1;48628:24;48624:354;;;48669:50;48685:10;48705:4;48712:6;48669:15;:50::i;:::-;48624:354;;;48752:12;48774:7;-1:-1:-1::0;;;;;48767:25:0::1;;48801:4;48767:40;;;;;;;;;;;;;-1:-1:-1::0;;;;;48767:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;48767:40:0;;-1:-1:-1;48822:67:0::1;-1:-1:-1::0;;;;;48822:32:0;::::1;48855:10;48875:4;48882:6:::0;48822:32:::1;:67::i;:::-;48913:53;48958:7;48920;-1:-1:-1::0;;;;;48913:25:0::1;;48947:4;48913:40;;;;;;;;;;;;;-1:-1:-1::0;;;;;48913:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;:53;48904:62;;48624:354;;49037:10;49024:24;::::0;;;:12:::1;:24;::::0;;;;;;;-1:-1:-1;;;;;49024:33:0;::::1;::::0;;;;;;;;:45:::1;::::0;49062:6;49024:37:::1;:45::i;:::-;49001:10;48988:24;::::0;;;:12:::1;:24;::::0;;;;;;;-1:-1:-1;;;;;48988:33:0;::::1;::::0;;;;;;;;;:81;;;;49125:20;;;:8:::1;:20:::0;;;;;:29;;;;;;;;;;;49085:78;;49111:12:::1;49085:78:::0;;;;::::1;::::0;;;;;;;;;49001:10;;49085:78:::1;::::0;;;;;;;;::::1;-1:-1:-1::0;;4067:1:0;5029:7;:22;48428:743::o;50457:368::-;50557:15;:3;27741:7;50557;:15::i;:::-;50534:10;50523:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;50523:31:0;;;;;;;;;:49;;;;50583:36;;50546:7;;50612:6;50583:7;:36::i;:::-;50687:10;50670:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;50670:37:0;;;;;;;;;;:49;;50712:6;50670:41;:49::i;:::-;50647:10;50630:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;50630:37:0;;;;;;;;;;;:89;;;;50777:22;;;:10;:22;;;;;:31;;;;;;;;;;;50735:82;;50763:12;50735:82;;;;;;;;;;;;;;50647:10;;50735:82;;;;;;;;;;50457:368;;:::o;56298:147::-;56358:4;56375:40;56391:10;56403:3;56408:6;56375:15;:40::i;:::-;-1:-1:-1;56433:4:0;56298:147;;;;:::o;45679:170::-;45765:10;;-1:-1:-1;;;;;45765:10:0;45751;:24;45743:56;;;;;-1:-1:-1;;;45743:56:0;;;;;;;;;;;;-1:-1:-1;;;45743:56:0;;;;;;;;;;;;;;;45810:17;:31;;-1:-1:-1;;;;;;45810:31:0;-1:-1:-1;;;;;45810:31:0;;;;;;;;;;45679:170::o;29054:40::-;;;;;;;;;;;;;;;:::o;49252:99::-;49297:16;49333:10;49326:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49326:17:0;;;;;;;;;;;;;;;;;;;;;;49252:99;:::o;21423:220::-;-1:-1:-1;;;;;21527:23:0;;21488:4;21527:23;;;:14;:23;;;;;;;;21568:16;:67;;21634:1;21568:67;;;-1:-1:-1;;;;;21587:20:0;;;;;;:11;:20;;;;;;;;:38;-1:-1:-1;;21608:16:0;;21587:38;;;;;;;;21623:1;21587:44;;21568:67;21561:74;21423:220;-1:-1:-1;;;21423:220:0:o;34548:295::-;34635:10;;-1:-1:-1;;;;;34635:10:0;34621;:24;34613:59;;;;;-1:-1:-1;;;34613:59:0;;;;;;;;;;;;-1:-1:-1;;;34613:59:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34692:28:0;;;;;;:17;:28;;;;;;;;34691:29;34683:65;;;;;-1:-1:-1;;;34683:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34759:28:0;;;;;:17;:28;;;;;:35;;-1:-1:-1;;34759:35:0;34790:4;34759:35;;;;;;34805:14;:30;;;;;;;;;;;;;;-1:-1:-1;;;;;;34805:30:0;;;;;;34548:295::o;29747:90::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20618:604::-;20765:57;;;18997:65;20765:57;;;;;;;;-1:-1:-1;;;;;20765:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20755:68;;;;;;-1:-1:-1;;;20861:57:0;;;;20890:15;20861:57;;;;;;;;;;;;;;;;;;;;;;;;;;;20851:68;;;;;;;;;20734:18;20950:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20755:68;;20851;20734:18;;20950:26;;;;;;;-1:-1:-1;;20950:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20950:26:0;;-1:-1:-1;;20950:26:0;;;-1:-1:-1;;;;;;;20995:23:0;;20987:54;;;;;-1:-1:-1;;;20987:54:0;;;;;;;;;;;;-1:-1:-1;;;20987:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;21069:17:0;;;;;;:6;:17;;;;;:19;;;;;;;;21060:28;;21052:61;;;;;-1:-1:-1;;;21052:61:0;;;;;;;;;;;;-1:-1:-1;;;21052:61:0;;;;;;;;;;;;;;;21139:6;21132:3;:13;;21124:48;;;;;-1:-1:-1;;;21124:48:0;;;;;;;;;;;;-1:-1:-1;;;21124:48:0;;;;;;;;;;;;;;;21183:31;21193:9;21204;21183;:31::i;:::-;20618:604;;;;;;;;;:::o;44376:267::-;44447:10;;-1:-1:-1;;;;;44447:10:0;44433;:24;44425:49;;;;;-1:-1:-1;;;44425:49:0;;;;;;;;;;;;-1:-1:-1;;;44425:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;44494:9:0;;;;;;:4;:9;;;;;;;;44493:10;44485:40;;;;;-1:-1:-1;;;44485:40:0;;;;;;;;;;;;-1:-1:-1;;;44485:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;44536:9:0;;;;;;:4;:9;;;;;;;;:16;;-1:-1:-1;;44536:16:0;44548:4;44536:16;;;;;;44563:17;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44563:17:0;;;;;44596:39;;44610:12;44596:39;;44624:10;44596:39;;;;;;;;;;;;;;;;;;;;44376:267;:::o;27902:29::-;27929:2;27902:29;:::o;33531:289::-;33622:10;;-1:-1:-1;;;;;33622:10:0;33608;:24;33600:51;;;;;-1:-1:-1;;;33600:51:0;;;;;;;;;;;;-1:-1:-1;;;33600:51:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33677:12:0;;;;;;:5;:12;;;;;;:24;;33694:6;33677:16;:24::i;:::-;-1:-1:-1;;;;;33662:12:0;;;;;;:5;:12;;;;;:39;33726:11;;:23;;33742:6;33726:15;:23::i;:::-;33712:11;:37;-1:-1:-1;;;;;33775:16:0;;;;;;;:9;:16;;;;;;33760:52;;33775:16;;33805:6;33760:14;:52::i;:::-;33531:289;;:::o;29159:39::-;;;;;;;;;;;;;:::o;55050:676::-;-1:-1:-1;;;;;55260:13:0;;;55177:18;55260:13;;;:6;:13;;;;;;;;:15;;;;;;;;;55208:78;;19194:86;55208:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55198:89;;;;;;-1:-1:-1;;;55325:57:0;;;;55354:15;55325:57;;;;;;;;;;;;;;;;;;;;;;;;;;;55315:68;;;;;;;;;55414:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55198:89;;55315:68;;55260:15;;55414:26;;;;;55260:13;;-1:-1:-1;;55414:26:0;;;;;;;;;;55260:15;55414:26;;;;;;;;;;;;;;;-1:-1:-1;;55414:26:0;;-1:-1:-1;;55414:26:0;;;-1:-1:-1;;;;;;;55459:23:0;;55451:53;;;;;-1:-1:-1;;;55451:53:0;;;;;;;;;;;;-1:-1:-1;;;55451:53:0;;;;;;;;;;;;;;;55536:5;-1:-1:-1;;;;;55523:18:0;:9;-1:-1:-1;;;;;55523:18:0;;55515:51;;;;;-1:-1:-1;;;55515:51:0;;;;;;;;;;;;-1:-1:-1;;;55515:51:0;;;;;;;;;;;;;;;55592:8;55585:3;:15;;55577:43;;;;;-1:-1:-1;;;55577:43:0;;;;;;;;;;;;-1:-1:-1;;;55577:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;55633:17:0;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;;;;;:35;;;55686:32;;;;;;;;;;;;;;;;;55050:676;;;;;;;;;;:::o;34014:380::-;34104:10;;-1:-1:-1;;;;;34104:10:0;34090;:24;34082:55;;;;;-1:-1:-1;;;34082:55:0;;;;;;;;;;;;-1:-1:-1;;;34082:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34156:9:0;;;;;;:4;:9;;;;;;;;34148:40;;;;;-1:-1:-1;;;34148:40:0;;;;;;;;;;;;-1:-1:-1;;;34148:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34229:12:0;;;;;;:7;:12;;;;;;;;34250:4;34229:27;;;;;;;;:39;;34261:6;34229:31;:39::i;:::-;-1:-1:-1;;;;;34199:12:0;;;;;;:7;:12;;;;;;;;34220:4;34199:27;;;;;;;;:69;;;;34279:28;;34300:6;34279:5;:28::i;:::-;34323:63;;;34365:12;34323:63;;;;;;;;;;34353:10;;-1:-1:-1;;;;;34323:63:0;;;34341:4;;34323:63;;;;;;;;;;;34014:380;;:::o;28753:37::-;;;;;;;;;;;;;:::o;53747:136::-;-1:-1:-1;;;;;53847:19:0;;;53823:4;53847:19;;;:10;:19;;;;;;;;:28;;;;;;;;;;;;;53747:136::o;33032:328::-;33120:10;;-1:-1:-1;;;;;33120:10:0;33106;:24;33098:51;;;;;-1:-1:-1;;;33098:51:0;;;;;;;;;;;;-1:-1:-1;;;33098:51:0;;;;;;;;;;;;;;;33160:31;33170:5;33185:4;33160:9;:31::i;:::-;-1:-1:-1;;;;;33217:12:0;;;;;;:5;:12;;;;;;:24;;33234:6;33217:16;:24::i;:::-;-1:-1:-1;;;;;33202:12:0;;;;;;:5;:12;;;;;:39;33266:11;;:23;;33282:6;33266:15;:23::i;:::-;33252:11;:37;-1:-1:-1;;;;;33327:16:0;;;33323:1;33327:16;;;:9;:16;;;;;;33300:52;;33327:16;33345:6;33300:14;:52::i;28501:64::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;29609:89::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28946:41::-;;;;;;;;;;;;;:::o;52229:491::-;4111:1;4717:7;;:19;;4709:63;;;;;-1:-1:-1;;;4709:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4709:63:0;;;;;;;;;;;;;;;4111:1;4850:7;:18;52342:10:::1;::::0;-1:-1:-1;;;;;52342:10:0::1;52328;:24;52320:48;;;::::0;;-1:-1:-1;;;52320:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;52320:48:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;52383:23:0;::::1;52401:4;52383:23;52379:186;;;52454:10;::::0;52423:50:::1;::::0;52447:4:::1;::::0;-1:-1:-1;;;;;52454:10:0::1;52466:6:::0;52423:15:::1;:50::i;:::-;52379:186;;;52534:10;::::0;52506:47:::1;::::0;-1:-1:-1;;;;;52506:27:0;;::::1;::::0;52534:10:::1;52546:6:::0;52506:27:::1;:47::i;:::-;52575:31;52583:6;52591;52599;52575:7;:31::i;:::-;-1:-1:-1::0;;;;;52617:16:0;::::1;52636:5;52617:16:::0;;;:8:::1;:16;::::0;;;;;;;;:24;;-1:-1:-1;;52617:24:0::1;::::0;;52657:55;;52691:12:::1;52657:55:::0;;;;::::1;::::0;;;;;52679:10:::1;::::0;52617:16;52657:55:::1;::::0;;;;;;::::1;-1:-1:-1::0;;4067:1:0;5029:7;:22;-1:-1:-1;52229:491:0:o;18951:111::-;18997:65;18951:111;:::o;30996:49::-;;;;;;;;;;;;;;;:::o;27938:33::-;27966:5;27938:33;:::o;30643:27::-;;;;;;;;;;18305:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30884:32::-;;;-1:-1:-1;;;;;30884:32:0;;:::o;51795:196::-;51870:10;;-1:-1:-1;;;;;51870:10:0;51856;:24;51848:50;;;;;-1:-1:-1;;;51848:50:0;;;;;;;;;;;;-1:-1:-1;;;51848:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;51909:16:0;;;;;;:8;:16;;;;;;;;;:23;;-1:-1:-1;;51909:23:0;51928:4;51909:23;;;51948:35;;51970:12;51948:35;;;;;;;;;;;;;;51795:196;:::o;47892:344::-;48001:4;48029:9;48018:8;:20;-1:-1:-1;;;;;48056:15:0;;;;;;:7;:15;;;;;;;;:66;;;;-1:-1:-1;;;;;;48092:13:0;;;;;;;:5;:13;;;;;;;;:19;;;;;;;;;;:30;-1:-1:-1;48092:30:0;48056:66;:118;;;;-1:-1:-1;;;;;;48143:21:0;;;;;;:13;:21;;;;;;:31;-1:-1:-1;48143:31:0;48056:118;:172;;;;-1:-1:-1;;;;;;48203:17:0;;;;;;:9;:17;;;;;;48225:3;;48195:26;;:3;;:7;:26::i;:::-;:33;;48056:172;48049:179;47892:344;-1:-1:-1;;;;;;47892:344:0:o;30512:41::-;;;;;;;;;;;;;;;:::o;30122:88::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35254:98::-;35294:16;35330:14;35323:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35323:21:0;;;;;;;;;;;;;;;;;;;;;;35254:98;:::o;346:148::-;398:4;424:5;;;448:6;;;;440:25;;;;;-1:-1:-1;;;440:25:0;;;;;;;;;;;;-1:-1:-1;;;440:25:0;;;;;;;;;;;;;;1013:432;1065:4;1307:6;1303:47;;-1:-1:-1;1337:1:0;1330:8;;1303:47;1371:5;;;1375:1;1371;:5;:1;1395:5;;;;;:10;1387:29;;;;;-1:-1:-1;;;1387:29:0;;;;;;;;;;;;-1:-1:-1;;;1387:29:0;;;;;;;;;;;;;;1725:103;1777:4;1801:19;1805:1;1808;1801:19;;;;;;;;;;;;;-1:-1:-1;;;1801:19:0;;;:3;:19::i;40601:293::-;-1:-1:-1;;;;;40670:17:0;;40662:49;;;;;-1:-1:-1;;;40662:49:0;;;;;;;;;;;;-1:-1:-1;;;40662:49:0;;;;;;;;;;;;;;;40738:51;;;;;;;;;;;-1:-1:-1;;;40738:51:0;;;;;;;;-1:-1:-1;;;;;40738:13:0;;-1:-1:-1;40738:13:0;;;:8;:13;;;;;;;;:51;;40756:6;;40738:17;:51::i;:::-;-1:-1:-1;;;;;40722:13:0;;;;;;:8;:13;;;;;:67;40814:11;;:23;;40830:6;40814:15;:23::i;:::-;40800:11;:37;40853:33;;;;;;;;40875:1;;-1:-1:-1;;;;;40853:33:0;;;-1:-1:-1;;;;;;;;;;;40853:33:0;;;;;;;;40601:293;;:::o;702:103::-;754:4;778:19;782:1;785;778:19;;;;;;;;;;;;;-1:-1:-1;;;778:19:0;;;:3;:19::i;49809:457::-;-1:-1:-1;;;;;49885:17:0;;;;;;:9;:17;;;;;;49881:146;;-1:-1:-1;;;;;49922:17:0;;;;;;:9;:17;;;;;;;;49942:3;49922:23;;;;49958:10;:23;;;;;;;;;;;;-1:-1:-1;;;;;;49958:23:0;;;;;;;49994:7;:15;;;;;:21;49881:146;-1:-1:-1;;;;;50037:15:0;;;;;;;:7;:15;;;;;;;;:22;;-1:-1:-1;;50037:22:0;50055:4;50037:22;;;50093:12;:20;;;;;:29;;;;;;;;;;50070:53;;50076:7;;50045:6;;50070:5;:53::i;:::-;-1:-1:-1;;;;;50134:20:0;;;50166:1;50134:20;;;:12;:20;;;;;;;;:29;;;;;;;;;;;;:33;;;50235:13;;;:5;:13;;;;;:22;;;;;;;;;;;50183:75;;50204:12;50183:75;;50218:15;50183:75;;;;;;;;;;;;;50134:20;;50183:75;;;;;;;;;;49809:457;;:::o;819:180::-;899:4;932:12;924:6;;;;916:29;;;;-1:-1:-1;;;916:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;965:5:0;;;819:180::o;57313:435::-;-1:-1:-1;;;;;57405:17:0;;57397:59;;;;;-1:-1:-1;;;57397:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57475:17:0;;57467:59;;;;;-1:-1:-1;;;57467:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;57555:61;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57555:13:0;;-1:-1:-1;57555:13:0;;;:8;:13;;;;;;;;:61;;57573:6;;57555:17;:61::i;:::-;-1:-1:-1;;;;;57539:13:0;;;;;;;:8;:13;;;;;;;;:77;;;;57643:55;;;;;;;;;;;;;;;:13;;;;;;;;;;;:55;;57661:6;;57643:17;:55::i;:::-;-1:-1:-1;;;;;57627:13:0;;;;;;;:8;:13;;;;;;;;;:71;;;;57714:26;;;;;;;57627:13;;57714:26;;;;-1:-1:-1;;;;;;;;;;;57714:26:0;;;;;;;;57313:435;;;:::o;40309:284::-;40412:11;;:23;;40428:6;40412:15;:23::i;:::-;40398:11;:37;-1:-1:-1;;;;;40511:13:0;;;;;;:8;:13;;;;;;:25;;40529:6;40511:17;:25::i;:::-;-1:-1:-1;;;;;40495:13:0;;;;;;:8;:13;;;;;;;;:41;;;;40552:33;;;;;;;40495:13;;;;-1:-1:-1;;;;;;;;;;;40552:33:0;;;;;;;;;40309:284;;:::o;43246:309::-;-1:-1:-1;;;;;43342:12:0;;;;;;:5;:12;;;;;;;;43363:4;43342:27;;;;;;;;:40;;43374:7;43342:31;:40::i;:::-;-1:-1:-1;;;;;43312:12:0;;;;;;:5;:12;;;;;;;;43333:4;43312:27;;;;;;;:70;43407:11;;:24;;43423:7;43407:15;:24::i;:::-;43393:11;:38;-1:-1:-1;;;;;43469:16:0;;;43465:1;43469:16;;;:9;:16;;;;;;43442:53;;43469:16;43487:7;43442:14;:53::i;:::-;43511:36;;;;;;;;-1:-1:-1;;;;;43511:36:0;;;43520:10;;-1:-1:-1;;;;;;;;;;;43511:36:0;;;;;;;;43246:309;;:::o;11287:176::-;11396:58;;;-1:-1:-1;;;;;11396:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11396:58:0;-1:-1:-1;;;11396:58:0;;;11370:85;;11389:5;;11370:18;:85::i;:::-;11287:176;;;:::o;11471:204::-;11598:68;;;-1:-1:-1;;;;;11598:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11598:68:0;-1:-1:-1;;;11598:68:0;;;11572:95;;11591:5;;11572:18;:95::i;:::-;11471:204;;;;:::o;23273:407::-;-1:-1:-1;;;;;23376:20:0;;;23350:23;23376:20;;;:9;:20;;;;;;;;;23452:5;:16;;;;;23477:4;23452:31;;;;;;;;23431:16;;;:5;:16;;;;;;23376:20;;;23350:23;;23431:53;;:16;:20;:53::i;:::-;-1:-1:-1;;;;;23495:20:0;;;;;;;:9;:20;;;;;;:32;;-1:-1:-1;;;;;;23495:32:0;;;;;;;;;;23545:54;;23407:77;;-1:-1:-1;23495:32:0;23545:54;;;;;;23495:20;23545:54;23612:60;23627:15;23644:9;23655:16;23612:14;:60::i;43891:324::-;-1:-1:-1;;;;;43998:12:0;;;;;;;:5;:12;;;;;;;;:21;;;;;;;;;;:34;;44024:7;43998:25;:34::i;:::-;-1:-1:-1;;;;;43974:12:0;;;;;;;:5;:12;;;;;;;;:21;;;;;;;;;;;;:58;;;;44066:4;44047:24;44043:163;;;44102:11;;:24;;44118:7;44102:15;:24::i;:::-;44088:11;:38;-1:-1:-1;;;;;44156:16:0;;;;;;;:9;:16;;;;;;44141:53;;44156:16;;44186:7;23688:862;23791:6;-1:-1:-1;;;;;23781:16:0;:6;-1:-1:-1;;;;;23781:16:0;;;:30;;;;;23810:1;23801:6;:10;23781:30;23777:766;;;-1:-1:-1;;;;;23832:20:0;;;23828:357;;-1:-1:-1;;;;;23892:22:0;;23873:16;23892:22;;;:14;:22;;;;;;;;;23950:13;:60;;24009:1;23950:60;;;-1:-1:-1;;;;;23966:19:0;;;;;;:11;:19;;;;;;;;:34;-1:-1:-1;;23986:13:0;;23966:34;;;;;;;;23998:1;23966:40;;23950:60;23933:77;;24029:14;24046:47;24060:6;24046:47;;;;;;;;;;;;;-1:-1:-1;;;24046:47:0;;;:9;:13;;:47;;;;;:::i;:::-;24029:64;;24112:57;24129:6;24137:9;24148;24159;24112:16;:57::i;:::-;23828:357;;;;-1:-1:-1;;;;;24205:20:0;;;24201:331;;-1:-1:-1;;;;;24265:22:0;;24246:16;24265:22;;;:14;:22;;;;;;;;;24323:13;:60;;24382:1;24323:60;;;-1:-1:-1;;;;;24339:19:0;;;;;;:11;:19;;;;;;;;:34;-1:-1:-1;;24359:13:0;;24339:34;;;;;;;;24371:1;24339:40;;24323:60;24306:77;-1:-1:-1;24402:14:0;24419:21;24306:77;24433:6;24419:13;:21::i;:::-;24402:38;;24459:57;24476:6;24484:9;24495;24506;24459:16;:57::i;:::-;24201:331;;;23688:862;;;:::o;1842:333::-;1922:4;2021:12;2014:5;2006:28;;;;-1:-1:-1;;;2006:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2045:6;2058:1;2054;:5;;;;;;;1842:333;-1:-1:-1;;;;;1842:333:0:o;43563:320::-;-1:-1:-1;;;;;43668:12:0;;;;;;;:5;:12;;;;;;;;:21;;;;;;;;;;:34;;43694:7;43668:25;:34::i;:::-;-1:-1:-1;;;;;43644:12:0;;;;;;;:5;:12;;;;;;;;:21;;;;;;;;;;;;:58;;;;43736:4;43717:24;43713:163;;;43772:11;;:24;;43788:7;43772:15;:24::i;:::-;43758:11;:38;-1:-1:-1;;;;;43838:16:0;;;43834:1;43838:16;;;:9;:16;;;;;;43811:53;;43838:16;43856:7;43811:14;:53::i;508:180::-;588:4;614:5;;;646:12;638:6;;;;630:29;;;;-1:-1:-1;;;630:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;679:1:0;508:180;-1:-1:-1;;;;508:180:0:o;13299:1080::-;13903:27;13911:5;-1:-1:-1;;;;;13903:25:0;;:27::i;:::-;13895:60;;;;;-1:-1:-1;;;13895:60:0;;;;;;;;;;;;-1:-1:-1;;;13895:60:0;;;;;;;;;;;;;;;14029:12;14043:23;14078:5;-1:-1:-1;;;;;14070:19:0;14090:4;14070:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14070:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14028:67;;;;14114:7;14106:52;;;;;-1:-1:-1;;;14106:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14175:17;;:21;14171:201;;14317:10;14306:30;;;;;;;;;;;;;;;-1:-1:-1;14306:30:0;14298:62;;;;;-1:-1:-1;;;14298:62:0;;;;;;;;;;;;-1:-1:-1;;;14298:62:0;;;;;;;;;;;;;;24558:598;24672:18;24693:49;24700:12;24693:49;;;;;;;;;;;;;;;;;:6;:49::i;:::-;24672:70;;24772:1;24757:12;:16;;;:85;;;;-1:-1:-1;;;;;;24777:22:0;;;;;;:11;:22;;;;;;;;:65;-1:-1:-1;;24800:16:0;;24777:40;;;;;;;;;:50;:65;;;:50;;:65;24757:85;24753:329;;;-1:-1:-1;;;;;24857:22:0;;;;;;:11;:22;;;;;;;;:40;-1:-1:-1;;24880:16:0;;24857:40;;;;;;;;24895:1;24857:46;:57;;;24753:329;;;24982:33;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24943:22:0;;-1:-1:-1;24943:22:0;;;:11;:22;;;;;:36;;;;;;;;;;:72;;;;;;;-1:-1:-1;;24943:72:0;;;;;;;;;;;;;25028:25;;;:14;:25;;;;;;:44;;25056:16;;;25028:44;;;;;;;;;;24753:329;25097:51;;;;;;;;;;;;;;-1:-1:-1;;;;;25097:51:0;;;;;;;;;;;24558:598;;;;;:::o;8460:619::-;8520:4;8988:20;;8831:66;9028:23;;;;;;:42;;-1:-1:-1;9055:15:0;;;9028:42;9020:51;8460:619;-1:-1:-1;;;;8460:619:0:o;25164:161::-;25239:6;25277:12;25270:5;25266:9;;25258:32;;;;-1:-1:-1;;;25258:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25315:1:0;;25164:161;-1:-1:-1;;25164:161:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://5e5ccd9c1630a48303264db588c9dba63ec7b2b2bb2a617f8d3218596613c303
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.