Contract 0xdd39a7462842636557c4761a6b04a52a173459dd

Contract Overview

Balance:
0 FTM

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xc5eb132e29ef7977deef354e2d1ec1b56357c15ea34f5e60ace35f658d64db74Claim108405312022-09-26 8:31:3862 days 16 hrs ago0x511b56b8bf0be48e9224e89580976ffa63828562 IN  0xdd39a7462842636557c4761a6b04a52a173459dd0 FTM0.000168193378
0x309ce58eb5826d027be052b29ac7553530d7928e5067d7e5432782e4f7020ff5Bet Bull108403152022-09-26 8:20:3362 days 16 hrs ago0x511b56b8bf0be48e9224e89580976ffa63828562 IN  0xdd39a7462842636557c4761a6b04a52a173459dd0 FTM0.000255428363
0x148038f7e6d4c8d8cc4b22367eef2688d056c74e9a195ba76608902f212ae832Claim108402732022-09-26 8:17:4262 days 16 hrs ago0x511b56b8bf0be48e9224e89580976ffa63828562 IN  0xdd39a7462842636557c4761a6b04a52a173459dd0 FTM0.000269777841
0x0f5a08fcc4c42c28f038bbf9130fff076c5789736552b26bd66d0029633c9cf4Bet Bull107492922022-09-22 6:48:2566 days 18 hrs ago0x511b56b8bf0be48e9224e89580976ffa63828562 IN  0xdd39a7462842636557c4761a6b04a52a173459dd0 FTM0.000255480445
0x7779b9a93f3c75075acf3321a320f4a905cd2613ef45ac0bad35e7ce41b77e23Bet Bull107491662022-09-22 6:41:1066 days 18 hrs ago0x511b56b8bf0be48e9224e89580976ffa63828562 IN  0xdd39a7462842636557c4761a6b04a52a173459dd0 FTM0.000255532776
0x3f445fc8e79eaba89305c748f82c8580c822eba0341e4beee59a0a3d7ea55761Bet Bear107452052022-09-22 2:39:1366 days 22 hrs ago0x511b56b8bf0be48e9224e89580976ffa63828562 IN  0xdd39a7462842636557c4761a6b04a52a173459dd0 FTM0.000287726418
0xbfc71c21dbd3adc8344372ba2d80e77ef0e386cfc46177d6dc8719f7874f48d2Bet Bull107451302022-09-22 2:34:1766 days 22 hrs ago0x511b56b8bf0be48e9224e89580976ffa63828562 IN  0xdd39a7462842636557c4761a6b04a52a173459dd0 FTM0.000255505614
0xa61377a03b3dede6b7fea508fefabb1d39a48e59b4d295fb05c125b2ad8f08a1Bet Bear107445912022-09-22 1:58:3666 days 23 hrs ago0x511b56b8bf0be48e9224e89580976ffa63828562 IN  0xdd39a7462842636557c4761a6b04a52a173459dd0 FTM0.000287639732
0xcefa6b7fcbef6cd9dfe1171bfae1cadcf3ee037bf57ce39c5340285ff519d2e8Bet Bull107445302022-09-22 1:54:0466 days 23 hrs ago0x511b56b8bf0be48e9224e89580976ffa63828562 IN  0xdd39a7462842636557c4761a6b04a52a173459dd0 FTM0.000310828336
0xc183b17478fae7174c89314f4796f987b44c313a718014d16ab51766a21ac130Bet Bull107443682022-09-22 1:41:3466 days 23 hrs ago0x511b56b8bf0be48e9224e89580976ffa63828562 IN  0xdd39a7462842636557c4761a6b04a52a173459dd0 FTM0.000259721608
0x855b61daa6bd3d754977ce7a9ff54268de9e094abdd23643895856bd6519c97eSet Operator106738212022-09-19 4:15:3969 days 20 hrs ago0xce44798440952ebd75cf1fdc62a996d28137ef30 IN  0xdd39a7462842636557c4761a6b04a52a173459dd0 FTM0.0001052415
0xc10e0f90c1805d4856ebfcaf56c226366c177d8f7e35093da9eea23f2dc23577Unpause105572932022-09-14 9:49:5074 days 15 hrs ago0xce44798440952ebd75cf1fdc62a996d28137ef30 IN  0xdd39a7462842636557c4761a6b04a52a173459dd0 FTM0.0001233925
0xb0ceb17614a8c311b9785c67438f63302ca3ea111ca8419e93ba101b0fbdb60bSet Buffer And I...105572902022-09-14 9:49:4174 days 15 hrs ago0xce44798440952ebd75cf1fdc62a996d28137ef30 IN  0xdd39a7462842636557c4761a6b04a52a173459dd0 FTM0.0001208585
0xa6d8a14c7a86999ae6f973bd7d40418487b14b936f57c1a3d729e4dba10fb5ddPause105572872022-09-14 9:49:3374 days 15 hrs ago0xce44798440952ebd75cf1fdc62a996d28137ef30 IN  0xdd39a7462842636557c4761a6b04a52a173459dd0 FTM0.000115731
0xc73f1e38fcbb016c0d39a3499b0b0f194ee3ffeef622792d75178d24673b4c67Set Operator105409392022-09-13 16:06:3675 days 9 hrs ago0xce44798440952ebd75cf1fdc62a996d28137ef30 IN  0xdd39a7462842636557c4761a6b04a52a173459dd0 FTM0.0001052415
0x233811b45b29349931c66f4587464371c3b048d2ddb4afa4e2e33b3f50c772780x60a06040105404332022-09-13 15:52:3475 days 9 hrs ago0xce44798440952ebd75cf1fdc62a996d28137ef30 IN  Contract Creation0 FTM0.005005887763
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x233811b45b29349931c66f4587464371c3b048d2ddb4afa4e2e33b3f50c77278105404332022-09-13 15:52:3475 days 9 hrs ago 0xce44798440952ebd75cf1fdc62a996d28137ef30  Contract Creation0 FTM
[ Download CSV Export 
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x37c56895008d43fC8D5c4419C554E609fe078a52

Contract Name:
PancakePredictionV3

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 99999 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2022-09-09
*/

// File: @chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol


pragma solidity ^0.8.0;

interface AggregatorV3Interface {

  function decimals()
    external
    view
    returns (
      uint8
    );

  function description()
    external
    view
    returns (
      string memory
    );

  function version()
    external
    view
    returns (
      uint256
    );

  // getRoundData and latestRoundData should both raise "No data present"
  // if they do not have data to report, instead of returning unset values
  // which could be misinterpreted as actual reported values.
  function getRoundData(
    uint80 _roundId
  )
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

  function latestRoundData()
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

}

// File: @openzeppelin/contracts/utils/Address.sol



pragma solidity ^0.8.0;

/**
 * @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) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;



/**
 * @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 IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    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));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    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'
        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) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _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. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

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



pragma solidity ^0.8.0;

/**
 * @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].
 */
abstract 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() {
        _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;
    }
}

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;


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

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

    bool private _paused;

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: projects/predictions/v3/contracts/PancakePredictionV3.sol


pragma solidity ^0.8.0;
pragma abicoder v2;







/**
 * @title PancakePredictionV3
 */
