ETH Price: $3,335.96 (-0.44%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Change Package R...215644462025-01-06 9:11:352 days ago1736154695IN
0x9A1d5103...Af0dd3856
0 ETH0.002120568.10223589
Change Package R...215644382025-01-06 9:09:592 days ago1736154599IN
0x9A1d5103...Af0dd3856
0 ETH0.001985877.58795545
Set Map215644342025-01-06 9:09:112 days ago1736154551IN
0x9A1d5103...Af0dd3856
0 ETH0.000236966.69401138
Withdraw215595932025-01-05 16:52:473 days ago1736095967IN
0x9A1d5103...Af0dd3856
0 ETH0.004260619.4920076
Withdraw215557392025-01-05 3:57:234 days ago1736049443IN
0x9A1d5103...Af0dd3856
0 ETH0.002589535.21376656
Withdraw214631262024-12-23 5:33:3516 days ago1734932015IN
0x9A1d5103...Af0dd3856
0 ETH0.003394173.91126049
Withdraw214584182024-12-22 13:45:1117 days ago1734875111IN
0x9A1d5103...Af0dd3856
0 ETH0.00212755.91918505
Withdraw213862732024-12-12 11:57:4727 days ago1734004667IN
0x9A1d5103...Af0dd3856
0 ETH0.0053580618.35143871
Withdraw213569862024-12-08 9:50:3531 days ago1733651435IN
0x9A1d5103...Af0dd3856
0 ETH0.004071548.44856683
Withdraw213569672024-12-08 9:46:4731 days ago1733651207IN
0x9A1d5103...Af0dd3856
0 ETH0.00453668.80811424
Withdraw213005562024-11-30 12:41:1139 days ago1732970471IN
0x9A1d5103...Af0dd3856
0 ETH0.004220057.75798988
Withdraw212799492024-11-27 15:21:3542 days ago1732720895IN
0x9A1d5103...Af0dd3856
0 ETH0.0115870422.39051303
Withdraw212131302024-11-18 7:32:3551 days ago1731915155IN
0x9A1d5103...Af0dd3856
0 ETH0.00490819.64560196
Withdraw212131132024-11-18 7:29:1151 days ago1731914951IN
0x9A1d5103...Af0dd3856
0 ETH0.003105479.76139937
Withdraw212131102024-11-18 7:28:3551 days ago1731914915IN
0x9A1d5103...Af0dd3856
0 ETH0.006244719.75974227
Withdraw212131022024-11-18 7:26:5951 days ago1731914819IN
0x9A1d5103...Af0dd3856
0 ETH0.005169649.99367316
Withdraw212130972024-11-18 7:25:4751 days ago1731914747IN
0x9A1d5103...Af0dd3856
0 ETH0.00589259.93688351
Change Package R...211936052024-11-15 14:11:3554 days ago1731679895IN
0x9A1d5103...Af0dd3856
0 ETH0.0080328330.69224858
Change Package R...211935992024-11-15 14:10:2354 days ago1731679823IN
0x9A1d5103...Af0dd3856
0 ETH0.0083701331.98100642
Change Package R...211935902024-11-15 14:08:3554 days ago1731679715IN
0x9A1d5103...Af0dd3856
0 ETH0.0082537431.53631172
Change Package R...211935792024-11-15 14:06:2354 days ago1731679583IN
0x9A1d5103...Af0dd3856
0 ETH0.0078349629.93621145
Change Package R...211935452024-11-15 13:59:3554 days ago1731679175IN
0x9A1d5103...Af0dd3856
0 ETH0.0075648428.9054618
Change CRFI Mine...211934892024-11-15 13:48:1154 days ago1731678491IN
0x9A1d5103...Af0dd3856
0 ETH0.00931635.49360743
Change Package R...211933542024-11-15 13:20:3554 days ago1731676835IN
0x9A1d5103...Af0dd3856
0 ETH0.0046137117.62803202
Change Package R...211933332024-11-15 13:16:2354 days ago1731676583IN
0x9A1d5103...Af0dd3856
0 ETH0.0042761616.33833178
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CrossLend

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-06-17
*/

// File: @openzeppelin/contracts/token/ERC777/IERC777.sol


pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Interface of the ERC777Token standard as defined in the EIP.
 *
 * This contract uses the
 * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 registry standard] to let
 * token holders and recipients react to token movements by using setting implementers
 * for the associated interfaces in said registry. See {IERC1820Registry} and
 * {ERC1820Implementer}.
 */
interface IERC777 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the smallest part of the token that is not divisible. This
     * means all token operations (creation, movement and destruction) must have
     * amounts that are a multiple of this number.
     *
     * For most token contracts, this value will equal 1.
     */
    function granularity() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * If send or receive hooks are registered for the caller and `recipient`,
     * the corresponding functions will be called with `data` and empty
     * `operatorData`. See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits a {Sent} event.
     *
     * Requirements
     *
     * - the caller must have at least `amount` tokens.
     * - `recipient` cannot be the zero address.
     * - if `recipient` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function send(address recipient, uint256 amount, bytes calldata data) external;

    /**
     * @dev Destroys `amount` tokens from the caller's account, reducing the
     * total supply.
     *
     * If a send hook is registered for the caller, the corresponding function
     * will be called with `data` and empty `operatorData`. See {IERC777Sender}.
     *
     * Emits a {Burned} event.
     *
     * Requirements
     *
     * - the caller must have at least `amount` tokens.
     */
    function burn(uint256 amount, bytes calldata data) external;

    /**
     * @dev Returns true if an account is an operator of `tokenHolder`.
     * Operators can send and burn tokens on behalf of their owners. All
     * accounts are their own operator.
     *
     * See {operatorSend} and {operatorBurn}.
     */
    function isOperatorFor(address operator, address tokenHolder) external view returns (bool);

    /**
     * @dev Make an account an operator of the caller.
     *
     * See {isOperatorFor}.
     *
     * Emits an {AuthorizedOperator} event.
     *
     * Requirements
     *
     * - `operator` cannot be calling address.
     */
    function authorizeOperator(address operator) external;

    /**
     * @dev Revoke an account's operator status for the caller.
     *
     * See {isOperatorFor} and {defaultOperators}.
     *
     * Emits a {RevokedOperator} event.
     *
     * Requirements
     *
     * - `operator` cannot be calling address.
     */
    function revokeOperator(address operator) external;

    /**
     * @dev Returns the list of default operators. These accounts are operators
     * for all token holders, even if {authorizeOperator} was never called on
     * them.
     *
     * This list is immutable, but individual holders may revoke these via
     * {revokeOperator}, in which case {isOperatorFor} will return false.
     */
    function defaultOperators() external view returns (address[] memory);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient`. The caller must
     * be an operator of `sender`.
     *
     * If send or receive hooks are registered for `sender` and `recipient`,
     * the corresponding functions will be called with `data` and
     * `operatorData`. See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits a {Sent} event.
     *
     * Requirements
     *
     * - `sender` cannot be the zero address.
     * - `sender` must have at least `amount` tokens.
     * - the caller must be an operator for `sender`.
     * - `recipient` cannot be the zero address.
     * - if `recipient` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function operatorSend(
        address sender,
        address recipient,
        uint256 amount,
        bytes calldata data,
        bytes calldata operatorData
    ) external;

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the total supply.
     * The caller must be an operator of `account`.
     *
     * If a send hook is registered for `account`, the corresponding function
     * will be called with `data` and `operatorData`. See {IERC777Sender}.
     *
     * Emits a {Burned} event.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     * - the caller must be an operator for `account`.
     */
    function operatorBurn(
        address account,
        uint256 amount,
        bytes calldata data,
        bytes calldata operatorData
    ) external;

    event Sent(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 amount,
        bytes data,
        bytes operatorData
    );

    event Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData);

    event Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData);

    event AuthorizedOperator(address indexed operator, address indexed tokenHolder);

    event RevokedOperator(address indexed operator, address indexed tokenHolder);
}

// File: @openzeppelin/contracts/token/ERC777/IERC777Recipient.sol


pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.
 *
 * Accounts can be notified of {IERC777} tokens being sent to them by having a
 * contract implement this interface (contract holders can be their own
 * implementer) and registering it on the
 * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].
 *
 * See {IERC1820Registry} and {ERC1820Implementer}.
 */
interface IERC777Recipient {
    /**
     * @dev Called by an {IERC777} token contract whenever tokens are being
     * moved or created into a registered account (`to`). The type of operation
     * is conveyed by `from` being the zero address or not.
     *
     * This call occurs _after_ the token contract's state is updated, so
     * {IERC777-balanceOf}, etc., can be used to query the post-operation state.
     *
     * This function may revert to prevent the operation from being executed.
     */
    function tokensReceived(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes calldata userData,
        bytes calldata operatorData
    ) external;
}

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


pragma solidity >=0.6.0 <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 () internal {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: @openzeppelin/contracts/introspection/IERC1820Registry.sol


pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Interface of the global ERC1820 Registry, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1820[EIP]. Accounts may register
 * implementers for interfaces in this registry, as well as query support.
 *
 * Implementers may be shared by multiple accounts, and can also implement more
 * than a single interface for each account. Contracts can implement interfaces
 * for themselves, but externally-owned accounts (EOA) must delegate this to a
 * contract.
 *
 * {IERC165} interfaces can also be queried via the registry.
 *
 * For an in-depth explanation and source code analysis, see the EIP text.
 */
interface IERC1820Registry {
    /**
     * @dev Sets `newManager` as the manager for `account`. A manager of an
     * account is able to set interface implementers for it.
     *
     * By default, each account is its own manager. Passing a value of `0x0` in
     * `newManager` will reset the manager to this initial state.
     *
     * Emits a {ManagerChanged} event.
     *
     * Requirements:
     *
     * - the caller must be the current manager for `account`.
     */
    function setManager(address account, address newManager) external;

    /**
     * @dev Returns the manager for `account`.
     *
     * See {setManager}.
     */
    function getManager(address account) external view returns (address);

    /**
     * @dev Sets the `implementer` contract as ``account``'s implementer for
     * `interfaceHash`.
     *
     * `account` being the zero address is an alias for the caller's address.
     * The zero address can also be used in `implementer` to remove an old one.
     *
     * See {interfaceHash} to learn how these are created.
     *
     * Emits an {InterfaceImplementerSet} event.
     *
     * Requirements:
     *
     * - the caller must be the current manager for `account`.
     * - `interfaceHash` must not be an {IERC165} interface id (i.e. it must not
     * end in 28 zeroes).
     * - `implementer` must implement {IERC1820Implementer} and return true when
     * queried for support, unless `implementer` is the caller. See
     * {IERC1820Implementer-canImplementInterfaceForAddress}.
     */
    function setInterfaceImplementer(address account, bytes32 _interfaceHash, address implementer) external;

    /**
     * @dev Returns the implementer of `interfaceHash` for `account`. If no such
     * implementer is registered, returns the zero address.
     *
     * If `interfaceHash` is an {IERC165} interface id (i.e. it ends with 28
     * zeroes), `account` will be queried for support of it.
     *
     * `account` being the zero address is an alias for the caller's address.
     */
    function getInterfaceImplementer(address account, bytes32 _interfaceHash) external view returns (address);

    /**
     * @dev Returns the interface hash for an `interfaceName`, as defined in the
     * corresponding
     * https://eips.ethereum.org/EIPS/eip-1820#interface-name[section of the EIP].
     */
    function interfaceHash(string calldata interfaceName) external pure returns (bytes32);

    /**
     *  @notice Updates the cache with whether the contract implements an ERC165 interface or not.
     *  @param account Address of the contract for which to update the cache.
     *  @param interfaceId ERC165 interface for which to update the cache.
     */
    function updateERC165Cache(address account, bytes4 interfaceId) external;

    /**
     *  @notice Checks whether a contract implements an ERC165 interface or not.
     *  If the result is not cached a direct lookup on the contract address is performed.
     *  If the result is not cached or the cached value is out-of-date, the cache MUST be updated manually by calling
     *  {updateERC165Cache} with the contract address.
     *  @param account Address of the contract to check.
     *  @param interfaceId ERC165 interface to check.
     *  @return True if `account` implements `interfaceId`, false otherwise.
     */
    function implementsERC165Interface(address account, bytes4 interfaceId) external view returns (bool);

    /**
     *  @notice Checks whether a contract implements an ERC165 interface or not without using nor updating the cache.
     *  @param account Address of the contract to check.
     *  @param interfaceId ERC165 interface to check.
     *  @return True if `account` implements `interfaceId`, false otherwise.
     */
    function implementsERC165InterfaceNoCache(address account, bytes4 interfaceId) external view returns (bool);

    event InterfaceImplementerSet(address indexed account, bytes32 indexed interfaceHash, address indexed implementer);

    event ManagerChanged(address indexed account, address indexed newManager);
}

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


pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

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

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

// File: crosslend/data.sol

pragma solidity >=0.6.2 <0.8.0;

enum FinancialType{CRFI, CFil}

struct FinancialPackage {
  FinancialType Type;
  
  uint256 Days;
  uint256 CFilInterestRate;
  uint256 CRFIInterestRateDyn;
  uint256 ID;

  uint256 Weight;
  uint256 ParamCRFI;
  uint256 ParamCFil;
  uint256 Total;
}

struct LoanCFilPackage {
  uint256 APY;
  uint256 PledgeRate;
  uint256 PaymentDue;
  uint256 PaymentDue99;

  uint256 UpdateTime;
  uint256 Param;
}

struct ViewSystemInfo{
  FinancialPackage[] Packages;
  uint256 AffRate;
  uint256 AffRequire;
  uint256 EnableAffCFil;
  
  LoanCFilPackage LoanCFil;

  ChainManager ChainM;

  // invest
  uint256 NewInvestID;
  mapping(uint256 => InvestInfo) Invests;
  mapping(address => uint256) InvestAddrID;
        
  // setting power
  address SuperAdmin;
  mapping(address => bool) Admins;

  // statistic
  uint256 nowInvestCRFI;
  uint256 nowInvestCFil; 
  uint256 cfilInterestPool;
  uint256 crfiInterestPool;

  uint256 cfilLendingTotal;
  uint256 crfiRewardTotal;
  uint256 avaiCFilAmount;
  
  uint256 totalWeightCFil;
  uint256 totalWeightCRFI;
  uint256 crfiMinerPerDayCFil;
  uint256 crfiMinerPerDayCRFI;
  
  uint256 ParamUpdateTime;
}

struct SystemInfoView {
  uint256 AffRate;
  uint256 AffRequire;
  uint256 EnableAffCFil;
  
  // invest
  uint256 NewInvestID;

  // statistic
  uint256 nowInvestCRFI;
  uint256 nowInvestCFil; 
  uint256 cfilInterestPool;
  uint256 crfiInterestPool;

  uint256 cfilLendingTotal;
  uint256 crfiRewardTotal;
  uint256 avaiCFilAmount;
  
  uint256 totalWeightCFil;
  uint256 totalWeightCRFI;
  uint256 crfiMinerPerDayCFil;
  uint256 crfiMinerPerDayCRFI;
  
  uint256 ParamUpdateTime;
}

struct SystemInfo {

  FinancialPackage[] Packages;
  uint256 AffRate;
  uint256 AffRequire;
  uint256 EnableAffCFil;
  
  LoanCFilPackage LoanCFil;

  ChainManager ChainM;

  // invest
  uint256 NewInvestID;
  mapping(uint256 => InvestInfo) Invests;
  mapping(address => uint256) InvestAddrID;
        
  // setting power
  address SuperAdmin;
  mapping(address => bool) Admins;

  // statistic
  uint256 nowInvestCRFI;
  uint256 nowInvestCFil; 
  uint256 cfilInterestPool;
  uint256 crfiInterestPool;

  uint256 cfilLendingTotal;
  uint256 crfiRewardTotal;
  uint256 avaiCFilAmount;
  
  uint256 totalWeightCFil;
  uint256 totalWeightCRFI;
  uint256 crfiMinerPerDayCFil;
  uint256 crfiMinerPerDayCRFI;
  
  uint256 ParamUpdateTime;

  mapping(string => string) kvMap;
}

struct InterestDetail{
  uint256 crfiInterest;
  uint256 cfilInterest;
}

struct LoanInvest{
  uint256 Lending;
  uint256 Pledge;
  uint256 Param;
  uint256 NowInterest;
}

struct InvestInfoView {
  address Addr;
  uint256 ID;

  uint256 affID;

  // statistic for financial
  uint256 totalAffTimes;
  uint256 totalAffPackageTimes;
  
  uint256 totalAffCRFI;
  uint256 totalAffCFil;
  
  uint256 nowInvestFinCRFI;
  uint256 nowInvestFinCFil;
}

struct InvestInfo {
  mapping(uint256 => ChainQueue) InvestRecords;

  address Addr;
  uint256 ID;

  uint256 affID;

  LoanInvest LoanCFil;

  // statistic for financial
  uint256 totalAffTimes;
  uint256 totalAffPackageTimes;
  
  uint256 totalAffCRFI;
  uint256 totalAffCFil;
  
  uint256 nowInvestFinCRFI;
  uint256 nowInvestFinCFil;
}


//////////////////// queue

struct QueueData {
  uint256 RecordID;
  
  FinancialType Type;
  uint256 PackageID;
  uint256 Days;
  uint256 EndTime;
  uint256 AffID;
  uint256 Amount;

  uint256 ParamCRFI;
  uint256 ParamCFil;
}

struct ChainItem {
  uint256 Next;
  uint256 Prev;
  uint256 My;
  
  QueueData Data;
}

struct ChainQueue{
  uint256 First;
  uint256 End;

  uint256 Size;
}


struct ChainManager{
  ChainItem[] rawQueue;

  ChainQueue avaiQueue;
}

library ChainQueueLib{

  //////////////////// item
  function GetNullItem(ChainManager storage chainM)
    internal
    view
    returns(ChainItem storage item){
    return chainM.rawQueue[0];
  }

  function HasNext(ChainManager storage chainM,
                   ChainItem storage item)
    internal
    view
    returns(bool has){

    if(item.Next == 0){
      return false;
    }

    return true;
  }

  function Next(ChainManager storage chainM,
                ChainItem storage item)
    internal
    view
    returns(ChainItem storage nextItem){

    uint256 nextIdx = item.Next;
    require(nextIdx > 0, "no next item");

    return chainM.rawQueue[uint256(nextIdx)];
  }

  //////////////////// chain
  function GetFirstItem(ChainManager storage chainM,
                        ChainQueue storage chain)
    internal
    view
    returns(ChainItem storage item){

    require(chain.Size > 0, "chain is empty");

    return chainM.rawQueue[chain.First];
  }

  function GetEndItem(ChainManager storage chainM,
                      ChainQueue storage chain)
    internal
    view
    returns(ChainItem storage item){

    require(chain.Size > 0, "chain is empty");

    return chainM.rawQueue[chain.End];
  }

  // need ensure the item is in chain
  function DeleteItem(ChainManager storage chainM,
                      ChainQueue storage chain,
                      ChainItem storage item)
    internal{

    if(chain.First == item.My){
      PopPutFirst(chainM, chain);
      return;
    } else if (chain.End == item.My){
      PopPutEnd(chainM, chain);
      return;
    }

    ChainItem storage next = chainM.rawQueue[item.Next];
    ChainItem storage prev = chainM.rawQueue[item.Prev];

    next.Prev = item.Prev;
    prev.Next = item.Next;

    item.Prev = 0;
    item.Next = 0;

    chain.Size--;

    PutItem(chainM, item);
  }

  function PopPutFirst(ChainManager storage chainM,
                       ChainQueue storage chain)
    internal{

    ChainItem storage item = PopFirstItem(chainM, chain);
    PutItem(chainM, item);
  }

  function PopPutEnd(ChainManager storage chainM,
                     ChainQueue storage chain)
    internal{

    ChainItem storage item = PopEndItem(chainM, chain);
    PutItem(chainM, item);
  }

  function PopEndItem(ChainManager storage chainM,
                        ChainQueue storage chain)
    internal
    returns(ChainItem storage item){
    
    require(chain.Size >0, "chain is empty");
    
    uint256 itemIdx = chain.End;
    chain.End = chainM.rawQueue[itemIdx].Prev;
    if(chain.End > 0){
      chainM.rawQueue[chain.End].Next = 0;
    } else {
      chain.First = 0;
    }
    chain.Size--;
    item = chainM.rawQueue[itemIdx];
    item.Prev = 0;
    return item;
  }

  function PopFirstItem(ChainManager storage chainM,
                        ChainQueue storage chain)
    internal
    returns(ChainItem storage item){

    require(chain.Size > 0, "chain is empty");

    uint256 itemIdx = chain.First;
    chain.First = chainM.rawQueue[itemIdx].Next;
    if(chain.First > 0){
      chainM.rawQueue[chain.First].Prev = 0;
    } else {
      chain.End = 0;
    }
    chain.Size--;

    item = chainM.rawQueue[itemIdx];
    item.Next = 0;

    return item;
  }

  function PushEndItem(ChainManager storage chainM,
                       ChainQueue storage chain,
                       ChainItem storage item)
    internal{

    item.Prev = chain.End;
    item.Next = 0;

    if(chain.Size == 0){
      chain.First = item.My;
      chain.End = item.My;
    } else {
      chainM.rawQueue[chain.End].Next = item.My;
      chain.End = item.My;
    }
    chain.Size++;
  }

  //////////////////// chain manager
  function InitChainManager(ChainManager storage chainM)
    internal{
    if(chainM.rawQueue.length == 0){
      chainM.rawQueue.push();
    }
  }
  
  function GetAvaiItem(ChainManager storage chainM)
    internal
    returns(ChainItem storage item){
    
    if(chainM.avaiQueue.Size == 0){
      if(chainM.rawQueue.length == 0){
        chainM.rawQueue.push();
      }
      
      uint256 itemIdx = chainM.rawQueue.length;
      chainM.rawQueue.push();

      item = chainM.rawQueue[itemIdx];
      item.Next = 0;
      item.Prev = 0;
      item.My = itemIdx;
      
      return item;
    }

    return PopFirstItem(chainM, chainM.avaiQueue);
  }

  function PutItem(ChainManager storage chainM,
                   ChainItem storage item)
    internal{
    
    PushEndItem(chainM, chainM.avaiQueue, item);
  }
}

// File: crosslend/main.sol

pragma solidity >=0.7.0 <0.8.0;
pragma abicoder v2;







contract CrossLend is IERC777Recipient, ReentrancyGuard{
  //////////////////// for using
  using ChainQueueLib for ChainManager;
  using SafeMath for uint256;

  //////////////////// constant
  IERC1820Registry constant internal _ERC1820_REGISTRY = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24);

  bytes32 private constant _TOKENS_RECIPIENT_INTERFACE_HASH = keccak256("ERC777TokensRecipient");

  uint256 constant Decimal = 1e18;

  uint256 public OneDayTime;

  //////////////////// var
  SystemInfo internal SInfo;
  
  IERC777 public CRFI;
  IERC777 public CFil;
  IERC777 public SFil;

  //////////////////// modifier
  modifier IsAdmin() {
    require(msg.sender == SInfo.SuperAdmin || SInfo.Admins[msg.sender], "only admin");
    _;
  }

  modifier IsSuperAdmin() {
    require(SInfo.SuperAdmin == msg.sender, "only super admin");
    _;
  }

  //////////////////// event
  event AffEvent(address indexed receiver, address indexed sender, uint256 indexed affTimes, uint256 crfiInterest, uint256 cfilInterest, uint256 packageID, uint256 timestamp);

  event AffBought(address indexed affer, address indexed sender, uint256 indexed affPackageTimes, uint256 amount, uint256 packageID, uint256 timestamp);
  
  event loanCFilEvent(address indexed addr, uint256 cfilAmount, uint256 sfilAmount);

  //////////////////// constructor
  constructor(address crfiAddr, address cfilAddr, address sfilAddr) {
    CRFI = IERC777(crfiAddr);
    CFil = IERC777(cfilAddr);
    SFil = IERC777(sfilAddr);
    OneDayTime = 60 * 60 * 24;

    SInfo.SuperAdmin = msg.sender;

    SInfo.AffRate = Decimal / 10;
    SInfo.EnableAffCFil = 1;

    SInfo.ChainM.InitChainManager();
    
    ////////// add package

    SInfo.crfiMinerPerDayCFil = 1917808 * Decimal / 100;
    SInfo.crfiMinerPerDayCRFI = 821918 * Decimal / 100;

    SInfo.ParamUpdateTime = block.timestamp;
    
    // loan CFil
    ChangeLoanRate(201 * Decimal / 1000,
                   56 * Decimal / 100,
                   2300 * Decimal);
    SInfo.LoanCFil.UpdateTime = block.timestamp;

    // add crfi
    AddPackage(FinancialType.CRFI,
               0,
               (20 * Decimal) / 1000,
               Decimal);
    
    AddPackage(FinancialType.CRFI,
               90,
               (32 * Decimal) / 1000,
               (15 * Decimal) / 10);

    AddPackage(FinancialType.CRFI,
               180,
               (34 * Decimal) / 1000,
               2 * Decimal);

    AddPackage(FinancialType.CRFI,
               365,
               (36 * Decimal) / 1000,
               (25 * Decimal) / 10);
                   
    AddPackage(FinancialType.CRFI,
               540,
               (40 * Decimal) / 1000,
               3 * Decimal);
    
    // add cfil
    AddPackage(FinancialType.CFil,
               0,
               (20 * Decimal) / 1000,
               Decimal);
    
    AddPackage(FinancialType.CFil,
               90,
               (33 * Decimal) / 1000,
               (15 * Decimal) / 10);

    AddPackage(FinancialType.CFil,
               180, 
               (35 * Decimal) / 1000,
               2 * Decimal);

    AddPackage(FinancialType.CFil,
               365,
               (37 * Decimal) / 1000,
               (25 * Decimal) / 10);
                   
    AddPackage(FinancialType.CFil,
               540,
               (41 * Decimal) / 1000,
               3 * Decimal);
    
    // register interfaces
    _ERC1820_REGISTRY.setInterfaceImplementer(address(this), _TOKENS_RECIPIENT_INTERFACE_HASH, address(this));
  }
  
  //////////////////// super admin func
  function AddAdmin(address admin)
    public
    IsSuperAdmin(){
    require(!SInfo.Admins[admin], "already add this admin");
    SInfo.Admins[admin] = true;
  }

  function DelAdmin(address admin)
    public
    IsSuperAdmin(){
    require(SInfo.Admins[admin], "this addr is not admin");
    SInfo.Admins[admin] = false;
  }

  function ChangeSuperAdmin(address suAdmin)
    public
    IsSuperAdmin(){
    require(suAdmin != address(0x0), "empty new super admin");

    if(suAdmin == SInfo.SuperAdmin){
      return;
    }
    
    SInfo.SuperAdmin = suAdmin;
  }

  //////////////////// admin func
  function SetMap(string memory key,
                  string memory value)
    public
    IsAdmin(){

    SInfo.kvMap[key] = value;
  }
  
  function ChangePackageRate(uint256 packageID,
                             uint256 cfilInterestRate,
                             uint256 weight)
    public
    IsAdmin(){
    
    require(packageID < SInfo.Packages.length, "packageID error");

    updateAllParam();
    
    FinancialPackage storage package = SInfo.Packages[packageID];
    package.CFilInterestRate = cfilInterestRate;

    uint256 nowTotal = package.Total.mul(package.Weight) / Decimal;
    if(package.Type == FinancialType.CRFI){
      SInfo.totalWeightCRFI = SInfo.totalWeightCRFI.sub(nowTotal);
    } else {
      SInfo.totalWeightCFil = SInfo.totalWeightCFil.sub(nowTotal);
    }

    package.Weight = weight;

    nowTotal = package.Total.mul(package.Weight) / Decimal;
    if(package.Type == FinancialType.CRFI){
      SInfo.totalWeightCRFI = SInfo.totalWeightCRFI.add(nowTotal);
    } else {
      SInfo.totalWeightCFil = SInfo.totalWeightCFil.add(nowTotal);
    }
  }

  function AddPackage(FinancialType _type,
                      uint256 dayTimes,
                      uint256 cfilInterestRate,
                      uint256 weight)
    public
    IsAdmin(){

    updateAllParam();
    
    uint256 idx = SInfo.Packages.length;
    SInfo.Packages.push();
    FinancialPackage storage package = SInfo.Packages[idx];

    package.Type = _type;
    package.Days = dayTimes;
    package.Weight = weight;
    package.CFilInterestRate = cfilInterestRate;
    package.ID = idx;
  }

  function ChangeCRFIMinerPerDay(uint256 crfi, uint256 cfil)
    public
    IsAdmin(){

    updateAllParam();

    SInfo.crfiMinerPerDayCFil = cfil;
    SInfo.crfiMinerPerDayCRFI = crfi;
  }

  function ChangeLoanRate(uint256 apy, uint256 pledgeRate, uint256 paymentDue)
    public
    IsAdmin(){

    require(pledgeRate > 0, "pledge rate can't = 0");

    SInfo.LoanCFil.APY = apy;
    SInfo.LoanCFil.PledgeRate = pledgeRate;
    SInfo.LoanCFil.PaymentDue = paymentDue;
    SInfo.LoanCFil.PaymentDue99 = paymentDue.mul(99) / 100;
  }

  function ChangeAffCFil(bool enable)
    public
    IsAdmin(){
    if(enable && SInfo.EnableAffCFil == 0){
      SInfo.EnableAffCFil = 1;
    } else if(!enable && SInfo.EnableAffCFil > 0){
      SInfo.EnableAffCFil = 0;
    }
  }

  function ChangeAffRate(uint256 rate)
    public
    IsAdmin(){
    
    SInfo.AffRate = rate;
  }

  function ChangeAffRequire(uint256 amount)
    public
    IsAdmin(){
    SInfo.AffRequire = amount;
  }

  function WithdrawCRFIInterestPool(uint256 amount)
    public
    IsAdmin(){
    SInfo.crfiInterestPool = SInfo.crfiInterestPool.sub(amount);
    CRFI.send(msg.sender, amount, "");
  }

  function WithdrawCFilInterestPool(uint256 amount)
    public
    IsAdmin(){
    SInfo.cfilInterestPool = SInfo.cfilInterestPool.sub(amount);
    CFil.send(msg.sender, amount, "");
  }
  
  //////////////////// public
  function tokensReceived(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes calldata userData,
        bytes calldata operatorData)
    public
    override
    nonReentrant(){

    ////////// check
    require(userData.length > 0, "no user data");
    
    // mode = 0, normal bought financial package
    // mode = 2, charge cfil interest pool
    // mode = 3, charge crfi interest pool
    // mode = 4, loan cfil
    // mode = 5, repay cfil by loan
    (uint256 mode, uint256 param, address addr) = abi.decode(userData, (uint256,uint256, address));
    require(from != address(0x0), "from is zero");

    if(mode == 5){
      _repayLoanCFil(from, amount);
    }else if(mode == 4){
      _loanCFil(from, amount);
    }else if(mode == 3){
      require(amount > 0, "no amount");
      require(msg.sender == address(CRFI), "only charge crfi");
      SInfo.crfiInterestPool = SInfo.crfiInterestPool.add(amount);
      return;
    }else if(mode == 2){
      require(amount > 0, "no amount");
      require(msg.sender == address(CFil), "only charge cfil");
      SInfo.cfilInterestPool = SInfo.cfilInterestPool.add(amount);
      
      return;
    } else if (mode == 0){
      _buyFinancialPackage(from, param, addr, amount);
    } else {
      revert("mode error");
    }
  }
  
  function Withdraw(uint256 packageID, bool only, uint256 maxNum)
    public
    nonReentrant(){

    InvestInfo storage uInfo = SInfo.Invests[getUID(msg.sender)];
    
    uint256 cfil;
    uint256 cfilInterest;
    uint256 crfi;
    uint256 crfiInterest;

    (crfi, crfiInterest, cfil, cfilInterest) = _withdrawFinancial(uInfo, packageID, only, maxNum);

    if(crfi > 0){
      uInfo.nowInvestFinCRFI = uInfo.nowInvestFinCRFI.sub(crfi);
    }
    if(cfil > 0){
      uInfo.nowInvestFinCFil = uInfo.nowInvestFinCFil.sub(cfil);
    }

    withdrawCoin(uInfo.Addr, crfi, crfiInterest, cfil, cfilInterest);
  }

  //////////////////// view func

  function GetMap(string memory key)
    public
    view
    returns(string memory value){

    return SInfo.kvMap[key];
  }

  function GetFinancialPackage()
    public
    view
    returns(FinancialPackage[] memory packages){

    packages = new FinancialPackage[](SInfo.Packages.length);
    for(uint256 packageID = 0; packageID < SInfo.Packages.length; packageID++){
      packages[packageID] = SInfo.Packages[packageID];
      packages[packageID].CRFIInterestRateDyn = getFinancialCRFIRate(SInfo.Packages[packageID]);
    }
    
    return packages;
  }

  function GetInvesterFinRecords(address addr)
    public
    view
    returns(QueueData[] memory records){

    uint256 uid = SInfo.InvestAddrID[addr];
    if(uid == 0){
      return records;
    }

    InvestInfo storage uInfo = SInfo.Invests[uid];

    uint256 recordSize = 0;

    for(uint256 packageID = 0; packageID < SInfo.Packages.length; packageID++){
      ChainQueue storage chain = uInfo.InvestRecords[packageID];
      recordSize = recordSize.add(chain.Size);
    }

    records = new QueueData[](recordSize);
    uint256 id = 0;
    
    for(uint256 packageID = 0; packageID < SInfo.Packages.length; packageID++){
      ChainQueue storage chain = uInfo.InvestRecords[packageID];
      if(chain.Size == 0){
        continue;
      }

      ChainItem storage item = SInfo.ChainM.GetFirstItem(chain);
      for(;;){
        records[id] = item.Data;
        id++;

        if(!SInfo.ChainM.HasNext(item)){
          break;
        }

        item = SInfo.ChainM.Next(item);
      }
    }
    
    return records;
  }


  function GetSystemInfo()
    public
    view
    returns(SystemInfoView memory sInfoView){

    sInfoView.AffRate = SInfo.AffRate;
    sInfoView.AffRequire = SInfo.AffRequire;
    sInfoView.EnableAffCFil = SInfo.EnableAffCFil;
    sInfoView.NewInvestID = SInfo.NewInvestID;
    sInfoView.nowInvestCRFI = SInfo.nowInvestCRFI;
    sInfoView.nowInvestCFil = SInfo.nowInvestCFil;
    sInfoView.cfilInterestPool = SInfo.cfilInterestPool;
    sInfoView.crfiInterestPool = SInfo.crfiInterestPool;

    sInfoView.cfilLendingTotal = SInfo.cfilLendingTotal;
    sInfoView.crfiRewardTotal = SInfo.crfiRewardTotal;
    sInfoView.avaiCFilAmount = SInfo.avaiCFilAmount;
  
    sInfoView.totalWeightCFil = SInfo.totalWeightCFil;
    sInfoView.totalWeightCRFI = SInfo.totalWeightCRFI;
    sInfoView.crfiMinerPerDayCFil = SInfo.crfiMinerPerDayCFil;
    sInfoView.crfiMinerPerDayCRFI = SInfo.crfiMinerPerDayCRFI;
  
    sInfoView.ParamUpdateTime = SInfo.ParamUpdateTime;

    return sInfoView;
  }

  function GetPackages()
    public
    view
    returns(FinancialPackage[] memory financialPackages,
            LoanCFilPackage memory loanCFil){

    return (GetFinancialPackage(),
            SInfo.LoanCFil);
  }


  function GetInvestRecords(address addr)
    public
    view
    returns(QueueData[] memory records,
            LoanInvest memory loanInvest,
            InterestDetail[] memory interestDetail){

    uint256 uid = SInfo.InvestAddrID[addr];
    if(uid == 0){
      return (records, loanInvest, interestDetail);
    }

    InvestInfo storage uInfo = SInfo.Invests[uid];

    records = GetInvesterFinRecords(addr);
    interestDetail = new InterestDetail[](records.length+1);

    uint256 id = 0;
    for(; id < records.length; id++){
      (interestDetail[id].crfiInterest, interestDetail[id].cfilInterest) = _calcInvestFinancial(records[id].PackageID, records[id].Amount, records[id].ParamCRFI, records[id].ParamCFil);
    }

    interestDetail[id].cfilInterest = calcInvestLoanStatus(uInfo);
    interestDetail[id].cfilInterest = interestDetail[id].cfilInterest.add(uInfo.LoanCFil.NowInterest);

    return(records,
           uInfo.LoanCFil,
           interestDetail);
  }

  function GetInvestInfo(uint256 uid, address addr)
    public
    view
    returns(bool admin,
            InvestInfoView memory uInfoView){
    if(uid == 0){
      uid = SInfo.InvestAddrID[addr];
    }

    if(uid == 0){
      if(addr != address(0x0)){
        admin = (SInfo.SuperAdmin == addr) || (SInfo.Admins[addr]);
      }
      return (admin,
              uInfoView);
    }
    
    InvestInfo storage uInfo = SInfo.Invests[uid];

    admin = (SInfo.SuperAdmin == uInfo.Addr) || (SInfo.Admins[uInfo.Addr]);

    uInfoView.Addr = uInfo.Addr;
    uInfoView.ID = uInfo.ID;
    uInfoView.affID = uInfo.affID;
    uInfoView.totalAffTimes = uInfo.totalAffTimes;
    uInfoView.totalAffPackageTimes = uInfo.totalAffPackageTimes;
    uInfoView.totalAffCRFI = uInfo.totalAffCRFI;
    uInfoView.totalAffCFil = uInfo.totalAffCFil;
    uInfoView.nowInvestFinCRFI = uInfo.nowInvestFinCRFI;
    uInfoView.nowInvestFinCFil = uInfo.nowInvestFinCFil;

    return (admin,
            uInfoView);
  }

  function calcSFilToCFil(uint256 sfil)
    public
    view
    returns(uint256 cfil){
    cfil = sfil.mul(SInfo.LoanCFil.PledgeRate) / Decimal;
    return cfil;
  }

  function calcCFilToSFil(uint256 cfil)
    public
    view
    returns(uint256 sfil){

    sfil = cfil.mul(Decimal) / SInfo.LoanCFil.PledgeRate;
    return sfil;
  }
  
  //////////////////// for debug

  function getChainMDetail()
    public
    view
    returns(ChainManager memory chaimM){

    return SInfo.ChainM;
  }

  function getInvestChainDetail(uint256 id)
    public
    view
    returns(ChainQueue[] memory chains){

    InvestInfo storage uInfo = SInfo.Invests[id];

    chains = new ChainQueue[](SInfo.Packages.length);

    for(uint256 packageID = 0; packageID < SInfo.Packages.length; packageID++){
      chains[packageID] = uInfo.InvestRecords[packageID];
    }

    return chains;
  }
  
  //////////////////// internal func
  function _repayLoanCFil(address from,
                          uint256 cfilAmount)
    internal{
    require(cfilAmount > 0, "no cfil amount");
    require(msg.sender == address(CFil), "not cfil coin type");

    InvestInfo storage uInfo = SInfo.Invests[getUID(from)];
    updateInvesterLoanCFil(uInfo);

    // deal interest
    uint256 repayInterest = cfilAmount;
    if(uInfo.LoanCFil.NowInterest < cfilAmount){
      repayInterest = uInfo.LoanCFil.NowInterest;
    }

    uInfo.LoanCFil.NowInterest = uInfo.LoanCFil.NowInterest.sub(repayInterest);
    SInfo.cfilInterestPool = SInfo.cfilInterestPool.add(repayInterest);
    cfilAmount = cfilAmount.sub(repayInterest);

    // deal lending
    if(cfilAmount == 0){
      return;
    }

    uint256 repayLending = cfilAmount;
    if(uInfo.LoanCFil.Lending < cfilAmount){
      repayLending = uInfo.LoanCFil.Lending;
    }

    uint256 pledge = repayLending.mul(uInfo.LoanCFil.Pledge) / uInfo.LoanCFil.Lending;
    uInfo.LoanCFil.Lending = uInfo.LoanCFil.Lending.sub(repayLending);
    uInfo.LoanCFil.Pledge = uInfo.LoanCFil.Pledge.sub(pledge);
    SInfo.cfilLendingTotal = SInfo.cfilLendingTotal.sub(repayLending);
    SInfo.avaiCFilAmount = SInfo.avaiCFilAmount.add(repayLending);
    cfilAmount = cfilAmount.sub(repayLending);

    if(pledge > 0){
      SFil.send(from, pledge, "");
    }
    
    if(cfilAmount > 0){
      CFil.send(from, cfilAmount, "");
    }
  }
  
  function _loanCFil(address from,
                     uint256 sfilAmount)
    internal{

    require(sfilAmount > 0, "no sfil amount");
    require(msg.sender == address(SFil), "not sfil coin type");

    uint256 cfilAmount = calcSFilToCFil(sfilAmount);
    require(cfilAmount <= SInfo.avaiCFilAmount, "not enough cfil to loan");
    require(cfilAmount >= SInfo.LoanCFil.PaymentDue99, "cfil amount is too small");

    InvestInfo storage uInfo = SInfo.Invests[getUID(from)];
    updateInvesterLoanCFil(uInfo);
    
    if(uInfo.LoanCFil.Param < SInfo.LoanCFil.Param){
      uInfo.LoanCFil.Param = SInfo.LoanCFil.Param;
    }
    uInfo.LoanCFil.Lending = uInfo.LoanCFil.Lending.add(cfilAmount);
    uInfo.LoanCFil.Pledge = uInfo.LoanCFil.Pledge.add(sfilAmount);

    SInfo.cfilLendingTotal = SInfo.cfilLendingTotal.add(cfilAmount);
    SInfo.avaiCFilAmount = SInfo.avaiCFilAmount.sub(cfilAmount);

    CFil.send(from, cfilAmount, "");
    emit loanCFilEvent(from, cfilAmount, sfilAmount);
  }
  
  function _buyFinancialPackage(address from,
                                uint256 packageID,
                                address affAddr,
                                uint256 amount)
    internal{
    // check
    require(amount > 0, "no amount");
    require(packageID < SInfo.Packages.length, "invalid packageID");
    FinancialPackage storage package = SInfo.Packages[packageID];
    if(package.Type == FinancialType.CRFI){
      require(msg.sender == address(CRFI), "not CRFI coin type");
    }else if(package.Type == FinancialType.CFil){
      require(msg.sender == address(CFil), "not CFil coin type");
    } else {
      revert("not avai package type");
    }

    updateAllParam();
    
    // exec
    InvestInfo storage uInfo = SInfo.Invests[getUID(from)];    

    uint256 affID = uInfo.affID;

    if(affID == 0 && affAddr != from && affAddr != address(0x0)){
      uInfo.affID = getUID(affAddr);
      affID = uInfo.affID;
    }

    if(package.Days == 0){
      affID = 0;
    }

    if(affID != 0){
      InvestInfo storage affInfo = SInfo.Invests[affID];
      affInfo.totalAffPackageTimes++;      
      emit AffBought(affAddr, from, affInfo.totalAffPackageTimes, amount, packageID, block.timestamp); 
    }

    ChainQueue storage recordQ = uInfo.InvestRecords[package.ID];

    ChainItem storage item = SInfo.ChainM.GetAvaiItem();

    item.Data.Type = package.Type;
    item.Data.PackageID = package.ID;
    item.Data.Days = package.Days;
    item.Data.EndTime = block.timestamp.add(package.Days.mul(OneDayTime));
    item.Data.AffID = affID;
    item.Data.Amount = amount;
    item.Data.ParamCRFI = package.ParamCRFI;
    item.Data.ParamCFil = package.ParamCFil;

    SInfo.ChainM.PushEndItem(recordQ, item);

    ////////// for statistic
    package.Total = package.Total.add(amount);
    if(package.Type == FinancialType.CRFI){
      uInfo.nowInvestFinCRFI = uInfo.nowInvestFinCRFI.add(amount);
      SInfo.nowInvestCRFI = SInfo.nowInvestCRFI.add(amount);
      SInfo.totalWeightCRFI = SInfo.totalWeightCRFI.add(amount.mul(package.Weight) / Decimal);
    } else if(package.Type == FinancialType.CFil){
      uInfo.nowInvestFinCFil = uInfo.nowInvestFinCFil.add(amount);
      SInfo.nowInvestCFil = SInfo.nowInvestCFil.add(amount);
      SInfo.avaiCFilAmount = SInfo.avaiCFilAmount.add(amount);
      SInfo.totalWeightCFil = SInfo.totalWeightCFil.add(amount.mul(package.Weight) / Decimal);
    }
  }

  function _withdrawFinancial(InvestInfo storage uInfo, uint256 onlyPackageID, bool only, uint256 maxNum)
    internal
    returns(uint256 crfi,
            uint256 crfiInterest,
            uint256 cfil,
            uint256 cfilInterest){

    updateAllParam();

    if(!only){
      onlyPackageID = 0;
    }

    if(maxNum == 0){
      maxNum -= 1;
    }
    
    (uint256 packageID, ChainItem storage item, bool has) = getFirstValidItem(uInfo, onlyPackageID);
    
    while(has && maxNum > 0 && (!only || packageID == onlyPackageID)){
      maxNum--;
      QueueData storage data = item.Data;
      FinancialPackage storage package = SInfo.Packages[data.PackageID];

      (uint256 _crfiInterest, uint256 _cfilInterest) = calcInvestFinancial(data);
      crfiInterest = crfiInterest.add(_crfiInterest);
      cfilInterest = cfilInterest.add(_cfilInterest);

      addAffCRFI(uInfo, data, _crfiInterest, _cfilInterest);

      if((block.timestamp > data.EndTime && data.Days > 0) || (data.Days ==0 && only)){
        package.Total = package.Total.sub(data.Amount);
        if(data.Type == FinancialType.CFil){
          cfil = cfil.add(data.Amount);
          SInfo.totalWeightCFil = SInfo.totalWeightCFil.sub(data.Amount.mul(package.Weight) / Decimal);
        } else {
          crfi = crfi.add(data.Amount);
          SInfo.totalWeightCRFI = SInfo.totalWeightCRFI.sub(data.Amount.mul(package.Weight) / Decimal);
        }
        SInfo.ChainM.PopPutFirst(uInfo.InvestRecords[packageID]);
        (packageID, item, has) = getFirstValidItem(uInfo, packageID);
      } else {
        data.ParamCRFI = package.ParamCRFI;
        data.ParamCFil = package.ParamCFil;
        (packageID, item, has) = getNextItem(uInfo, packageID, item);
      }
    }

    return (crfi, crfiInterest, cfil, cfilInterest);
  }
        
  function getUID(address addr) internal returns(uint256 uID){
    uID = SInfo.InvestAddrID[addr];
    if(uID != 0){
      return uID;
    }
    
    SInfo.NewInvestID++;
    uID = SInfo.NewInvestID;

    InvestInfo storage uInfo = SInfo.Invests[uID];
    uInfo.Addr = addr;
    uInfo.ID = uID;
        
    SInfo.InvestAddrID[addr] = uID;
    return uID;
  }

  function calcSystemLoanStatus()
    internal
    view
    returns(uint256 param){

    if(block.timestamp == SInfo.LoanCFil.UpdateTime){
      return SInfo.LoanCFil.Param;
    }

    uint256 diffSec = block.timestamp.sub(SInfo.LoanCFil.UpdateTime);

    param = SInfo.LoanCFil.Param.add(calcInterest(Decimal, SInfo.LoanCFil.APY, diffSec));

    return param;
  }

  function calcInvestLoanStatus(InvestInfo storage uInfo)
    internal
    view
    returns(uint256 cfilInterest){

    if(uInfo.LoanCFil.Lending == 0){
      return 0;
    }
    
    uint256 param = calcSystemLoanStatus();
    if(uInfo.LoanCFil.Param >= param){
      return 0;
    }
    
    cfilInterest = uInfo.LoanCFil.Lending.mul(param.sub(uInfo.LoanCFil.Param)) / Decimal;
    
    return cfilInterest;
  }

  function updateSystemLoanStatus()
    internal{
    uint256 param;
    param = calcSystemLoanStatus();
    if(param <= SInfo.LoanCFil.Param){
      return;
    }

    SInfo.LoanCFil.Param = param;
    SInfo.LoanCFil.UpdateTime = block.timestamp;
  }

  function updateInvesterLoanCFil(InvestInfo storage uInfo)
    internal{
    updateSystemLoanStatus();
    uint256 cfilInterest = calcInvestLoanStatus(uInfo);
    if(cfilInterest == 0){
      return;
    }

    uInfo.LoanCFil.Param = SInfo.LoanCFil.Param;
    uInfo.LoanCFil.NowInterest = uInfo.LoanCFil.NowInterest.add(cfilInterest);
  }

  function calcInterest(uint256 amount, uint256 rate, uint256 sec)
    internal
    view
    returns(uint256){
    
    return amount.mul(rate).mul(sec) / 365 / OneDayTime / Decimal;    
  }

  function getFirstValidItem(InvestInfo storage uInfo, uint256 packageID)
    internal
    view
    returns(uint256 newPackageID, ChainItem storage item, bool has){
    
    while(packageID < SInfo.Packages.length){
      ChainQueue storage chain = uInfo.InvestRecords[packageID];
      if(chain.Size == 0){
        packageID++;
        continue;
      }
      item = SInfo.ChainM.GetFirstItem(chain);
      return (packageID, item, true);
    }

    return (0, SInfo.ChainM.GetNullItem(), false);
  }

  function getNextItem(InvestInfo storage uInfo,
                       uint256 packageID,
                       ChainItem storage item)
    internal
    view
    returns(uint256, ChainItem storage, bool){

    if(packageID >= SInfo.Packages.length){
      return (0, item, false);
    }

    if(SInfo.ChainM.HasNext(item)){
      return (packageID, SInfo.ChainM.Next(item), true);
    }

    return getFirstValidItem(uInfo, packageID+1);
  }

  function addAffCRFI(InvestInfo storage uInfo, QueueData storage data, uint256 crfiInterest, uint256 cfilInterest)
    internal{
    if(data.Days == 0){
      return;
    }
    
    uint256 affID = data.AffID;
    if(affID == 0){
      return;
    }
    InvestInfo storage affInfo = SInfo.Invests[affID];
    if(affInfo.nowInvestFinCFil < SInfo.AffRequire){
      return;
    }
    
    uint256 affCRFI = crfiInterest.mul(SInfo.AffRate) / Decimal;
    uint256 affCFil;

    bool emitFlag;
    if(affCRFI != 0){
      emitFlag = true;
      affInfo.totalAffCRFI = affInfo.totalAffCRFI.add(affCRFI);
    }

    if(SInfo.EnableAffCFil > 0){
      affCFil = cfilInterest.mul(SInfo.AffRate) / Decimal;
      if(affCFil != 0){
        emitFlag = true;
        affInfo.totalAffCFil = affInfo.totalAffCFil.add(affCFil);
      }
    }

    if(!emitFlag){
      return;
    }
    
    affInfo.totalAffTimes++;
    emit AffEvent(affInfo.Addr, uInfo.Addr, affInfo.totalAffTimes, affCRFI, affCFil, data.PackageID, block.timestamp);

    withdrawCoin(affInfo.Addr, 0, affCRFI, 0, affCFil);

  }

  function withdrawCoin(address addr,
                        uint256 crfi,
                        uint256 crfiInterest,
                        uint256 cfil,
                        uint256 cfilInterest)
    internal{
    
    require(cfil <= SInfo.nowInvestCFil, "cfil invest now error");
    require(cfil <= SInfo.avaiCFilAmount, "not enough cfil to withdraw");    
    require(crfi <= SInfo.nowInvestCRFI, "crfi invest now error");
    
    if(cfil > 0){
      SInfo.nowInvestCFil = SInfo.nowInvestCFil.sub(cfil);
      SInfo.avaiCFilAmount = SInfo.avaiCFilAmount.sub(cfil);
    }

    if(crfi > 0){
      SInfo.nowInvestCRFI = SInfo.nowInvestCRFI.sub(crfi);
    }
    
    if(cfilInterest > 0){
      require(SInfo.cfilInterestPool >= cfilInterest, "cfil interest pool is not enough");
      SInfo.cfilInterestPool = SInfo.cfilInterestPool.sub(cfilInterest);
      cfil = cfil.add(cfilInterest);
    }

    if(crfiInterest > 0){
      require(SInfo.crfiInterestPool >= crfiInterest, "crfi interest pool is not enough");
      SInfo.crfiInterestPool = SInfo.crfiInterestPool.sub(crfiInterest);
      crfi = crfi.add(crfiInterest);
      SInfo.crfiRewardTotal = SInfo.crfiRewardTotal.add(crfiInterest);
    }

    if(cfil > 0){
      CFil.send(addr, cfil, "");
    }

    if(crfi > 0){
      CRFI.send(addr, crfi, "");
    }
  }

  //////////////////// for update param
  
  function getFinancialCRFIRate(FinancialPackage storage package)
    internal
    view
    returns(uint256 rate){
    if(package.Total == 0){
      return 0;
    }
    
    uint256 x = package.Total.mul(package.Weight);
    if(package.Type == FinancialType.CRFI){
      if(SInfo.totalWeightCRFI == 0){
        return 0;
      }
      rate = x.mul(SInfo.crfiMinerPerDayCRFI) / SInfo.totalWeightCRFI;
    } else {
      if(SInfo.totalWeightCFil == 0){
        return 0;
      }
      rate = x.mul(SInfo.crfiMinerPerDayCFil) / SInfo.totalWeightCFil;
    }

    rate = rate.mul(365) / package.Total ;
    
    return rate;
  }

  function calcFinancialParam(FinancialPackage storage package)
    internal
    view
    returns(uint256 paramCRFI,
            uint256 paramCFil){

    uint256 diffSec = block.timestamp.sub(SInfo.ParamUpdateTime);
    if(diffSec == 0){
      return (package.ParamCRFI, package.ParamCFil);
    }

    paramCFil = package.ParamCFil.add(calcInterest(Decimal, package.CFilInterestRate, diffSec));
    paramCRFI = package.ParamCRFI.add(calcInterest(Decimal,
                                                   getFinancialCRFIRate(package),
                                                   diffSec));
    return (paramCRFI, paramCFil);
  }

  function updateFinancialParam(FinancialPackage storage package)
    internal{

    (package.ParamCRFI, package.ParamCFil) = calcFinancialParam(package);
  }

  function updateAllParam()
    internal{
    if(block.timestamp == SInfo.ParamUpdateTime){
      return;
    }

    for(uint256 i = 0; i < SInfo.Packages.length; i++){
      updateFinancialParam(SInfo.Packages[i]);
    }

    SInfo.ParamUpdateTime = block.timestamp;
  }

  function _calcInvestFinancial(uint256 packageID, uint256 amount, uint256 paramCRFI, uint256 paramCFil)
    internal
    view
    returns(uint256 crfiInterest, uint256 cfilInterest){
    
    FinancialPackage storage package = SInfo.Packages[packageID];

    (uint256 packageParamCRFI, uint256 packageParamCFil) = calcFinancialParam(package);
    crfiInterest = amount.mul(packageParamCRFI.sub(paramCRFI)) / Decimal;
    cfilInterest = amount.mul(packageParamCFil.sub(paramCFil)) / Decimal;

    return(crfiInterest, cfilInterest);
  }

  function calcInvestFinancial(QueueData storage data)
    internal
    view
    returns(uint256 crfiInterest, uint256 cfilInterest){
    return _calcInvestFinancial(data.PackageID, data.Amount, data.ParamCRFI, data.ParamCFil);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"crfiAddr","type":"address"},{"internalType":"address","name":"cfilAddr","type":"address"},{"internalType":"address","name":"sfilAddr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"affer","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"affPackageTimes","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"packageID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"AffBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"affTimes","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"crfiInterest","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cfilInterest","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"packageID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"AffEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"cfilAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sfilAmount","type":"uint256"}],"name":"loanCFilEvent","type":"event"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"AddAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum FinancialType","name":"_type","type":"uint8"},{"internalType":"uint256","name":"dayTimes","type":"uint256"},{"internalType":"uint256","name":"cfilInterestRate","type":"uint256"},{"internalType":"uint256","name":"weight","type":"uint256"}],"name":"AddPackage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"CFil","outputs":[{"internalType":"contract IERC777","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CRFI","outputs":[{"internalType":"contract IERC777","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"ChangeAffCFil","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"ChangeAffRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ChangeAffRequire","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"crfi","type":"uint256"},{"internalType":"uint256","name":"cfil","type":"uint256"}],"name":"ChangeCRFIMinerPerDay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"apy","type":"uint256"},{"internalType":"uint256","name":"pledgeRate","type":"uint256"},{"internalType":"uint256","name":"paymentDue","type":"uint256"}],"name":"ChangeLoanRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"packageID","type":"uint256"},{"internalType":"uint256","name":"cfilInterestRate","type":"uint256"},{"internalType":"uint256","name":"weight","type":"uint256"}],"name":"ChangePackageRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"suAdmin","type":"address"}],"name":"ChangeSuperAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"DelAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"GetFinancialPackage","outputs":[{"components":[{"internalType":"enum FinancialType","name":"Type","type":"uint8"},{"internalType":"uint256","name":"Days","type":"uint256"},{"internalType":"uint256","name":"CFilInterestRate","type":"uint256"},{"internalType":"uint256","name":"CRFIInterestRateDyn","type":"uint256"},{"internalType":"uint256","name":"ID","type":"uint256"},{"internalType":"uint256","name":"Weight","type":"uint256"},{"internalType":"uint256","name":"ParamCRFI","type":"uint256"},{"internalType":"uint256","name":"ParamCFil","type":"uint256"},{"internalType":"uint256","name":"Total","type":"uint256"}],"internalType":"struct FinancialPackage[]","name":"packages","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"uid","type":"uint256"},{"internalType":"address","name":"addr","type":"address"}],"name":"GetInvestInfo","outputs":[{"internalType":"bool","name":"admin","type":"bool"},{"components":[{"internalType":"address","name":"Addr","type":"address"},{"internalType":"uint256","name":"ID","type":"uint256"},{"internalType":"uint256","name":"affID","type":"uint256"},{"internalType":"uint256","name":"totalAffTimes","type":"uint256"},{"internalType":"uint256","name":"totalAffPackageTimes","type":"uint256"},{"internalType":"uint256","name":"totalAffCRFI","type":"uint256"},{"internalType":"uint256","name":"totalAffCFil","type":"uint256"},{"internalType":"uint256","name":"nowInvestFinCRFI","type":"uint256"},{"internalType":"uint256","name":"nowInvestFinCFil","type":"uint256"}],"internalType":"struct InvestInfoView","name":"uInfoView","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"GetInvestRecords","outputs":[{"components":[{"internalType":"uint256","name":"RecordID","type":"uint256"},{"internalType":"enum FinancialType","name":"Type","type":"uint8"},{"internalType":"uint256","name":"PackageID","type":"uint256"},{"internalType":"uint256","name":"Days","type":"uint256"},{"internalType":"uint256","name":"EndTime","type":"uint256"},{"internalType":"uint256","name":"AffID","type":"uint256"},{"internalType":"uint256","name":"Amount","type":"uint256"},{"internalType":"uint256","name":"ParamCRFI","type":"uint256"},{"internalType":"uint256","name":"ParamCFil","type":"uint256"}],"internalType":"struct QueueData[]","name":"records","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"Lending","type":"uint256"},{"internalType":"uint256","name":"Pledge","type":"uint256"},{"internalType":"uint256","name":"Param","type":"uint256"},{"internalType":"uint256","name":"NowInterest","type":"uint256"}],"internalType":"struct LoanInvest","name":"loanInvest","type":"tuple"},{"components":[{"internalType":"uint256","name":"crfiInterest","type":"uint256"},{"internalType":"uint256","name":"cfilInterest","type":"uint256"}],"internalType":"struct InterestDetail[]","name":"interestDetail","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"GetInvesterFinRecords","outputs":[{"components":[{"internalType":"uint256","name":"RecordID","type":"uint256"},{"internalType":"enum FinancialType","name":"Type","type":"uint8"},{"internalType":"uint256","name":"PackageID","type":"uint256"},{"internalType":"uint256","name":"Days","type":"uint256"},{"internalType":"uint256","name":"EndTime","type":"uint256"},{"internalType":"uint256","name":"AffID","type":"uint256"},{"internalType":"uint256","name":"Amount","type":"uint256"},{"internalType":"uint256","name":"ParamCRFI","type":"uint256"},{"internalType":"uint256","name":"ParamCFil","type":"uint256"}],"internalType":"struct QueueData[]","name":"records","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"key","type":"string"}],"name":"GetMap","outputs":[{"internalType":"string","name":"value","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GetPackages","outputs":[{"components":[{"internalType":"enum FinancialType","name":"Type","type":"uint8"},{"internalType":"uint256","name":"Days","type":"uint256"},{"internalType":"uint256","name":"CFilInterestRate","type":"uint256"},{"internalType":"uint256","name":"CRFIInterestRateDyn","type":"uint256"},{"internalType":"uint256","name":"ID","type":"uint256"},{"internalType":"uint256","name":"Weight","type":"uint256"},{"internalType":"uint256","name":"ParamCRFI","type":"uint256"},{"internalType":"uint256","name":"ParamCFil","type":"uint256"},{"internalType":"uint256","name":"Total","type":"uint256"}],"internalType":"struct FinancialPackage[]","name":"financialPackages","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"APY","type":"uint256"},{"internalType":"uint256","name":"PledgeRate","type":"uint256"},{"internalType":"uint256","name":"PaymentDue","type":"uint256"},{"internalType":"uint256","name":"PaymentDue99","type":"uint256"},{"internalType":"uint256","name":"UpdateTime","type":"uint256"},{"internalType":"uint256","name":"Param","type":"uint256"}],"internalType":"struct LoanCFilPackage","name":"loanCFil","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GetSystemInfo","outputs":[{"components":[{"internalType":"uint256","name":"AffRate","type":"uint256"},{"internalType":"uint256","name":"AffRequire","type":"uint256"},{"internalType":"uint256","name":"EnableAffCFil","type":"uint256"},{"internalType":"uint256","name":"NewInvestID","type":"uint256"},{"internalType":"uint256","name":"nowInvestCRFI","type":"uint256"},{"internalType":"uint256","name":"nowInvestCFil","type":"uint256"},{"internalType":"uint256","name":"cfilInterestPool","type":"uint256"},{"internalType":"uint256","name":"crfiInterestPool","type":"uint256"},{"internalType":"uint256","name":"cfilLendingTotal","type":"uint256"},{"internalType":"uint256","name":"crfiRewardTotal","type":"uint256"},{"internalType":"uint256","name":"avaiCFilAmount","type":"uint256"},{"internalType":"uint256","name":"totalWeightCFil","type":"uint256"},{"internalType":"uint256","name":"totalWeightCRFI","type":"uint256"},{"internalType":"uint256","name":"crfiMinerPerDayCFil","type":"uint256"},{"internalType":"uint256","name":"crfiMinerPerDayCRFI","type":"uint256"},{"internalType":"uint256","name":"ParamUpdateTime","type":"uint256"}],"internalType":"struct SystemInfoView","name":"sInfoView","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OneDayTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SFil","outputs":[{"internalType":"contract IERC777","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"name":"SetMap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"packageID","type":"uint256"},{"internalType":"bool","name":"only","type":"bool"},{"internalType":"uint256","name":"maxNum","type":"uint256"}],"name":"Withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawCFilInterestPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawCRFIInterestPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cfil","type":"uint256"}],"name":"calcCFilToSFil","outputs":[{"internalType":"uint256","name":"sfil","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"sfil","type":"uint256"}],"name":"calcSFilToCFil","outputs":[{"internalType":"uint256","name":"cfil","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainMDetail","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"Next","type":"uint256"},{"internalType":"uint256","name":"Prev","type":"uint256"},{"internalType":"uint256","name":"My","type":"uint256"},{"components":[{"internalType":"uint256","name":"RecordID","type":"uint256"},{"internalType":"enum FinancialType","name":"Type","type":"uint8"},{"internalType":"uint256","name":"PackageID","type":"uint256"},{"internalType":"uint256","name":"Days","type":"uint256"},{"internalType":"uint256","name":"EndTime","type":"uint256"},{"internalType":"uint256","name":"AffID","type":"uint256"},{"internalType":"uint256","name":"Amount","type":"uint256"},{"internalType":"uint256","name":"ParamCRFI","type":"uint256"},{"internalType":"uint256","name":"ParamCFil","type":"uint256"}],"internalType":"struct QueueData","name":"Data","type":"tuple"}],"internalType":"struct ChainItem[]","name":"rawQueue","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"First","type":"uint256"},{"internalType":"uint256","name":"End","type":"uint256"},{"internalType":"uint256","name":"Size","type":"uint256"}],"internalType":"struct ChainQueue","name":"avaiQueue","type":"tuple"}],"internalType":"struct ChainManager","name":"chaimM","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getInvestChainDetail","outputs":[{"components":[{"internalType":"uint256","name":"First","type":"uint256"},{"internalType":"uint256","name":"End","type":"uint256"},{"internalType":"uint256","name":"Size","type":"uint256"}],"internalType":"struct ChainQueue[]","name":"chains","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"userData","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"tokensReceived","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162004a1638038062004a168339810160408190526200003491620007dd565b60016000819055602280546001600160a01b038087166001600160a01b031992831617909255602380548684169083161790556024805492851692821692909217909155620151809091556013805490911633179055600a670de0b6b3a7640000046003556001600555620000b6600c620002e9602090811b620018e617901c565b69040fa553262d67700000601e556901bd900936eb031e0000601f5542602055620000fc6702ca186f5fda80006707c5850872380000687caee97613e670000062000300565b42600a55620001256000806103e86801158e460913d000005b04670de0b6b3a7640000620003af565b6200014f6000605a6103e86801bc16d674ec8000005b04600a67d02ab486cedc00005b04620003af565b62000175600060b46103e86801d7d843dc3b4800005b04671bc16d674ec80000620003af565b6200019f600061016d6103e86801f399b1438a1000005b04600a68015af1d78b58c4000062000148565b620001c6600061021c6103e868022b1c8c1227a000005b046729a2241af62c0000620003af565b620001e1600160006103e86801158e460913d0000062000115565b620001fc6001605a6103e86801c9f78d2893e400006200013b565b62000217600160b46103e86801e5b8fa8fe2ac000062000165565b62000233600161016d6103e86802017a67f7317400006200018c565b6200024f600161021c6103e8680238fd42c5cf040000620001b6565b6040516329965a1d60e01b8152731820a4b7618bde71dce8cdc73aab6c95905fad24906329965a1d90620002ac9030907fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b90829060040162000826565b600060405180830381600087803b158015620002c757600080fd5b505af1158015620002dc573d6000803e3d6000fd5b5050505050505062000953565b8054620002fd578054600101815560008190525b50565b6013546001600160a01b03163314806200032957503360009081526014602052604090205460ff165b620003515760405162461bcd60e51b81526004016200034890620008b7565b60405180910390fd5b60008211620003745760405162461bcd60e51b8152600401620003489062000849565b60068390556007829055600881905560646200039e82606362000470602090811b620018f817901c565b81620003a657fe5b04600955505050565b6013546001600160a01b0316331480620003d857503360009081526014602052604090205460ff165b620003f75760405162461bcd60e51b81526004016200034890620008b7565b62000401620004b9565b60028054600181018083556000838152919290839081106200041f57fe5b6000918252602090912060099091020180549091508690829060ff1916600183818111156200044a57fe5b021790555060018101949094556005840191909155600283019190915560049091015550565b6000826200048157506000620004b3565b828202828482816200048f57fe5b0414620004b05760405162461bcd60e51b8152600401620003489062000912565b90505b92915050565b602054421415620004ca5762000516565b60005b60025481101562000510576200050760026000018281548110620004ed57fe5b90600052602060002090600902016200051860201b60201c565b600101620004cd565b50426020555b565b620005238162000530565b6007830155600690910155565b6000806000620005546002601e015442620005f260201b6200193b1790919060201c565b9050806200056f5750505060068101546007820154620005ed565b620005ab62000592670de0b6b3a76400008660020154846200061d60201b60201c565b85600701546200068460201b620019631790919060201c565b9150620005e9620005d0670de0b6b3a7640000620005c987620006ac565b846200061d565b85600601546200068460201b620019631790919060201c565b9250505b915091565b600082821115620006175760405162461bcd60e51b81526004016200034890620008db565b50900390565b6000670de0b6b3a764000060015461016d62000661856200064d888a6200047060201b620018f81790919060201c565b6200047060201b620018f81790919060201c565b816200066957fe5b04816200067257fe5b04816200067b57fe5b04949350505050565b600082820183811015620004b05760405162461bcd60e51b8152600401620003489062000880565b6000816008015460001415620006c557506000620007c0565b6000620006e9836005015484600801546200047060201b620018f81790919060201c565b90506000835460ff166001811115620006fe57fe5b14156200074e57601d5462000718576000915050620007c0565b6002601b01546200073d6002601d0154836200047060201b620018f81790919060201c565b816200074557fe5b04915062000792565b601c5462000761576000915050620007c0565b6002601a0154620007866002601c0154836200047060201b620018f81790919060201c565b816200078e57fe5b0491505b8260080154620007b361016d846200047060201b620018f81790919060201c565b81620007bb57fe5b049150505b919050565b80516001600160a01b0381168114620007c057600080fd5b600080600060608486031215620007f2578283fd5b620007fd84620007c5565b92506200080d60208501620007c5565b91506200081d60408501620007c5565b90509250925092565b6001600160a01b0393841681526020810192909252909116604082015260600190565b60208082526015908201527f706c6564676520726174652063616e2774203d20300000000000000000000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600a908201526937b7363c9030b236b4b760b11b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6140b380620009636000396000f3fe608060405234801561001057600080fd5b50600436106101d95760003560e01c806387e3dfe211610104578063c211acf2116100a2578063e3adffab11610071578063e3adffab14610405578063e640207714610418578063f550810114610438578063f56033171461044b576101d9565b8063c211acf2146103c4578063c7c13b3a146103d7578063cc297ab1146103ea578063d8359117146103f2576101d9565b8063a834f5b7116100de578063a834f5b714610381578063ad6de44514610396578063b6932914146103a9578063bace1a36146103bc576101d9565b806387e3dfe21461033b5780639c1857d41461035b5780639fa8f0131461036e576101d9565b806338309b851161017c578063470c23821161014b578063470c2382146102de578063497cb411146103005780636f73ae00146103155780638719bfb114610328576101d9565b806338309b85146102755780633a64ebec146102955780633daa551c146102a85780633dd8fe11146102be576101d9565b80630faf728a116101b85780630faf728a14610232578063119577a41461024557806312efe4b31461025a5780632ef3da231461026d576101d9565b806223de29146101de5780630696ecaa146101f35780630a28b8a91461021d575b600080fd5b6101f16101ec36600461324d565b61045e565b005b61020661020136600461340d565b610628565b6040516102149291906137e3565b60405180910390f35b61022561075a565b604051610214919061385c565b6101f1610240366004613394565b610769565b61024d6107e7565b6040516102149190613f48565b6101f1610268366004613231565b61087a565b610225610904565b610288610283366004613231565b610913565b6040516102149190613747565b6101f16102a33660046134c9565b610ae8565b6102b0610c5d565b6040516102149291906136f2565b6102d16102cc3660046133f5565b610cb1565b6040516102149190613ff4565b6102f16102ec366004613231565b610cda565b6040516102149392919061375a565b610308610edf565b60405161021491906136df565b6101f16103233660046133f5565b611044565b6101f16103363660046134c9565b6110f8565b61034e610349366004613359565b611188565b6040516102149190613870565b6101f16103693660046133f5565b611238565b6102d161037c3660046133f5565b611281565b610389611299565b6040516102149190613eba565b6101f16103a4366004613231565b6113ec565b6101f16103b7366004613231565b611473565b6102256114f6565b6101f16103d2366004613470565b611505565b6101f16103e536600461343c565b611559565b6102d161160c565b6101f16104003660046132fb565b611612565b6101f161041336600461331c565b61168e565b61042b6104263660046133f5565b611747565b6040516102149190613691565b6101f16104463660046133f5565b611817565b6101f16104593660046133f5565b61189d565b6002600054141561048a5760405162461bcd60e51b815260040161048190613e4c565b60405180910390fd5b6002600055826104ac5760405162461bcd60e51b815260040161048190613b91565b600080806104bc86880188613491565b919450925090506001600160a01b038a166104e95760405162461bcd60e51b815260040161048190613dd6565b8260051415610501576104fc8a89611988565b610615565b8260041415610514576104fc8a89611bb7565b8260031415610580576000881161053d5760405162461bcd60e51b815260040161048190613c6a565b6022546001600160a01b031633146105675760405162461bcd60e51b815260040161048190613b3b565b6018546105749089611963565b60185550610619915050565b82600214156105ec57600088116105a95760405162461bcd60e51b815260040161048190613c6a565b6023546001600160a01b031633146105d35760405162461bcd60e51b815260040161048190613cbd565b6017546105e09089611963565b60175550610619915050565b826105fd576104fc8a83838b611d86565b60405162461bcd60e51b815260040161048190613d87565b5050505b50506001600055505050505050565b6000610632612eab565b83610653576001600160a01b03831660009081526012602052604090205493505b836106a3576001600160a01b0383161561069e576013546001600160a01b038481169116148061069b57506001600160a01b03831660009081526014602052604090205460ff165b91505b610753565b600084815260116020526040902060018101546013546001600160a01b03908116911614806106ee575060018101546001600160a01b031660009081526014602052604090205460ff165b60018201546001600160a01b0316835260028201546020840152600382015460408401526008820154606084015260098201546080840152600a82015460a0840152600b82015460c0840152600c82015460e0840152600d9091015461010083015291505b9250929050565b6023546001600160a01b031681565b6013546001600160a01b031633148061079157503360009081526014602052604090205460ff165b6107ad5760405162461bcd60e51b815260040161048190613bb7565b806002601f01836040516107c1919061364d565b908152602001604051809103902090805190602001906107e2929190612f00565b505050565b6107ef612f88565b600354815260045460208083019190915260055460408301526010546060830152601554608083015260165460a083015260175460c083015260185460e0830152601954610100830152601a54610120830152601b54610140830152601c54610160830152601d54610180830152601e546101a0830152601f546101c0830152546101e08201525b90565b6013546001600160a01b031633146108a45760405162461bcd60e51b815260040161048190613ab2565b6001600160a01b0381166108ca5760405162461bcd60e51b815260040161048190613a4c565b6013546001600160a01b03828116911614156108e557610901565b601380546001600160a01b0319166001600160a01b0383161790555b50565b6022546001600160a01b031681565b6001600160a01b0381166000908152601260205260409020546060908061093a5750610ae3565b600081815260116020526040812090805b60025481101561097e5760008181526020849052604090206002810154610973908490611963565b92505060010161094b565b508067ffffffffffffffff8111801561099657600080fd5b506040519080825280602002602001820160405280156109d057816020015b6109bd613005565b8152602001906001900390816109b55790505b5093506000805b600254811015610add57600081815260208590526040902060028101546109fe5750610ad5565b6000610a0b600c8361213d565b90505b60408051610120810190915260038201805482526004830154602083019060ff166001811115610a3a57fe5b6001811115610a4557fe5b8152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481525050888581518110610a9b57fe5b6020908102919091010152600190930192610ab7600c82612187565b610ac057610ad2565b610acb600c826121a1565b9050610a0e565b50505b6001016109d7565b50505050505b919050565b6013546001600160a01b0316331480610b1057503360009081526014602052604090205460ff165b610b2c5760405162461bcd60e51b815260040161048190613bb7565b6002548310610b4d5760405162461bcd60e51b8152600401610481906138f8565b610b556121e9565b600060026000018481548110610b6757fe5b906000526020600020906009020190508281600201819055506000670de0b6b3a7640000610ba6836005015484600801546118f890919063ffffffff16565b81610bad57fe5b0490506000825460ff166001811115610bc257fe5b1415610bdd57601d54610bd5908261193b565b601d55610bee565b601c54610bea908261193b565b601c555b600582018390556008820154670de0b6b3a764000090610c0e90856118f8565b81610c1557fe5b0490506000825460ff166001811115610c2a57fe5b1415610c4557601d54610c3d9082611963565b601d55610c56565b601c54610c529082611963565b601c555b5050505050565b6060610c67613052565b610c6f610edf565b6040805160c08101825260065481526007546020820152600854918101919091526009546060820152600a546080820152600b5460a082015290925090509091565b600754600090670de0b6b3a764000090610ccc9084906118f8565b81610cd357fe5b0492915050565b6060610ce4613088565b6001600160a01b03831660009081526012602052604090205460609080610d0b5750610ed8565b6000818152601160205260409020610d2286610913565b9450845160010167ffffffffffffffff81118015610d3f57600080fd5b50604051908082528060200260200182016040528015610d7957816020015b610d666130b0565b815260200190600190039081610d5e5790505b50925060005b8551811015610e2e57610df1868281518110610d9757fe5b602002602001015160400151878381518110610daf57fe5b602002602001015160c00151888481518110610dc757fe5b602002602001015160e00151898581518110610ddf57fe5b6020026020010151610100015161223b565b858381518110610dfd57fe5b6020026020010151600001868481518110610e1457fe5b602090810291909101810151019190915252600101610d7f565b610e37826122c4565b848281518110610e4357fe5b60200260200101516020018181525050610e848260040160030154858381518110610e6a57fe5b60200260200101516020015161196390919063ffffffff16565b848281518110610e9057fe5b60209081029190910181015181019190915260408051608081018252600485015481526005850154928101929092526006840154908201526007909201546060830152509250505b9193909250565b60025460609067ffffffffffffffff81118015610efb57600080fd5b50604051908082528060200260200182016040528015610f3557816020015b610f226130ca565b815260200190600190039081610f1a5790505b50905060005b600254811015611040576002805482908110610f5357fe5b600091825260209091206040805161012081019091526009909202018054829060ff166001811115610f8157fe5b6001811115610f8c57fe5b815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481525050828281518110610fec57fe5b602002602001018190525061101d6002600001828154811061100a57fe5b9060005260206000209060090201612334565b82828151811061102957fe5b602090810291909101015160600152600101610f3b565b5090565b6013546001600160a01b031633148061106c57503360009081526014602052604090205460ff165b6110885760405162461bcd60e51b815260040161048190613bb7565b601754611095908261193b565b601755602354604051634decdde360e11b81526001600160a01b0390911690639bd9bbc6906110ca9033908590600401613669565b600060405180830381600087803b1580156110e457600080fd5b505af1158015610c56573d6000803e3d6000fd5b6013546001600160a01b031633148061112057503360009081526014602052604090205460ff165b61113c5760405162461bcd60e51b815260040161048190613bb7565b6000821161115c5760405162461bcd60e51b8152600401610481906139f1565b60068390556007829055600881905560646111788260636118f8565b8161117f57fe5b04600955505050565b60606002601f018260405161119d919061364d565b9081526040805160209281900383018120805460026001821615610100026000190190911604601f8101859004850283018501909352828252909290919083018282801561122c5780601f106112015761010080835404028352916020019161122c565b820191906000526020600020905b81548152906001019060200180831161120f57829003601f168201915b50505050509050919050565b6013546001600160a01b031633148061126057503360009081526014602052604090205460ff165b61127c5760405162461bcd60e51b815260040161048190613bb7565b600355565b600754600090610ccc83670de0b6b3a76400006118f8565b6112a1613117565b60408051600c80546060602082028401810185529383018181529293919284929091849160009085015b828210156113ad57838290600052602060002090600c02016040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820160405180610120016040529081600082015481526020016001820160009054906101000a900460ff16600181111561134557fe5b600181111561135057fe5b815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820154815260200160088201548152505081525050815260200190600101906112cb565b50505050815260200160018201604051806060016040529081600082015481526020016001820154815260200160028201548152505081525050905090565b6013546001600160a01b031633146114165760405162461bcd60e51b815260040161048190613ab2565b6001600160a01b03811660009081526014602052604090205460ff161561144f5760405162461bcd60e51b815260040161048190613adc565b6001600160a01b03166000908152601460205260409020805460ff19166001179055565b6013546001600160a01b0316331461149d5760405162461bcd60e51b815260040161048190613ab2565b6001600160a01b03811660009081526014602052604090205460ff166114d55760405162461bcd60e51b815260040161048190613c8d565b6001600160a01b03166000908152601460205260409020805460ff19169055565b6024546001600160a01b031681565b6013546001600160a01b031633148061152d57503360009081526014602052604090205460ff165b6115495760405162461bcd60e51b815260040161048190613bb7565b6115516121e9565b601e55601f55565b6002600054141561157c5760405162461bcd60e51b815260040161048190613e4c565b6002600090815560118161158f336123f1565b815260200190815260200160002090506000806000806115b18589898961246d565b9096509450909250905081156115d657600c8501546115d0908361193b565b600c8601555b83156115f157600d8501546115eb908561193b565b600d8601555b6001850154610619906001600160a01b0316838387876126b7565b60015481565b6013546001600160a01b031633148061163a57503360009081526014602052604090205460ff165b6116565760405162461bcd60e51b815260040161048190613bb7565b8080156116635750600554155b15611672576001600555610901565b80158015611681575060055415155b1561090157600060055550565b6013546001600160a01b03163314806116b657503360009081526014602052604090205460ff165b6116d25760405162461bcd60e51b815260040161048190613bb7565b6116da6121e9565b60028054600181018083556000838152919290839081106116f757fe5b6000918252602090912060099091020180549091508690829060ff19166001838181111561172157fe5b021790555060018101949094556005840191909155600283019190915560049091015550565b60008181526011602052604090206002546060919067ffffffffffffffff8111801561177257600080fd5b506040519080825280602002602001820160405280156117ac57816020015b611799613136565b8152602001906001900390816117915790505b50915060005b6002548110156118105760008181526020838152604091829020825160608101845281548152600182015492810192909252600201549181019190915283518490839081106117fd57fe5b60209081029190910101526001016117b2565b5050919050565b6013546001600160a01b031633148061183f57503360009081526014602052604090205460ff165b61185b5760405162461bcd60e51b815260040161048190613bb7565b601854611868908261193b565b601855602254604051634decdde360e11b81526001600160a01b0390911690639bd9bbc6906110ca9033908590600401613669565b6013546001600160a01b03163314806118c557503360009081526014602052604090205460ff165b6118e15760405162461bcd60e51b815260040161048190613bb7565b600455565b80546109015780546001018155600052565b60008261190757506000611935565b8282028284828161191457fe5b04146119325760405162461bcd60e51b815260040161048190613ce7565b90505b92915050565b60008282111561195d5760405162461bcd60e51b815260040161048190613bdb565b50900390565b6000828201838110156119325760405162461bcd60e51b815260040161048190613a7b565b600081116119a85760405162461bcd60e51b815260040161048190613d28565b6023546001600160a01b031633146119d25760405162461bcd60e51b815260040161048190613c12565b60006011816119e0856123f1565b815260200190815260200160002090506119f9816128c7565b60078101548290811115611a0e575060078101545b6007820154611a1d908261193b565b6007830155601754611a2f9082611963565b601755611a3c838261193b565b925082611a4a575050611bb3565b60048201548390811115611a5f575060048201545b6004830154600584015460009190611a789084906118f8565b81611a7f57fe5b60048601549190049150611a93908361193b565b60048501556005840154611aa7908261193b565b6005850155601954611ab9908361193b565b601955601b54611ac99083611963565b601b55611ad6858361193b565b94508015611b4357602454604051634decdde360e11b81526001600160a01b0390911690639bd9bbc690611b109089908590600401613669565b600060405180830381600087803b158015611b2a57600080fd5b505af1158015611b3e573d6000803e3d6000fd5b505050505b8415611bae57602354604051634decdde360e11b81526001600160a01b0390911690639bd9bbc690611b7b9089908990600401613669565b600060405180830381600087803b158015611b9557600080fd5b505af1158015611ba9573d6000803e3d6000fd5b505050505b505050505b5050565b60008111611bd75760405162461bcd60e51b815260040161048190613dfc565b6024546001600160a01b03163314611c015760405162461bcd60e51b815260040161048190613a20565b6000611c0c82610cb1565b601b54909150811115611c315760405162461bcd60e51b815260040161048190613e83565b600954811015611c535760405162461bcd60e51b815260040161048190613d50565b6000601181611c61866123f1565b81526020019081526020016000209050611c7a816128c7565b600b5460068201541015611c9157600b5460068201555b6004810154611ca09083611963565b60048201556005810154611cb49084611963565b6005820155601954611cc69083611963565b601955601b54611cd6908361193b565b601b55602354604051634decdde360e11b81526001600160a01b0390911690639bd9bbc690611d0b9087908690600401613669565b600060405180830381600087803b158015611d2557600080fd5b505af1158015611d39573d6000803e3d6000fd5b50505050836001600160a01b03167fad9d68f84b5df48e48651913515b1d6bed12ed9f20dea3d9771f5328526196958385604051611d78929190613ffd565b60405180910390a250505050565b60008111611da65760405162461bcd60e51b815260040161048190613c6a565b6002548310611dc75760405162461bcd60e51b815260040161048190613dab565b600060026000018481548110611dd957fe5b6000918252602082206009909102019150815460ff166001811115611dfa57fe5b1415611e2f576022546001600160a01b03163314611e2a5760405162461bcd60e51b815260040161048190613b65565b611e89565b6001815460ff166001811115611e4157fe5b1415611e71576023546001600160a01b03163314611e2a5760405162461bcd60e51b815260040161048190613c3e565b60405162461bcd60e51b815260040161048190613958565b611e916121e9565b6000601181611e9f886123f1565b81526020810191909152604001600020600381015490915080158015611ed75750866001600160a01b0316856001600160a01b031614155b8015611eeb57506001600160a01b03851615155b15611f0357611ef9856123f1565b6003830181905590505b6001830154611f10575060005b8015611f8357600081815260116020526040908190206009810180546001019081905591519091906001600160a01b03808b1691908916907f7e1c35b2764f73a1364fed3bf30d5061c05022f93703cd0ca9404df72b0f48b390611f79908a908d90429061400b565b60405180910390a4505b6004830154600090815260208390526040812090611fa1600c612907565b855460048201805492935060ff9091169160ff191660018381811115611fc357fe5b021790555060048501546005820155600180860154600683018190559054611ff591611fee916118f8565b4290611963565b60078083019190915560088201849055600982018790556006860154600a830155850154600b82015561202a600c8383612976565b60088501546120399087611963565b60088601556000855460ff16600181111561205057fe5b14156120b257600c8401546120659087611963565b600c8501556015546120779087611963565b60155560058501546120aa90670de0b6b3a7640000906120989089906118f8565b8161209f57fe5b601d54919004611963565b601d55612132565b6001855460ff1660018111156120c457fe5b141561213257600d8401546120d99087611963565b600d8501556016546120eb9087611963565b601655601b546120fb9087611963565b601b55600585015461212e90670de0b6b3a76400009061211c9089906118f8565b8161212357fe5b601c54919004611963565b601c555b505050505050505050565b6000808260020154116121625760405162461bcd60e51b815260040161048190613e24565b81548354849190811061217157fe5b90600052602060002090600c0201905092915050565b805460009061219857506000611935565b50600192915050565b8054600090806121c35760405162461bcd60e51b8152600401610481906138a3565b8360000181815481106121d257fe5b90600052602060002090600c020191505092915050565b6020544214156121f857612239565b60005b6002548110156122335761222b6002600001828154811061221857fe5b90600052602060002090600902016129e1565b6001016121fb565b50426020555b565b60008060006002600001878154811061225057fe5b9060005260206000209060090201905060008061226c836129f7565b9092509050670de0b6b3a764000061228e612287848a61193b565b8a906118f8565b8161229557fe5b049450670de0b6b3a76400006122ae612287838961193b565b816122b557fe5b04935050505094509492505050565b60048101546000906122d857506000610ae3565b60006122e2612a86565b9050808360040160020154106122fc576000915050610ae3565b6006830154670de0b6b3a7640000906123259061231a90849061193b565b6004860154906118f8565b8161232c57fe5b049392505050565b600081600801546000141561234b57506000610ae3565b6000612368836005015484600801546118f890919063ffffffff16565b90506000835460ff16600181111561237c57fe5b14156123b357601d54612393576000915050610ae3565b601d54601f546123a49083906118f8565b816123ab57fe5b0491506123e0565b601c546123c4576000915050610ae3565b601c54601e546123d59083906118f8565b816123dc57fe5b0491505b60088301546123258361016d6118f8565b6001600160a01b038116600090815260126020526040902054801561241557610ae3565b5060108054600190810191829055600082815260116020908152604080832093840180546001600160a01b0388166001600160a01b031990911681179091556002949094018590559282526012905220819055919050565b60008060008061247b6121e9565b8561248557600096505b84612491576001850394505b60008060006124a08b8b612adc565b9250925092505b8080156124b45750600088115b80156124c757508815806124c757508983145b156126a957600582015460028054600019909a019960038501926000929181106124ed57fe5b9060005260206000209060090201905060008061250984612b46565b90925090506125188a83611963565b99506125248882611963565b97506125328f858484612b6e565b836004015442118015612549575060008460030154115b8061255e5750600384015415801561255e57508c5b1561267757600684015460088401546125769161193b565b600884015560018481015460ff168181111561258e57fe5b14156125e75760068401546125a4908a90611963565b98506125df670de0b6b3a76400006125cd856005015487600601546118f890919063ffffffff16565b816125d457fe5b601c5491900461193b565b601c55612636565b60068401546125f7908c90611963565b9a50612632670de0b6b3a7640000612620856005015487600601546118f890919063ffffffff16565b8161262757fe5b601d5491900461193b565b601d555b6126618f60000160008981526020019081526020016000206002600a01612cd890919063ffffffff16565b61266b8f88612adc565b919850965094506126a0565b600683015460078086019190915583015460088501556126988f8888612cf0565b919850965094505b505050506124a7565b505050945094509450949050565b6016548211156126d95760405162461bcd60e51b8152600401610481906138c9565b601b548211156126fb5760405162461bcd60e51b815260040161048190613921565b60155484111561271d5760405162461bcd60e51b815260040161048190613b0c565b811561274457601654612730908361193b565b601655601b54612740908361193b565b601b555b831561275b57601554612757908561193b565b6015555b80156127a0576017548111156127835760405162461bcd60e51b8152600401610481906139bc565b601754612790908261193b565b60175561279d8282611963565b91505b82156127f6576018548311156127c85760405162461bcd60e51b815260040161048190613987565b6018546127d5908461193b565b6018556127e28484611963565b601a549094506127f29084611963565b601a555b811561286157602354604051634decdde360e11b81526001600160a01b0390911690639bd9bbc69061282e9088908690600401613669565b600060405180830381600087803b15801561284857600080fd5b505af115801561285c573d6000803e3d6000fd5b505050505b8315610c5657602254604051634decdde360e11b81526001600160a01b0390911690639bd9bbc6906128999088908890600401613669565b600060405180830381600087803b1580156128b357600080fd5b505af1158015612132573d6000803e3d6000fd5b6128cf612d54565b60006128da826122c4565b9050806128e75750610901565b600b54600683015560078201546128fe9082611963565b60078301555050565b6003810154600090612969578154612926578154600101825560008290525b815460018101808455600084905283908290811061294057fe5b600091825260208220600c90910201818155600181019190915560028101919091559050610ae3565b6119358283600101612d79565b6001808301549082015560008155600282015461299f57600281015480835560018301556129d3565b8060020154836000018360010154815481106129b757fe5b60009182526020909120600c9091020155600281015460018301555b506002018054600101905550565b6129ea816129f7565b6007830155600690910155565b6000806000612a146002601e01544261193b90919063ffffffff16565b905080612a2d5750505060068101546007820154612a81565b612a52612a47670de0b6b3a7640000866002015484612e2f565b600786015490611963565b9150612a7d612a72670de0b6b3a7640000612a6c87612334565b84612e2f565b600686015490611963565b9250505b915091565b600a54600090421415612a9c5750600b54610877565b600a54600090612aad90429061193b565b9050612ad6612acd670de0b6b3a764000060026004016000015484612e2f565b600b5490611963565b91505090565b60008060005b600254841015612b2a5760008481526020869052604090206002810154612b0f5750600190930192612ae2565b612b1a600c8261213d565b859450925060019150612b3f9050565b6000612b36600c612e76565b60009250925092505b9250925092565b600080612b65836002015484600601548560070154866008015461223b565b91509150915091565b6003830154612b7c57612cd2565b600583015480612b8c5750612cd2565b6000818152601160205260409020600454600d8201541015612baf575050612cd2565b600354600090670de0b6b3a764000090612bca9087906118f8565b81612bd157fe5b0490506000808215612bf65750600a830154600190612bf09084611963565b600a8501555b60055415612c3f57600354670de0b6b3a764000090612c169088906118f8565b81612c1d57fe5b0491508115612c3f5750600b830154600190612c399083611963565b600b8501555b80612c4e575050505050612cd2565b6008840180546001908101918290558a8101549086015460028b01546040516001600160a01b0393841693909216917fafe38f267ece28b49c2765a03daf360a7bf79bd1cd7e664ffe93d2c05f76e03991612cae91899189914290614021565b60405180910390a46001840154612132906001600160a01b031660008581866126b7565b50505050565b6000612ce48383612d79565b90506107e28382612e9d565b600254600090819081908510612d0e57506000915082905081612d4b565b612d19600c85612187565b15612d375784612d2a600c866121a1565b6001925092509250612d4b565b612d448686600101612adc565b9250925092505b93509350939050565b6000612d5e612a86565b600b549091508111612d705750612239565b600b5542600a55565b600080826002015411612d9e5760405162461bcd60e51b815260040161048190613e24565b81548354849082908110612dae57fe5b60009182526020909120600c909102015480845515612df2578254845460009186918110612dd857fe5b90600052602060002090600c020160010181905550612dfa565b600060018401555b6002830180546000190190558354849082908110612e1457fe5b600091825260208220600c9091020190815591505092915050565b600154600090670de0b6b3a76400009061016d612e5685612e5089896118f8565b906118f8565b81612e5d57fe5b0481612e6557fe5b0481612e6d57fe5b04949350505050565b600081600001600081548110612e8857fe5b90600052602060002090600c02019050919050565b611bb3828360010183612976565b60405180610120016040528060006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282612f365760008555612f7c565b82601f10612f4f57805160ff1916838001178555612f7c565b82800160010185558215612f7c579182015b82811115612f7c578251825591602001919060010190612f61565b50611040929150613157565b604051806102000160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604080516101208101909152600080825260208201908152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b604080516101208101909152806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806040016040528060608152602001613131613136565b905290565b60405180606001604052806000815260200160008152602001600081525090565b5b808211156110405760008155600101613158565b80358015158114610ae357600080fd5b60008083601f84011261318d578182fd5b50813567ffffffffffffffff8111156131a4578182fd5b60208301915083602082850101111561075357600080fd5b600082601f8301126131cc578081fd5b813567ffffffffffffffff808211156131e157fe5b604051601f8301601f1916810160200182811182821017156131ff57fe5b604052828152848301602001861015613216578384fd5b82602086016020830137918201602001929092529392505050565b600060208284031215613242578081fd5b813561193281614068565b60008060008060008060008060c0898b031215613268578384fd5b883561327381614068565b9750602089013561328381614068565b9650604089013561329381614068565b955060608901359450608089013567ffffffffffffffff808211156132b6578586fd5b6132c28c838d0161317c565b909650945060a08b01359150808211156132da578384fd5b506132e78b828c0161317c565b999c989b5096995094979396929594505050565b60006020828403121561330c578081fd5b6133158261316c565b9392505050565b60008060008060808587031215613331578384fd5b84356002811061333f578485fd5b966020860135965060408601359560600135945092505050565b60006020828403121561336a578081fd5b813567ffffffffffffffff811115613380578182fd5b61338c848285016131bc565b949350505050565b600080604083850312156133a6578182fd5b823567ffffffffffffffff808211156133bd578384fd5b6133c9868387016131bc565b935060208501359150808211156133de578283fd5b506133eb858286016131bc565b9150509250929050565b600060208284031215613406578081fd5b5035919050565b6000806040838503121561341f578182fd5b82359150602083013561343181614068565b809150509250929050565b600080600060608486031215613450578283fd5b833592506134606020850161316c565b9150604084013590509250925092565b60008060408385031215613482578182fd5b50508035926020909101359150565b6000806000606084860312156134a5578283fd5b833592506020840135915060408401356134be81614068565b809150509250925092565b6000806000606084860312156134dd578283fd5b505081359360208301359350604090920135919050565b6000815180845260208085019450808401835b8381101561357e57815161351c8882516135c3565b808401518885015260408082015190890152606080820151908901526080808201519089015260a0808201519089015260c0808201519089015260e0808201519089015261010090810151908801526101209096019590820190600101613507565b509495945050505050565b6000815180845260208085019450808401835b8381101561357e576135af8783516135ea565b61012096909601959082019060010161359c565b600281106135cd57fe5b9052565b8051825260208082015190830152604090810151910152565b80518252602081015161360060208401826135c3565b5060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152505050565b6000825161365f81846020870161403c565b9190910192915050565b6001600160a01b03929092168252602082015260606040820181905260009082015260800190565b6020808252825182820181905260009190848201906040850190845b818110156136d3576136c08385516135d1565b92840192606092909201916001016136ad565b50909695505050505050565b60006020825261331560208301846134f4565b600060e0825261370560e08301856134f4565b905082516020830152602083015160408301526040830151606083015260608301516080830152608083015160a083015260a083015160c08301529392505050565b6000602082526133156020830184613589565b600060c0825261376d60c0830186613589565b602085518185015280860151604081818701528088015160608701526060880151608087015285840360a0870152839150865180855283850192508388019450855b818110156137d4578551805185528501518585015294840194928201926001016137af565b50919998505050505050505050565b600061014082019050831515825260018060a01b038351166020830152602083015160408301526040830151606083015260608301516080830152608083015160a083015260a083015160c083015260c083015160e083015260e083015161010081818501528085015161012085015250509392505050565b6001600160a01b0391909116815260200190565b600060208252825180602084015261388f81604085016020870161403c565b601f01601f19169190910160400192915050565b6020808252600c908201526b6e6f206e657874206974656d60a01b604082015260600190565b60208082526015908201527431b334b61034b73b32b9ba103737bb9032b93937b960591b604082015260600190565b6020808252600f908201526e3830b1b5b0b3b2a4a21032b93937b960891b604082015260600190565b6020808252601b908201527f6e6f7420656e6f756768206366696c20746f2077697468647261770000000000604082015260600190565b6020808252601590820152746e6f742061766169207061636b616765207479706560581b604082015260600190565b6020808252818101527f6372666920696e74657265737420706f6f6c206973206e6f7420656e6f756768604082015260600190565b6020808252818101527f6366696c20696e74657265737420706f6f6c206973206e6f7420656e6f756768604082015260600190565b6020808252601590820152740706c6564676520726174652063616e2774203d203605c1b604082015260600190565b6020808252601290820152716e6f74207366696c20636f696e207479706560701b604082015260600190565b60208082526015908201527432b6b83a3c903732bb9039bab832b91030b236b4b760591b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526010908201526f37b7363c9039bab832b91030b236b4b760811b604082015260600190565b60208082526016908201527530b63932b0b23c9030b232103a3434b99030b236b4b760511b604082015260600190565b60208082526015908201527431b933349034b73b32b9ba103737bb9032b93937b960591b604082015260600190565b60208082526010908201526f6f6e6c7920636861726765206372666960801b604082015260600190565b6020808252601290820152716e6f74204352464920636f696e207479706560701b604082015260600190565b6020808252600c908201526b6e6f2075736572206461746160a01b604082015260600190565b6020808252600a908201526937b7363c9030b236b4b760b11b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252601290820152716e6f74206366696c20636f696e207479706560701b604082015260600190565b6020808252601290820152716e6f74204346696c20636f696e207479706560701b604082015260600190565b6020808252600990820152681b9bc8185b5bdd5b9d60ba1b604082015260600190565b6020808252601690820152753a3434b99030b232391034b9903737ba1030b236b4b760511b604082015260600190565b60208082526010908201526f1bdb9b1e4818da185c99d94818d99a5b60821b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252600e908201526d1b9bc818d99a5b08185b5bdd5b9d60921b604082015260600190565b60208082526018908201527f6366696c20616d6f756e7420697320746f6f20736d616c6c0000000000000000604082015260600190565b6020808252600a908201526936b7b2329032b93937b960b11b604082015260600190565b6020808252601190820152701a5b9d985b1a59081c1858dad859d95251607a1b604082015260600190565b6020808252600c908201526b66726f6d206973207a65726f60a01b604082015260600190565b6020808252600e908201526d1b9bc81cd99a5b08185b5bdd5b9d60921b604082015260600190565b6020808252600e908201526d636861696e20697320656d70747960901b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526017908201527f6e6f7420656e6f756768206366696c20746f206c6f616e000000000000000000604082015260600190565b60208082528251608083830152805160a0840181905260009291820190839060c08601905b80831015613f2b5783518051835285810151868401526040808201519084015260609081015190613f12818501836135ea565b5050610180820191508484019350600183019250613edf565b509286015192613f3e60408701856135d1565b9695505050505050565b815181526020808301519082015260408083015190820152606080830151908201526080808301519082015260a0808301519082015260c0808301519082015260e08083015190820152610100808301519082015261012080830151908201526101408083015190820152610160808301519082015261018080830151908201526101a080830151908201526101c080830151908201526101e091820151918101919091526102000190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b60005b8381101561405757818101518382015260200161403f565b83811115612cd25750506000910152565b6001600160a01b038116811461090157600080fdfea2646970667358221220e41164bdf8c9a4db6120b097c47392ab0b27dfdcd74414380c0b5555653ad6a964736f6c634300070600330000000000000000000000008848812bd31aeee33313c10a840ffc3169078c5b0000000000000000000000000f91445a15a1353a099e742f9b51b1b41c2cbfe8000000000000000000000000642c75e5e61b3169ed40644e14260b6f5a366d65

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101d95760003560e01c806387e3dfe211610104578063c211acf2116100a2578063e3adffab11610071578063e3adffab14610405578063e640207714610418578063f550810114610438578063f56033171461044b576101d9565b8063c211acf2146103c4578063c7c13b3a146103d7578063cc297ab1146103ea578063d8359117146103f2576101d9565b8063a834f5b7116100de578063a834f5b714610381578063ad6de44514610396578063b6932914146103a9578063bace1a36146103bc576101d9565b806387e3dfe21461033b5780639c1857d41461035b5780639fa8f0131461036e576101d9565b806338309b851161017c578063470c23821161014b578063470c2382146102de578063497cb411146103005780636f73ae00146103155780638719bfb114610328576101d9565b806338309b85146102755780633a64ebec146102955780633daa551c146102a85780633dd8fe11146102be576101d9565b80630faf728a116101b85780630faf728a14610232578063119577a41461024557806312efe4b31461025a5780632ef3da231461026d576101d9565b806223de29146101de5780630696ecaa146101f35780630a28b8a91461021d575b600080fd5b6101f16101ec36600461324d565b61045e565b005b61020661020136600461340d565b610628565b6040516102149291906137e3565b60405180910390f35b61022561075a565b604051610214919061385c565b6101f1610240366004613394565b610769565b61024d6107e7565b6040516102149190613f48565b6101f1610268366004613231565b61087a565b610225610904565b610288610283366004613231565b610913565b6040516102149190613747565b6101f16102a33660046134c9565b610ae8565b6102b0610c5d565b6040516102149291906136f2565b6102d16102cc3660046133f5565b610cb1565b6040516102149190613ff4565b6102f16102ec366004613231565b610cda565b6040516102149392919061375a565b610308610edf565b60405161021491906136df565b6101f16103233660046133f5565b611044565b6101f16103363660046134c9565b6110f8565b61034e610349366004613359565b611188565b6040516102149190613870565b6101f16103693660046133f5565b611238565b6102d161037c3660046133f5565b611281565b610389611299565b6040516102149190613eba565b6101f16103a4366004613231565b6113ec565b6101f16103b7366004613231565b611473565b6102256114f6565b6101f16103d2366004613470565b611505565b6101f16103e536600461343c565b611559565b6102d161160c565b6101f16104003660046132fb565b611612565b6101f161041336600461331c565b61168e565b61042b6104263660046133f5565b611747565b6040516102149190613691565b6101f16104463660046133f5565b611817565b6101f16104593660046133f5565b61189d565b6002600054141561048a5760405162461bcd60e51b815260040161048190613e4c565b60405180910390fd5b6002600055826104ac5760405162461bcd60e51b815260040161048190613b91565b600080806104bc86880188613491565b919450925090506001600160a01b038a166104e95760405162461bcd60e51b815260040161048190613dd6565b8260051415610501576104fc8a89611988565b610615565b8260041415610514576104fc8a89611bb7565b8260031415610580576000881161053d5760405162461bcd60e51b815260040161048190613c6a565b6022546001600160a01b031633146105675760405162461bcd60e51b815260040161048190613b3b565b6018546105749089611963565b60185550610619915050565b82600214156105ec57600088116105a95760405162461bcd60e51b815260040161048190613c6a565b6023546001600160a01b031633146105d35760405162461bcd60e51b815260040161048190613cbd565b6017546105e09089611963565b60175550610619915050565b826105fd576104fc8a83838b611d86565b60405162461bcd60e51b815260040161048190613d87565b5050505b50506001600055505050505050565b6000610632612eab565b83610653576001600160a01b03831660009081526012602052604090205493505b836106a3576001600160a01b0383161561069e576013546001600160a01b038481169116148061069b57506001600160a01b03831660009081526014602052604090205460ff165b91505b610753565b600084815260116020526040902060018101546013546001600160a01b03908116911614806106ee575060018101546001600160a01b031660009081526014602052604090205460ff165b60018201546001600160a01b0316835260028201546020840152600382015460408401526008820154606084015260098201546080840152600a82015460a0840152600b82015460c0840152600c82015460e0840152600d9091015461010083015291505b9250929050565b6023546001600160a01b031681565b6013546001600160a01b031633148061079157503360009081526014602052604090205460ff165b6107ad5760405162461bcd60e51b815260040161048190613bb7565b806002601f01836040516107c1919061364d565b908152602001604051809103902090805190602001906107e2929190612f00565b505050565b6107ef612f88565b600354815260045460208083019190915260055460408301526010546060830152601554608083015260165460a083015260175460c083015260185460e0830152601954610100830152601a54610120830152601b54610140830152601c54610160830152601d54610180830152601e546101a0830152601f546101c0830152546101e08201525b90565b6013546001600160a01b031633146108a45760405162461bcd60e51b815260040161048190613ab2565b6001600160a01b0381166108ca5760405162461bcd60e51b815260040161048190613a4c565b6013546001600160a01b03828116911614156108e557610901565b601380546001600160a01b0319166001600160a01b0383161790555b50565b6022546001600160a01b031681565b6001600160a01b0381166000908152601260205260409020546060908061093a5750610ae3565b600081815260116020526040812090805b60025481101561097e5760008181526020849052604090206002810154610973908490611963565b92505060010161094b565b508067ffffffffffffffff8111801561099657600080fd5b506040519080825280602002602001820160405280156109d057816020015b6109bd613005565b8152602001906001900390816109b55790505b5093506000805b600254811015610add57600081815260208590526040902060028101546109fe5750610ad5565b6000610a0b600c8361213d565b90505b60408051610120810190915260038201805482526004830154602083019060ff166001811115610a3a57fe5b6001811115610a4557fe5b8152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481525050888581518110610a9b57fe5b6020908102919091010152600190930192610ab7600c82612187565b610ac057610ad2565b610acb600c826121a1565b9050610a0e565b50505b6001016109d7565b50505050505b919050565b6013546001600160a01b0316331480610b1057503360009081526014602052604090205460ff165b610b2c5760405162461bcd60e51b815260040161048190613bb7565b6002548310610b4d5760405162461bcd60e51b8152600401610481906138f8565b610b556121e9565b600060026000018481548110610b6757fe5b906000526020600020906009020190508281600201819055506000670de0b6b3a7640000610ba6836005015484600801546118f890919063ffffffff16565b81610bad57fe5b0490506000825460ff166001811115610bc257fe5b1415610bdd57601d54610bd5908261193b565b601d55610bee565b601c54610bea908261193b565b601c555b600582018390556008820154670de0b6b3a764000090610c0e90856118f8565b81610c1557fe5b0490506000825460ff166001811115610c2a57fe5b1415610c4557601d54610c3d9082611963565b601d55610c56565b601c54610c529082611963565b601c555b5050505050565b6060610c67613052565b610c6f610edf565b6040805160c08101825260065481526007546020820152600854918101919091526009546060820152600a546080820152600b5460a082015290925090509091565b600754600090670de0b6b3a764000090610ccc9084906118f8565b81610cd357fe5b0492915050565b6060610ce4613088565b6001600160a01b03831660009081526012602052604090205460609080610d0b5750610ed8565b6000818152601160205260409020610d2286610913565b9450845160010167ffffffffffffffff81118015610d3f57600080fd5b50604051908082528060200260200182016040528015610d7957816020015b610d666130b0565b815260200190600190039081610d5e5790505b50925060005b8551811015610e2e57610df1868281518110610d9757fe5b602002602001015160400151878381518110610daf57fe5b602002602001015160c00151888481518110610dc757fe5b602002602001015160e00151898581518110610ddf57fe5b6020026020010151610100015161223b565b858381518110610dfd57fe5b6020026020010151600001868481518110610e1457fe5b602090810291909101810151019190915252600101610d7f565b610e37826122c4565b848281518110610e4357fe5b60200260200101516020018181525050610e848260040160030154858381518110610e6a57fe5b60200260200101516020015161196390919063ffffffff16565b848281518110610e9057fe5b60209081029190910181015181019190915260408051608081018252600485015481526005850154928101929092526006840154908201526007909201546060830152509250505b9193909250565b60025460609067ffffffffffffffff81118015610efb57600080fd5b50604051908082528060200260200182016040528015610f3557816020015b610f226130ca565b815260200190600190039081610f1a5790505b50905060005b600254811015611040576002805482908110610f5357fe5b600091825260209091206040805161012081019091526009909202018054829060ff166001811115610f8157fe5b6001811115610f8c57fe5b815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481525050828281518110610fec57fe5b602002602001018190525061101d6002600001828154811061100a57fe5b9060005260206000209060090201612334565b82828151811061102957fe5b602090810291909101015160600152600101610f3b565b5090565b6013546001600160a01b031633148061106c57503360009081526014602052604090205460ff165b6110885760405162461bcd60e51b815260040161048190613bb7565b601754611095908261193b565b601755602354604051634decdde360e11b81526001600160a01b0390911690639bd9bbc6906110ca9033908590600401613669565b600060405180830381600087803b1580156110e457600080fd5b505af1158015610c56573d6000803e3d6000fd5b6013546001600160a01b031633148061112057503360009081526014602052604090205460ff165b61113c5760405162461bcd60e51b815260040161048190613bb7565b6000821161115c5760405162461bcd60e51b8152600401610481906139f1565b60068390556007829055600881905560646111788260636118f8565b8161117f57fe5b04600955505050565b60606002601f018260405161119d919061364d565b9081526040805160209281900383018120805460026001821615610100026000190190911604601f8101859004850283018501909352828252909290919083018282801561122c5780601f106112015761010080835404028352916020019161122c565b820191906000526020600020905b81548152906001019060200180831161120f57829003601f168201915b50505050509050919050565b6013546001600160a01b031633148061126057503360009081526014602052604090205460ff165b61127c5760405162461bcd60e51b815260040161048190613bb7565b600355565b600754600090610ccc83670de0b6b3a76400006118f8565b6112a1613117565b60408051600c80546060602082028401810185529383018181529293919284929091849160009085015b828210156113ad57838290600052602060002090600c02016040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820160405180610120016040529081600082015481526020016001820160009054906101000a900460ff16600181111561134557fe5b600181111561135057fe5b815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820154815260200160088201548152505081525050815260200190600101906112cb565b50505050815260200160018201604051806060016040529081600082015481526020016001820154815260200160028201548152505081525050905090565b6013546001600160a01b031633146114165760405162461bcd60e51b815260040161048190613ab2565b6001600160a01b03811660009081526014602052604090205460ff161561144f5760405162461bcd60e51b815260040161048190613adc565b6001600160a01b03166000908152601460205260409020805460ff19166001179055565b6013546001600160a01b0316331461149d5760405162461bcd60e51b815260040161048190613ab2565b6001600160a01b03811660009081526014602052604090205460ff166114d55760405162461bcd60e51b815260040161048190613c8d565b6001600160a01b03166000908152601460205260409020805460ff19169055565b6024546001600160a01b031681565b6013546001600160a01b031633148061152d57503360009081526014602052604090205460ff165b6115495760405162461bcd60e51b815260040161048190613bb7565b6115516121e9565b601e55601f55565b6002600054141561157c5760405162461bcd60e51b815260040161048190613e4c565b6002600090815560118161158f336123f1565b815260200190815260200160002090506000806000806115b18589898961246d565b9096509450909250905081156115d657600c8501546115d0908361193b565b600c8601555b83156115f157600d8501546115eb908561193b565b600d8601555b6001850154610619906001600160a01b0316838387876126b7565b60015481565b6013546001600160a01b031633148061163a57503360009081526014602052604090205460ff165b6116565760405162461bcd60e51b815260040161048190613bb7565b8080156116635750600554155b15611672576001600555610901565b80158015611681575060055415155b1561090157600060055550565b6013546001600160a01b03163314806116b657503360009081526014602052604090205460ff165b6116d25760405162461bcd60e51b815260040161048190613bb7565b6116da6121e9565b60028054600181018083556000838152919290839081106116f757fe5b6000918252602090912060099091020180549091508690829060ff19166001838181111561172157fe5b021790555060018101949094556005840191909155600283019190915560049091015550565b60008181526011602052604090206002546060919067ffffffffffffffff8111801561177257600080fd5b506040519080825280602002602001820160405280156117ac57816020015b611799613136565b8152602001906001900390816117915790505b50915060005b6002548110156118105760008181526020838152604091829020825160608101845281548152600182015492810192909252600201549181019190915283518490839081106117fd57fe5b60209081029190910101526001016117b2565b5050919050565b6013546001600160a01b031633148061183f57503360009081526014602052604090205460ff165b61185b5760405162461bcd60e51b815260040161048190613bb7565b601854611868908261193b565b601855602254604051634decdde360e11b81526001600160a01b0390911690639bd9bbc6906110ca9033908590600401613669565b6013546001600160a01b03163314806118c557503360009081526014602052604090205460ff165b6118e15760405162461bcd60e51b815260040161048190613bb7565b600455565b80546109015780546001018155600052565b60008261190757506000611935565b8282028284828161191457fe5b04146119325760405162461bcd60e51b815260040161048190613ce7565b90505b92915050565b60008282111561195d5760405162461bcd60e51b815260040161048190613bdb565b50900390565b6000828201838110156119325760405162461bcd60e51b815260040161048190613a7b565b600081116119a85760405162461bcd60e51b815260040161048190613d28565b6023546001600160a01b031633146119d25760405162461bcd60e51b815260040161048190613c12565b60006011816119e0856123f1565b815260200190815260200160002090506119f9816128c7565b60078101548290811115611a0e575060078101545b6007820154611a1d908261193b565b6007830155601754611a2f9082611963565b601755611a3c838261193b565b925082611a4a575050611bb3565b60048201548390811115611a5f575060048201545b6004830154600584015460009190611a789084906118f8565b81611a7f57fe5b60048601549190049150611a93908361193b565b60048501556005840154611aa7908261193b565b6005850155601954611ab9908361193b565b601955601b54611ac99083611963565b601b55611ad6858361193b565b94508015611b4357602454604051634decdde360e11b81526001600160a01b0390911690639bd9bbc690611b109089908590600401613669565b600060405180830381600087803b158015611b2a57600080fd5b505af1158015611b3e573d6000803e3d6000fd5b505050505b8415611bae57602354604051634decdde360e11b81526001600160a01b0390911690639bd9bbc690611b7b9089908990600401613669565b600060405180830381600087803b158015611b9557600080fd5b505af1158015611ba9573d6000803e3d6000fd5b505050505b505050505b5050565b60008111611bd75760405162461bcd60e51b815260040161048190613dfc565b6024546001600160a01b03163314611c015760405162461bcd60e51b815260040161048190613a20565b6000611c0c82610cb1565b601b54909150811115611c315760405162461bcd60e51b815260040161048190613e83565b600954811015611c535760405162461bcd60e51b815260040161048190613d50565b6000601181611c61866123f1565b81526020019081526020016000209050611c7a816128c7565b600b5460068201541015611c9157600b5460068201555b6004810154611ca09083611963565b60048201556005810154611cb49084611963565b6005820155601954611cc69083611963565b601955601b54611cd6908361193b565b601b55602354604051634decdde360e11b81526001600160a01b0390911690639bd9bbc690611d0b9087908690600401613669565b600060405180830381600087803b158015611d2557600080fd5b505af1158015611d39573d6000803e3d6000fd5b50505050836001600160a01b03167fad9d68f84b5df48e48651913515b1d6bed12ed9f20dea3d9771f5328526196958385604051611d78929190613ffd565b60405180910390a250505050565b60008111611da65760405162461bcd60e51b815260040161048190613c6a565b6002548310611dc75760405162461bcd60e51b815260040161048190613dab565b600060026000018481548110611dd957fe5b6000918252602082206009909102019150815460ff166001811115611dfa57fe5b1415611e2f576022546001600160a01b03163314611e2a5760405162461bcd60e51b815260040161048190613b65565b611e89565b6001815460ff166001811115611e4157fe5b1415611e71576023546001600160a01b03163314611e2a5760405162461bcd60e51b815260040161048190613c3e565b60405162461bcd60e51b815260040161048190613958565b611e916121e9565b6000601181611e9f886123f1565b81526020810191909152604001600020600381015490915080158015611ed75750866001600160a01b0316856001600160a01b031614155b8015611eeb57506001600160a01b03851615155b15611f0357611ef9856123f1565b6003830181905590505b6001830154611f10575060005b8015611f8357600081815260116020526040908190206009810180546001019081905591519091906001600160a01b03808b1691908916907f7e1c35b2764f73a1364fed3bf30d5061c05022f93703cd0ca9404df72b0f48b390611f79908a908d90429061400b565b60405180910390a4505b6004830154600090815260208390526040812090611fa1600c612907565b855460048201805492935060ff9091169160ff191660018381811115611fc357fe5b021790555060048501546005820155600180860154600683018190559054611ff591611fee916118f8565b4290611963565b60078083019190915560088201849055600982018790556006860154600a830155850154600b82015561202a600c8383612976565b60088501546120399087611963565b60088601556000855460ff16600181111561205057fe5b14156120b257600c8401546120659087611963565b600c8501556015546120779087611963565b60155560058501546120aa90670de0b6b3a7640000906120989089906118f8565b8161209f57fe5b601d54919004611963565b601d55612132565b6001855460ff1660018111156120c457fe5b141561213257600d8401546120d99087611963565b600d8501556016546120eb9087611963565b601655601b546120fb9087611963565b601b55600585015461212e90670de0b6b3a76400009061211c9089906118f8565b8161212357fe5b601c54919004611963565b601c555b505050505050505050565b6000808260020154116121625760405162461bcd60e51b815260040161048190613e24565b81548354849190811061217157fe5b90600052602060002090600c0201905092915050565b805460009061219857506000611935565b50600192915050565b8054600090806121c35760405162461bcd60e51b8152600401610481906138a3565b8360000181815481106121d257fe5b90600052602060002090600c020191505092915050565b6020544214156121f857612239565b60005b6002548110156122335761222b6002600001828154811061221857fe5b90600052602060002090600902016129e1565b6001016121fb565b50426020555b565b60008060006002600001878154811061225057fe5b9060005260206000209060090201905060008061226c836129f7565b9092509050670de0b6b3a764000061228e612287848a61193b565b8a906118f8565b8161229557fe5b049450670de0b6b3a76400006122ae612287838961193b565b816122b557fe5b04935050505094509492505050565b60048101546000906122d857506000610ae3565b60006122e2612a86565b9050808360040160020154106122fc576000915050610ae3565b6006830154670de0b6b3a7640000906123259061231a90849061193b565b6004860154906118f8565b8161232c57fe5b049392505050565b600081600801546000141561234b57506000610ae3565b6000612368836005015484600801546118f890919063ffffffff16565b90506000835460ff16600181111561237c57fe5b14156123b357601d54612393576000915050610ae3565b601d54601f546123a49083906118f8565b816123ab57fe5b0491506123e0565b601c546123c4576000915050610ae3565b601c54601e546123d59083906118f8565b816123dc57fe5b0491505b60088301546123258361016d6118f8565b6001600160a01b038116600090815260126020526040902054801561241557610ae3565b5060108054600190810191829055600082815260116020908152604080832093840180546001600160a01b0388166001600160a01b031990911681179091556002949094018590559282526012905220819055919050565b60008060008061247b6121e9565b8561248557600096505b84612491576001850394505b60008060006124a08b8b612adc565b9250925092505b8080156124b45750600088115b80156124c757508815806124c757508983145b156126a957600582015460028054600019909a019960038501926000929181106124ed57fe5b9060005260206000209060090201905060008061250984612b46565b90925090506125188a83611963565b99506125248882611963565b97506125328f858484612b6e565b836004015442118015612549575060008460030154115b8061255e5750600384015415801561255e57508c5b1561267757600684015460088401546125769161193b565b600884015560018481015460ff168181111561258e57fe5b14156125e75760068401546125a4908a90611963565b98506125df670de0b6b3a76400006125cd856005015487600601546118f890919063ffffffff16565b816125d457fe5b601c5491900461193b565b601c55612636565b60068401546125f7908c90611963565b9a50612632670de0b6b3a7640000612620856005015487600601546118f890919063ffffffff16565b8161262757fe5b601d5491900461193b565b601d555b6126618f60000160008981526020019081526020016000206002600a01612cd890919063ffffffff16565b61266b8f88612adc565b919850965094506126a0565b600683015460078086019190915583015460088501556126988f8888612cf0565b919850965094505b505050506124a7565b505050945094509450949050565b6016548211156126d95760405162461bcd60e51b8152600401610481906138c9565b601b548211156126fb5760405162461bcd60e51b815260040161048190613921565b60155484111561271d5760405162461bcd60e51b815260040161048190613b0c565b811561274457601654612730908361193b565b601655601b54612740908361193b565b601b555b831561275b57601554612757908561193b565b6015555b80156127a0576017548111156127835760405162461bcd60e51b8152600401610481906139bc565b601754612790908261193b565b60175561279d8282611963565b91505b82156127f6576018548311156127c85760405162461bcd60e51b815260040161048190613987565b6018546127d5908461193b565b6018556127e28484611963565b601a549094506127f29084611963565b601a555b811561286157602354604051634decdde360e11b81526001600160a01b0390911690639bd9bbc69061282e9088908690600401613669565b600060405180830381600087803b15801561284857600080fd5b505af115801561285c573d6000803e3d6000fd5b505050505b8315610c5657602254604051634decdde360e11b81526001600160a01b0390911690639bd9bbc6906128999088908890600401613669565b600060405180830381600087803b1580156128b357600080fd5b505af1158015612132573d6000803e3d6000fd5b6128cf612d54565b60006128da826122c4565b9050806128e75750610901565b600b54600683015560078201546128fe9082611963565b60078301555050565b6003810154600090612969578154612926578154600101825560008290525b815460018101808455600084905283908290811061294057fe5b600091825260208220600c90910201818155600181019190915560028101919091559050610ae3565b6119358283600101612d79565b6001808301549082015560008155600282015461299f57600281015480835560018301556129d3565b8060020154836000018360010154815481106129b757fe5b60009182526020909120600c9091020155600281015460018301555b506002018054600101905550565b6129ea816129f7565b6007830155600690910155565b6000806000612a146002601e01544261193b90919063ffffffff16565b905080612a2d5750505060068101546007820154612a81565b612a52612a47670de0b6b3a7640000866002015484612e2f565b600786015490611963565b9150612a7d612a72670de0b6b3a7640000612a6c87612334565b84612e2f565b600686015490611963565b9250505b915091565b600a54600090421415612a9c5750600b54610877565b600a54600090612aad90429061193b565b9050612ad6612acd670de0b6b3a764000060026004016000015484612e2f565b600b5490611963565b91505090565b60008060005b600254841015612b2a5760008481526020869052604090206002810154612b0f5750600190930192612ae2565b612b1a600c8261213d565b859450925060019150612b3f9050565b6000612b36600c612e76565b60009250925092505b9250925092565b600080612b65836002015484600601548560070154866008015461223b565b91509150915091565b6003830154612b7c57612cd2565b600583015480612b8c5750612cd2565b6000818152601160205260409020600454600d8201541015612baf575050612cd2565b600354600090670de0b6b3a764000090612bca9087906118f8565b81612bd157fe5b0490506000808215612bf65750600a830154600190612bf09084611963565b600a8501555b60055415612c3f57600354670de0b6b3a764000090612c169088906118f8565b81612c1d57fe5b0491508115612c3f5750600b830154600190612c399083611963565b600b8501555b80612c4e575050505050612cd2565b6008840180546001908101918290558a8101549086015460028b01546040516001600160a01b0393841693909216917fafe38f267ece28b49c2765a03daf360a7bf79bd1cd7e664ffe93d2c05f76e03991612cae91899189914290614021565b60405180910390a46001840154612132906001600160a01b031660008581866126b7565b50505050565b6000612ce48383612d79565b90506107e28382612e9d565b600254600090819081908510612d0e57506000915082905081612d4b565b612d19600c85612187565b15612d375784612d2a600c866121a1565b6001925092509250612d4b565b612d448686600101612adc565b9250925092505b93509350939050565b6000612d5e612a86565b600b549091508111612d705750612239565b600b5542600a55565b600080826002015411612d9e5760405162461bcd60e51b815260040161048190613e24565b81548354849082908110612dae57fe5b60009182526020909120600c909102015480845515612df2578254845460009186918110612dd857fe5b90600052602060002090600c020160010181905550612dfa565b600060018401555b6002830180546000190190558354849082908110612e1457fe5b600091825260208220600c9091020190815591505092915050565b600154600090670de0b6b3a76400009061016d612e5685612e5089896118f8565b906118f8565b81612e5d57fe5b0481612e6557fe5b0481612e6d57fe5b04949350505050565b600081600001600081548110612e8857fe5b90600052602060002090600c02019050919050565b611bb3828360010183612976565b60405180610120016040528060006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282612f365760008555612f7c565b82601f10612f4f57805160ff1916838001178555612f7c565b82800160010185558215612f7c579182015b82811115612f7c578251825591602001919060010190612f61565b50611040929150613157565b604051806102000160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604080516101208101909152600080825260208201908152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b604080516101208101909152806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806040016040528060608152602001613131613136565b905290565b60405180606001604052806000815260200160008152602001600081525090565b5b808211156110405760008155600101613158565b80358015158114610ae357600080fd5b60008083601f84011261318d578182fd5b50813567ffffffffffffffff8111156131a4578182fd5b60208301915083602082850101111561075357600080fd5b600082601f8301126131cc578081fd5b813567ffffffffffffffff808211156131e157fe5b604051601f8301601f1916810160200182811182821017156131ff57fe5b604052828152848301602001861015613216578384fd5b82602086016020830137918201602001929092529392505050565b600060208284031215613242578081fd5b813561193281614068565b60008060008060008060008060c0898b031215613268578384fd5b883561327381614068565b9750602089013561328381614068565b9650604089013561329381614068565b955060608901359450608089013567ffffffffffffffff808211156132b6578586fd5b6132c28c838d0161317c565b909650945060a08b01359150808211156132da578384fd5b506132e78b828c0161317c565b999c989b5096995094979396929594505050565b60006020828403121561330c578081fd5b6133158261316c565b9392505050565b60008060008060808587031215613331578384fd5b84356002811061333f578485fd5b966020860135965060408601359560600135945092505050565b60006020828403121561336a578081fd5b813567ffffffffffffffff811115613380578182fd5b61338c848285016131bc565b949350505050565b600080604083850312156133a6578182fd5b823567ffffffffffffffff808211156133bd578384fd5b6133c9868387016131bc565b935060208501359150808211156133de578283fd5b506133eb858286016131bc565b9150509250929050565b600060208284031215613406578081fd5b5035919050565b6000806040838503121561341f578182fd5b82359150602083013561343181614068565b809150509250929050565b600080600060608486031215613450578283fd5b833592506134606020850161316c565b9150604084013590509250925092565b60008060408385031215613482578182fd5b50508035926020909101359150565b6000806000606084860312156134a5578283fd5b833592506020840135915060408401356134be81614068565b809150509250925092565b6000806000606084860312156134dd578283fd5b505081359360208301359350604090920135919050565b6000815180845260208085019450808401835b8381101561357e57815161351c8882516135c3565b808401518885015260408082015190890152606080820151908901526080808201519089015260a0808201519089015260c0808201519089015260e0808201519089015261010090810151908801526101209096019590820190600101613507565b509495945050505050565b6000815180845260208085019450808401835b8381101561357e576135af8783516135ea565b61012096909601959082019060010161359c565b600281106135cd57fe5b9052565b8051825260208082015190830152604090810151910152565b80518252602081015161360060208401826135c3565b5060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152505050565b6000825161365f81846020870161403c565b9190910192915050565b6001600160a01b03929092168252602082015260606040820181905260009082015260800190565b6020808252825182820181905260009190848201906040850190845b818110156136d3576136c08385516135d1565b92840192606092909201916001016136ad565b50909695505050505050565b60006020825261331560208301846134f4565b600060e0825261370560e08301856134f4565b905082516020830152602083015160408301526040830151606083015260608301516080830152608083015160a083015260a083015160c08301529392505050565b6000602082526133156020830184613589565b600060c0825261376d60c0830186613589565b602085518185015280860151604081818701528088015160608701526060880151608087015285840360a0870152839150865180855283850192508388019450855b818110156137d4578551805185528501518585015294840194928201926001016137af565b50919998505050505050505050565b600061014082019050831515825260018060a01b038351166020830152602083015160408301526040830151606083015260608301516080830152608083015160a083015260a083015160c083015260c083015160e083015260e083015161010081818501528085015161012085015250509392505050565b6001600160a01b0391909116815260200190565b600060208252825180602084015261388f81604085016020870161403c565b601f01601f19169190910160400192915050565b6020808252600c908201526b6e6f206e657874206974656d60a01b604082015260600190565b60208082526015908201527431b334b61034b73b32b9ba103737bb9032b93937b960591b604082015260600190565b6020808252600f908201526e3830b1b5b0b3b2a4a21032b93937b960891b604082015260600190565b6020808252601b908201527f6e6f7420656e6f756768206366696c20746f2077697468647261770000000000604082015260600190565b6020808252601590820152746e6f742061766169207061636b616765207479706560581b604082015260600190565b6020808252818101527f6372666920696e74657265737420706f6f6c206973206e6f7420656e6f756768604082015260600190565b6020808252818101527f6366696c20696e74657265737420706f6f6c206973206e6f7420656e6f756768604082015260600190565b6020808252601590820152740706c6564676520726174652063616e2774203d203605c1b604082015260600190565b6020808252601290820152716e6f74207366696c20636f696e207479706560701b604082015260600190565b60208082526015908201527432b6b83a3c903732bb9039bab832b91030b236b4b760591b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526010908201526f37b7363c9039bab832b91030b236b4b760811b604082015260600190565b60208082526016908201527530b63932b0b23c9030b232103a3434b99030b236b4b760511b604082015260600190565b60208082526015908201527431b933349034b73b32b9ba103737bb9032b93937b960591b604082015260600190565b60208082526010908201526f6f6e6c7920636861726765206372666960801b604082015260600190565b6020808252601290820152716e6f74204352464920636f696e207479706560701b604082015260600190565b6020808252600c908201526b6e6f2075736572206461746160a01b604082015260600190565b6020808252600a908201526937b7363c9030b236b4b760b11b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252601290820152716e6f74206366696c20636f696e207479706560701b604082015260600190565b6020808252601290820152716e6f74204346696c20636f696e207479706560701b604082015260600190565b6020808252600990820152681b9bc8185b5bdd5b9d60ba1b604082015260600190565b6020808252601690820152753a3434b99030b232391034b9903737ba1030b236b4b760511b604082015260600190565b60208082526010908201526f1bdb9b1e4818da185c99d94818d99a5b60821b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252600e908201526d1b9bc818d99a5b08185b5bdd5b9d60921b604082015260600190565b60208082526018908201527f6366696c20616d6f756e7420697320746f6f20736d616c6c0000000000000000604082015260600190565b6020808252600a908201526936b7b2329032b93937b960b11b604082015260600190565b6020808252601190820152701a5b9d985b1a59081c1858dad859d95251607a1b604082015260600190565b6020808252600c908201526b66726f6d206973207a65726f60a01b604082015260600190565b6020808252600e908201526d1b9bc81cd99a5b08185b5bdd5b9d60921b604082015260600190565b6020808252600e908201526d636861696e20697320656d70747960901b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526017908201527f6e6f7420656e6f756768206366696c20746f206c6f616e000000000000000000604082015260600190565b60208082528251608083830152805160a0840181905260009291820190839060c08601905b80831015613f2b5783518051835285810151868401526040808201519084015260609081015190613f12818501836135ea565b5050610180820191508484019350600183019250613edf565b509286015192613f3e60408701856135d1565b9695505050505050565b815181526020808301519082015260408083015190820152606080830151908201526080808301519082015260a0808301519082015260c0808301519082015260e08083015190820152610100808301519082015261012080830151908201526101408083015190820152610160808301519082015261018080830151908201526101a080830151908201526101c080830151908201526101e091820151918101919091526102000190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b60005b8381101561405757818101518382015260200161403f565b83811115612cd25750506000910152565b6001600160a01b038116811461090157600080fdfea2646970667358221220e41164bdf8c9a4db6120b097c47392ab0b27dfdcd74414380c0b5555653ad6a964736f6c63430007060033

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

0000000000000000000000008848812bd31aeee33313c10a840ffc3169078c5b0000000000000000000000000f91445a15a1353a099e742f9b51b1b41c2cbfe8000000000000000000000000642c75e5e61b3169ed40644e14260b6f5a366d65

-----Decoded View---------------
Arg [0] : crfiAddr (address): 0x8848812BD31AEEe33313C10A840FfC3169078C5b
Arg [1] : cfilAddr (address): 0x0f91445A15a1353A099E742f9B51b1b41C2CbFe8
Arg [2] : sfilAddr (address): 0x642C75E5E61b3169Ed40644E14260b6f5a366d65

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000008848812bd31aeee33313c10a840ffc3169078c5b
Arg [1] : 0000000000000000000000000f91445a15a1353a099e742f9b51b1b41c2cbfe8
Arg [2] : 000000000000000000000000642c75e5e61b3169ed40644e14260b6f5a366d65


Deployed Bytecode Sourcemap

31425:30325:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38855:1370;;;;;;:::i;:::-;;:::i;:::-;;44809:1021;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;32005:19;;;:::i;:::-;;;;;;;:::i;35756:140::-;;;;;;:::i;:::-;;:::i;42560:1005::-;;;:::i;:::-;;;;;;;:::i;35470:245::-;;;;;;:::i;:::-;;:::i;31981:19::-;;;:::i;41486:1066::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35904:972::-;;;;;;:::i;:::-;;:::i;43571:222::-;;;:::i;:::-;;;;;;;;:::i;45836:169::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;43801:1002::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;41038:442::-;;;:::i;:::-;;;;;;;:::i;38628:188::-;;;;;;:::i;:::-;;:::i;37616:350::-;;;;;;:::i;:::-;;:::i;40904:128::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38214:102::-;;;;;;:::i;:::-;;:::i;46011:171::-;;;;;;:::i;:::-;;:::i;46226:123::-;;;:::i;:::-;;;;;;;:::i;35128:165::-;;;;;;:::i;:::-;;:::i;35299:::-;;;;;;:::i;:::-;;:::i;32029:19::-;;;:::i;37414:196::-;;;;;;:::i;:::-;;:::i;40233:629::-;;;;;;:::i;:::-;;:::i;31887:25::-;;;:::i;37972:236::-;;;;;;:::i;:::-;;:::i;36882:526::-;;;;;;:::i;:::-;;:::i;46355:391::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38434:188::-;;;;;;:::i;:::-;;:::i;38322:106::-;;;;;;:::i;:::-;;:::i;38855:1370::-;9345:1;9951:7;;:19;;9943:63;;;;-1:-1:-1;;;9943:63:0;;;;;;;:::i;:::-;;;;;;;;;9345:1;10084:7;:18;39132:19;39124:44:::1;;;;-1:-1:-1::0;;;39124:44:0::1;;;;;;;:::i;:::-;39385:12;::::0;;39430:48:::1;::::0;;::::1;39441:8:::0;39430:48:::1;:::i;:::-;39384:94:::0;;-1:-1:-1;39384:94:0;-1:-1:-1;39384:94:0;-1:-1:-1;;;;;;39493:20:0;::::1;39485:45;;;;-1:-1:-1::0;;;39485:45:0::1;;;;;;;:::i;:::-;39542:4;39550:1;39542:9;39539:681;;;39561:28;39576:4;39582:6;39561:14;:28::i;:::-;39539:681;;;39605:4;39613:1;39605:9;39602:618;;;39624:23;39634:4;39640:6;39624:9;:23::i;39602:618::-;39663:4;39671:1;39663:9;39660:560;;;39699:1;39690:6;:10;39682:32;;;;-1:-1:-1::0;;;39682:32:0::1;;;;;;;:::i;:::-;39753:4;::::0;-1:-1:-1;;;;;39753:4:0::1;39731:10;:27;39723:56;;;;-1:-1:-1::0;;;39723:56:0::1;;;;;;;:::i;:::-;39813:22:::0;;:34:::1;::::0;39840:6;39813:26:::1;:34::i;:::-;39788:22:::0;:59;-1:-1:-1;39856:7:0::1;::::0;-1:-1:-1;;39856:7:0::1;39660:560;39878:4;39886:1;39878:9;39875:345;;;39914:1;39905:6;:10;39897:32;;;;-1:-1:-1::0;;;39897:32:0::1;;;;;;;:::i;:::-;39968:4;::::0;-1:-1:-1;;;;;39968:4:0::1;39946:10;:27;39938:56;;;;-1:-1:-1::0;;;39938:56:0::1;;;;;;;:::i;:::-;40028:22:::0;;:34:::1;::::0;40055:6;40028:26:::1;:34::i;:::-;40003:22:::0;:59;-1:-1:-1;40079:7:0::1;::::0;-1:-1:-1;;40079:7:0::1;39875:345;40103:9:::0;40099:121:::1;;40122:47;40143:4;40149:5;40156:4;40162:6;40122:20;:47::i;40099:121::-;40192:20;;-1:-1:-1::0;;;40192:20:0::1;;;;;;;:::i;40099:121::-;10115:1;;;;-1:-1:-1::0;;9301:1:0;10263:7;:22;-1:-1:-1;;;;;;38855:1370:0:o;44809:1021::-;44894:10;44919:31;;:::i;:::-;44961:8;44958:59;;-1:-1:-1;;;;;44985:24:0;;;;;;:18;:24;;;;;;;-1:-1:-1;44958:59:0;45028:8;45025:180;;-1:-1:-1;;;;;45049:20:0;;;45046:103;;45090:16;;-1:-1:-1;;;;;45090:24:0;;;:16;;:24;;45089:50;;-1:-1:-1;;;;;;45120:18:0;;;;;;:12;:18;;;;;;;;45089:50;45081:58;;45046:103;45157:40;;45025:180;45217:24;45244:18;;;:13;:18;;;;;45300:10;;;;45280:16;;-1:-1:-1;;;;;45280:16:0;;;45300:10;;45280:30;;45279:62;;-1:-1:-1;45329:10:0;;;;-1:-1:-1;;;;;45329:10:0;45316:24;;;;:12;:24;;;;;;;;45279:62;45367:10;;;;-1:-1:-1;;;;;45367:10:0;45350:27;;45399:8;;;;45384:12;;;:23;45432:11;;;;45414:15;;;:29;45476:19;;;;45450:23;;;:45;45535:26;;;;45502:30;;;:59;45593:18;;;;45568:22;;;:43;45643:18;;;;45618:22;;;:43;45697:22;;;;45668:26;;;:51;45755:22;;;;;45367:10;45726:26;;:51;45271:70;-1:-1:-1;44809:1021:0;;;;;;:::o;32005:19::-;;;-1:-1:-1;;;;;32005:19:0;;:::o;35756:140::-;32136:16;;-1:-1:-1;;;;;32136:16:0;32122:10;:30;;:58;;-1:-1:-1;32169:10:0;32156:24;;;;:12;:24;;;;;;;;32122:58;32114:81;;;;-1:-1:-1;;;32114:81:0;;;;;;;:::i;:::-;35885:5:::1;35866;:11;;35878:3;35866:16;;;;;;:::i;:::-;;;;;;;;;;;;;:24;;;;;;;;;;;;:::i;:::-;;35756:140:::0;;:::o;42560:1005::-;42620:31;;:::i;:::-;42681:13;;42661:33;;42724:16;;42701:20;;;;:39;;;;42773:19;;42747:23;;;:45;42823:17;;42799:21;;;:41;42873:19;;42847:23;;;:45;42925:19;;42899:23;;;:45;42980:22;;42951:26;;;:51;43038:22;;43009:26;;;:51;43098:22;;43069:26;;;:51;43155:21;;43127:25;;;:49;43210:20;;43183:24;;;:47;43269:21;;43241:25;;;:49;43325:21;;43297:25;;;:49;43385:25;;43353:29;;;:57;43449:25;;43417:29;;;:57;43513:21;43485:25;;;:49;42560:1005;;:::o;35470:245::-;32254:16;;-1:-1:-1;;;;;32254:16:0;32274:10;32254:30;32246:59;;;;-1:-1:-1;;;32246:59:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35559:23:0;::::1;35551:57;;;;-1:-1:-1::0;;;35551:57:0::1;;;;;;;:::i;:::-;35631:16:::0;;-1:-1:-1;;;;;35620:27:0;;::::1;35631:16:::0;::::1;35620:27;35617:54;;;35657:7;;35617:54;35683:16:::0;:26;;-1:-1:-1;;;;;;35683:26:0::1;-1:-1:-1::0;;;;;35683:26:0;::::1;;::::0;;32312:1:::1;35470:245:::0;:::o;31981:19::-;;;-1:-1:-1;;;;;31981:19:0;;:::o;41486:1066::-;-1:-1:-1;;;;;41616:24:0;;41602:11;41616:24;;;:18;:24;;;;;;41566:26;;41650:8;41647:43;;41668:14;;;41647:43;41698:24;41725:18;;;:13;:18;;;;;;41698:24;41783:196;41822:5;:21;41810:33;;41783:196;;;41866:24;41893:30;;;;;;;;;;41960:10;;;;41945:26;;:10;;:14;:26::i;:::-;41932:39;-1:-1:-1;;41845:11:0;;41783:196;;;;42013:10;41997:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;41987:37;;42031:10;42062:17;42058:462;42097:5;:21;42085:33;;42058:462;;;42141:24;42168:30;;;;;;;;;;42210:10;;;;42207:48;;42237:8;;;42207:48;42265:22;42290:32;:12;42316:5;42290:25;:32::i;:::-;42265:57;;42331:182;42349:23;;;;;;;;;42363:9;;;42349:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;42357:2;42349:11;;;;;;;;;;;;;;;;;:23;42383:4;;;;;42404:26;:12;42425:4;42404:20;:26::i;:::-;42400:61;;42444:5;;42400:61;42480:23;:12;42498:4;42480:17;:23::i;:::-;42473:30;;42331:182;;;42058:462;;;42120:11;;42058:462;;;;42532:14;;;;41486:1066;;;;:::o;35904:972::-;32136:16;;-1:-1:-1;;;;;32136:16:0;32122:10;:30;;:58;;-1:-1:-1;32169:10:0;32156:24;;;;:12;:24;;;;;;;;32122:58;32114:81;;;;-1:-1:-1;;;32114:81:0;;;;;;;:::i;:::-;36111:5:::1;:21:::0;36099:33;::::1;36091:61;;;;-1:-1:-1::0;;;36091:61:0::1;;;;;;;:::i;:::-;36161:16;:14;:16::i;:::-;36190:32;36225:5;:14;;36240:9;36225:25;;;;;;;;;;;;;;;;;;36190:60;;36284:16;36257:7;:24;;:43;;;;36309:16;31876:4;36328:33;36346:7;:14;;;36328:7;:13;;;:17;;:33;;;;:::i;:::-;:43;;;;;;::::0;-1:-1:-1;36397:18:0::1;36381:12:::0;;::::1;;::::0;:34;::::1;;;;;;;36378:196;;;36449:21:::0;;:35:::1;::::0;36475:8;36449:25:::1;:35::i;:::-;36425:21:::0;:59;36378:196:::1;;;36531:21:::0;;:35:::1;::::0;36557:8;36531:25:::1;:35::i;:::-;36507:21:::0;:59;36378:196:::1;36582:14;::::0;::::1;:23:::0;;;36625:13:::1;::::0;::::1;::::0;31876:4:::1;::::0;36625:33:::1;::::0;36599:6;36625:17:::1;:33::i;:::-;:43;;;;;;::::0;-1:-1:-1;36694:18:0::1;36678:12:::0;;::::1;;::::0;:34;::::1;;;;;;;36675:196;;;36746:21:::0;;:35:::1;::::0;36772:8;36746:25:::1;:35::i;:::-;36722:21:::0;:59;36675:196:::1;;;36828:21:::0;;:35:::1;::::0;36854:8;36828:25:::1;:35::i;:::-;36804:21:::0;:59;36675:196:::1;32202:1;;35904:972:::0;;;:::o;43571:222::-;43629:43;43687:31;;:::i;:::-;43736:21;:19;:21::i;:::-;43728:59;;;;;;;;43772:14;43728:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43728:59:0;-1:-1:-1;43571:222:0;;:::o;45836:169::-;45945:25;;45909:12;;31876:4;;45936:35;;:4;;:8;:35::i;:::-;:45;;;;;;;45836:169;-1:-1:-1;;45836:169:0:o;43801:1002::-;43876:26;43917:28;;:::i;:::-;-1:-1:-1;;;;;44022:24:0;;44008:11;44022:24;;;:18;:24;;;;;;43960:38;;44056:8;44053:73;;44074:44;;;44053:73;44134:24;44161:18;;;:13;:18;;;;;44198:27;44220:4;44198:21;:27::i;:::-;44188:37;;44270:7;:14;44285:1;44270:16;44249:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;44232:55;;44296:10;44317:227;44328:7;:14;44323:2;:19;44317:227;;;44427:109;44448:7;44456:2;44448:11;;;;;;;;;;;;;;:21;;;44471:7;44479:2;44471:11;;;;;;;;;;;;;;:18;;;44491:7;44499:2;44491:11;;;;;;;;;;;;;;:21;;;44514:7;44522:2;44514:11;;;;;;;;;;;;;;:21;;;44427:20;:109::i;:::-;44359:14;44374:2;44359:18;;;;;;;;;;;;;;:31;;44392:14;44407:2;44392:18;;;;;;;;;;;;;;;;;;;:31;44358:178;;;;;44344:4;;44317:227;;;44586:27;44607:5;44586:20;:27::i;:::-;44552:14;44567:2;44552:18;;;;;;;;;;;;;;:31;;:61;;;;;44654:63;44690:5;:14;;:26;;;44654:14;44669:2;44654:18;;;;;;;;;;;;;;:31;;;:35;;:63;;;;:::i;:::-;44620:14;44635:2;44620:18;;;;;;;;;;;;;;;;;;;:31;;:97;;;;44726:71;;;;;;;;44754:14;;;44726:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44726:71:0;-1:-1:-1;;43801:1002:0;;;;;;:::o;41038:442::-;41182:5;:21;41104:34;;41159:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;41148:56;;41215:17;41211:236;41250:5;:21;41238:33;;41211:236;;;41316:5;:25;;41331:9;;41316:25;;;;;;;;;;;;;;41294:47;;;;;;;;;41316:25;;;;;41294:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;41303:9;41294:19;;;;;;;;;;;;;:47;;;;41392;41413:5;:14;;41428:9;41413:25;;;;;;;;;;;;;;;;;;41392:20;:47::i;:::-;41350:8;41359:9;41350:19;;;;;;;;;;;;;;;;;;:39;;:89;41273:11;;41211:236;;;;41038:442;:::o;38628:188::-;32136:16;;-1:-1:-1;;;;;32136:16:0;32122:10;:30;;:58;;-1:-1:-1;32169:10:0;32156:24;;;;:12;:24;;;;;;;;32122:58;32114:81;;;;-1:-1:-1;;;32114:81:0;;;;;;;:::i;:::-;38736:22;;:34:::1;::::0;38763:6;38736:26:::1;:34::i;:::-;38711:22:::0;:59;38777:4:::1;::::0;:33:::1;::::0;-1:-1:-1;;;38777:33:0;;-1:-1:-1;;;;;38777:4:0;;::::1;::::0;:9:::1;::::0;:33:::1;::::0;38787:10:::1;::::0;38799:6;;38777:33:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;37616:350:::0;32136:16;;-1:-1:-1;;;;;32136:16:0;32122:10;:30;;:58;;-1:-1:-1;32169:10:0;32156:24;;;;:12;:24;;;;;;;;32122:58;32114:81;;;;-1:-1:-1;;;32114:81:0;;;;;;;:::i;:::-;37749:1:::1;37736:10;:14;37728:48;;;;-1:-1:-1::0;;;37728:48:0::1;;;;;;;:::i;:::-;37785:14:::0;:24;;;37816:25;:38;;;37861:25;:38;;;37957:3:::1;37936:18;37889:10:::0;37951:2:::1;37936:14;:18::i;:::-;:24;;;;;;37906:27:::0;:54;-1:-1:-1;;;37616:350:0:o;40904:128::-;40974:19;41010:5;:11;;41022:3;41010:16;;;;;;:::i;:::-;;;;;;;;;;;;;;;;41003:23;;;;;;;;;-1:-1:-1;;41003:23:0;;;;;;;;;;;;;;;;;;;;;;;41010:16;;;;41003:23;;;41010:16;41003:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40904:128;;;:::o;38214:102::-;32136:16;;-1:-1:-1;;;;;32136:16:0;32122:10;:30;;:58;;-1:-1:-1;32169:10:0;32156:24;;;;:12;:24;;;;;;;;32122:58;32114:81;;;;-1:-1:-1;;;32114:81:0;;;;;;;:::i;:::-;38290:13;:20;38214:102::o;46011:171::-;46133:25;;46084:12;;46113:17;:4;31876;46113:8;:17::i;46226:123::-;46288:26;;:::i;:::-;46324:19;;;46331:12;46324:19;;;;;;;;;;;;;;;;;;;;46331:12;;46324:19;;;;46331:12;;-1:-1:-1;;46324:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46226:123;:::o;35128:165::-;32254:16;;-1:-1:-1;;;;;32254:16:0;32274:10;32254:30;32246:59;;;;-1:-1:-1;;;32246:59:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35208:19:0;::::1;;::::0;;;:12;:19:::1;::::0;;;;;::::1;;35207:20;35199:55;;;;-1:-1:-1::0;;;35199:55:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35261:19:0::1;;::::0;;;:12;:19:::1;::::0;;;;:26;;-1:-1:-1;;35261:26:0::1;35283:4;35261:26;::::0;;35128:165::o;35299:::-;32254:16;;-1:-1:-1;;;;;32254:16:0;32274:10;32254:30;32246:59;;;;-1:-1:-1;;;32246:59:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35378:19:0;::::1;;::::0;;;:12;:19:::1;::::0;;;;;::::1;;35370:54;;;;-1:-1:-1::0;;;35370:54:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35431:19:0::1;35453:5;35431:19:::0;;;:12;:19:::1;::::0;;;;:27;;-1:-1:-1;;35431:27:0::1;::::0;;35299:165::o;32029:19::-;;;-1:-1:-1;;;;;32029:19:0;;:::o;37414:196::-;32136:16;;-1:-1:-1;;;;;32136:16:0;32122:10;:30;;:58;;-1:-1:-1;32169:10:0;32156:24;;;;:12;:24;;;;;;;;32122:58;32114:81;;;;-1:-1:-1;;;32114:81:0;;;;;;;:::i;:::-;37508:16:::1;:14;:16::i;:::-;37533:25:::0;:32;37572:25;:32;37414:196::o;40233:629::-;9345:1;9951:7;;:19;;9943:63;;;;-1:-1:-1;;;9943:63:0;;;;;;;:::i;:::-;9345:1;10084:7;:18;;;40364:13;10084:7;40378:18:::1;40385:10;40378:6;:18::i;:::-;40364:33;;;;;;;;;;;40337:60;;40410:12;40429:20:::0;40456:12:::1;40475:20:::0;40547:50:::1;40566:5;40573:9;40584:4;40590:6;40547:18;:50::i;:::-;40504:93:::0;;-1:-1:-1;40504:93:0;-1:-1:-1;40504:93:0;;-1:-1:-1;40504:93:0;-1:-1:-1;40609:8:0;;40606:86:::1;;40652:22;::::0;::::1;::::0;:32:::1;::::0;40679:4;40652:26:::1;:32::i;:::-;40627:22;::::0;::::1;:57:::0;40606:86:::1;40701:8:::0;;40698:86:::1;;40744:22;::::0;::::1;::::0;:32:::1;::::0;40771:4;40744:26:::1;:32::i;:::-;40719:22;::::0;::::1;:57:::0;40698:86:::1;40805:10;::::0;::::1;::::0;40792:64:::1;::::0;-1:-1:-1;;;;;40805:10:0::1;40817:4:::0;40823:12;40837:4;40843:12;40792::::1;:64::i;31887:25::-:0;;;;:::o;37972:236::-;32136:16;;-1:-1:-1;;;;;32136:16:0;32122:10;:30;;:58;;-1:-1:-1;32169:10:0;32156:24;;;;:12;:24;;;;;;;;32122:58;32114:81;;;;-1:-1:-1;;;32114:81:0;;;;;;;:::i;:::-;38044:6:::1;:34;;;;-1:-1:-1::0;38054:19:0;;:24;38044:34:::1;38041:162;;;38110:1;38088:19:::0;:23;38041:162:::1;;;38129:6;38128:7;:34;;;;-1:-1:-1::0;38139:19:0;;:23;;38128:34:::1;38125:78;;;38194:1;38172:19:::0;:23;37972:236;:::o;36882:526::-;32136:16;;-1:-1:-1;;;;;32136:16:0;32122:10;:30;;:58;;-1:-1:-1;32169:10:0;32156:24;;;;:12;:24;;;;;;;;32122:58;32114:81;;;;-1:-1:-1;;;32114:81:0;;;;;;;:::i;:::-;37087:16:::1;:14;:16::i;:::-;37130:5;:21:::0;;37158::::1;::::0;::::1;::::0;;;37116:11:::1;37158:21:::0;;;37130;;:5;:21;;37221:19;::::1;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;37249:20:::0;;37221:19;;-1:-1:-1;37264:5:0;;37221:19;;-1:-1:-1;;37249:20:0::1;::::0;37264:5;37249:20;;::::1;;;;;;;;::::0;;-1:-1:-1;37276:12:0::1;::::0;::::1;:23:::0;;;;37306:14:::1;::::0;::::1;:23:::0;;;;37336:24:::1;::::0;::::1;:43:::0;;;;37386:10:::1;::::0;;::::1;:16:::0;-1:-1:-1;36882:526:0:o;46355:391::-;46468:24;46495:17;;;:13;:17;;;;;:5;46547:21;46432:26;;46495:17;46530:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;46521:48;;46582:17;46578:141;46617:5;:21;46605:33;;46578:141;;;46681:19;:30;;;;;;;;;;;;46661:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;;:6;;46701:9;;46661:17;;;;;;;;;;;;;;;:50;46640:11;;46578:141;;;;46727:13;46355:391;;;:::o;38434:188::-;32136:16;;-1:-1:-1;;;;;32136:16:0;32122:10;:30;;:58;;-1:-1:-1;32169:10:0;32156:24;;;;:12;:24;;;;;;;;32122:58;32114:81;;;;-1:-1:-1;;;32114:81:0;;;;;;;:::i;:::-;38542:22;;:34:::1;::::0;38569:6;38542:26:::1;:34::i;:::-;38517:22:::0;:59;38583:4:::1;::::0;:33:::1;::::0;-1:-1:-1;;;38583:33:0;;-1:-1:-1;;;;;38583:4:0;;::::1;::::0;:9:::1;::::0;:33:::1;::::0;38593:10:::1;::::0;38605:6;;38583:33:::1;;;:::i;38322:106::-:0;32136:16;;-1:-1:-1;;;;;32136:16:0;32122:10;:30;;:58;;-1:-1:-1;32169:10:0;32156:24;;;;:12;:24;;;;;;;;32122:58;32114:81;;;;-1:-1:-1;;;32114:81:0;;;;;;;:::i;:::-;38397:16;:25;38322:106::o;30470:150::-;30548:22;;30545:70;;30585:22;;;;;;-1:-1:-1;30585:22:0;30470:150::o;18894:220::-;18952:7;18976:6;18972:20;;-1:-1:-1;18991:1:0;18984:8;;18972:20;19015:5;;;19019:1;19015;:5;:1;19039:5;;;;;:10;19031:56;;;;-1:-1:-1;;;19031:56:0;;;;;;;:::i;:::-;19105:1;-1:-1:-1;18894:220:0;;;;;:::o;18477:158::-;18535:7;18568:1;18563;:6;;18555:49;;;;-1:-1:-1;;;18555:49:0;;;;;;;:::i;:::-;-1:-1:-1;18622:5:0;;;18477:158::o;18015:179::-;18073:7;18105:5;;;18129:6;;;;18121:46;;;;-1:-1:-1;;;18121:46:0;;;;;;;:::i;46792:1464::-;46918:1;46905:10;:14;46897:41;;;;-1:-1:-1;;;46897:41:0;;;;;;;:::i;:::-;46975:4;;-1:-1:-1;;;;;46975:4:0;46953:10;:27;46945:58;;;;-1:-1:-1;;;46945:58:0;;;;;;;:::i;:::-;47012:24;47039:13;47012:24;47053:12;47060:4;47053:6;:12::i;:::-;47039:27;;;;;;;;;;;47012:54;;47073:29;47096:5;47073:22;:29::i;:::-;47177:26;;;;47157:10;;47177:39;-1:-1:-1;47174:102:0;;;-1:-1:-1;47242:26:0;;;;47174:102;47313:26;;;;:45;;47344:13;47313:30;:45::i;:::-;47284:26;;;:74;47390:22;;:41;;47417:13;47390:26;:41::i;:::-;47365:22;:66;47451:29;:10;47466:13;47451:14;:29::i;:::-;47438:42;-1:-1:-1;47513:15:0;47510:42;;47538:7;;;;47510:42;47603:14;;;:22;47583:10;;47603:35;-1:-1:-1;47600:93:0;;;-1:-1:-1;47663:14:0;;;:22;47600:93;47760:14;;;:22;47735:21;;;;47701:14;;47760:22;47718:39;;:12;;:16;:39::i;:::-;:64;;;;;47814:14;;;:22;47718:64;;;;-1:-1:-1;47814:40:0;;47841:12;47814:26;:40::i;:::-;47789:14;;;:65;47885:21;;;;:33;;47911:6;47885:25;:33::i;:::-;47861:21;;;:57;47950:22;;:40;;47977:12;47950:26;:40::i;:::-;47925:22;:65;48020:20;;:38;;48045:12;48020:24;:38::i;:::-;47997:20;:61;48078:28;:10;48093:12;48078:14;:28::i;:::-;48065:41;-1:-1:-1;48118:10:0;;48115:58;;48138:4;;:27;;-1:-1:-1;;;48138:27:0;;-1:-1:-1;;;;;48138:4:0;;;;:9;;:27;;48148:4;;48154:6;;48138:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48115:58;48188:14;;48185:66;;48212:4;;:31;;-1:-1:-1;;;48212:31:0;;-1:-1:-1;;;;;48212:4:0;;;;:9;;:31;;48222:4;;48228:10;;48212:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48185:66;46792:1464;;;;;;;:::o;48264:1016::-;48382:1;48369:10;:14;48361:41;;;;-1:-1:-1;;;48361:41:0;;;;;;;:::i;:::-;48439:4;;-1:-1:-1;;;;;48439:4:0;48417:10;:27;48409:58;;;;-1:-1:-1;;;48409:58:0;;;;;;;:::i;:::-;48476:18;48497:26;48512:10;48497:14;:26::i;:::-;48552:20;;48476:47;;-1:-1:-1;48538:34:0;;;48530:70;;;;-1:-1:-1;;;48530:70:0;;;;;;;:::i;:::-;48629:27;;48615:41;;;48607:78;;;;-1:-1:-1;;;48607:78:0;;;;;;;:::i;:::-;48694:24;48721:13;48694:24;48735:12;48742:4;48735:6;:12::i;:::-;48721:27;;;;;;;;;;;48694:54;;48755:29;48778:5;48755:22;:29::i;:::-;48823:20;;:14;48800:20;;;:43;48797:107;;;48876:20;;:14;48853:20;;:43;48797:107;48935:14;;;:22;:38;;48962:10;48935:26;:38::i;:::-;48910:14;;;:63;49004:21;;;;:37;;49030:10;49004:25;:37::i;:::-;48980:21;;;:61;49075:22;;:38;;49102:10;49075:26;:38::i;:::-;49050:22;:63;49143:20;;:36;;49168:10;49143:24;:36::i;:::-;49120:20;:59;49188:4;;:31;;-1:-1:-1;;;49188:31:0;;-1:-1:-1;;;;;49188:4:0;;;;:9;;:31;;49198:4;;49204:10;;49188:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49245:4;-1:-1:-1;;;;;49231:43:0;;49251:10;49263;49231:43;;;;;;;:::i;:::-;;;;;;;;48264:1016;;;;:::o;49288:2495::-;49534:1;49525:6;:10;49517:32;;;;-1:-1:-1;;;49517:32:0;;;;;;;:::i;:::-;49576:5;:21;49564:33;;49556:63;;;;-1:-1:-1;;;49556:63:0;;;;;;;:::i;:::-;49626:32;49661:5;:14;;49676:9;49661:25;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49696:12:0;;;;;:34;;;;;;;;49693:285;;;49770:4;;-1:-1:-1;;;;;49770:4:0;49748:10;:27;49740:58;;;;-1:-1:-1;;;49740:58:0;;;;;;;:::i;:::-;49693:285;;;49830:18;49814:12;;;;;:34;;;;;;;;49811:167;;;49888:4;;-1:-1:-1;;;;;49888:4:0;49866:10;:27;49858:58;;;;-1:-1:-1;;;49858:58:0;;;;;;;:::i;49811:167::-;49939:31;;-1:-1:-1;;;49939:31:0;;;;;;;:::i;49811:167::-;49986:16;:14;:16::i;:::-;50028:24;50055:13;50028:24;50069:12;50076:4;50069:6;:12::i;:::-;50055:27;;;;;;;;;;;-1:-1:-1;50055:27:0;50111:11;;;;50055:27;;-1:-1:-1;50134:10:0;;:29;;;;;50159:4;-1:-1:-1;;;;;50148:15:0;:7;-1:-1:-1;;;;;50148:15:0;;;50134:29;:56;;;;-1:-1:-1;;;;;;50167:23:0;;;;50134:56;50131:134;;;50214:15;50221:7;50214:6;:15::i;:::-;50200:11;;;:29;;;;-1:-1:-1;50131:134:0;50276:12;;;;50273:47;;-1:-1:-1;50311:1:0;50273:47;50331:10;;50328:230;;50351:26;50380:20;;;:13;:20;;;;;;;50409:28;;;:30;;;;;;;;50459:90;;50380:20;;50409:30;-1:-1:-1;;;;;50459:90:0;;;;;;;;;;;;50514:6;;50522:9;;50533:15;;50459:90;:::i;:::-;;;;;;;;50328:230;;50615:10;;;;50566:26;50595:31;;;;;;;;;;;50660:26;:12;:24;:26::i;:::-;50712:12;;50695:14;;;:29;;50635:51;;-1:-1:-1;50712:12:0;;;;;-1:-1:-1;;50695:29:0;50712:12;;50695:29;;;;;;;;;;;;-1:-1:-1;50753:10:0;;;;50731:19;;;:32;50787:12;;;;;50770:14;;;:29;;;50863:10;;50826:49;;50846:28;;:16;:28::i;:::-;50826:15;;:19;:49::i;:::-;50806:17;;;;:69;;;;50882:15;;;:23;;;50912:16;;;:25;;;:16;50966:17;;;50944:19;;;:39;51012:17;;;50990:19;;;:39;51038;:12;51063:7;50806:4;51038:24;:39::i;:::-;51132:13;;;;:25;;51150:6;51132:17;:25::i;:::-;51116:13;;;:41;51183:18;51167:12;;;;;:34;;;;;;;;51164:614;;;51236:22;;;;:34;;51263:6;51236:26;:34::i;:::-;51211:22;;;:59;51301:19;;:31;;51325:6;51301:23;:31::i;:::-;51279:19;:53;51402:14;;;;51365:63;;31876:4;;51391:26;;:6;;:10;:26::i;:::-;:36;;;;;51365:21;;;51391:36;;51365:25;:63::i;:::-;51341:21;:87;51164:614;;;51461:18;51445:12;;;;;:34;;;;;;;;51442:336;;;51514:22;;;;:34;;51541:6;51514:26;:34::i;:::-;51489:22;;;:59;51579:19;;:31;;51603:6;51579:23;:31::i;:::-;51557:19;:53;51642:20;;:32;;51667:6;51642:24;:32::i;:::-;51619:20;:55;51744:14;;;;51707:63;;31876:4;;51733:26;;:6;;:10;:26::i;:::-;:36;;;;;51707:21;;;51733:36;;51707:25;:63::i;:::-;51683:21;:87;51442:336;49288:2495;;;;;;;;;:::o;27369:262::-;27508:22;27561:1;27548:5;:10;;;:14;27540:41;;;;-1:-1:-1;;;27540:41:0;;;;;;;:::i;:::-;27613:11;;27597:28;;:6;;27613:11;27597:28;;;;;;;;;;;;;;;;27590:35;;27369:262;;;;:::o;26828:217::-;26976:9;;26955:8;;26973:47;;-1:-1:-1;27007:5:0;27000:12;;26973:47;-1:-1:-1;27035:4:0;26828:217;;;;:::o;27051:282::-;27226:9;;27172:26;;27250:11;27242:36;;;;-1:-1:-1;;;27242:36:0;;;;;;;:::i;:::-;27294:6;:15;;27318:7;27294:33;;;;;;;;;;;;;;;;;;27287:40;;;27051:282;;;;:::o;60675:280::-;60743:21;;60724:15;:40;60721:67;;;60774:7;;60721:67;60800:9;60796:106;60819:5;:21;60815:25;;60796:106;;;60855:39;60876:5;:14;;60891:1;60876:17;;;;;;;;;;;;;;;;;;60855:20;:39::i;:::-;60842:3;;60796:106;;;-1:-1:-1;60934:15:0;60910:21;:39;60675:280;:::o;60961:546::-;61101:20;61123;61157:32;61192:5;:14;;61207:9;61192:25;;;;;;;;;;;;;;;;;;61157:60;;61227:24;61253;61281:27;61300:7;61281:18;:27::i;:::-;61226:82;;-1:-1:-1;61226:82:0;-1:-1:-1;31876:4:0;61330:43;61341:31;61226:82;61362:9;61341:20;:31::i;:::-;61330:6;;:10;:43::i;:::-;:53;;;;;;;-1:-1:-1;31876:4:0;61405:43;61416:31;:16;61437:9;61416:20;:31::i;61405:43::-;:53;;;;;;61390:68;;61467:34;;;60961:546;;;;;;;:::o;54418:428::-;54544:14;;;:22;54511:20;;54541:56;;-1:-1:-1;54588:1:0;54581:8;;54541:56;54609:13;54625:22;:20;:22::i;:::-;54609:38;;54681:5;54657;:14;;:20;;;:29;54654:58;;54703:1;54696:8;;;;;54654:58;54776:20;;;;31876:4;;54739:59;;54766:31;;:5;;:9;:31::i;:::-;54739:14;;;:22;;:26;:59::i;:::-;:69;;;;;;;54418:428;-1:-1:-1;;;54418:428:0:o;59201:645::-;59302:12;59325:7;:13;;;59342:1;59325:18;59322:47;;;-1:-1:-1;59360:1:0;59353:8;;59322:47;59381:9;59393:33;59411:7;:14;;;59393:7;:13;;;:17;;:33;;;;:::i;:::-;59381:45;-1:-1:-1;59452:18:0;59436:12;;;;;:34;;;;;;;;59433:338;;;59483:21;;59480:59;;59528:1;59521:8;;;;;59480:59;59589:21;;59560:25;;59554:32;;:1;;:5;:32::i;:::-;:56;;;;;;59547:63;;59433:338;;;59636:21;;59633:59;;59681:1;59674:8;;;;;59633:59;59742:21;;59713:25;;59707:32;;:1;;:5;:32::i;:::-;:56;;;;;;59700:63;;59433:338;59802:13;;;;59786;:4;59795:3;59786:8;:13::i;53658:372::-;-1:-1:-1;;;;;53730:24:0;;53705:11;53730:24;;;:18;:24;;;;;;53764:8;;53761:39;;53782:10;;53761:39;-1:-1:-1;53812:17:0;:19;;;;;;;;;;:17;53897:18;;;:13;:18;;;;;;;;53922:10;;;:17;;-1:-1:-1;;;;;53922:17:0;;-1:-1:-1;;;;;;53922:17:0;;;;;;;;53812:5;53946:8;;;;:14;;;53977:24;;;:18;:24;;;:30;;;53658:372;;;:::o;51789:1855::-;51920:12;51947:20;51982:12;52009:20;52039:16;:14;:16::i;:::-;52068:4;52064:43;;52098:1;52082:17;;52064:43;52118:11;52115:43;;52149:1;52139:11;;;;52115:43;52171:17;52190:22;52214:8;52226:39;52244:5;52251:13;52226:17;:39::i;:::-;52170:95;;;;;;52278:1305;52284:3;:17;;;;;52300:1;52291:6;:10;52284:17;:58;;;;;52307:4;52306:5;:35;;;;52328:13;52315:9;:26;52306:35;52278:1305;;;52462:14;;;;52447:5;:30;;-1:-1:-1;;52352:8:0;;;;52394:9;;;;52369:22;;52447:5;:30;;;;;;;;;;;;;;;;52412:65;;52489:21;52512;52537:25;52557:4;52537:19;:25::i;:::-;52488:74;;-1:-1:-1;52488:74:0;-1:-1:-1;52586:31:0;:12;52488:74;52586:16;:31::i;:::-;52571:46;-1:-1:-1;52641:31:0;:12;52658:13;52641:16;:31::i;:::-;52626:46;;52683:53;52694:5;52701:4;52707:13;52722;52683:10;:53::i;:::-;52769:4;:12;;;52751:15;:30;:47;;;;;52797:1;52785:4;:9;;;:13;52751:47;52750:76;;;-1:-1:-1;52804:9:0;;;;:13;:21;;;;;52821:4;52804:21;52747:829;;;52872:11;;;;52854:13;;;;:30;;:17;:30::i;:::-;52838:13;;;:46;52911:18;52898:9;;;;;;:31;;;;;;;;;52895:357;;;52959:11;;;;52950:21;;:4;;:8;:21::i;:::-;52943:28;;53008:68;31876:4;53034:31;53050:7;:14;;;53034:4;:11;;;:15;;:31;;;;:::i;:::-;:41;;;;;53008:21;;;53034:41;;53008:25;:68::i;:::-;52984:21;:92;52895:357;;;53123:11;;;;53114:21;;:4;;:8;:21::i;:::-;53107:28;;53172:68;31876:4;53198:31;53214:7;:14;;;53198:4;:11;;;:15;;:31;;;;:::i;:::-;:41;;;;;53172:21;;;53198:41;;53172:25;:68::i;:::-;53148:21;:92;52895:357;53262:56;53287:5;:19;;:30;53307:9;53287:30;;;;;;;;;;;53262:5;:12;;:24;;:56;;;;:::i;:::-;53354:35;53372:5;53379:9;53354:17;:35::i;:::-;53329:60;;-1:-1:-1;53329:60:0;-1:-1:-1;53329:60:0;-1:-1:-1;52747:829:0;;;53433:17;;;;53416:14;;;;:34;;;;53478:17;;;53461:14;;;:34;53531:35;53543:5;53550:9;53561:4;53531:11;:35::i;:::-;53506:60;;-1:-1:-1;53506:60:0;-1:-1:-1;53506:60:0;-1:-1:-1;52747:829:0;52278:1305;;;;;;;53591:47;;;51789:1855;;;;;;;;;:::o;57780:1370::-;58030:19;;58022:27;;;58014:61;;;;-1:-1:-1;;;58014:61:0;;;;;;;:::i;:::-;58098:20;;58090:28;;;58082:68;;;;-1:-1:-1;;;58082:68:0;;;;;;;:::i;:::-;58177:19;;58169:27;;;58161:61;;;;-1:-1:-1;;;58161:61:0;;;;;;;:::i;:::-;58238:8;;58235:142;;58278:19;;:29;;58302:4;58278:23;:29::i;:::-;58256:19;:51;58339:20;;:30;;58364:4;58339:24;:30::i;:::-;58316:20;:53;58235:142;58388:8;;58385:80;;58428:19;;:29;;58452:4;58428:23;:29::i;:::-;58406:19;:51;58385:80;58480:16;;58477:232;;58514:22;;:38;-1:-1:-1;58514:38:0;58506:83;;;;-1:-1:-1;;;58506:83:0;;;;;;;:::i;:::-;58623:22;;:40;;58650:12;58623:26;:40::i;:::-;58598:22;:65;58679:22;:4;58688:12;58679:8;:22::i;:::-;58672:29;;58477:232;58720:16;;58717:304;;58754:22;;:38;-1:-1:-1;58754:38:0;58746:83;;;;-1:-1:-1;;;58746:83:0;;;;;;;:::i;:::-;58863:22;;:40;;58890:12;58863:26;:40::i;:::-;58838:22;:65;58919:22;:4;58928:12;58919:8;:22::i;:::-;58974:21;;58912:29;;-1:-1:-1;58974:39:0;;59000:12;58974:25;:39::i;:::-;58950:21;:63;58717:304;59032:8;;59029:54;;59050:4;;:25;;-1:-1:-1;;;59050:25:0;;-1:-1:-1;;;;;59050:4:0;;;;:9;;:25;;59060:4;;59066;;59050:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59029:54;59094:8;;59091:54;;59112:4;;:25;;-1:-1:-1;;;59112:25:0;;-1:-1:-1;;;;;59112:4:0;;;;:9;;:25;;59122:4;;59128;;59112:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55117:347;55195:24;:22;:24::i;:::-;55226:20;55249:27;55270:5;55249:20;:27::i;:::-;55226:50;-1:-1:-1;55286:17:0;55283:44;;55313:7;;;55283:44;55358:20;;:14;55335:20;;:43;55414:26;;;;:44;;55445:12;55414:30;:44::i;:::-;55385:26;;;:73;-1:-1:-1;55117:347:0;:::o;30628:520::-;30744:21;;;;30705:22;;30741:348;;30783:22;;30780:74;;30822:22;;;;;;:15;:22;;;30780:74;30888:22;;30919;;;;;;30870:15;30919:22;;;30888:6;;:22;;30959:24;;;;;;;;;;;;;;;;;;30992:13;;;31014:9;;;:13;;;;31036:7;;;:17;;;;30959:24;-1:-1:-1;31070:11:0;;30741:348;31104:38;31117:6;31125;:16;;31104:12;:38::i;30005:421::-;30187:9;;;;;30175;;;:21;-1:-1:-1;30203:13:0;;30228:10;;;;30225:177;;30267:7;;;;30253:21;;;30283:9;;;:19;30225:177;;;30359:4;:7;;;30325:6;:15;;30341:5;:9;;;30325:26;;;;;;;;;;;;;;;;;;;;;:41;30387:7;;;;30375:9;;;:19;30225:177;-1:-1:-1;30408:10:0;;:12;;;;;;-1:-1:-1;30005:421:0:o;60509:160::-;60636:27;60655:7;60636:18;:27::i;:::-;60615:17;;;60595:68;60596:17;;;;60595:68;60509:160::o;59852:651::-;59951:17;59983;60010:15;60028:42;60048:5;:21;;;60028:15;:19;;:42;;;;:::i;:::-;60010:60;-1:-1:-1;60080:12:0;60077:78;;-1:-1:-1;;;60110:17:0;;;;60129;;;;60102:45;;60077:78;60175:79;60197:56;31876:4;60219:7;:24;;;60245:7;60197:12;:56::i;:::-;60175:17;;;;;:21;:79::i;:::-;60163:91;;60273:188;60295:165;31876:4;60369:29;60390:7;60369:20;:29::i;:::-;60452:7;60295:12;:165::i;:::-;60273:17;;;;;:21;:188::i;:::-;60261:200;;60468:29;59852:651;;;;:::o;54036:376::-;54150:25;;54105:13;;54131:15;:44;54128:92;;;-1:-1:-1;54192:20:0;;54185:27;;54128:92;54266:25;;54228:15;;54246:46;;:15;;:19;:46::i;:::-;54228:64;;54309:76;54334:50;31876:4;54356:5;:14;;:18;;;54376:7;54334:12;:50::i;:::-;54309:20;;;:24;:76::i;:::-;54301:84;;54394:12;54036:376;:::o;55670:515::-;55779:20;55801:22;55825:8;55847:279;55865:5;:21;55853:33;;55847:279;;;55896:24;55923:30;;;;;;;;;;55965:10;;;;55962:70;;-1:-1:-1;55992:11:0;;;;;56014:8;;55962:70;56047:32;:12;56073:5;56047:25;:32::i;:::-;56096:9;;-1:-1:-1;56040:39:0;-1:-1:-1;56113:4:0;;-1:-1:-1;56088:30:0;;-1:-1:-1;56088:30:0;55847:279;56142:1;56145:26;:12;:24;:26::i;:::-;56173:5;56134:45;;;;;;55670:515;;;;;;:::o;61513:234::-;61603:20;61625;61660:81;61681:4;:14;;;61697:4;:11;;;61710:4;:14;;;61726:4;:14;;;61660:20;:81::i;:::-;61653:88;;;;61513:234;;;:::o;56654:1120::-;56791:9;;;;56788:41;;56815:7;;56788:41;56857:10;;;;56877;56874:37;;56897:7;;;56874:37;56917:26;56946:20;;;:13;:20;;;;;57003:16;;56976:24;;;;:43;56973:70;;;57029:7;;;;56973:70;57090:13;;57055:15;;31876:4;;57073:31;;:12;;:16;:31::i;:::-;:41;;;;;;;-1:-1:-1;57121:15:0;;57168:12;;57165:113;;-1:-1:-1;57237:20:0;;;;57201:4;;57237:33;;57262:7;57237:24;:33::i;:::-;57214:20;;;:56;57165:113;57289:19;;:23;57286:222;;57349:13;;31876:4;;57332:31;;:12;;:16;:31::i;:::-;:41;;;;;;;-1:-1:-1;57385:12:0;;57382:119;;-1:-1:-1;57458:20:0;;;;57420:4;;57458:33;;57483:7;57458:24;:33::i;:::-;57435:20;;;:56;57382:119;57520:8;57516:36;;57538:7;;;;;;;57516:36;57564:21;;;:23;;;;;;;;;;57622:10;;;;57608:12;;;;57675:14;;;;57599:108;;-1:-1:-1;;;;;57622:10:0;;;;57608:12;;;;57599:108;;;;57657:7;;57666;;57691:15;;57599:108;:::i;:::-;;;;;;;;57729:12;;;;57716:50;;-1:-1:-1;;;;;57729:12:0;;57746:7;57729:12;57758:7;57716:12;:50::i;56654:1120::-;;;;;:::o;28556:208::-;28678:22;28703:27;28716:6;28724:5;28703:12;:27::i;:::-;28678:52;;28737:21;28745:6;28753:4;28737:7;:21::i;56191:457::-;56424:5;:21;56366:7;;;;;;56411:34;;56408:78;;-1:-1:-1;56463:1:0;;-1:-1:-1;56466:4:0;;-1:-1:-1;56463:1:0;56455:23;;56408:78;56497:26;:12;56518:4;56497:20;:26::i;:::-;56494:96;;;56541:9;56552:23;:12;56570:4;56552:17;:23::i;:::-;56577:4;56533:49;;;;;;;;56494:96;56605:37;56623:5;56630:9;56640:1;56630:11;56605:17;:37::i;:::-;56598:44;;;;;;56191:457;;;;;;;;:::o;54852:259::-;54906:13;54934:22;:20;:22::i;:::-;54975:20;;54926:30;;-1:-1:-1;54966:29:0;;54963:56;;55005:7;;;54963:56;55027:20;:28;55090:15;55062:25;:43;54852:259::o;29489:510::-;29618:22;29671:1;29658:5;:10;;;:14;29650:41;;;;-1:-1:-1;;;29650:41:0;;;;;;;:::i;:::-;29718:11;;29750:24;;:6;;29718:11;;29750:24;;;;;;;;;;;;;;;;;;;:29;29736:43;;;29789:15;29786:109;;29830:11;;29814:28;;29850:1;;29814:6;;:28;;;;;;;;;;;;;;;;:33;;:37;;;;29786:109;;;29886:1;29874:9;;;:13;29786:109;29901:10;;;:12;;-1:-1:-1;;29901:12:0;;;29929:24;;:6;;29945:7;;29929:24;;;;;;;;;;;;;;;;;;29960:13;;;29929:24;-1:-1:-1;;29489:510:0;;;;:::o;55470:194::-;55634:10;;55572:7;;31876:4;;55628:3;55600:25;55621:3;55600:16;:6;55611:4;55600:10;:16::i;:::-;:20;;:25::i;:::-;:31;;;;;;:44;;;;;;:54;;;;;;;55470:194;-1:-1:-1;;;;55470:194:0:o;26674:148::-;26761:22;26798:6;:15;;26814:1;26798:18;;;;;;;;;;;;;;;;;;26791:25;;26674:148;;;:::o;31154:165::-;31270:43;31282:6;31290;:16;;31308:4;31270:11;:43::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:162:1;81:20;;137:13;;130:21;120:32;;110:2;;166:1;163;156:12;181:377;;;298:3;291:4;283:6;279:17;275:27;265:2;;323:8;313;306:26;265:2;-1:-1:-1;353:20:1;;396:18;385:30;;382:2;;;435:8;425;418:26;382:2;479:4;471:6;467:17;455:29;;531:3;524:4;515:6;507;503:19;499:30;496:39;493:2;;;548:1;545;538:12;563:695;;661:3;654:4;646:6;642:17;638:27;628:2;;683:5;676;669:20;628:2;723:6;710:20;749:18;786:2;782;779:10;776:2;;;792:9;776:2;832;826:9;901:2;882:13;;-1:-1:-1;;878:27:1;866:40;;908:4;862:51;928:18;;;948:22;;;925:46;922:2;;;974:9;922:2;1001;994:22;1025:18;;;1062:15;;;1079:4;1058:26;1055:35;-1:-1:-1;1052:2:1;;;1107:5;1100;1093:20;1052:2;1175;1168:4;1160:6;1156:17;1149:4;1141:6;1137:17;1124:54;1198:15;;;1215:4;1194:26;1187:41;;;;1202:6;618:640;-1:-1:-1;;;618:640:1:o;1263:259::-;;1375:2;1363:9;1354:7;1350:23;1346:32;1343:2;;;1396:6;1388;1381:22;1343:2;1440:9;1427:23;1459:33;1486:5;1459:33;:::i;1527:1245::-;;;;;;;;;1762:3;1750:9;1741:7;1737:23;1733:33;1730:2;;;1784:6;1776;1769:22;1730:2;1828:9;1815:23;1847:33;1874:5;1847:33;:::i;:::-;1899:5;-1:-1:-1;1956:2:1;1941:18;;1928:32;1969:35;1928:32;1969:35;:::i;:::-;2023:7;-1:-1:-1;2082:2:1;2067:18;;2054:32;2095:35;2054:32;2095:35;:::i;:::-;2149:7;-1:-1:-1;2203:2:1;2188:18;;2175:32;;-1:-1:-1;2258:3:1;2243:19;;2230:33;2282:18;2312:14;;;2309:2;;;2344:6;2336;2329:22;2309:2;2388:60;2440:7;2431:6;2420:9;2416:22;2388:60;:::i;:::-;2467:8;;-1:-1:-1;2362:86:1;-1:-1:-1;2555:3:1;2540:19;;2527:33;;-1:-1:-1;2572:16:1;;;2569:2;;;2606:6;2598;2591:22;2569:2;;2650:62;2704:7;2693:8;2682:9;2678:24;2650:62;:::i;:::-;1720:1052;;;;-1:-1:-1;1720:1052:1;;-1:-1:-1;1720:1052:1;;;;;;2731:8;-1:-1:-1;;;1720:1052:1:o;2777:192::-;;2886:2;2874:9;2865:7;2861:23;2857:32;2854:2;;;2907:6;2899;2892:22;2854:2;2935:28;2953:9;2935:28;:::i;:::-;2925:38;2844:125;-1:-1:-1;;;2844:125:1:o;2974:498::-;;;;;3154:3;3142:9;3133:7;3129:23;3125:33;3122:2;;;3176:6;3168;3161:22;3122:2;3220:9;3207:23;3259:1;3252:5;3249:12;3239:2;;3280:6;3272;3265:22;3239:2;3308:5;3360:2;3345:18;;3332:32;;-1:-1:-1;3411:2:1;3396:18;;3383:32;;3462:2;3447:18;3434:32;;-1:-1:-1;3112:360:1;-1:-1:-1;;;3112:360:1:o;3477:344::-;;3599:2;3587:9;3578:7;3574:23;3570:32;3567:2;;;3620:6;3612;3605:22;3567:2;3665:9;3652:23;3698:18;3690:6;3687:30;3684:2;;;3735:6;3727;3720:22;3684:2;3763:52;3807:7;3798:6;3787:9;3783:22;3763:52;:::i;:::-;3753:62;3557:264;-1:-1:-1;;;;3557:264:1:o;3826:577::-;;;3975:2;3963:9;3954:7;3950:23;3946:32;3943:2;;;3996:6;3988;3981:22;3943:2;4041:9;4028:23;4070:18;4111:2;4103:6;4100:14;4097:2;;;4132:6;4124;4117:22;4097:2;4160:52;4204:7;4195:6;4184:9;4180:22;4160:52;:::i;:::-;4150:62;;4265:2;4254:9;4250:18;4237:32;4221:48;;4294:2;4284:8;4281:16;4278:2;;;4315:6;4307;4300:22;4278:2;;4343:54;4389:7;4378:8;4367:9;4363:24;4343:54;:::i;:::-;4333:64;;;3933:470;;;;;:::o;4408:190::-;;4520:2;4508:9;4499:7;4495:23;4491:32;4488:2;;;4541:6;4533;4526:22;4488:2;-1:-1:-1;4569:23:1;;4478:120;-1:-1:-1;4478:120:1:o;4603:327::-;;;4732:2;4720:9;4711:7;4707:23;4703:32;4700:2;;;4753:6;4745;4738:22;4700:2;4794:9;4781:23;4771:33;;4854:2;4843:9;4839:18;4826:32;4867:33;4894:5;4867:33;:::i;:::-;4919:5;4909:15;;;4690:240;;;;;:::o;4935:328::-;;;;5078:2;5066:9;5057:7;5053:23;5049:32;5046:2;;;5099:6;5091;5084:22;5046:2;5140:9;5127:23;5117:33;;5169:37;5202:2;5191:9;5187:18;5169:37;:::i;:::-;5159:47;;5253:2;5242:9;5238:18;5225:32;5215:42;;5036:227;;;;;:::o;5268:258::-;;;5397:2;5385:9;5376:7;5372:23;5368:32;5365:2;;;5418:6;5410;5403:22;5365:2;-1:-1:-1;;5446:23:1;;;5516:2;5501:18;;;5488:32;;-1:-1:-1;5355:171:1:o;5531:403::-;;;;5685:2;5673:9;5664:7;5660:23;5656:32;5653:2;;;5706:6;5698;5691:22;5653:2;5747:9;5734:23;5724:33;;5804:2;5793:9;5789:18;5776:32;5766:42;;5858:2;5847:9;5843:18;5830:32;5871:33;5898:5;5871:33;:::i;:::-;5923:5;5913:15;;;5643:291;;;;;:::o;5939:326::-;;;;6085:2;6073:9;6064:7;6060:23;6056:32;6053:2;;;6106:6;6098;6091:22;6053:2;-1:-1:-1;;6134:23:1;;;6204:2;6189:18;;6176:32;;-1:-1:-1;6255:2:1;6240:18;;;6227:32;;6043:222;-1:-1:-1;6043:222:1:o;6270:1137::-;;6384:5;6378:12;6411:6;6406:3;6399:19;6437:4;6466:2;6461:3;6457:12;6450:19;;6503:2;6496:5;6492:14;6524:3;6536:846;6550:6;6547:1;6544:13;6536:846;;;6615:6;6609:13;6635:48;6679:3;6674:2;6668:9;6635:48;:::i;:::-;6723:11;;;6717:18;6703:12;;;6696:40;6759:4;6803:11;;;6797:18;6783:12;;;6776:40;6839:4;6883:11;;;6877:18;6863:12;;;6856:40;6919:4;6963:11;;;6957:18;6943:12;;;6936:40;6999:4;7043:11;;;7037:18;7023:12;;;7016:40;7079:4;7123:11;;;7117:18;7103:12;;;7096:40;7159:4;7203:11;;;7197:18;7183:12;;;7176:40;7239:6;7285:11;;;7279:18;7265:12;;;7258:40;7327:6;7318:16;;;;7357:15;;;;6572:1;6565:9;6536:846;;;-1:-1:-1;7398:3:1;;6354:1053;-1:-1:-1;;;;;6354:1053:1:o;7412:481::-;;7519:5;7513:12;7546:6;7541:3;7534:19;7572:4;7601:2;7596:3;7592:12;7585:19;;7638:2;7631:5;7627:14;7659:3;7671:197;7685:6;7682:1;7679:13;7671:197;;;7734:50;7780:3;7771:6;7765:13;7734:50;:::i;:::-;7813:6;7804:16;;;;;7843:15;;;;7707:1;7700:9;7671:197;;7898:138;7986:1;7979:5;7976:12;7966:2;;7992:9;7966:2;8012:18;;7956:80::o;8041:210::-;8120:12;;8108:25;;8182:4;8171:16;;;8165:23;8149:14;;;8142:47;8238:4;8227:16;;;8221:23;8205:14;;8198:47;8098:153::o;8256:633::-;8340:5;8334:12;8329:3;8322:25;8393:4;8386:5;8382:16;8376:23;8408:62;8464:4;8459:3;8455:14;8441:12;8408:62;:::i;:::-;;8519:4;8512:5;8508:16;8502:23;8495:4;8490:3;8486:14;8479:47;8575:4;8568:5;8564:16;8558:23;8551:4;8546:3;8542:14;8535:47;8631:4;8624:5;8620:16;8614:23;8607:4;8602:3;8598:14;8591:47;8687:4;8680:5;8676:16;8670:23;8663:4;8658:3;8654:14;8647:47;8743:4;8736:5;8732:16;8726:23;8719:4;8714:3;8710:14;8703:47;8799:4;8792:5;8788:16;8782:23;8775:4;8770:3;8766:14;8759:47;8825:6;8878:2;8871:5;8867:14;8861:21;8856:2;8851:3;8847:12;8840:43;;8312:577;;:::o;8894:276::-;;9063:6;9057:13;9079:53;9125:6;9120:3;9113:4;9105:6;9101:17;9079:53;:::i;:::-;9148:16;;;;;9033:137;-1:-1:-1;;9033:137:1:o;9175:463::-;-1:-1:-1;;;;;9440:32:1;;;;9422:51;;9504:2;9489:18;;9482:34;9552:2;9547;9532:18;;9525:30;;;9175:463;9571:18;;;9564:32;9628:3;9613:19;;9412:226::o;10103:716::-;10328:2;10380:21;;;10450:13;;10353:18;;;10472:22;;;10103:716;;10328:2;10551:15;;;;10525:2;10510:18;;;10103:716;10597:196;10611:6;10608:1;10605:13;10597:196;;;10660:51;10707:3;10698:6;10692:13;10660:51;:::i;:::-;10768:15;;;;10740:4;10731:14;;;;;10633:1;10626:9;10597:196;;;-1:-1:-1;10810:3:1;;10308:511;-1:-1:-1;;;;;;10308:511:1:o;10824:350::-;;11069:2;11058:9;11051:21;11089:79;11164:2;11153:9;11149:18;11141:6;11089:79;:::i;11179:794::-;;11516:3;11505:9;11498:22;11537:80;11612:3;11601:9;11597:19;11589:6;11537:80;:::i;:::-;11529:88;;11659:6;11653:13;11648:2;11637:9;11633:18;11626:41;11721:2;11713:6;11709:15;11703:22;11698:2;11687:9;11683:18;11676:50;11780:2;11772:6;11768:15;11762:22;11757:2;11746:9;11742:18;11735:50;11840:2;11832:6;11828:15;11822:22;11816:3;11805:9;11801:19;11794:51;11900:3;11892:6;11888:16;11882:23;11876:3;11865:9;11861:19;11854:52;11961:3;11953:6;11949:16;11943:23;11937:3;11926:9;11922:19;11915:52;11488:485;;;;;:::o;11978:329::-;;12209:2;12198:9;12191:21;12229:72;12297:2;12286:9;12282:18;12274:6;12229:72;:::i;12312:1377::-;;12765:3;12754:9;12747:22;12792:73;12860:3;12849:9;12845:19;12837:6;12792:73;:::i;:::-;12884:2;12928:6;12922:13;12917:2;12906:9;12902:18;12895:41;12973:2;12965:6;12961:15;12955:22;12996:2;13034;13029;13018:9;13014:18;13007:30;13091:2;13083:6;13079:15;13073:22;13068:2;13057:9;13053:18;13046:50;13151:2;13143:6;13139:15;13133:22;13127:3;13116:9;13112:19;13105:51;13205:9;13197:6;13193:22;13187:3;13176:9;13172:19;13165:51;13236:6;13225:17;;13271:6;13265:13;13302:6;13294;13287:22;13337:2;13329:6;13325:15;13318:22;;13375:2;13367:6;13363:15;13349:29;;13396:4;13409:254;13423:6;13420:1;13417:13;13409:254;;;13482:13;;13520:9;;13508:22;;13570:11;;13564:18;13550:12;;;13543:40;13638:15;;;;13603:12;;;;13445:1;13438:9;13409:254;;;-1:-1:-1;13680:3:1;;12737:952;-1:-1:-1;;;;;;;;;12737:952:1:o;13694:878::-;;13912:3;13901:9;13897:19;13889:27;;13957:6;13950:14;13943:22;13932:9;13925:41;14038:1;14034;14029:3;14025:11;14021:19;14012:6;14006:13;14002:39;13997:2;13986:9;13982:18;13975:67;14096:2;14088:6;14084:15;14078:22;14073:2;14062:9;14058:18;14051:50;14155:2;14147:6;14143:15;14137:22;14132:2;14121:9;14117:18;14110:50;14215:2;14207:6;14203:15;14197:22;14191:3;14180:9;14176:19;14169:51;14275:3;14267:6;14263:16;14257:23;14251:3;14240:9;14236:19;14229:52;14336:3;14328:6;14324:16;14318:23;14312:3;14301:9;14297:19;14290:52;14397:3;14389:6;14385:16;14379:23;14373:3;14362:9;14358:19;14351:52;14440:3;14432:6;14428:16;14422:23;14464:3;14503:2;14498;14487:9;14483:18;14476:30;14561:2;14553:6;14549:15;14543:22;14537:3;14526:9;14522:19;14515:51;;;13879:693;;;;;:::o;14577:218::-;-1:-1:-1;;;;;14756:32:1;;;;14738:51;;14726:2;14711:18;;14693:102::o;14800:383::-;;14949:2;14938:9;14931:21;14981:6;14975:13;15024:6;15019:2;15008:9;15004:18;14997:34;15040:66;15099:6;15094:2;15083:9;15079:18;15074:2;15066:6;15062:15;15040:66;:::i;:::-;15167:2;15146:15;-1:-1:-1;;15142:29:1;15127:45;;;;15174:2;15123:54;;14921:262;-1:-1:-1;;14921:262:1:o;15188:336::-;15390:2;15372:21;;;15429:2;15409:18;;;15402:30;-1:-1:-1;;;15463:2:1;15448:18;;15441:42;15515:2;15500:18;;15362:162::o;15529:345::-;15731:2;15713:21;;;15770:2;15750:18;;;15743:30;-1:-1:-1;;;15804:2:1;15789:18;;15782:51;15865:2;15850:18;;15703:171::o;15879:339::-;16081:2;16063:21;;;16120:2;16100:18;;;16093:30;-1:-1:-1;;;16154:2:1;16139:18;;16132:45;16209:2;16194:18;;16053:165::o;16223:351::-;16425:2;16407:21;;;16464:2;16444:18;;;16437:30;16503:29;16498:2;16483:18;;16476:57;16565:2;16550:18;;16397:177::o;16579:345::-;16781:2;16763:21;;;16820:2;16800:18;;;16793:30;-1:-1:-1;;;16854:2:1;16839:18;;16832:51;16915:2;16900:18;;16753:171::o;16929:356::-;17131:2;17113:21;;;17150:18;;;17143:30;17209:34;17204:2;17189:18;;17182:62;17276:2;17261:18;;17103:182::o;17290:356::-;17492:2;17474:21;;;17511:18;;;17504:30;17570:34;17565:2;17550:18;;17543:62;17637:2;17622:18;;17464:182::o;17651:345::-;17853:2;17835:21;;;17892:2;17872:18;;;17865:30;-1:-1:-1;;;17926:2:1;17911:18;;17904:51;17987:2;17972:18;;17825:171::o;18001:342::-;18203:2;18185:21;;;18242:2;18222:18;;;18215:30;-1:-1:-1;;;18276:2:1;18261:18;;18254:48;18334:2;18319:18;;18175:168::o;18348:345::-;18550:2;18532:21;;;18589:2;18569:18;;;18562:30;-1:-1:-1;;;18623:2:1;18608:18;;18601:51;18684:2;18669:18;;18522:171::o;18698:351::-;18900:2;18882:21;;;18939:2;18919:18;;;18912:30;18978:29;18973:2;18958:18;;18951:57;19040:2;19025:18;;18872:177::o;19054:340::-;19256:2;19238:21;;;19295:2;19275:18;;;19268:30;-1:-1:-1;;;19329:2:1;19314:18;;19307:46;19385:2;19370:18;;19228:166::o;19399:346::-;19601:2;19583:21;;;19640:2;19620:18;;;19613:30;-1:-1:-1;;;19674:2:1;19659:18;;19652:52;19736:2;19721:18;;19573:172::o;19750:345::-;19952:2;19934:21;;;19991:2;19971:18;;;19964:30;-1:-1:-1;;;20025:2:1;20010:18;;20003:51;20086:2;20071:18;;19924:171::o;20100:340::-;20302:2;20284:21;;;20341:2;20321:18;;;20314:30;-1:-1:-1;;;20375:2:1;20360:18;;20353:46;20431:2;20416:18;;20274:166::o;20445:342::-;20647:2;20629:21;;;20686:2;20666:18;;;20659:30;-1:-1:-1;;;20720:2:1;20705:18;;20698:48;20778:2;20763:18;;20619:168::o;20792:336::-;20994:2;20976:21;;;21033:2;21013:18;;;21006:30;-1:-1:-1;;;21067:2:1;21052:18;;21045:42;21119:2;21104:18;;20966:162::o;21133:334::-;21335:2;21317:21;;;21374:2;21354:18;;;21347:30;-1:-1:-1;;;21408:2:1;21393:18;;21386:40;21458:2;21443:18;;21307:160::o;21472:354::-;21674:2;21656:21;;;21713:2;21693:18;;;21686:30;21752:32;21747:2;21732:18;;21725:60;21817:2;21802:18;;21646:180::o;21831:342::-;22033:2;22015:21;;;22072:2;22052:18;;;22045:30;-1:-1:-1;;;22106:2:1;22091:18;;22084:48;22164:2;22149:18;;22005:168::o;22178:342::-;22380:2;22362:21;;;22419:2;22399:18;;;22392:30;-1:-1:-1;;;22453:2:1;22438:18;;22431:48;22511:2;22496:18;;22352:168::o;22525:332::-;22727:2;22709:21;;;22766:1;22746:18;;;22739:29;-1:-1:-1;;;22799:2:1;22784:18;;22777:39;22848:2;22833:18;;22699:158::o;22862:346::-;23064:2;23046:21;;;23103:2;23083:18;;;23076:30;-1:-1:-1;;;23137:2:1;23122:18;;23115:52;23199:2;23184:18;;23036:172::o;23213:340::-;23415:2;23397:21;;;23454:2;23434:18;;;23427:30;-1:-1:-1;;;23488:2:1;23473:18;;23466:46;23544:2;23529:18;;23387:166::o;23558:397::-;23760:2;23742:21;;;23799:2;23779:18;;;23772:30;23838:34;23833:2;23818:18;;23811:62;-1:-1:-1;;;23904:2:1;23889:18;;23882:31;23945:3;23930:19;;23732:223::o;23960:338::-;24162:2;24144:21;;;24201:2;24181:18;;;24174:30;-1:-1:-1;;;24235:2:1;24220:18;;24213:44;24289:2;24274:18;;24134:164::o;24303:348::-;24505:2;24487:21;;;24544:2;24524:18;;;24517:30;24583:26;24578:2;24563:18;;24556:54;24642:2;24627:18;;24477:174::o;24656:334::-;24858:2;24840:21;;;24897:2;24877:18;;;24870:30;-1:-1:-1;;;24931:2:1;24916:18;;24909:40;24981:2;24966:18;;24830:160::o;24995:341::-;25197:2;25179:21;;;25236:2;25216:18;;;25209:30;-1:-1:-1;;;25270:2:1;25255:18;;25248:47;25327:2;25312:18;;25169:167::o;25341:336::-;25543:2;25525:21;;;25582:2;25562:18;;;25555:30;-1:-1:-1;;;25616:2:1;25601:18;;25594:42;25668:2;25653:18;;25515:162::o;25682:338::-;25884:2;25866:21;;;25923:2;25903:18;;;25896:30;-1:-1:-1;;;25957:2:1;25942:18;;25935:44;26011:2;25996:18;;25856:164::o;26025:338::-;26227:2;26209:21;;;26266:2;26246:18;;;26239:30;-1:-1:-1;;;26300:2:1;26285:18;;26278:44;26354:2;26339:18;;26199:164::o;26368:355::-;26570:2;26552:21;;;26609:2;26589:18;;;26582:30;26648:33;26643:2;26628:18;;26621:61;26714:2;26699:18;;26542:181::o;26728:347::-;26930:2;26912:21;;;26969:2;26949:18;;;26942:30;27008:25;27003:2;26988:18;;26981:53;27066:2;27051:18;;26902:173::o;27080:1193::-;27259:2;27270:21;;;27362:13;;27411:4;27391:18;;;27384:32;27465:19;;27329:3;27314:19;;27493:22;;;27080:1193;;27259:2;27573:21;;;27080:1193;;27546:3;27531:19;;;27625:491;27639:6;27636:1;27633:13;27625:491;;;27698:13;;27736:9;;27724:22;;27786:11;;;27780:18;27766:12;;;27759:40;27822:4;27866:11;;;27860:18;27846:12;;;27839:40;27902:4;27947:11;;;27941:18;;27972:60;28019:12;;;27941:18;27972:60;:::i;:::-;;;28061:6;28056:3;28052:16;28045:23;;28103:2;28095:6;28091:15;28081:25;;27661:1;27658;27654:9;27649:14;;27625:491;;;-1:-1:-1;28153:15:1;;;28147:22;;28178:69;28241:4;28226:20;;28147:22;28178:69;:::i;:::-;28264:3;27239:1034;-1:-1:-1;;;;;;27239:1034:1:o;28278:1360::-;28505:13;;28487:32;;28575:4;28563:17;;;28557:24;28535:20;;;28528:54;28638:4;28626:17;;;28620:24;28598:20;;;28591:54;28701:4;28689:17;;;28683:24;28661:20;;;28654:54;28764:4;28752:17;;;28746:24;28724:20;;;28717:54;28827:4;28815:17;;;28809:24;28787:20;;;28780:54;28890:4;28878:17;;;28872:24;28850:20;;;28843:54;28953:4;28941:17;;;28935:24;28913:20;;;28906:54;28979:6;29027:15;;;29021:22;29001:18;;;28994:50;29063:6;29111:15;;;29105:22;29085:18;;;29078:50;29147:6;29195:15;;;29189:22;29169:18;;;29162:50;29231:6;29279:15;;;29273:22;29253:18;;;29246:50;29315:6;29363:15;;;29357:22;29337:18;;;29330:50;29399:6;29447:15;;;29441:22;29421:18;;;29414:50;29483:6;29531:15;;;29525:22;29505:18;;;29498:50;29567:6;29615:15;;;29609:22;29589:18;;;29582:50;;;;28474:3;28459:19;;28441:1197::o;29643:177::-;29789:25;;;29777:2;29762:18;;29744:76::o;29825:248::-;29999:25;;;30055:2;30040:18;;30033:34;29987:2;29972:18;;29954:119::o;30078:319::-;30280:25;;;30336:2;30321:18;;30314:34;;;;30379:2;30364:18;;30357:34;30268:2;30253:18;;30235:162::o;30402:391::-;30633:25;;;30689:2;30674:18;;30667:34;;;;30732:2;30717:18;;30710:34;30775:2;30760:18;;30753:34;30620:3;30605:19;;30587:206::o;30798:258::-;30870:1;30880:113;30894:6;30891:1;30888:13;30880:113;;;30970:11;;;30964:18;30951:11;;;30944:39;30916:2;30909:10;30880:113;;;31011:6;31008:1;31005:13;31002:2;;;-1:-1:-1;;31046:1:1;31028:16;;31021:27;30851:205::o;31061:133::-;-1:-1:-1;;;;;31138:31:1;;31128:42;;31118:2;;31184:1;31181;31174:12

Swarm Source

ipfs://e41164bdf8c9a4db6120b097c47392ab0b27dfdcd74414380c0b5555653ad6a9

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

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