contract PancakePredictionV3 is Ownable, Pausable, ReentrancyGuard {
    using SafeERC20 for IERC20;

    IERC20 public immutable token; // Prediction token

    AggregatorV3Interface public oracle;

    bool public genesisLockOnce = false;
    bool public genesisStartOnce = false;

    address public adminAddress; // address of the admin
    address public operatorAddress; // address of the operator

    uint256 public bufferSeconds; // number of seconds for valid execution of a prediction round
    uint256 public intervalSeconds; // interval in seconds between two prediction rounds

    uint256 public minBetAmount; // minimum betting amount (denominated in wei)
    uint256 public treasuryFee; // treasury rate (e.g. 200 = 2%, 150 = 1.50%)
    uint256 public treasuryAmount; // treasury amount that was not claimed

    uint256 public currentEpoch; // current epoch for prediction round

    uint256 public oracleLatestRoundId; // converted from uint80 (Chainlink)
    uint256 public oracleUpdateAllowance; // seconds

    uint256 public constant MAX_TREASURY_FEE = 1000; // 10%

    mapping(uint256 => mapping(address => BetInfo)) public ledger;
    mapping(uint256 => Round) public rounds;
    mapping(address => uint256[]) public userRounds;

    enum Position {
        Bull,
        Bear
    }

    struct Round {
        uint256 epoch;
        uint256 startTimestamp;
        uint256 lockTimestamp;
        uint256 closeTimestamp;
        int256 lockPrice;
        int256 closePrice;
        uint256 lockOracleId;
        uint256 closeOracleId;
        uint256 totalAmount;
        uint256 bullAmount;
        uint256 bearAmount;
        uint256 rewardBaseCalAmount;
        uint256 rewardAmount;
        bool oracleCalled;
    }

    struct BetInfo {
        Position position;
        uint256 amount;
        bool claimed; // default false
    }

    event BetBear(address indexed sender, uint256 indexed epoch, uint256 amount);
    event BetBull(address indexed sender, uint256 indexed epoch, uint256 amount);
    event Claim(address indexed sender, uint256 indexed epoch, uint256 amount);
    event EndRound(uint256 indexed epoch, uint256 indexed roundId, int256 price);
    event LockRound(uint256 indexed epoch, uint256 indexed roundId, int256 price);

    event NewAdminAddress(address admin);
    event NewBufferAndIntervalSeconds(uint256 bufferSeconds, uint256 intervalSeconds);
    event NewMinBetAmount(uint256 indexed epoch, uint256 minBetAmount);
    event NewTreasuryFee(uint256 indexed epoch, uint256 treasuryFee);
    event NewOperatorAddress(address operator);
    event NewOracle(address oracle);
    event NewOracleUpdateAllowance(uint256 oracleUpdateAllowance);

    event Pause(uint256 indexed epoch);
    event RewardsCalculated(
        uint256 indexed epoch,
        uint256 rewardBaseCalAmount,
        uint256 rewardAmount,
        uint256 treasuryAmount
    );

    event StartRound(uint256 indexed epoch);
    event TokenRecovery(address indexed token, uint256 amount);
    event TreasuryClaim(uint256 amount);
    event Unpause(uint256 indexed epoch);

    modifier onlyAdmin() {
        require(msg.sender == adminAddress, "Not admin");
        _;
    }

    modifier onlyAdminOrOperator() {
        require(msg.sender == adminAddress || msg.sender == operatorAddress, "Not operator/admin");
        _;
    }

    modifier onlyOperator() {
        require(msg.sender == operatorAddress, "Not operator");
        _;
    }

    modifier notContract() {
        require(!_isContract(msg.sender), "Contract not allowed");
        require(msg.sender == tx.origin, "Proxy contract not allowed");
        _;
    }

    /**
     * @notice Constructor
     * @param _token: prediction token
     * @param _oracleAddress: oracle address
     * @param _adminAddress: admin address
     * @param _operatorAddress: operator address
     * @param _intervalSeconds: number of time within an interval
     * @param _bufferSeconds: buffer of time for resolution of price
     * @param _minBetAmount: minimum bet amounts (in wei)
     * @param _oracleUpdateAllowance: oracle update allowance
     * @param _treasuryFee: treasury fee (1000 = 10%)
     */
    constructor(
        IERC20 _token,
        address _oracleAddress,
        address _adminAddress,
        address _operatorAddress,
        uint256 _intervalSeconds,
        uint256 _bufferSeconds,
        uint256 _minBetAmount,
        uint256 _oracleUpdateAllowance,
        uint256 _treasuryFee
    ) {
        require(_treasuryFee <= MAX_TREASURY_FEE, "Treasury fee too high");

        token = _token;
        oracle = AggregatorV3Interface(_oracleAddress);
        adminAddress = _adminAddress;
        operatorAddress = _operatorAddress;
        intervalSeconds = _intervalSeconds;
        bufferSeconds = _bufferSeconds;
        minBetAmount = _minBetAmount;
        oracleUpdateAllowance = _oracleUpdateAllowance;
        treasuryFee = _treasuryFee;
    }

    /**
     * @notice Bet bear position
     * @param epoch: epoch
     */
    function betBear(uint256 epoch, uint256 _amount) external whenNotPaused nonReentrant notContract {
        require(epoch == currentEpoch, "Bet is too early/late");
        require(_bettable(epoch), "Round not bettable");
        require(_amount >= minBetAmount, "Bet amount must be greater than minBetAmount");
        require(ledger[epoch][msg.sender].amount == 0, "Can only bet once per round");

        token.safeTransferFrom(msg.sender, address(this), _amount);
        // Update round data
        uint256 amount = _amount;
        Round storage round = rounds[epoch];
        round.totalAmount = round.totalAmount + amount;
        round.bearAmount = round.bearAmount + amount;

        // Update user data
        BetInfo storage betInfo = ledger[epoch][msg.sender];
        betInfo.position = Position.Bear;
        betInfo.amount = amount;
        userRounds[msg.sender].push(epoch);

        emit BetBear(msg.sender, epoch, amount);
    }

    /**
     * @notice Bet bull position
     * @param epoch: epoch
     */
    function betBull(uint256 epoch, uint256 _amount) external whenNotPaused nonReentrant notContract {
        require(epoch == currentEpoch, "Bet is too early/late");
        require(_bettable(epoch), "Round not bettable");
        require(_amount >= minBetAmount, "Bet amount must be greater than minBetAmount");
        require(ledger[epoch][msg.sender].amount == 0, "Can only bet once per round");

        token.safeTransferFrom(msg.sender, address(this), _amount);
        // Update round data
        uint256 amount = _amount;
        Round storage round = rounds[epoch];
        round.totalAmount = round.totalAmount + amount;
        round.bullAmount = round.bullAmount + amount;

        // Update user data
        BetInfo storage betInfo = ledger[epoch][msg.sender];
        betInfo.position = Position.Bull;
        betInfo.amount = amount;
        userRounds[msg.sender].push(epoch);

        emit BetBull(msg.sender, epoch, amount);
    }

    /**
     * @notice Claim reward for an array of epochs
     * @param epochs: array of epochs
     */
    function claim(uint256[] calldata epochs) external nonReentrant notContract {
        uint256 reward; // Initializes reward

        for (uint256 i = 0; i < epochs.length; i++) {
            require(rounds[epochs[i]].startTimestamp != 0, "Round has not started");
            require(block.timestamp > rounds[epochs[i]].closeTimestamp, "Round has not ended");

            uint256 addedReward = 0;

            // Round valid, claim rewards
            if (rounds[epochs[i]].oracleCalled) {
                require(claimable(epochs[i], msg.sender), "Not eligible for claim");
                Round memory round = rounds[epochs[i]];
                addedReward = (ledger[epochs[i]][msg.sender].amount * round.rewardAmount) / round.rewardBaseCalAmount;
            }
            // Round invalid, refund bet amount
            else {
                require(refundable(epochs[i], msg.sender), "Not eligible for refund");
                addedReward = ledger[epochs[i]][msg.sender].amount;
            }

            ledger[epochs[i]][msg.sender].claimed = true;
            reward += addedReward;

            emit Claim(msg.sender, epochs[i], addedReward);
        }

        if (reward > 0) {
            token.safeTransfer(msg.sender, reward);
        }
    }

    /**
     * @notice Start the next round n, lock price for round n-1, end round n-2
     * @dev Callable by operator
     */
    function executeRound() external whenNotPaused onlyOperator {
        require(
            genesisStartOnce && genesisLockOnce,
            "Can only run after genesisStartRound and genesisLockRound is triggered"
        );

        (uint80 currentRoundId, int256 currentPrice) = _getPriceFromOracle();

        oracleLatestRoundId = uint256(currentRoundId);

        // CurrentEpoch refers to previous round (n-1)
        _safeLockRound(currentEpoch, currentRoundId, currentPrice);
        _safeEndRound(currentEpoch - 1, currentRoundId, currentPrice);
        _calculateRewards(currentEpoch - 1);

        // Increment currentEpoch to current round (n)
        currentEpoch = currentEpoch + 1;
        _safeStartRound(currentEpoch);
    }

    /**
     * @notice Lock genesis round
     * @dev Callable by operator
     */
    function genesisLockRound() external whenNotPaused onlyOperator {
        require(genesisStartOnce, "Can only run after genesisStartRound is triggered");
        require(!genesisLockOnce, "Can only run genesisLockRound once");

        (uint80 currentRoundId, int256 currentPrice) = _getPriceFromOracle();

        oracleLatestRoundId = uint256(currentRoundId);

        _safeLockRound(currentEpoch, currentRoundId, currentPrice);

        currentEpoch = currentEpoch + 1;
        _startRound(currentEpoch);
        genesisLockOnce = true;
    }

    /**
     * @notice Start genesis round
     * @dev Callable by admin or operator
     */
    function genesisStartRound() external whenNotPaused onlyOperator {
        require(!genesisStartOnce, "Can only run genesisStartRound once");

        currentEpoch = currentEpoch + 1;
        _startRound(currentEpoch);
        genesisStartOnce = true;
    }

    /**
     * @notice called by the admin to pause, triggers stopped state
     * @dev Callable by admin or operator
     */
    function pause() external whenNotPaused onlyAdminOrOperator {
        _pause();

        emit Pause(currentEpoch);
    }

    /**
     * @notice Claim all rewards in treasury
     * @dev Callable by admin
     */
    function claimTreasury() external nonReentrant onlyAdmin {
        uint256 currentTreasuryAmount = treasuryAmount;
        treasuryAmount = 0;
        token.safeTransfer(adminAddress, currentTreasuryAmount);
        emit TreasuryClaim(currentTreasuryAmount);
    }

    /**
     * @notice called by the admin to unpause, returns to normal state
     * Reset genesis state. Once paused, the rounds would need to be kickstarted by genesis
     * @dev Callable by admin or operator
     */
    function unpause() external whenPaused onlyAdminOrOperator {
        genesisStartOnce = false;
        genesisLockOnce = false;
        _unpause();

        emit Unpause(currentEpoch);
    }

    /**
     * @notice Set buffer and interval (in seconds)
     * @dev Callable by admin
     */
    function setBufferAndIntervalSeconds(uint256 _bufferSeconds, uint256 _intervalSeconds)
        external
        whenPaused
        onlyAdmin
    {
        require(_bufferSeconds < _intervalSeconds, "bufferSeconds must be inferior to intervalSeconds");
        bufferSeconds = _bufferSeconds;
        intervalSeconds = _intervalSeconds;

        emit NewBufferAndIntervalSeconds(_bufferSeconds, _intervalSeconds);
    }

    /**
     * @notice Set minBetAmount
     * @dev Callable by admin
     */
    function setMinBetAmount(uint256 _minBetAmount) external whenPaused onlyAdmin {
        require(_minBetAmount != 0, "Must be superior to 0");
        minBetAmount = _minBetAmount;

        emit NewMinBetAmount(currentEpoch, minBetAmount);
    }

    /**
     * @notice Set operator address
     * @dev Callable by admin
     */
    function setOperator(address _operatorAddress) external onlyAdmin {
        require(_operatorAddress != address(0), "Cannot be zero address");
        operatorAddress = _operatorAddress;

        emit NewOperatorAddress(_operatorAddress);
    }

    /**
     * @notice Set Oracle address
     * @dev Callable by admin
     */
    function setOracle(address _oracle) external whenPaused onlyAdmin {
        require(_oracle != address(0), "Cannot be zero address");
        oracleLatestRoundId = 0;
        oracle = AggregatorV3Interface(_oracle);

        // Dummy check to make sure the interface implements this function properly
        oracle.latestRoundData();

        emit NewOracle(_oracle);
    }

    /**
     * @notice Set oracle update allowance
     * @dev Callable by admin
     */
    function setOracleUpdateAllowance(uint256 _oracleUpdateAllowance) external whenPaused onlyAdmin {
        oracleUpdateAllowance = _oracleUpdateAllowance;

        emit NewOracleUpdateAllowance(_oracleUpdateAllowance);
    }

    /**
     * @notice Set treasury fee
     * @dev Callable by admin
     */
    function setTreasuryFee(uint256 _treasuryFee) external whenPaused onlyAdmin {
        require(_treasuryFee <= MAX_TREASURY_FEE, "Treasury fee too high");
        treasuryFee = _treasuryFee;

        emit NewTreasuryFee(currentEpoch, treasuryFee);
    }

    /**
     * @notice It allows the owner to recover tokens sent to the contract by mistake
     * @param _token: token address
     * @param _amount: token amount
     * @dev Callable by owner
     */
    function recoverToken(address _token, uint256 _amount) external onlyOwner {
        require(_token != address(token), "Cannot be prediction token address");
        IERC20(_token).safeTransfer(address(msg.sender), _amount);

        emit TokenRecovery(_token, _amount);
    }

    /**
     * @notice Set admin address
     * @dev Callable by owner
     */
    function setAdmin(address _adminAddress) external onlyOwner {
        require(_adminAddress != address(0), "Cannot be zero address");
        adminAddress = _adminAddress;

        emit NewAdminAddress(_adminAddress);
    }

    /**
     * @notice Returns round epochs and bet information for a user that has participated
     * @param user: user address
     * @param cursor: cursor
     * @param size: size
     */
    function getUserRounds(
        address user,
        uint256 cursor,
        uint256 size
    )
        external
        view
        returns (
            uint256[] memory,
            BetInfo[] memory,
            uint256
        )
    {
        uint256 length = size;

        if (length > userRounds[user].length - cursor) {
            length = userRounds[user].length - cursor;
        }

        uint256[] memory values = new uint256[](length);
        BetInfo[] memory betInfo = new BetInfo[](length);

        for (uint256 i = 0; i < length; i++) {
            values[i] = userRounds[user][cursor + i];
            betInfo[i] = ledger[values[i]][user];
        }

        return (values, betInfo, cursor + length);
    }

    /**
     * @notice Returns round epochs length
     * @param user: user address
     */
    function getUserRoundsLength(address user) external view returns (uint256) {
        return userRounds[user].length;
    }

    /**
     * @notice Get the claimable stats of specific epoch and user account
     * @param epoch: epoch
     * @param user: user address
     */
    function claimable(uint256 epoch, address user) public view returns (bool) {
        BetInfo memory betInfo = ledger[epoch][user];
        Round memory round = rounds[epoch];
        if (round.lockPrice == round.closePrice) {
            return false;
        }
        return
            round.oracleCalled &&
            betInfo.amount != 0 &&
            !betInfo.claimed &&
            ((round.closePrice > round.lockPrice && betInfo.position == Position.Bull) ||
                (round.closePrice < round.lockPrice && betInfo.position == Position.Bear));
    }

    /**
     * @notice Get the refundable stats of specific epoch and user account
     * @param epoch: epoch
     * @param user: user address
     */
    function refundable(uint256 epoch, address user) public view returns (bool) {
        BetInfo memory betInfo = ledger[epoch][user];
        Round memory round = rounds[epoch];
        return
            !round.oracleCalled &&
            !betInfo.claimed &&
            block.timestamp > round.closeTimestamp + bufferSeconds &&
            betInfo.amount != 0;
    }

    /**
     * @notice Calculate rewards for round
     * @param epoch: epoch
     */
    function _calculateRewards(uint256 epoch) internal {
        require(rounds[epoch].rewardBaseCalAmount == 0 && rounds[epoch].rewardAmount == 0, "Rewards calculated");
        Round storage round = rounds[epoch];
        uint256 rewardBaseCalAmount;
        uint256 treasuryAmt;
        uint256 rewardAmount;

        // Bull wins
        if (round.closePrice > round.lockPrice) {
            rewardBaseCalAmount = round.bullAmount;
            treasuryAmt = (round.totalAmount * treasuryFee) / 10000;
            rewardAmount = round.totalAmount - treasuryAmt;
        }
        // Bear wins
        else if (round.closePrice < round.lockPrice) {
            rewardBaseCalAmount = round.bearAmount;
            treasuryAmt = (round.totalAmount * treasuryFee) / 10000;
            rewardAmount = round.totalAmount - treasuryAmt;
        }
        // House wins
        else {
            rewardBaseCalAmount = 0;
            rewardAmount = 0;
            treasuryAmt = round.totalAmount;
        }
        round.rewardBaseCalAmount = rewardBaseCalAmount;
        round.rewardAmount = rewardAmount;

        // Add to treasury
        treasuryAmount += treasuryAmt;

        emit RewardsCalculated(epoch, rewardBaseCalAmount, rewardAmount, treasuryAmt);
    }

    /**
     * @notice End round
     * @param epoch: epoch
     * @param roundId: roundId
     * @param price: price of the round
     */
    function _safeEndRound(
        uint256 epoch,
        uint256 roundId,
        int256 price
    ) internal {
        require(rounds[epoch].lockTimestamp != 0, "Can only end round after round has locked");
        require(block.timestamp >= rounds[epoch].closeTimestamp, "Can only end round after closeTimestamp");
        require(
            block.timestamp <= rounds[epoch].closeTimestamp + bufferSeconds,
            "Can only end round within bufferSeconds"
        );
        Round storage round = rounds[epoch];
        round.closePrice = price;
        round.closeOracleId = roundId;
        round.oracleCalled = true;

        emit EndRound(epoch, roundId, round.closePrice);
    }

    /**
     * @notice Lock round
     * @param epoch: epoch
     * @param roundId: roundId
     * @param price: price of the round
     */
    function _safeLockRound(
        uint256 epoch,
        uint256 roundId,
        int256 price
    ) internal {
        require(rounds[epoch].startTimestamp != 0, "Can only lock round after round has started");
        require(block.timestamp >= rounds[epoch].lockTimestamp, "Can only lock round after lockTimestamp");
        require(
            block.timestamp <= rounds[epoch].lockTimestamp + bufferSeconds,
            "Can only lock round within bufferSeconds"
        );
        Round storage round = rounds[epoch];
        round.closeTimestamp = block.timestamp + intervalSeconds;
        round.lockPrice = price;
        round.lockOracleId = roundId;

        emit LockRound(epoch, roundId, round.lockPrice);
    }

    /**
     * @notice Start round
     * Previous round n-2 must end
     * @param epoch: epoch
     */
    function _safeStartRound(uint256 epoch) internal {
        require(genesisStartOnce, "Can only run after genesisStartRound is triggered");
        require(rounds[epoch - 2].closeTimestamp != 0, "Can only start round after round n-2 has ended");
        require(
            block.timestamp >= rounds[epoch - 2].closeTimestamp,
            "Can only start new round after round n-2 closeTimestamp"
        );
        _startRound(epoch);
    }

    /**
     * @notice Start round
     * Previous round n-2 must end
     * @param epoch: epoch
     */
    function _startRound(uint256 epoch) internal {
        Round storage round = rounds[epoch];
        round.startTimestamp = block.timestamp;
        round.lockTimestamp = block.timestamp + intervalSeconds;
        round.closeTimestamp = block.timestamp + (2 * intervalSeconds);
        round.epoch = epoch;
        round.totalAmount = 0;

        emit StartRound(epoch);
    }

    /**
     * @notice Determine if a round is valid for receiving bets
     * Round must have started and locked
     * Current timestamp must be within startTimestamp and closeTimestamp
     */
    function _bettable(uint256 epoch) internal view returns (bool) {
        return
            rounds[epoch].startTimestamp != 0 &&
            rounds[epoch].lockTimestamp != 0 &&
            block.timestamp > rounds[epoch].startTimestamp &&
            block.timestamp < rounds[epoch].lockTimestamp;
    }

    /**
     * @notice Get latest recorded price from oracle
     * If it falls below allowed buffer or has not updated, it would be invalid.
     */
    function _getPriceFromOracle() internal view returns (uint80, int256) {
        uint256 leastAllowedTimestamp = block.timestamp + oracleUpdateAllowance;
        (uint80 roundId, int256 price, , uint256 timestamp, ) = oracle.latestRoundData();
        require(timestamp <= leastAllowedTimestamp, "Oracle update exceeded max timestamp allowance");
        require(
            uint256(roundId) > oracleLatestRoundId,
            "Oracle update roundId must be larger than oracleLatestRoundId"
        );
        return (roundId, price);
    }

    /**
     * @notice Returns true if `account` is a contract.
     * @param account: account address
     */
    function _isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"address","name":"_oracleAddress","type":"address"},{"internalType":"address","name":"_adminAddress","type":"address"},{"internalType":"address","name":"_operatorAddress","type":"address"},{"internalType":"uint256","name":"_intervalSeconds","type":"uint256"},{"internalType":"uint256","name":"_bufferSeconds","type":"uint256"},{"internalType":"uint256","name":"_minBetAmount","type":"uint256"},{"internalType":"uint256","name":"_oracleUpdateAllowance","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BetBear","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BetBull","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":false,"internalType":"int256","name":"price","type":"int256"}],"name":"EndRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":false,"internalType":"int256","name":"price","type":"int256"}],"name":"LockRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"}],"name":"NewAdminAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bufferSeconds","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"intervalSeconds","type":"uint256"}],"name":"NewBufferAndIntervalSeconds","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minBetAmount","type":"uint256"}],"name":"NewMinBetAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"NewOperatorAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oracle","type":"address"}],"name":"NewOracle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oracleUpdateAllowance","type":"uint256"}],"name":"NewOracleUpdateAllowance","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"treasuryFee","type":"uint256"}],"name":"NewTreasuryFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardBaseCalAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"treasuryAmount","type":"uint256"}],"name":"RewardsCalculated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"StartRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenRecovery","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TreasuryClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_TREASURY_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adminAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"betBear","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"betBull","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bufferSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"epochs","type":"uint256[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"claimable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"executeRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"genesisLockOnce","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisLockRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"genesisStartOnce","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisStartRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"cursor","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"}],"name":"getUserRounds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"components":[{"internalType":"enum PancakePredictionV3.Position","name":"position","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"claimed","type":"bool"}],"internalType":"struct PancakePredictionV3.BetInfo[]","name":"","type":"tuple[]"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserRoundsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"intervalSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"ledger","outputs":[{"internalType":"enum PancakePredictionV3.Position","name":"position","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"claimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBetAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"contract AggregatorV3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleLatestRoundId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleUpdateAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"refundable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rounds","outputs":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"lockTimestamp","type":"uint256"},{"internalType":"uint256","name":"closeTimestamp","type":"uint256"},{"internalType":"int256","name":"lockPrice","type":"int256"},{"internalType":"int256","name":"closePrice","type":"int256"},{"internalType":"uint256","name":"lockOracleId","type":"uint256"},{"internalType":"uint256","name":"closeOracleId","type":"uint256"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"bullAmount","type":"uint256"},{"internalType":"uint256","name":"bearAmount","type":"uint256"},{"internalType":"uint256","name":"rewardBaseCalAmount","type":"uint256"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"bool","name":"oracleCalled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_adminAddress","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bufferSeconds","type":"uint256"},{"internalType":"uint256","name":"_intervalSeconds","type":"uint256"}],"name":"setBufferAndIntervalSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minBetAmount","type":"uint256"}],"name":"setMinBetAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operatorAddress","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"}],"name":"setOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_oracleUpdateAllowance","type":"uint256"}],"name":"setOracleUpdateAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"setTreasuryFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userRounds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60a06040526002805461ffff60a01b191690553480156200001f57600080fd5b506040516200568f3803806200568f833981016040819052620000429162000171565b6200004d3362000121565b6000805460ff60a01b19169055600180556103e8811115620000b55760405162461bcd60e51b815260206004820152601560248201527f54726561737572792066656520746f6f20686967680000000000000000000000604482015260640160405180910390fd5b60609890981b6001600160601b031916608052600280546001600160a01b03199081166001600160a01b03998a161790915560038054821697891697909717909655600480549096169490961693909317909355600655600591909155600755600c5560085562000224565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008060008060008060008060006101208a8c03121562000190578485fd5b89516200019d816200020b565b60208b0151909950620001b0816200020b565b60408b0151909850620001c3816200020b565b60608b0151909750620001d6816200020b565b8096505060808a0151945060a08a0151935060c08a0151925060e08a015191506101008a015190509295985092959850929598565b6001600160a01b03811681146200022157600080fd5b50565b60805160601c615429620002666000396000818161073c0152818161089d01528181610cd3015281816111ad01528181611e7c015261351001526154296000f3fe608060405234801561001057600080fd5b50600436106102e85760003560e01c80637d1cd04f11610191578063cf2f5039116100e3578063f2b3c80911610097578063fa968eea11610071578063fa968eea1461072e578063fc0c546a14610737578063fc6f94681461075e57600080fd5b8063f2b3c809146106ec578063f2fde38b146106f5578063f7fdec281461070857600080fd5b8063dd1f7596116100c8578063dd1f7596146106c7578063eaba2361146106da578063ec324703146106e357600080fd5b8063cf2f5039146106ac578063d9d55eac146106bf57600080fd5b80638da5cb5b11610145578063b29a81401161011f578063b29a81401461067d578063b3ab15fb14610690578063cc32d176146106a357600080fd5b80638da5cb5b1461062a578063951fd60014610648578063a0c7f71c1461066a57600080fd5b80638456cb59116101765780638456cb5914610527578063890dc7661461052f5780638c65c81f1461054257600080fd5b80637d1cd04f146104fe5780637dc0d1d01461050757600080fd5b8063605540111161024a5780637285c58b116101fe5780637adbf973116101d85780637adbf973146104d05780637b3205f5146104e35780637bf41254146104eb57600080fd5b80637285c58b1461046657806376671808146104b457806377e741c7146104bd57600080fd5b80636c1885931161022f5780636c18859314610438578063704b6c021461044b578063715018a61461045e57600080fd5b8063605540111461041c5780636ba4c1381461042557600080fd5b8063368acb09116102a15780633f4ba83a116102865780633f4ba83a146103e9578063452fd75a146103f15780635c975abb146103f957600080fd5b8063368acb09146103cd5780633923e1b4146103d657600080fd5b80630f74174f116102d25780630f74174f1461030a578063127effb214610344578063273867d41461038957600080fd5b80623bdc74146102ed5780630e89e5a4146102f7575b600080fd5b6102f561077e565b005b6102f56103053660046150dc565b610900565b60025461032f9074010000000000000000000000000000000000000000900460ff1681565b60405190151581526020015b60405180910390f35b6004546103649073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161033b565b6103bf610397366004614f94565b73ffffffffffffffffffffffffffffffffffffffff166000908152600f602052604090205490565b60405190815260200161033b565b6103bf60095481565b6102f56103e43660046150dc565b610dda565b6102f56112a2565b6102f5611427565b60005474010000000000000000000000000000000000000000900460ff1661032f565b6103bf600c5481565b6102f5610433366004615009565b611637565b6102f5610446366004615099565b611eac565b6102f5610459366004614f94565b612057565b6102f56121cf565b6104a56104743660046150b1565b600d60209081526000928352604080842090915290825290208054600182015460029092015460ff91821692911683565b60405161033b93929190615245565b6103bf600a5481565b6102f56104cb366004615099565b61225c565b6102f56104de366004614f94565b612405565b6102f56126a3565b61032f6104f93660046150b1565b612937565b6103bf60065481565b6002546103649073ffffffffffffffffffffffffffffffffffffffff1681565b6102f5612b02565b6102f561053d3660046150dc565b612c60565b6105c0610550366004615099565b600e60205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a8b0154600b8c0154600c8d0154600d909d01549b9c9a9b999a98999798969795969495939492939192909160ff168e565b604080519e8f5260208f019d909d529b8d019a909a5260608c019890985260808b019690965260a08a019490945260c089019290925260e088015261010087015261012086015261014085015261016084015261018083015215156101a08201526101c00161033b565b60005473ffffffffffffffffffffffffffffffffffffffff16610364565b61065b610656366004614fd7565b612e3b565b60405161033b939291906151a3565b61032f6106783660046150b1565b61321c565b6102f561068b366004614fae565b61348d565b6102f561069e366004614f94565b61365f565b6103bf60085481565b6102f56106ba366004615099565b6137d0565b6102f561390a565b6103bf6106d5366004614fae565b613c00565b6103bf60055481565b6103bf600b5481565b6103bf6103e881565b6102f5610703366004614f94565b613c31565b60025461032f907501000000000000000000000000000000000000000000900460ff1681565b6103bf60075481565b6103647f000000000000000000000000000000000000000000000000000000000000000081565b6003546103649073ffffffffffffffffffffffffffffffffffffffff1681565b600260015414156107f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b600260015560035473ffffffffffffffffffffffffffffffffffffffff163314610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f742061646d696e000000000000000000000000000000000000000000000060448201526064016107e7565b6009805460009091556003546108c69073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116911683613d61565b6040518181527fb9197c6b8e21274bd1e2d9c956a88af5cfee510f630fab3f046300f88b4223619060200160405180910390a15060018055565b60005474010000000000000000000000000000000000000000900460ff1615610985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016107e7565b600260015414156109f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107e7565b6002600155333b15610a60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f6e7472616374206e6f7420616c6c6f77656400000000000000000000000060448201526064016107e7565b333214610ac9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f77656400000000000060448201526064016107e7565b600a548214610b34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f42657420697320746f6f206561726c792f6c617465000000000000000000000060448201526064016107e7565b610b3d82613e3a565b610ba3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f526f756e64206e6f74206265747461626c65000000000000000000000000000060448201526064016107e7565b600754811015610c35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f42657420616d6f756e74206d7573742062652067726561746572207468616e2060448201527f6d696e426574416d6f756e74000000000000000000000000000000000000000060648201526084016107e7565b6000828152600d6020908152604080832033845290915290206001015415610cb9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f43616e206f6e6c7920626574206f6e63652070657220726f756e64000000000060448201526064016107e7565b610cfb73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613ea5565b6000828152600e602052604090206008810154829190610d1c9083906152ba565b6008820155600a810154610d319083906152ba565b600a8201556000848152600d602090815260408083203380855290835281842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081178255808201889055600f855283862080549182018155865294849020909401889055905185815287927f0d8c1fe3e67ab767116a81f122b83c2557a8c2564019cb7c4f83de1aeb1f1f0d91015b60405180910390a3505060018055505050565b60005474010000000000000000000000000000000000000000900460ff1615610e5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016107e7565b60026001541415610ecc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107e7565b6002600155333b15610f3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f6e7472616374206e6f7420616c6c6f77656400000000000000000000000060448201526064016107e7565b333214610fa3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f77656400000000000060448201526064016107e7565b600a54821461100e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f42657420697320746f6f206561726c792f6c617465000000000000000000000060448201526064016107e7565b61101782613e3a565b61107d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f526f756e64206e6f74206265747461626c65000000000000000000000000000060448201526064016107e7565b60075481101561110f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f42657420616d6f756e74206d7573742062652067726561746572207468616e2060448201527f6d696e426574416d6f756e74000000000000000000000000000000000000000060648201526084016107e7565b6000828152600d6020908152604080832033845290915290206001015415611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f43616e206f6e6c7920626574206f6e63652070657220726f756e64000000000060448201526064016107e7565b6111d573ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613ea5565b6000828152600e6020526040902060088101548291906111f69083906152ba565b6008820155600981015461120b9083906152ba565b60098201556000848152600d602090815260408083203380855290835281842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681556001808201889055600f855283862080549182018155865294849020909401889055905185815287927f438122d8cff518d18388099a5181f0d17a12b4f1b55faedf6e4a6acee0060c129101610dc7565b60005474010000000000000000000000000000000000000000900460ff16611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016107e7565b60035473ffffffffffffffffffffffffffffffffffffffff16331480611363575060045473ffffffffffffffffffffffffffffffffffffffff1633145b6113c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f74206f70657261746f722f61646d696e000000000000000000000000000060448201526064016107e7565b600280547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1690556113f9613f09565b600a546040517faaa520fdd7d2c83061d632fa017b0432407e798818af63ea908589fceda39ab790600090a2565b60005474010000000000000000000000000000000000000000900460ff16156114ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016107e7565b60045473ffffffffffffffffffffffffffffffffffffffff16331461152d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f72000000000000000000000000000000000000000060448201526064016107e7565b6002547501000000000000000000000000000000000000000000900460ff16156115d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f43616e206f6e6c792072756e2067656e657369735374617274526f756e64206f60448201527f6e6365000000000000000000000000000000000000000000000000000000000060648201526084016107e7565b600a546115e79060016152ba565b600a8190556115f590614002565b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b600260015414156116a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107e7565b6002600155333b15611712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f6e7472616374206e6f7420616c6c6f77656400000000000000000000000060448201526064016107e7565b33321461177b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f77656400000000000060448201526064016107e7565b6000805b82811015611e5b57600e60008585848181106117c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002013581526020019081526020016000206001015460001415611847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f526f756e6420686173206e6f742073746172746564000000000000000000000060448201526064016107e7565b600e6000858584818110611884577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201358152602001908152602001600020600301544211611905576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f526f756e6420686173206e6f7420656e6465640000000000000000000000000060448201526064016107e7565b6000600e6000868685818110611944577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60209081029290920135835250810191909152604001600020600d015460ff1615611bd2576119b28585848181106119a5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201353361321c565b611a18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4e6f7420656c696769626c6520666f7220636c61696d0000000000000000000060448201526064016107e7565b6000600e6000878786818110611a57577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201358152602001908152602001600020604051806101c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d820160009054906101000a900460ff1615151515815250509050806101600151816101800151600d6000898988818110611b60577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020135815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154611bc0919061530b565b611bca91906152d2565b915050611d17565b611c1b858584818110611c0e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002013533612937565b611c81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e6f7420656c696769626c6520666f7220726566756e6400000000000000000060448201526064016107e7565b600d6000868685818110611cbe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020135815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490505b6001600d6000878786818110611d56577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602090810292909201358352508181019290925260409081016000908120338252909252902060020180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055611db681846152ba565b9250848483818110611df1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201353373ffffffffffffffffffffffffffffffffffffffff167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf783604051611e4091815260200190565b60405180910390a35080611e538161538b565b91505061177f565b508015611ea357611ea373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163383613d61565b50506001805550565b60005474010000000000000000000000000000000000000000900460ff16611f30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016107e7565b60035473ffffffffffffffffffffffffffffffffffffffff163314611fb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f742061646d696e000000000000000000000000000000000000000000000060448201526064016107e7565b80612018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d757374206265207375706572696f7220746f2030000000000000000000000060448201526064016107e7565b6007819055600a546040518281527f90eb87c560a0213754ceb3a7fa3012f01acab0a35602c1e1995adf69dabc9d50906020015b60405180910390a250565b60005473ffffffffffffffffffffffffffffffffffffffff1633146120d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107e7565b73ffffffffffffffffffffffffffffffffffffffff8116612155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e6e6f74206265207a65726f20616464726573730000000000000000000060448201526064016107e7565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f137b621413925496477d46e5055ac0d56178bdd724ba8bf843afceef18268ba3906020015b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314612250576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107e7565b61225a6000614080565b565b60005474010000000000000000000000000000000000000000900460ff166122e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016107e7565b60035473ffffffffffffffffffffffffffffffffffffffff163314612361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f742061646d696e000000000000000000000000000000000000000000000060448201526064016107e7565b6103e88111156123cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f54726561737572792066656520746f6f2068696768000000000000000000000060448201526064016107e7565b6008819055600a546040518281527fb1c4ee38d35556741133da7ff9b6f7ab0fa88d0406133126ff128f635490a8579060200161204c565b60005474010000000000000000000000000000000000000000900460ff16612489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016107e7565b60035473ffffffffffffffffffffffffffffffffffffffff16331461250a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f742061646d696e000000000000000000000000000000000000000000000060448201526064016107e7565b73ffffffffffffffffffffffffffffffffffffffff8116612587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e6e6f74206265207a65726f20616464726573730000000000000000000060448201526064016107e7565b6000600b55600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117909155604080517ffeaf968c000000000000000000000000000000000000000000000000000000008152905163feaf968c9160048082019260a092909190829003018186803b15801561261e57600080fd5b505afa158015612632573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265691906150fd565b505060405173ffffffffffffffffffffffffffffffffffffffff851681527fb3eacd0e351fafdfefdec84e1cd19679b38dbcd63ea7c2c24da17fd2bc3b3c0e935060200191506121c49050565b60005474010000000000000000000000000000000000000000900460ff1615612728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016107e7565b60045473ffffffffffffffffffffffffffffffffffffffff1633146127a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f72000000000000000000000000000000000000000060448201526064016107e7565b6002547501000000000000000000000000000000000000000000900460ff1680156127ee575060025474010000000000000000000000000000000000000000900460ff165b6128a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f43616e206f6e6c792072756e2061667465722067656e6573697353746172745260448201527f6f756e6420616e642067656e657369734c6f636b526f756e642069732074726960648201527f6767657265640000000000000000000000000000000000000000000000000000608482015260a4016107e7565b6000806128ab6140f5565b915091508169ffffffffffffffffffff16600b819055506128db600a548369ffffffffffffffffffff16836142ef565b6129006001600a546128ed9190615348565b8369ffffffffffffffffffff1683614548565b6129176001600a546129129190615348565b6147b5565b600a546129259060016152ba565b600a81905561293390614958565b5050565b6000828152600d6020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152808220815160608101909252805483929190829060ff1660018111156129b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60018111156129eb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260018281015460208084019190915260029384015460ff908116151560409485015260008a8152600e835284902084516101c08101865281548152938101549284019290925293810154928201929092526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a820154610140820152600b820154610160820152600c820154610180820152600d909101549091161580156101a083018190529293509091612acc57508160400151155b8015612ae857506005548160600151612ae591906152ba565b42115b8015612af75750602082015115155b925050505b92915050565b60005474010000000000000000000000000000000000000000900460ff1615612b87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016107e7565b60035473ffffffffffffffffffffffffffffffffffffffff16331480612bc4575060045473ffffffffffffffffffffffffffffffffffffffff1633145b612c2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f74206f70657261746f722f61646d696e000000000000000000000000000060448201526064016107e7565b612c32614b6d565b600a546040517f68b095021b1f40fe513109f513c66692f0b3219aee674a69f4efc57badb8201d90600090a2565b60005474010000000000000000000000000000000000000000900460ff16612ce4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016107e7565b60035473ffffffffffffffffffffffffffffffffffffffff163314612d65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f742061646d696e000000000000000000000000000000000000000000000060448201526064016107e7565b808210612df4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f6275666665725365636f6e6473206d75737420626520696e666572696f72207460448201527f6f20696e74657276616c5365636f6e647300000000000000000000000000000060648201526084016107e7565b6005829055600681905560408051838152602081018390527fe60149e0431fec12df63dfab5fce2a9cefe9a4d3df5f41cb626f579ae1f2b91a910160405180910390a15050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600f602052604081205460609182918490612e73908790615348565b811115612eae5773ffffffffffffffffffffffffffffffffffffffff87166000908152600f6020526040902054612eab908790615348565b90505b60008167ffffffffffffffff811115612ef0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612f19578160200160208202803683370190505b50905060008267ffffffffffffffff811115612f5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612fc757816020015b60408051606081018252600080825260208083018290529282015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181612f7c5790505b50905060005b838110156131fd5773ffffffffffffffffffffffffffffffffffffffff8a166000908152600f60205260409020613004828b6152ba565b8154811061303b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015483828151811061307f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050600d60008483815181106130c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020908102919091018101518252818101929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff8e168252909252908190208151606081019092528054829060ff16600181111561314f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6001811115613187577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526001820154602082015260029091015460ff16151560409091015282518390839081106131df577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018190525080806131f59061538b565b915050612fcd565b50818161320a858b6152ba565b95509550955050505093509350939050565b6000828152600d6020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152808220815160608101909252805483929190829060ff166001811115613298577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60018111156132d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260018281015460208084019190915260029384015460ff908116151560409485015260008a8152600e835284902084516101c081018652815481529381015492840192909252938101549282019290925260038201546060820152600482015460808201819052600583015460a08301819052600684015460c0840152600784015460e084015260088401546101008401526009840154610120840152600a840154610140840152600b840154610160840152600c840154610180840152600d9093015490931615156101a082015292935014156133b557600092505050612afc565b806101a0015180156133ca5750602082015115155b80156133d857508160400151155b8015612af7575080608001518160a0015113801561342f575060008251600181111561342d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b145b80612af7575080608001518160a00151128015612af75750600182516001811115613483577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1495945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461350e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107e7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f43616e6e6f742062652070726564696374696f6e20746f6b656e20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016107e7565b61360b73ffffffffffffffffffffffffffffffffffffffff83163383613d61565b8173ffffffffffffffffffffffffffffffffffffffff167f14f11966a996e0629572e51064726d2057a80fbd34efc066682c06a71dbb6e988260405161365391815260200190565b60405180910390a25050565b60035473ffffffffffffffffffffffffffffffffffffffff1633146136e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f742061646d696e000000000000000000000000000000000000000000000060448201526064016107e7565b73ffffffffffffffffffffffffffffffffffffffff811661375d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e6e6f74206265207a65726f20616464726573730000000000000000000060448201526064016107e7565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fc47d127c07bdd56c5ccba00463ce3bd3c1bca71b4670eea6e5d0c02e4aa156e2906020016121c4565b60005474010000000000000000000000000000000000000000900460ff16613854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016107e7565b60035473ffffffffffffffffffffffffffffffffffffffff1633146138d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f742061646d696e000000000000000000000000000000000000000000000060448201526064016107e7565b600c8190556040518181527f93ccaceac092ffb842c46b8718667a13a80e9058dcd0bd403d0b47215b30da07906020016121c4565b60005474010000000000000000000000000000000000000000900460ff161561398f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016107e7565b60045473ffffffffffffffffffffffffffffffffffffffff163314613a10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f72000000000000000000000000000000000000000060448201526064016107e7565b6002547501000000000000000000000000000000000000000000900460ff16613abb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f43616e206f6e6c792072756e2061667465722067656e6573697353746172745260448201527f6f756e642069732074726967676572656400000000000000000000000000000060648201526084016107e7565b60025474010000000000000000000000000000000000000000900460ff1615613b66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f43616e206f6e6c792072756e2067656e657369734c6f636b526f756e64206f6e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016107e7565b600080613b716140f5565b915091508169ffffffffffffffffffff16600b81905550613ba1600a548369ffffffffffffffffffff16836142ef565b600a54613baf9060016152ba565b600a819055613bbd90614002565b5050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055565b600f6020528160005260406000208181548110613c1c57600080fd5b90600052602060002001600091509150505481565b60005473ffffffffffffffffffffffffffffffffffffffff163314613cb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107e7565b73ffffffffffffffffffffffffffffffffffffffff8116613d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107e7565b613d5e81614080565b50565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052613e359084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614c59565b505050565b6000818152600e602052604081206001015415801590613e6a57506000828152600e602052604090206002015415155b8015613e8657506000828152600e602052604090206001015442115b8015612afc5750506000908152600e6020526040902060020154421090565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052613f039085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613db3565b50505050565b60005474010000000000000000000000000000000000000000900460ff16613f8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016107e7565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000818152600e602052604090204260018201819055600654614024916152ba565b6002808301919091556006546140399161530b565b61404390426152ba565b600382015581815560006008820181905560405183917f939f42374aa9bf1d8d8cd56d8a9110cb040cd8dfeae44080c6fcf2645e51b45291a25050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000806000600c544261410891906152ba565b90506000806000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561417757600080fd5b505afa15801561418b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141af91906150fd565b509350509250925083811115614247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4f7261636c6520757064617465206578636565646564206d61782074696d657360448201527f74616d7020616c6c6f77616e636500000000000000000000000000000000000060648201526084016107e7565b600b548369ffffffffffffffffffff16116142e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4f7261636c652075706461746520726f756e644964206d757374206265206c6160448201527f72676572207468616e206f7261636c654c6174657374526f756e64496400000060648201526084016107e7565b509094909350915050565b6000838152600e602052604090206001015461438d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f43616e206f6e6c79206c6f636b20726f756e6420616674657220726f756e642060448201527f686173207374617274656400000000000000000000000000000000000000000060648201526084016107e7565b6000838152600e602052604090206002015442101561442e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f43616e206f6e6c79206c6f636b20726f756e64206166746572206c6f636b546960448201527f6d657374616d700000000000000000000000000000000000000000000000000060648201526084016107e7565b6005546000848152600e602052604090206002015461444d91906152ba565b4211156144dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f43616e206f6e6c79206c6f636b20726f756e642077697468696e20627566666560448201527f725365636f6e647300000000000000000000000000000000000000000000000060648201526084016107e7565b6000838152600e602052604090206006546144f790426152ba565b60038201556004810182905560068101839055604051828152839085907f482e76a65b448a42deef26e99e58fb20c85e26f075defff8df6aa80459b39006906020015b60405180910390a350505050565b6000838152600e60205260409020600201546145e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f43616e206f6e6c7920656e6420726f756e6420616674657220726f756e64206860448201527f6173206c6f636b6564000000000000000000000000000000000000000000000060648201526084016107e7565b6000838152600e6020526040902060030154421015614687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f43616e206f6e6c7920656e6420726f756e6420616674657220636c6f7365546960448201527f6d657374616d700000000000000000000000000000000000000000000000000060648201526084016107e7565b6005546000848152600e60205260409020600301546146a691906152ba565b421115614735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f43616e206f6e6c7920656e6420726f756e642077697468696e2062756666657260448201527f5365636f6e64730000000000000000000000000000000000000000000000000060648201526084016107e7565b6000838152600e6020526040908190206005810183905560078101849055600d810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790559051839085907fb6ff1fe915db84788cbbbc017f0d2bef9485fad9fd0bd8ce9340fde0d8410dd89061453a9086815260200190565b6000818152600e60205260409020600b01541580156147e357506000818152600e60205260409020600c0154155b614849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f526577617264732063616c63756c61746564000000000000000000000000000060448201526064016107e7565b6000818152600e60205260408120600481015460058201549192918291829113156148ad5783600901549250612710600854856008015461488a919061530b565b61489491906152d2565b91508184600801546148a69190615348565b90506148e6565b8360040154846005015412156148d95783600a01549250612710600854856008015461488a919061530b565b5050506008810154600090815b600b8401839055600c8401819055600980548391906000906149099084906152ba565b9091555050604080518481526020810183905290810183905285907f6dfdfcb09c8804d0058826cd2539f1acfbe3cb887c9be03d928035bce0f1a58d9060600160405180910390a25050505050565b6002547501000000000000000000000000000000000000000000900460ff16614a03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f43616e206f6e6c792072756e2061667465722067656e6573697353746172745260448201527f6f756e642069732074726967676572656400000000000000000000000000000060648201526084016107e7565b600e6000614a12600284615348565b81526020019081526020016000206003015460001415614ab4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f43616e206f6e6c7920737461727420726f756e6420616674657220726f756e6460448201527f206e2d322068617320656e64656400000000000000000000000000000000000060648201526084016107e7565b600e6000614ac3600284615348565b815260200190815260200160002060030154421015614b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43616e206f6e6c79207374617274206e657720726f756e64206166746572207260448201527f6f756e64206e2d3220636c6f736554696d657374616d7000000000000000000060648201526084016107e7565b613d5e81614002565b60005474010000000000000000000000000000000000000000900460ff1615614bf2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016107e7565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613fd83390565b6000614cbb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614d659092919063ffffffff16565b805190915015613e355780806020019051810190614cd99190615079565b613e35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016107e7565b6060614d748484600085614d7e565b90505b9392505050565b606082471015614e10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016107e7565b843b614e78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107e7565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051614ea19190615187565b60006040518083038185875af1925050503d8060008114614ede576040519150601f19603f3d011682016040523d82523d6000602084013e614ee3565b606091505b5091509150614ef3828286614efe565b979650505050505050565b60608315614f0d575081614d77565b825115614f1d5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e79190615269565b803573ffffffffffffffffffffffffffffffffffffffff81168114614f7557600080fd5b919050565b805169ffffffffffffffffffff81168114614f7557600080fd5b600060208284031215614fa5578081fd5b614d7782614f51565b60008060408385031215614fc0578081fd5b614fc983614f51565b946020939093013593505050565b600080600060608486031215614feb578081fd5b614ff484614f51565b95602085013595506040909401359392505050565b6000806020838503121561501b578182fd5b823567ffffffffffffffff80821115615032578384fd5b818501915085601f830112615045578384fd5b813581811115615053578485fd5b8660208260051b8501011115615067578485fd5b60209290920196919550909350505050565b60006020828403121561508a578081fd5b81518015158114614d77578182fd5b6000602082840312156150aa578081fd5b5035919050565b600080604083850312156150c3578182fd5b823591506150d360208401614f51565b90509250929050565b600080604083850312156150ee578182fd5b50508035926020909101359150565b600080600080600060a08688031215615114578081fd5b61511d86614f7a565b945060208601519350604086015192506060860151915061514060808701614f7a565b90509295509295909350565b60028110615183577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b6000825161519981846020870161535f565b9190910192915050565b60608082528451828201819052600091906020906080850190828901855b828110156151dd578151845292840192908401906001016151c1565b50505084810382860152865180825287830191830190855b8181101561522e57835161520a84825161514c565b808601518487015260409081015115159084015292840192918501916001016151f5565b505080945050505050826040830152949350505050565b60608101615253828661514c565b8360208301528215156040830152949350505050565b602081526000825180602084015261528881604085016020870161535f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600082198211156152cd576152cd6153c4565b500190565b600082615306577f4e487b710000000000000000000000000000000000000000000000000000000081526012600452602481fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615343576153436153c4565b500290565b60008282101561535a5761535a6153c4565b500390565b60005b8381101561537a578181015183820152602001615362565b83811115613f035750506000910152565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156153bd576153bd6153c4565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212208a55ebfca524e089c68a80a3d64a2b24b27cc6848ce9b0747b129df0dade081564736f6c634300080400330000000000000000000000007de832a36dff2f75806d7b5c43ad95ed56a6f91400000000000000000000000065e8d79f3e8e36fe48ec31a2ae935e92f5bbf529000000000000000000000000ce44798440952ebd75cf1fdc62a996d28137ef30000000000000000000000000ce44798440952ebd75cf1fdc62a996d28137ef30000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000000000000000000012c00000000000000000000000000000000000000000000000000000000000003e8

Deployed ByteCode Sourcemap

23948:23013:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34845:269;;;:::i;:::-;;29128:969;;;;;;:::i;:::-;;:::i;24159:35::-;;;;;;;;;;;;;;;6580:14:1;;6573:22;6555:41;;6543:2;6528:18;24159:35:0;;;;;;;;24304:30;;;;;;;;;;;;4146:42:1;4134:55;;;4116:74;;4104:2;4089:18;24304:30:0;4071:125:1;39798:124:0;;;;;;:::i;:::-;39891:16;;39864:7;39891:16;;;:10;:16;;;;;:23;;39798:124;;;;7617:25:1;;;7605:2;7590:18;39798:124:0;7572:76:1;24720:29:0;;;;;;30185:969;;;;;;:::i;:::-;;:::i;35348:196::-;;;:::i;34217:263::-;;;:::i;20311:86::-;20358:4;20382:7;;;;;;20311:86;;24950:36;;;;;;31271:1290;;;;;;:::i;:::-;;:::i;36172:249::-;;;;;;:::i;:::-;;:::i;38502:228::-;;;;;;:::i;:::-;;:::i;23146:94::-;;;:::i;25069:61::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24798:27::-;;;;;;37657:257;;;;;;:::i;:::-;;:::i;36856:383::-;;;;;;:::i;:::-;;:::i;32701:758::-;;;:::i;40826:374::-;;;;;;:::i;:::-;;:::i;24468:30::-;;;;;;24115:35;;;;;;;;;34618:124;;;:::i;35654:428::-;;;;;;:::i;:::-;;:::i;25137:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25020:25:1;;;25076:2;25061:18;;25054:34;;;;25104:18;;;25097:34;;;;25162:2;25147:18;;25140:34;;;;25205:3;25190:19;;25183:35;;;;25249:3;25234:19;;25227:35;;;;25293:3;25278:19;;25271:35;;;;25337:3;25322:19;;25315:35;25381:3;25366:19;;25359:35;25425:3;25410:19;;25403:35;25469:3;25454:19;;25447:36;25514:3;25499:19;;25492:36;25559:3;25544:19;;25537:36;25617:15;25610:23;25604:3;25589:19;;25582:52;25007:3;24992:19;25137:39:0;24974:666:1;22495:87:0;22541:7;22568:6;;;22495:87;;38936:758;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;40085:577::-;;;;;;:::i;:::-;;:::i;38131:280::-;;;;;;:::i;:::-;;:::i;36515:249::-;;;;;;:::i;:::-;;:::i;24641:26::-;;;;;;37340:227;;;;;;:::i;:::-;;:::i;33554:558::-;;;:::i;25183:47::-;;;;;;:::i;:::-;;:::i;24370:28::-;;;;;;24872:34;;;;;;25006:47;;25049:4;25006:47;;23395:192;;;;;;:::i;:::-;;:::i;24201:36::-;;;;;;;;;;;;24560:27;;;;;;24057:29;;;;;24246:27;;;;;;;;;34845:269;17454:1;18050:7;;:19;;18042:63;;;;;;;22155:2:1;18042:63:0;;;22137:21:1;22194:2;22174:18;;;22167:30;22233:33;22213:18;;;22206:61;22284:18;;18042:63:0;;;;;;;;;17454:1;18183:7;:18;27190:12:::1;::::0;::::1;;27176:10;:26;27168:48;;;::::0;::::1;::::0;;23621:2:1;27168:48:0::1;::::0;::::1;23603:21:1::0;23660:1;23640:18;;;23633:29;23698:11;23678:18;;;23671:39;23727:18;;27168:48:0::1;23593:158:1::0;27168:48:0::1;34945:14:::2;::::0;;34913:29:::2;34970:18:::0;;;35018:12:::2;::::0;34999:55:::2;::::0;35018:12:::2;34999:5;:18:::0;::::2;::::0;35018:12:::2;34945:14:::0;34999:18:::2;:55::i;:::-;35070:36;::::0;7617:25:1;;;35070:36:0::2;::::0;7605:2:1;7590:18;35070:36:0::2;;;;;;;-1:-1:-1::0;17410:1:0;18362:22;;34845:269::o;29128:969::-;20358:4;20382:7;;;;;;20636:9;20628:38;;;;;;;17278:2:1;20628:38:0;;;17260:21:1;17317:2;17297:18;;;17290:30;17356:18;17336;;;17329:46;17392:18;;20628:38:0;17250:166:1;20628:38:0;17454:1:::1;18050:7;;:19;;18042:63;;;::::0;::::1;::::0;;22155:2:1;18042:63:0::1;::::0;::::1;22137:21:1::0;22194:2;22174:18;;;22167:30;22233:33;22213:18;;;22206:61;22284:18;;18042:63:0::1;22127:181:1::0;18042:63:0::1;17454:1;18183:7;:18:::0;27576:10:::2;46894:20:::0;46942:8;27555:57:::2;;;::::0;::::2;::::0;;11843:2:1;27555:57:0::2;::::0;::::2;11825:21:1::0;11882:2;11862:18;;;11855:30;11921:22;11901:18;;;11894:50;11961:18;;27555:57:0::2;11815:170:1::0;27555:57:0::2;27631:10;27645:9;27631:23;27623:62;;;::::0;::::2;::::0;;17974:2:1;27623:62:0::2;::::0;::::2;17956:21:1::0;18013:2;17993:18;;;17986:30;18052:28;18032:18;;;18025:56;18098:18;;27623:62:0::2;17946:176:1::0;27623:62:0::2;29253:12:::3;;29244:5;:21;29236:55;;;::::0;::::3;::::0;;22515:2:1;29236:55:0::3;::::0;::::3;22497:21:1::0;22554:2;22534:18;;;22527:30;22593:23;22573:18;;;22566:51;22634:18;;29236:55:0::3;22487:171:1::0;29236:55:0::3;29310:16;29320:5;29310:9;:16::i;:::-;29302:47;;;::::0;::::3;::::0;;18690:2:1;29302:47:0::3;::::0;::::3;18672:21:1::0;18729:2;18709:18;;;18702:30;18768:20;18748:18;;;18741:48;18806:18;;29302:47:0::3;18662:168:1::0;29302:47:0::3;29379:12;;29368:7;:23;;29360:80;;;::::0;::::3;::::0;;16108:2:1;29360:80:0::3;::::0;::::3;16090:21:1::0;16147:2;16127:18;;;16120:30;16186:34;16166:18;;;16159:62;16257:14;16237:18;;;16230:42;16289:19;;29360:80:0::3;16080:234:1::0;29360:80:0::3;29459:13;::::0;;;:6:::3;:13;::::0;;;;;;;29473:10:::3;29459:25:::0;;;;;;;:32:::3;;::::0;:37;29451:77:::3;;;::::0;::::3;::::0;;21388:2:1;29451:77:0::3;::::0;::::3;21370:21:1::0;21427:2;21407:18;;;21400:30;21466:29;21446:18;;;21439:57;21513:18;;29451:77:0::3;21360:177:1::0;29451:77:0::3;29541:58;:22;:5;:22;29564:10;29584:4;29591:7:::0;29541:22:::3;:58::i;:::-;29640:14;29697:13:::0;;;:6:::3;:13;::::0;;;;29741:17:::3;::::0;::::3;::::0;29657:7;;29697:13;29741:26:::3;::::0;29657:7;;29741:26:::3;:::i;:::-;29721:17;::::0;::::3;:46:::0;29797:16:::3;::::0;::::3;::::0;:25:::3;::::0;29816:6;;29797:25:::3;:::i;:::-;29778:16;::::0;::::3;:44:::0;29864:23:::3;29890:13:::0;;;:6:::3;:13;::::0;;;;;;;29904:10:::3;29890:25:::0;;;;;;;;;29926:32;;;::::3;29945:13;29926:32:::0;;::::3;::::0;;29969:14;;::::3;:23:::0;;;30003:10:::3;:22:::0;;;;;:34;;;;::::3;::::0;;;;;;;;;;::::3;::::0;;;30055;;7617:25:1;;;29890:13:0;;30055:34:::3;::::0;7590:18:1;30055:34:0::3;;;;;;;;-1:-1:-1::0;;17410:1:0::1;18362:22:::0;;-1:-1:-1;;;29128:969:0:o;30185:::-;20358:4;20382:7;;;;;;20636:9;20628:38;;;;;;;17278:2:1;20628:38:0;;;17260:21:1;17317:2;17297:18;;;17290:30;17356:18;17336;;;17329:46;17392:18;;20628:38:0;17250:166:1;20628:38:0;17454:1:::1;18050:7;;:19;;18042:63;;;::::0;::::1;::::0;;22155:2:1;18042:63:0::1;::::0;::::1;22137:21:1::0;22194:2;22174:18;;;22167:30;22233:33;22213:18;;;22206:61;22284:18;;18042:63:0::1;22127:181:1::0;18042:63:0::1;17454:1;18183:7;:18:::0;27576:10:::2;46894:20:::0;46942:8;27555:57:::2;;;::::0;::::2;::::0;;11843:2:1;27555:57:0::2;::::0;::::2;11825:21:1::0;11882:2;11862:18;;;11855:30;11921:22;11901:18;;;11894:50;11961:18;;27555:57:0::2;11815:170:1::0;27555:57:0::2;27631:10;27645:9;27631:23;27623:62;;;::::0;::::2;::::0;;17974:2:1;27623:62:0::2;::::0;::::2;17956:21:1::0;18013:2;17993:18;;;17986:30;18052:28;18032:18;;;18025:56;18098:18;;27623:62:0::2;17946:176:1::0;27623:62:0::2;30310:12:::3;;30301:5;:21;30293:55;;;::::0;::::3;::::0;;22515:2:1;30293:55:0::3;::::0;::::3;22497:21:1::0;22554:2;22534:18;;;22527:30;22593:23;22573:18;;;22566:51;22634:18;;30293:55:0::3;22487:171:1::0;30293:55:0::3;30367:16;30377:5;30367:9;:16::i;:::-;30359:47;;;::::0;::::3;::::0;;18690:2:1;30359:47:0::3;::::0;::::3;18672:21:1::0;18729:2;18709:18;;;18702:30;18768:20;18748:18;;;18741:48;18806:18;;30359:47:0::3;18662:168:1::0;30359:47:0::3;30436:12;;30425:7;:23;;30417:80;;;::::0;::::3;::::0;;16108:2:1;30417:80:0::3;::::0;::::3;16090:21:1::0;16147:2;16127:18;;;16120:30;16186:34;16166:18;;;16159:62;16257:14;16237:18;;;16230:42;16289:19;;30417:80:0::3;16080:234:1::0;30417:80:0::3;30516:13;::::0;;;:6:::3;:13;::::0;;;;;;;30530:10:::3;30516:25:::0;;;;;;;:32:::3;;::::0;:37;30508:77:::3;;;::::0;::::3;::::0;;21388:2:1;30508:77:0::3;::::0;::::3;21370:21:1::0;21427:2;21407:18;;;21400:30;21466:29;21446:18;;;21439:57;21513:18;;30508:77:0::3;21360:177:1::0;30508:77:0::3;30598:58;:22;:5;:22;30621:10;30641:4;30648:7:::0;30598:22:::3;:58::i;:::-;30697:14;30754:13:::0;;;:6:::3;:13;::::0;;;;30798:17:::3;::::0;::::3;::::0;30714:7;;30754:13;30798:26:::3;::::0;30714:7;;30798:26:::3;:::i;:::-;30778:17;::::0;::::3;:46:::0;30854:16:::3;::::0;::::3;::::0;:25:::3;::::0;30873:6;;30854:25:::3;:::i;:::-;30835:16;::::0;::::3;:44:::0;30921:23:::3;30947:13:::0;;;:6:::3;:13;::::0;;;;;;;30961:10:::3;30947:25:::0;;;;;;;;;30983:32;;;::::3;::::0;;;31026:14;;::::3;:23:::0;;;31060:10:::3;:22:::0;;;;;:34;;;;::::3;::::0;;;;;;;;;;::::3;::::0;;;31112;;7617:25:1;;;30947:13:0;;31112:34:::3;::::0;7590:18:1;31112:34:0::3;7572:76:1::0;35348:196:0;20358:4;20382:7;;;;;;20906:41;;;;;;;8302:2:1;20906:41:0;;;8284:21:1;8341:2;8321:18;;;8314:30;8380:22;8360:18;;;8353:50;8420:18;;20906:41:0;8274:170:1;20906:41:0;27308:12:::1;::::0;::::1;;27294:10;:26;::::0;:59:::1;;-1:-1:-1::0;27338:15:0::1;::::0;::::1;;27324:10;:29;27294:59;27286:90;;;::::0;::::1;::::0;;13793:2:1;27286:90:0::1;::::0;::::1;13775:21:1::0;13832:2;13812:18;;;13805:30;13871:20;13851:18;;;13844:48;13909:18;;27286:90:0::1;13765:168:1::0;27286:90:0::1;35418:16:::2;:24:::0;;35453:23;;;;35487:10:::2;:8;:10::i;:::-;35523:12;::::0;35515:21:::2;::::0;::::2;::::0;;;::::2;35348:196::o:0;34217:263::-;20358:4;20382:7;;;;;;20636:9;20628:38;;;;;;;17278:2:1;20628:38:0;;;17260:21:1;17317:2;17297:18;;;17290:30;17356:18;17336;;;17329:46;17392:18;;20628:38:0;17250:166:1;20628:38:0;27461:15:::1;::::0;::::1;;27447:10;:29;27439:54;;;::::0;::::1;::::0;;23280:2:1;27439:54:0::1;::::0;::::1;23262:21:1::0;23319:2;23299:18;;;23292:30;23358:14;23338:18;;;23331:42;23390:18;;27439:54:0::1;23252:162:1::0;27439:54:0::1;34302:16:::2;::::0;;;::::2;;;34301:17;34293:65;;;::::0;::::2;::::0;;19447:2:1;34293:65:0::2;::::0;::::2;19429:21:1::0;19486:2;19466:18;;;19459:30;19525:34;19505:18;;;19498:62;19596:5;19576:18;;;19569:33;19619:19;;34293:65:0::2;19419:225:1::0;34293:65:0::2;34386:12;::::0;:16:::2;::::0;34401:1:::2;34386:16;:::i;:::-;34371:12;:31:::0;;;34413:25:::2;::::0;:11:::2;:25::i;:::-;34449:16;:23:::0;;;::::2;::::0;::::2;::::0;;34217:263::o;31271:1290::-;17454:1;18050:7;;:19;;18042:63;;;;;;;22155:2:1;18042:63:0;;;22137:21:1;22194:2;22174:18;;;22167:30;22233:33;22213:18;;;22206:61;22284:18;;18042:63:0;22127:181:1;18042:63:0;17454:1;18183:7;:18;27576:10:::1;46894:20:::0;46942:8;27555:57:::1;;;::::0;::::1;::::0;;11843:2:1;27555:57:0::1;::::0;::::1;11825:21:1::0;11882:2;11862:18;;;11855:30;11921:22;11901:18;;;11894:50;11961:18;;27555:57:0::1;11815:170:1::0;27555:57:0::1;27631:10;27645:9;27631:23;27623:62;;;::::0;::::1;::::0;;17974:2:1;27623:62:0::1;::::0;::::1;17956:21:1::0;18013:2;17993:18;;;17986:30;18052:28;18032:18;;;18025:56;18098:18;;27623:62:0::1;17946:176:1::0;27623:62:0::1;31358:14:::2;::::0;31407:1054:::2;31427:17:::0;;::::2;31407:1054;;;31474:6;:17;31481:6;;31488:1;31481:9;;;;;;;;;;;;;;;;;;;;;31474:17;;;;;;;;;;;:32;;;31510:1;31474:37;;31466:71;;;::::0;::::2;::::0;;21038:2:1;31466:71:0::2;::::0;::::2;21020:21:1::0;21077:2;21057:18;;;21050:30;21116:23;21096:18;;;21089:51;21157:18;;31466:71:0::2;21010:171:1::0;31466:71:0::2;31578:6;:17;31585:6;;31592:1;31585:9;;;;;;;;;;;;;;;;;;;;;31578:17;;;;;;;;;;;:32;;;31560:15;:50;31552:82;;;::::0;::::2;::::0;;16521:2:1;31552:82:0::2;::::0;::::2;16503:21:1::0;16560:2;16540:18;;;16533:30;16599:21;16579:18;;;16572:49;16638:18;;31552:82:0::2;16493:169:1::0;31552:82:0::2;31651:19;31738:6;:17;31745:6;;31752:1;31745:9;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;;31738:17:::0;;-1:-1:-1;31738:17:0;::::2;::::0;;;;;;-1:-1:-1;31738:17:0;:30:::2;;::::0;::::2;;31734:556;;;31797:32;31807:6;;31814:1;31807:9;;;;;;;;;;;;;;;;;;;;;31818:10;31797:9;:32::i;:::-;31789:67;;;::::0;::::2;::::0;;12610:2:1;31789:67:0::2;::::0;::::2;12592:21:1::0;12649:2;12629:18;;;12622:30;12688:24;12668:18;;;12661:52;12730:18;;31789:67:0::2;12582:172:1::0;31789:67:0::2;31875:18;31896:6;:17;31903:6;;31910:1;31903:9;;;;;;;;;;;;;;;;;;;;;31896:17;;;;;;;;;;;31875:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;32008:5;:25;;;31986:5;:18;;;31947:6;:17;31954:6;;31961:1;31954:9;;;;;;;;;;;;;;;;;;;;;31947:17;;;;;;;;;;;:29;31965:10;31947:29;;;;;;;;;;;;;;;:36;;;:57;;;;:::i;:::-;31946:87;;;;:::i;:::-;31932:101;;31734:556;;;;32144:33;32155:6;;32162:1;32155:9;;;;;;;;;;;;;;;;;;;;;32166:10;32144;:33::i;:::-;32136:69;;;::::0;::::2;::::0;;8651:2:1;32136:69:0::2;::::0;::::2;8633:21:1::0;8690:2;8670:18;;;8663:30;8729:25;8709:18;;;8702:53;8772:18;;32136:69:0::2;8623:173:1::0;32136:69:0::2;32238:6;:17;32245:6;;32252:1;32245:9;;;;;;;;;;;;;;;;;;;;;32238:17;;;;;;;;;;;:29;32256:10;32238:29;;;;;;;;;;;;;;;:36;;;32224:50;;31734:556;32346:4;32306:6;:17;32313:6;;32320:1;32313:9;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;;32306:17:::0;;-1:-1:-1;32306:17:0;;::::2;::::0;;;;;;;;-1:-1:-1;32306:17:0;;;32324:10:::2;32306:29:::0;;;;;;;:37:::2;;:44:::0;;;::::2;::::0;::::2;;::::0;;;::::2;::::0;;32365:21:::2;32375:11:::0;32365:21;::::2;:::i;:::-;;;32426:6;;32433:1;32426:9;;;;;;;;;;;;;;;;;;;;;32414:10;32408:41;;;32437:11;32408:41;;;;7617:25:1::0;;7605:2;7590:18;;7572:76;32408:41:0::2;;;;;;;;-1:-1:-1::0;31446:3:0;::::2;::::0;::::2;:::i;:::-;;;;31407:1054;;;-1:-1:-1::0;32477:10:0;;32473:81:::2;;32504:38;:18;:5;:18;32523:10;32535:6:::0;32504:18:::2;:38::i;:::-;-1:-1:-1::0;;17410:1:0;18362:22;;-1:-1:-1;31271:1290:0:o;36172:249::-;20358:4;20382:7;;;;;;20906:41;;;;;;;8302:2:1;20906:41:0;;;8284:21:1;8341:2;8321:18;;;8314:30;8380:22;8360:18;;;8353:50;8420:18;;20906:41:0;8274:170:1;20906:41:0;27190:12:::1;::::0;::::1;;27176:10;:26;27168:48;;;::::0;::::1;::::0;;23621:2:1;27168:48:0::1;::::0;::::1;23603:21:1::0;23660:1;23640:18;;;23633:29;23698:11;23678:18;;;23671:39;23727:18;;27168:48:0::1;23593:158:1::0;27168:48:0::1;36269:18:::0;36261:52:::2;;;::::0;::::2;::::0;;19851:2:1;36261:52:0::2;::::0;::::2;19833:21:1::0;19890:2;19870:18;;;19863:30;19929:23;19909:18;;;19902:51;19970:18;;36261:52:0::2;19823:171:1::0;36261:52:0::2;36324:12;:28:::0;;;36386:12:::2;::::0;36370:43:::2;::::0;7617:25:1;;;36370:43:0::2;::::0;7605:2:1;7590:18;36370:43:0::2;;;;;;;;36172:249:::0;:::o;38502:228::-;22541:7;22568:6;22715:23;22568:6;19103:10;22715:23;22707:68;;;;;;;18329:2:1;22707:68:0;;;18311:21:1;;;18348:18;;;18341:30;18407:34;18387:18;;;18380:62;18459:18;;22707:68:0;18301:182:1;22707:68:0;38581:27:::1;::::0;::::1;38573:62;;;::::0;::::1;::::0;;17623:2:1;38573:62:0::1;::::0;::::1;17605:21:1::0;17662:2;17642:18;;;17635:30;17701:24;17681:18;;;17674:52;17743:18;;38573:62:0::1;17595:172:1::0;38573:62:0::1;38646:12;:28:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;38692:30:::1;::::0;4116:74:1;;;38692:30:0::1;::::0;4104:2:1;4089:18;38692:30:0::1;;;;;;;;38502:228:::0;:::o;23146:94::-;22541:7;22568:6;22715:23;22568:6;19103:10;22715:23;22707:68;;;;;;;18329:2:1;22707:68:0;;;18311:21:1;;;18348:18;;;18341:30;18407:34;18387:18;;;18380:62;18459:18;;22707:68:0;18301:182:1;22707:68:0;23211:21:::1;23229:1;23211:9;:21::i;:::-;23146:94::o:0;37657:257::-;20358:4;20382:7;;;;;;20906:41;;;;;;;8302:2:1;20906:41:0;;;8284:21:1;8341:2;8321:18;;;8314:30;8380:22;8360:18;;;8353:50;8420:18;;20906:41:0;8274:170:1;20906:41:0;27190:12:::1;::::0;::::1;;27176:10;:26;27168:48;;;::::0;::::1;::::0;;23621:2:1;27168:48:0::1;::::0;::::1;23603:21:1::0;23660:1;23640:18;;;23633:29;23698:11;23678:18;;;23671:39;23727:18;;27168:48:0::1;23593:158:1::0;27168:48:0::1;25049:4:::2;37752:12;:32;;37744:66;;;::::0;::::2;::::0;;9003:2:1;37744:66:0::2;::::0;::::2;8985:21:1::0;9042:2;9022:18;;;9015:30;9081:23;9061:18;;;9054:51;9122:18;;37744:66:0::2;8975:171:1::0;37744:66:0::2;37821:11;:26:::0;;;37880:12:::2;::::0;37865:41:::2;::::0;7617:25:1;;;37865:41:0::2;::::0;7605:2:1;7590:18;37865:41:0::2;7572:76:1::0;36856:383:0;20358:4;20382:7;;;;;;20906:41;;;;;;;8302:2:1;20906:41:0;;;8284:21:1;8341:2;8321:18;;;8314:30;8380:22;8360:18;;;8353:50;8420:18;;20906:41:0;8274:170:1;20906:41:0;27190:12:::1;::::0;::::1;;27176:10;:26;27168:48;;;::::0;::::1;::::0;;23621:2:1;27168:48:0::1;::::0;::::1;23603:21:1::0;23660:1;23640:18;;;23633:29;23698:11;23678:18;;;23671:39;23727:18;;27168:48:0::1;23593:158:1::0;27168:48:0::1;36941:21:::2;::::0;::::2;36933:56;;;::::0;::::2;::::0;;17623:2:1;36933:56:0::2;::::0;::::2;17605:21:1::0;17662:2;17642:18;;;17635:30;17701:24;17681:18;;;17674:52;17743:18;;36933:56:0::2;17595:172:1::0;36933:56:0::2;37022:1;37000:19;:23:::0;37034:6:::2;:39:::0;;;::::2;;::::0;::::2;::::0;;::::2;::::0;;;37171:24:::2;::::0;;;;;;;:22:::2;::::0;:24:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;;37034:39;37171:24;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;37213:18:0::2;::::0;4146:42:1;4134:55;;4116:74;;37213:18:0::2;::::0;-1:-1:-1;4104:2:1;4089:18;;-1:-1:-1;37213:18:0::2;::::0;-1:-1:-1;4071:125:1;32701:758:0;20358:4;20382:7;;;;;;20636:9;20628:38;;;;;;;17278:2:1;20628:38:0;;;17260:21:1;17317:2;17297:18;;;17290:30;17356:18;17336;;;17329:46;17392:18;;20628:38:0;17250:166:1;20628:38:0;27461:15:::1;::::0;::::1;;27447:10;:29;27439:54;;;::::0;::::1;::::0;;23280:2:1;27439:54:0::1;::::0;::::1;23262:21:1::0;23319:2;23299:18;;;23292:30;23358:14;23338:18;;;23331:42;23390:18;;27439:54:0::1;23252:162:1::0;27439:54:0::1;32794:16:::2;::::0;;;::::2;;;:35:::0;::::2;;;-1:-1:-1::0;32814:15:0::2;::::0;;;::::2;;;32794:35;32772:155;;;::::0;::::2;::::0;;20201:2:1;32772:155:0::2;::::0;::::2;20183:21:1::0;20240:2;20220:18;;;20213:30;20279:34;20259:18;;;20252:62;20350:34;20330:18;;;20323:62;20422:8;20401:19;;;20394:37;20448:19;;32772:155:0::2;20173:300:1::0;32772:155:0::2;32941:21;32964:19:::0;32987:21:::2;:19;:21::i;:::-;32940:68;;;;33051:14;33043:23;;33021:19;:45;;;;33135:58;33150:12;;33164:14;33135:58;;33180:12;33135:14;:58::i;:::-;33204:61;33233:1;33218:12;;:16;;;;:::i;:::-;33236:14;33204:61;;33252:12;33204:13;:61::i;:::-;33276:35;33309:1;33294:12;;:16;;;;:::i;:::-;33276:17;:35::i;:::-;33395:12;::::0;:16:::2;::::0;33410:1:::2;33395:16;:::i;:::-;33380:12;:31:::0;;;33422:29:::2;::::0;:15:::2;:29::i;:::-;27504:1;;32701:758::o:0;40826:374::-;40896:4;40938:13;;;:6;:13;;;;;;;;:19;;;;;;;;;;;40913:44;;;;;;;;;;40896:4;;40913:44;40938:19;40913:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40989:13:0;;;:6;:13;;;;;40968:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40913:44;40968:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40913:44;;-1:-1:-1;40968:34:0;;41033:52;;;41070:7;:15;;;41069:16;41033:52;:123;;;;;41143:13;;41120:5;:20;;;:36;;;;:::i;:::-;41102:15;:54;41033:123;:159;;;;-1:-1:-1;41173:14:0;;;;:19;;41033:159;41013:179;;;;40826:374;;;;;:::o;34618:124::-;20358:4;20382:7;;;;;;20636:9;20628:38;;;;;;;17278:2:1;20628:38:0;;;17260:21:1;17317:2;17297:18;;;17290:30;17356:18;17336;;;17329:46;17392:18;;20628:38:0;17250:166:1;20628:38:0;27308:12:::1;::::0;::::1;;27294:10;:26;::::0;:59:::1;;-1:-1:-1::0;27338:15:0::1;::::0;::::1;;27324:10;:29;27294:59;27286:90;;;::::0;::::1;::::0;;13793:2:1;27286:90:0::1;::::0;::::1;13775:21:1::0;13832:2;13812:18;;;13805:30;13871:20;13851:18;;;13844:48;13909:18;;27286:90:0::1;13765:168:1::0;27286:90:0::1;34689:8:::2;:6;:8::i;:::-;34721:12;::::0;34715:19:::2;::::0;::::2;::::0;;;::::2;34618:124::o:0;35654:428::-;20358:4;20382:7;;;;;;20906:41;;;;;;;8302:2:1;20906:41:0;;;8284:21:1;8341:2;8321:18;;;8314:30;8380:22;8360:18;;;8353:50;8420:18;;20906:41:0;8274:170:1;20906:41:0;27190:12:::1;::::0;::::1;;27176:10;:26;27168:48;;;::::0;::::1;::::0;;23621:2:1;27168:48:0::1;::::0;::::1;23603:21:1::0;23660:1;23640:18;;;23633:29;23698:11;23678:18;;;23671:39;23727:18;;27168:48:0::1;23593:158:1::0;27168:48:0::1;35839:16:::2;35822:14;:33;35814:95;;;::::0;::::2;::::0;;12192:2:1;35814:95:0::2;::::0;::::2;12174:21:1::0;12231:2;12211:18;;;12204:30;12270:34;12250:18;;;12243:62;12341:19;12321:18;;;12314:47;12378:19;;35814:95:0::2;12164:239:1::0;35814:95:0::2;35920:13;:30:::0;;;35961:15:::2;:34:::0;;;36013:61:::2;::::0;;24112:25:1;;;24168:2;24153:18;;24146:34;;;36013:61:0::2;::::0;24085:18:1;36013:61:0::2;;;;;;;35654:428:::0;;:::o;38936:758::-;39245:16;;;39163:7;39245:16;;;:10;:16;;;;;:23;39101:16;;;;39215:4;;39245:32;;39271:6;;39245:32;:::i;:::-;39236:6;:41;39232:115;;;39303:16;;;;;;;:10;:16;;;;;:23;:32;;39329:6;;39303:32;:::i;:::-;39294:41;;39232:115;39359:23;39399:6;39385:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39385:21:0;;39359:47;;39417:24;39458:6;39444:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;39444:21:0;;;;;;;;;;;;;;;39417:48;;39483:9;39478:155;39502:6;39498:1;:10;39478:155;;;39542:16;;;;;;;:10;:16;;;;;39559:10;39568:1;39559:6;:10;:::i;:::-;39542:28;;;;;;;;;;;;;;;;;;;;;;;;39530:6;39537:1;39530:9;;;;;;;;;;;;;;;;;;;;;:40;;;;;39598:6;:17;39605:6;39612:1;39605:9;;;;;;;;;;;;;;;;;;;;;;;;;;;39598:17;;;;;;;;;;;;;-1:-1:-1;39598:17:0;;;:23;;;;;;;;;;;;39585:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:10;;:7;;39593:1;;39585:10;;;;;;;;;;;;;;;;;;;:36;;;;39510:3;;;;;:::i;:::-;;;;39478:155;;;-1:-1:-1;39653:6:0;39661:7;39670:15;39679:6;39670;:15;:::i;:::-;39645:41;;;;;;;;;38936:758;;;;;;;:::o;40085:577::-;40154:4;40196:13;;;:6;:13;;;;;;;;:19;;;;;;;;;;;40171:44;;;;;;;;;;40154:4;;40171:44;40196:19;40171:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40247:13:0;;;:6;:13;;;;;40226:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40171:44;40226:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40171:44;;-1:-1:-1;40275:35:0;40271:80;;;40334:5;40327:12;;;;;;40271:80;40381:5;:18;;;:54;;;;-1:-1:-1;40416:14:0;;;;:19;;40381:54;:87;;;;;40453:7;:15;;;40452:16;40381:87;:273;;;;;40506:5;:15;;;40487:5;:16;;;:34;:71;;;;-1:-1:-1;40545:13:0;40525:16;;:33;;;;;;;;;;;;;;;;;40487:71;40486:167;;;;40600:5;:15;;;40581:5;:16;;;:34;:71;;;;-1:-1:-1;40639:13:0;40619:16;;:33;;;;;;;;;;;;;;;;;;40085:577;-1:-1:-1;;;;;40085:577:0:o;38131:280::-;22541:7;22568:6;22715:23;22568:6;19103:10;22715:23;22707:68;;;;;;;18329:2:1;22707:68:0;;;18311:21:1;;;18348:18;;;18341:30;18407:34;18387:18;;;18380:62;18459:18;;22707:68:0;18301:182:1;22707:68:0;38242:5:::1;38224:24;;:6;:24;;;;38216:71;;;::::0;::::1;::::0;;15705:2:1;38216:71:0::1;::::0;::::1;15687:21:1::0;15744:2;15724:18;;;15717:30;15783:34;15763:18;;;15756:62;15854:4;15834:18;;;15827:32;15876:19;;38216:71:0::1;15677:224:1::0;38216:71:0::1;38298:57;:27;::::0;::::1;38334:10;38347:7:::0;38298:27:::1;:57::i;:::-;38387:6;38373:30;;;38395:7;38373:30;;;;7617:25:1::0;;7605:2;7590:18;;7572:76;38373:30:0::1;;;;;;;;38131:280:::0;;:::o;36515:249::-;27190:12;;;;27176:10;:26;27168:48;;;;;;;23621:2:1;27168:48:0;;;23603:21:1;23660:1;23640:18;;;23633:29;23698:11;23678:18;;;23671:39;23727:18;;27168:48:0;23593:158:1;27168:48:0;36600:30:::1;::::0;::::1;36592:65;;;::::0;::::1;::::0;;17623:2:1;36592:65:0::1;::::0;::::1;17605:21:1::0;17662:2;17642:18;;;17635:30;17701:24;17681:18;;;17674:52;17743:18;;36592:65:0::1;17595:172:1::0;36592:65:0::1;36668:15;:34:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;36720:36:::1;::::0;4116:74:1;;;36720:36:0::1;::::0;4104:2:1;4089:18;36720:36:0::1;4071:125:1::0;37340:227:0;20358:4;20382:7;;;;;;20906:41;;;;;;;8302:2:1;20906:41:0;;;8284:21:1;8341:2;8321:18;;;8314:30;8380:22;8360:18;;;8353:50;8420:18;;20906:41:0;8274:170:1;20906:41:0;27190:12:::1;::::0;::::1;;27176:10;:26;27168:48;;;::::0;::::1;::::0;;23621:2:1;27168:48:0::1;::::0;::::1;23603:21:1::0;23660:1;23640:18;;;23633:29;23698:11;23678:18;;;23671:39;23727:18;;27168:48:0::1;23593:158:1::0;27168:48:0::1;37447:21:::2;:46:::0;;;37511:48:::2;::::0;7617:25:1;;;37511:48:0::2;::::0;7605:2:1;7590:18;37511:48:0::2;7572:76:1::0;33554:558:0;20358:4;20382:7;;;;;;20636:9;20628:38;;;;;;;17278:2:1;20628:38:0;;;17260:21:1;17317:2;17297:18;;;17290:30;17356:18;17336;;;17329:46;17392:18;;20628:38:0;17250:166:1;20628:38:0;27461:15:::1;::::0;::::1;;27447:10;:29;27439:54;;;::::0;::::1;::::0;;23280:2:1;27439:54:0::1;::::0;::::1;23262:21:1::0;23319:2;23299:18;;;23292:30;23358:14;23338:18;;;23331:42;23390:18;;27439:54:0::1;23252:162:1::0;27439:54:0::1;33637:16:::2;::::0;;;::::2;;;33629:78;;;::::0;::::2;::::0;;9765:2:1;33629:78:0::2;::::0;::::2;9747:21:1::0;9804:2;9784:18;;;9777:30;9843:34;9823:18;;;9816:62;9914:19;9894:18;;;9887:47;9951:19;;33629:78:0::2;9737:239:1::0;33629:78:0::2;33727:15;::::0;;;::::2;;;33726:16;33718:63;;;::::0;::::2;::::0;;14140:2:1;33718:63:0::2;::::0;::::2;14122:21:1::0;14179:2;14159:18;;;14152:30;14218:34;14198:18;;;14191:62;14289:4;14269:18;;;14262:32;14311:19;;33718:63:0::2;14112:224:1::0;33718:63:0::2;33795:21;33818:19:::0;33841:21:::2;:19;:21::i;:::-;33794:68;;;;33905:14;33897:23;;33875:19;:45;;;;33933:58;33948:12;;33962:14;33933:58;;33978:12;33933:14;:58::i;:::-;34019:12;::::0;:16:::2;::::0;34034:1:::2;34019:16;:::i;:::-;34004:12;:31:::0;;;34046:25:::2;::::0;:11:::2;:25::i;:::-;-1:-1:-1::0;;34082:15:0::2;:22:::0;;;::::2;::::0;::::2;::::0;;33554:558::o;25183:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23395:192::-;22541:7;22568:6;22715:23;22568:6;19103:10;22715:23;22707:68;;;;;;;18329:2:1;22707:68:0;;;18311:21:1;;;18348:18;;;18341:30;18407:34;18387:18;;;18380:62;18459:18;;22707:68:0;18301:182:1;22707:68:0;23484:22:::1;::::0;::::1;23476:73;;;::::0;::::1;::::0;;10183:2:1;23476:73:0::1;::::0;::::1;10165:21:1::0;10222:2;10202:18;;;10195:30;10261:34;10241:18;;;10234:62;10332:8;10312:18;;;10305:36;10358:19;;23476:73:0::1;10155:228:1::0;23476:73:0::1;23560:19;23570:8;23560:9;:19::i;:::-;23395:192:::0;:::o;12411:211::-;12555:58;;4808:42:1;4796:55;;12555:58:0;;;4778:74:1;4868:18;;;4861:34;;;12528:86:0;;12548:5;;12578:23;;4751:18:1;;12555:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12528:19;:86::i;:::-;12411:211;;;:::o;45618:309::-;45675:4;45712:13;;;:6;:13;;;;;:28;;;:33;;;;:82;;-1:-1:-1;45762:13:0;;;;:6;:13;;;;;:27;;;:32;;45712:82;:145;;;;-1:-1:-1;45829:13:0;;;;:6;:13;;;;;:28;;;45811:15;:46;45712:145;:207;;;;-1:-1:-1;;45892:13:0;;;;:6;:13;;;;;:27;;;45874:15;:45;;45618:309::o;12630:248::-;12801:68;;4413:42:1;4482:15;;;12801:68:0;;;4464:34:1;4534:15;;4514:18;;;4507:43;4566:18;;;4559:34;;;12774:96:0;;12794:5;;12824:27;;4376:18:1;;12801:68:0;4358:241:1;12774:96:0;12630:248;;;;:::o;21370:120::-;20358:4;20382:7;;;;;;20906:41;;;;;;;8302:2:1;20906:41:0;;;8284:21:1;8341:2;8321:18;;;8314:30;8380:22;8360:18;;;8353:50;8420:18;;20906:41:0;8274:170:1;20906:41:0;21439:5:::1;21429:15:::0;;;::::1;::::0;;21460:22:::1;19103:10:::0;21469:12:::1;21460:22;::::0;4146:42:1;4134:55;;;4116:74;;4104:2;4089:18;21460:22:0::1;;;;;;;21370:120::o:0;45025:384::-;45081:19;45103:13;;;:6;:13;;;;;45150:15;45127:20;;;:38;;;45216:15;;45198:33;;;:::i;:::-;45176:19;;;;:55;;;;45288:15;;45284:19;;;:::i;:::-;45265:39;;:15;:39;:::i;:::-;45242:20;;;:62;45315:19;;;:11;45345:17;;;:21;;;45384:17;;45329:5;;45384:17;;;45025:384;;:::o;23595:173::-;23651:16;23670:6;;;23687:17;;;;;;;;;;23720:40;;23670:6;;;;;;;23720:40;;23651:16;23720:40;23595:173;;:::o;46089:549::-;46143:6;46151;46170:29;46220:21;;46202:15;:39;;;;:::i;:::-;46170:71;;46253:14;46269:12;46285:17;46308:6;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46252:80;;;;;;;;46364:21;46351:9;:34;;46343:93;;;;;;;22865:2:1;46343:93:0;;;22847:21:1;22904:2;22884:18;;;22877:30;22943:34;22923:18;;;22916:62;23014:16;22994:18;;;22987:44;23048:19;;46343:93:0;22837:236:1;46343:93:0;46488:19;;46477:7;46469:16;;:38;46447:149;;;;;;;11005:2:1;46447:149:0;;;10987:21:1;11044:2;11024:18;;;11017:30;11083:34;11063:18;;;11056:62;11154:31;11134:18;;;11127:59;11203:19;;46447:149:0;10977:251:1;46447:149:0;-1:-1:-1;46615:7:0;;46624:5;;-1:-1:-1;46089:549:0;-1:-1:-1;;46089:549:0:o;43601:739::-;43733:13;;;;:6;:13;;;;;:28;;;43725:89;;;;;;;9353:2:1;43725:89:0;;;9335:21:1;9392:2;9372:18;;;9365:30;9431:34;9411:18;;;9404:62;9502:13;9482:18;;;9475:41;9533:19;;43725:89:0;9325:233:1;43725:89:0;43852:13;;;;:6;:13;;;;;:27;;;43833:15;:46;;43825:98;;;;;;;12961:2:1;43825:98:0;;;12943:21:1;13000:2;12980:18;;;12973:30;13039:34;13019:18;;;13012:62;13110:9;13090:18;;;13083:37;13137:19;;43825:98:0;12933:229:1;43825:98:0;44005:13;;43975;;;;:6;:13;;;;;:27;;;:43;;44005:13;43975:43;:::i;:::-;43956:15;:62;;43934:152;;;;;;;16869:2:1;43934:152:0;;;16851:21:1;16908:2;16888:18;;;16881:30;16947:34;16927:18;;;16920:62;17018:10;16998:18;;;16991:38;17046:19;;43934:152:0;16841:230:1;43934:152:0;44097:19;44119:13;;;:6;:13;;;;;44184:15;;44166:33;;:15;:33;:::i;:::-;44143:20;;;:56;44210:15;;;:23;;;44244:18;;;:28;;;44290:42;;7617:25:1;;;44244:28:0;;44300:5;;44290:42;;7605:2:1;7590:18;44290:42:0;;;;;;;;43601:739;;;;:::o;42740:707::-;42871:13;;;;:6;:13;;;;;:27;;;42863:86;;;;;;;19037:2:1;42863:86:0;;;19019:21:1;19076:2;19056:18;;;19049:30;19115:34;19095:18;;;19088:62;19186:11;19166:18;;;19159:39;19215:19;;42863:86:0;19009:231:1;42863:86:0;42987:13;;;;:6;:13;;;;;:28;;;42968:15;:47;;42960:99;;;;;;;14950:2:1;42960:99:0;;;14932:21:1;14989:2;14969:18;;;14962:30;15028:34;15008:18;;;15001:62;15099:9;15079:18;;;15072:37;15126:19;;42960:99:0;14922:229:1;42960:99:0;43142:13;;43111;;;;:6;:13;;;;;:28;;;:44;;43142:13;43111:44;:::i;:::-;43092:15;:63;;43070:152;;;;;;;11435:2:1;43070:152:0;;;11417:21:1;11474:2;11454:18;;;11447:30;11513:34;11493:18;;;11486:62;11584:9;11564:18;;;11557:37;11611:19;;43070:152:0;11407:229:1;43070:152:0;43233:19;43255:13;;;:6;:13;;;;;;;43279:16;;;:24;;;43314:19;;;:29;;;43354:18;;;:25;;;;43375:4;43354:25;;;43397:42;;43336:7;;43262:5;;43397:42;;;;43298:5;7617:25:1;;7605:2;7590:18;;7572:76;41298:1289:0;41368:13;;;;:6;:13;;;;;:33;;;:38;:73;;;;-1:-1:-1;41410:13:0;;;;:6;:13;;;;;:26;;;:31;41368:73;41360:104;;;;;;;15358:2:1;41360:104:0;;;15340:21:1;15397:2;15377:18;;;15370:30;15436:20;15416:18;;;15409:48;15474:18;;41360:104:0;15330:168:1;41360:104:0;41475:19;41497:13;;;:6;:13;;;;;41667:15;;;;41648:16;;;;41497:13;;41475:19;;;;;41648:34;41644:674;;;41721:5;:16;;;41699:38;;41802:5;41787:11;;41767:5;:17;;;:31;;;;:::i;:::-;41766:41;;;;:::i;:::-;41752:55;;41857:11;41837:5;:17;;;:31;;;;:::i;:::-;41822:46;;41644:674;;;41940:5;:15;;;41921:5;:16;;;:34;41917:401;;;41994:5;:16;;;41972:38;;42075:5;42060:11;;42040:5;:17;;;:31;;;;:::i;41917:401::-;-1:-1:-1;;;42289:17:0;;;;42228:1;;;41917:401;42328:25;;;:47;;;42386:18;;;:33;;;42460:14;:29;;42478:11;;42460:14;-1:-1:-1;;42460:29:0;;42478:11;;42460:29;:::i;:::-;;;;-1:-1:-1;;42507:72:0;;;24393:25:1;;;24449:2;24434:18;;24427:34;;;24477:18;;;24470:34;;;42525:5:0;;42507:72;;24381:2:1;24366:18;42507:72:0;;;;;;;41298:1289;;;;;:::o;44458:449::-;44526:16;;;;;;;44518:78;;;;;;;9765:2:1;44518:78:0;;;9747:21:1;9804:2;9784:18;;;9777:30;9843:34;9823:18;;;9816:62;9914:19;9894:18;;;9887:47;9951:19;;44518:78:0;9737:239:1;44518:78:0;44615:6;:17;44622:9;44630:1;44622:5;:9;:::i;:::-;44615:17;;;;;;;;;;;:32;;;44651:1;44615:37;;44607:96;;;;;;;10590:2:1;44607:96:0;;;10572:21:1;10629:2;10609:18;;;10602:30;10668:34;10648:18;;;10641:62;10739:16;10719:18;;;10712:44;10773:19;;44607:96:0;10562:236:1;44607:96:0;44755:6;:17;44762:9;44770:1;44762:5;:9;:::i;:::-;44755:17;;;;;;;;;;;:32;;;44736:15;:51;;44714:156;;;;;;;13369:2:1;44714:156:0;;;13351:21:1;13408:2;13388:18;;;13381:30;13447:34;13427:18;;;13420:62;13518:25;13498:18;;;13491:53;13561:19;;44714:156:0;13341:245:1;44714:156:0;44881:18;44893:5;44881:11;:18::i;21111:118::-;20358:4;20382:7;;;;;;20636:9;20628:38;;;;;;;17278:2:1;20628:38:0;;;17260:21:1;17317:2;17297:18;;;17290:30;17356:18;17336;;;17329:46;17392:18;;20628:38:0;17250:166:1;20628:38:0;21171:7:::1;:14:::0;;;::::1;::::0;::::1;::::0;;21201:20:::1;21208:12;19103:10:::0;;19023:98;14984:716;15408:23;15434:69;15462:4;15434:69;;;;;;;;;;;;;;;;;15442:5;15434:27;;;;:69;;;;;:::i;:::-;15518:17;;15408:95;;-1:-1:-1;15518:21:0;15514:179;;15615:10;15604:30;;;;;;;;;;;;:::i;:::-;15596:85;;;;;;;21744:2:1;15596:85:0;;;21726:21:1;21783:2;21763:18;;;21756:30;21822:34;21802:18;;;21795:62;21893:12;21873:18;;;21866:40;21923:19;;15596:85:0;21716:232:1;4637:229:0;4774:12;4806:52;4828:6;4836:4;4842:1;4845:12;4806:21;:52::i;:::-;4799:59;;4637:229;;;;;;:::o;5757:511::-;5927:12;5985:5;5960:21;:30;;5952:81;;;;;;;14543:2:1;5952:81:0;;;14525:21:1;14582:2;14562:18;;;14555:30;14621:34;14601:18;;;14594:62;14692:8;14672:18;;;14665:36;14718:19;;5952:81:0;14515:228:1;5952:81:0;46894:20;;6044:60;;;;;;;20680:2:1;6044:60:0;;;20662:21:1;20719:2;20699:18;;;20692:30;20758:31;20738:18;;;20731:59;20807:18;;6044:60:0;20652:179:1;6044:60:0;6118:12;6132:23;6159:6;:11;;6178:5;6185:4;6159:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6117:73;;;;6208:52;6226:7;6235:10;6247:12;6208:17;:52::i;:::-;6201:59;5757:511;-1:-1:-1;;;;;;;5757:511:0:o;8226:712::-;8376:12;8405:7;8401:530;;;-1:-1:-1;8436:10:0;8429:17;;8401:530;8550:17;;:21;8546:374;;8748:10;8742:17;8809:15;8796:10;8792:2;8788:19;8781:44;8696:148;8891:12;8884:20;;;;;;;;;;;:::i;14:196:1:-;82:20;;142:42;131:54;;121:65;;111:2;;200:1;197;190:12;111:2;63:147;;;:::o;215:179::-;293:13;;346:22;335:34;;325:45;;315:2;;384:1;381;374:12;399:196;458:6;511:2;499:9;490:7;486:23;482:32;479:2;;;532:6;524;517:22;479:2;560:29;579:9;560:29;:::i;600:264::-;668:6;676;729:2;717:9;708:7;704:23;700:32;697:2;;;750:6;742;735:22;697:2;778:29;797:9;778:29;:::i;:::-;768:39;854:2;839:18;;;;826:32;;-1:-1:-1;;;687:177:1:o;869:332::-;946:6;954;962;1015:2;1003:9;994:7;990:23;986:32;983:2;;;1036:6;1028;1021:22;983:2;1064:29;1083:9;1064:29;:::i;:::-;1054:39;1140:2;1125:18;;1112:32;;-1:-1:-1;1191:2:1;1176:18;;;1163:32;;973:228;-1:-1:-1;;;973:228:1:o;1206:665::-;1292:6;1300;1353:2;1341:9;1332:7;1328:23;1324:32;1321:2;;;1374:6;1366;1359:22;1321:2;1419:9;1406:23;1448:18;1489:2;1481:6;1478:14;1475:2;;;1510:6;1502;1495:22;1475:2;1553:6;1542:9;1538:22;1528:32;;1598:7;1591:4;1587:2;1583:13;1579:27;1569:2;;1625:6;1617;1610:22;1569:2;1670;1657:16;1696:2;1688:6;1685:14;1682:2;;;1717:6;1709;1702:22;1682:2;1775:7;1770:2;1760:6;1757:1;1753:14;1749:2;1745:23;1741:32;1738:45;1735:2;;;1801:6;1793;1786:22;1735:2;1837;1829:11;;;;;1859:6;;-1:-1:-1;1311:560:1;;-1:-1:-1;;;;1311:560:1:o;1876:297::-;1943:6;1996:2;1984:9;1975:7;1971:23;1967:32;1964:2;;;2017:6;2009;2002:22;1964:2;2054:9;2048:16;2107:5;2100:13;2093:21;2086:5;2083:32;2073:2;;2134:6;2126;2119:22;2178:190;2237:6;2290:2;2278:9;2269:7;2265:23;2261:32;2258:2;;;2311:6;2303;2296:22;2258:2;-1:-1:-1;2339:23:1;;2248:120;-1:-1:-1;2248:120:1:o;2373:264::-;2441:6;2449;2502:2;2490:9;2481:7;2477:23;2473:32;2470:2;;;2523:6;2515;2508:22;2470:2;2564:9;2551:23;2541:33;;2593:38;2627:2;2616:9;2612:18;2593:38;:::i;:::-;2583:48;;2460:177;;;;;:::o;2642:258::-;2710:6;2718;2771:2;2759:9;2750:7;2746:23;2742:32;2739:2;;;2792:6;2784;2777:22;2739:2;-1:-1:-1;;2820:23:1;;;2890:2;2875:18;;;2862:32;;-1:-1:-1;2729:171:1:o;2905:483::-;3008:6;3016;3024;3032;3040;3093:3;3081:9;3072:7;3068:23;3064:33;3061:2;;;3115:6;3107;3100:22;3061:2;3143:39;3172:9;3143:39;:::i;:::-;3133:49;;3222:2;3211:9;3207:18;3201:25;3191:35;;3266:2;3255:9;3251:18;3245:25;3235:35;;3310:2;3299:9;3295:18;3289:25;3279:35;;3333:49;3377:3;3366:9;3362:19;3333:49;:::i;:::-;3323:59;;3051:337;;;;;;;;:::o;3393:293::-;3473:1;3466:5;3463:12;3453:2;;3509:77;3506:1;3499:88;3610:4;3607:1;3600:15;3638:4;3635:1;3628:15;3453:2;3662:18;;3443:243::o;3691:274::-;3820:3;3858:6;3852:13;3874:53;3920:6;3915:3;3908:4;3900:6;3896:17;3874:53;:::i;:::-;3943:16;;;;;3828:137;-1:-1:-1;;3828:137:1:o;4906:1504::-;5231:2;5283:21;;;5353:13;;5256:18;;;5375:22;;;5202:4;;5231:2;5451:4;;5428:3;5413:19;;;5478:15;;;5202:4;5524:169;5538:6;5535:1;5532:13;5524:169;;;5599:13;;5587:26;;5633:12;;;;5668:15;;;;5560:1;5553:9;5524:169;;;-1:-1:-1;;;5729:19:1;;;5709:18;;;5702:47;5799:13;;5821:21;;;5897:15;;;;5860:12;;;5932:4;5945:392;5961:8;5956:3;5953:17;5945:392;;;6032:8;6026:15;6054:42;6090:5;6085:2;6079:9;6054:42;:::i;:::-;6138:11;;;6132:18;6116:14;;;6109:42;6174:4;6234:11;;;6228:18;6221:26;6214:34;6198:14;;;6191:58;6310:17;;;;6271:14;;;;5989:1;5980:11;5945:392;;;5949:3;;6354:5;6346:13;;;;;;6397:6;6390:4;6379:9;6375:20;6368:36;5211:1199;;;;;;:::o;7111:357::-;7305:2;7290:18;;7317:43;7294:9;7342:6;7317:43;:::i;:::-;7396:6;7391:2;7380:9;7376:18;7369:34;7453:6;7446:14;7439:22;7434:2;7423:9;7419:18;7412:50;7272:196;;;;;;:::o;7653:442::-;7802:2;7791:9;7784:21;7765:4;7834:6;7828:13;7877:6;7872:2;7861:9;7857:18;7850:34;7893:66;7952:6;7947:2;7936:9;7932:18;7927:2;7919:6;7915:15;7893:66;:::i;:::-;8011:2;7999:15;8016:66;7995:88;7980:104;;;;8086:2;7976:113;;7774:321;-1:-1:-1;;7774:321:1:o;25645:128::-;25685:3;25716:1;25712:6;25709:1;25706:13;25703:2;;;25722:18;;:::i;:::-;-1:-1:-1;25758:9:1;;25693:80::o;25778:274::-;25818:1;25844;25834:2;;25879:77;25876:1;25869:88;25980:4;25977:1;25970:15;26008:4;26005:1;25998:15;25834:2;-1:-1:-1;26037:9:1;;25824:228::o;26057:::-;26097:7;26223:1;26155:66;26151:74;26148:1;26145:81;26140:1;26133:9;26126:17;26122:105;26119:2;;;26230:18;;:::i;:::-;-1:-1:-1;26270:9:1;;26109:176::o;26290:125::-;26330:4;26358:1;26355;26352:8;26349:2;;;26363:18;;:::i;:::-;-1:-1:-1;26400:9:1;;26339:76::o;26420:258::-;26492:1;26502:113;26516:6;26513:1;26510:13;26502:113;;;26592:11;;;26586:18;26573:11;;;26566:39;26538:2;26531:10;26502:113;;;26633:6;26630:1;26627:13;26624:2;;;-1:-1:-1;;26668:1:1;26650:16;;26643:27;26473:205::o;26683:195::-;26722:3;26753:66;26746:5;26743:77;26740:2;;;26823:18;;:::i;:::-;-1:-1:-1;26870:1:1;26859:13;;26730:148::o;26883:184::-;26935:77;26932:1;26925:88;27032:4;27029:1;27022:15;27056:4;27053:1;27046:15

Swarm Source

ipfs://8a55ebfca524e089c68a80a3d64a2b24b27cc6848ce9b0747b129df0dade0815
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading