Contract 0xD22E79BFB566697657b967E0ca8F9194719bA551

 
 
Txn Hash
Method
Block
From
To
Value
0xb9f2811dd83758fb12f71537bf58edd0a0db43ec87a7c071cfc5b7a3a72951a4Withdraw All Fun...142934142022-02-28 8:00:00215 days 9 hrs ago0xaa524247a50c4ac2666dd5457ace09dfcf369b88 IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.00256384 44.25003613
0x5120776c25835b07f1319890ce620142caca169b81d68f5203bc6e337b762bbdWithdraw Staking138670492021-12-24 9:19:00281 days 8 hrs ago0x6ab155bcfd1b60a744c9ce06cccadfbe34a3d7a3 IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.0049857244
0x0b83655041bb4045c0dd7f24ea73f991777a1746aaf608ec64aa6262252d5058Transfer User In...137945392021-12-13 3:56:10292 days 13 hrs ago0xaa524247a50c4ac2666dd5457ace09dfcf369b88 IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.013574270.71923058
0x1ae909a692c3943dd76eb002528c5d669cc687e54ce1f7fb0363721925622954Withdraw Staking137861262021-12-11 20:53:54293 days 20 hrs ago0x9fbc22ce6d878fb28366ef5d700cde9bc6d41710 IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.00656302 65.87535263
0xb23431681e55d46fa52e4ff34b812711ab16b1c3f010028e20a9a0fd0423b02aWithdraw Staking137743282021-12-10 0:59:15295 days 16 hrs ago0xf6f680e8b2affa1e0c03c3c225771bce18cb6d9a IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.0048135548.3171787
0xe9f5eebfa12da6240bd8e2a44a52aff99ddc3691ca627c54e02a3fffc9139cb6Withdraw Staking137514882021-12-06 9:27:30299 days 8 hrs ago0x0d66fc519f0a4616603aeebe4ccb52c8246ebc96 IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.00815718 81.87969296
0xae228b48cac055b411e11681b9704f61cf839ea6b0983593f5f5400156adb971Transfer User In...137321632021-12-03 7:01:15302 days 10 hrs ago0xaa524247a50c4ac2666dd5457ace09dfcf369b88 IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.013099568.2461187
0x03a800c349ae86b6ddd2c69af0b2e562a7394eb472ce28589461f453ba1d2417Withdraw Staking136630182021-11-22 6:53:32313 days 10 hrs ago0xa96e5ba81d2bb683fa215620d8e35ff6465522ce IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.01198158 120.24877948
0x3d9e59887dde61e1ab737c802987f7b15f0fd89dd72a590a7f8728a21593ae45Withdraw Staking136067072021-11-13 8:54:24322 days 8 hrs ago0xabb9ab93dbc94ef6197e9f7c9daa1d1db38eb69d IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.01254937 125.95724048
0xc4a619e0f5e78ce2c3333887ee3eea01c6ed00c1421aafd0887e422a3a1261cbWithdraw Staking136026632021-11-12 17:38:57323 days 7 mins ago0x7712e26b0bc12126c87e8b5f219cfca9ff66579e IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.01769486 177.60577208
0xbaccf6aa5522165881742d729de6e92178c298ff0db13454351cb31c95d71e8aWithdraw Staking135390032021-11-02 18:01:01332 days 23 hrs ago0x2e40e5f78258c020acbef86cd08072aa8b92e0f2 IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.00710747 190.17170602
0x9c8bf4798123cf160ecf551318adf7b4d275aae866ef370e659ea29568be2b61Withdraw Staking135390032021-11-02 18:01:01332 days 23 hrs ago0x2e40e5f78258c020acbef86cd08072aa8b92e0f2 IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.0189487 190.17170602
0x6dea167baf881915609724281abfed58f6081eb7eb60638ccdda129fe3e28b71Withdraw Staking134806552021-10-24 14:14:15342 days 3 hrs ago0x2d5565ef7c3d267a4efd21f65ae639277ba8f0ed IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.0025309867.73862162
0xc11d8e1649b1393cb0fd481b5efb3f48ca5b301fceae9eaaa8505b459486c706Withdraw Staking134806552021-10-24 14:14:15342 days 3 hrs ago0x2d5565ef7c3d267a4efd21f65ae639277ba8f0ed IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.0059876160.09244238
0x62d6f893f2fcb0a6d5eea3a6b178e037154dc97aea37eb3948e5c0bb42c04664Withdraw Staking134723602021-10-23 7:07:17343 days 10 hrs ago0x58052c4799cffac069b74218e66c0ac1dfab844c IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.0085040875.03360619
0x917cfb318e4748d282c57ebc8f9dc6774da90a63b15dde00fad5dac49e50f083Withdraw Staking134645332021-10-22 1:28:11344 days 16 hrs agoENS Name cryptoclaim.eth IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.008967690
0x2459b6d8af5d46858bd0fe212e8fa493d294590aeccc3aaf802c805dfcb2a4a7Withdraw Staking134109112021-10-13 15:59:52353 days 1 hr ago0xffbebcaf6e67926eff873c91e277ef57e94860a9 IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.01215412122
0x0048ab10948c7e7af7ca2d0d00c7867d7a26ee2d72e0e143ac1f03ae9155c532Withdraw Staking134093802021-10-13 10:04:18353 days 7 hrs ago0x5c828be4747cae926007dfa2bfd21cca3499219f IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.0087250277.00000145
0x7bbff80ff7741a6c1557e8e881891510e07b24ce119698057713e9493b2eab7eWithdraw Staking134083252021-10-13 5:57:15353 days 11 hrs ago0x6e112386fdaf933b9b17f081d68f638f67a58ade IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.0027656774.00000145
0xd4ab970a73a628b600fc5e21b397141140ca2c67efab6427ea5c97d67329493eWithdraw Staking134083252021-10-13 5:57:15353 days 11 hrs ago0x6e112386fdaf933b9b17f081d68f638f67a58ade IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.0071740872.00000145
0x1137a711250ffa3be4c92a1a0fad6b00775f442a7821f9cc33a942a38fb65fd0Withdraw Staking134028432021-10-12 9:33:35354 days 8 hrs ago0xf2301c7ccc438808fd856ac59e91c0af8580195b IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.0086123276.00000145
0x5f0edbef096d3769a0e65669a98dd897f9b36b463b15a80fde1bab9f1c760e0fWithdraw Staking133859142021-10-09 17:36:23357 days 10 mins ago0x89bfb8ab02199c7bff8b11bc1371e3bea7db4e52 IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.0059773260
0xadaaf1155d2cfcf01ae6cfa3212fc90fc74028719a31b6cd964ea6ea7883ab26Withdraw Staking133836672021-10-09 9:12:09357 days 8 hrs ago0x3d94ddc647e148bee8c5676c69a61040c1583104 IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.004981250
0x3fdfc9904b43566ee4d17240d97098accabd46a52f5c50a7225a80774488de5fWithdraw Staking133824362021-10-09 4:25:47357 days 13 hrs ago0xa044468730b5d51c7ce785ee04ae6bc963f8a7c7 IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.00766676 67.66544821
0x5e8b157eae1ef57a033340968b551688aad5e0339581077ca2ffbab4fde0f030Withdraw Staking133653312021-10-06 12:08:18360 days 5 hrs ago0xf29e040125c48d8c807ac241c141d3e77b38e893 IN  0xd22e79bfb566697657b967e0ca8f9194719ba5510 Ether0.01226712 108.22816335
[ Download CSV Export 
View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DPRStaking

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-07-31
*/

pragma solidity ^0.5.12;
pragma experimental ABIEncoderV2;


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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

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

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

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

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

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

/**
 * @dev These functions deal with verification of Merkle trees (hash trees),
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}

contract DPRStaking {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;
    uint256 DPR_UNIT = 10 ** 18;
    struct Period{
		bytes32  withdraw_root;
        uint256 start_time;
        uint256 end_time;
    }
    Period[] private periods;
    IERC20 public dpr;
    uint256 public staking_time = 270 days; // lock for 9 months
    uint256 private total_release_time; // linear release in 3 months
    uint256 private reward_time = 0;
    address public owner; 
    address public migrate_address;
    bool public pause;

	mapping (address => uint256) private user_staking_period_index;
    mapping (address => uint256) private user_staking_amount;
    mapping (address => uint256) private user_release_time;
    mapping (address => uint256) private user_claimed_map;
    mapping (address => string) private dpr_address_mapping;
    mapping (string => address) private address_dpr_mapping;
    mapping (address => Period) private user_staking_periods;
    mapping (address => uint256) private user_staking_time;
    uint256[8] private staking_level = [
        20000 * DPR_UNIT, // 100 credit
        46800 * DPR_UNIT, // 200 credit
        76800 * DPR_UNIT, // 300 credit
        138000 * DPR_UNIT, // 400 credit
        218000 * DPR_UNIT, // 500 credit
        288000 * DPR_UNIT, // 600 credit
        368000 * DPR_UNIT, // 700 credit
        468000 * DPR_UNIT // 800 credit
    ];


    
    //modifiers
    modifier onlyOwner() {
        require(msg.sender==owner, "DPRStaking: Only owner can operate this function");
        _;
    }

    modifier whenNotPaused(){
        require(pause == false, "DPRStaking: Pause!");
        _;
    }
    
    //events
    event Stake(address indexed user, string DPRAddress, uint256 indexed amount);
    event StakeChange(address indexed user, uint256 indexed oldAmount, uint256 indexed newAmount);
    event OwnerShipTransfer(address indexed oldOwner, address indexed newOwner);
    event DPRAddressChange(bytes32 oldAddress, bytes32 newAddress);
    event UserInfoChange(address indexed oldUser, address indexed newUser);
    event WithdrawAllFunds(address indexed to);
    event LinearTimeChange(uint256 day);
    event WithdrawStaking(address indexed _address, uint256 indexed _amount);
    event UpdateRewardTime(uint256 indexed _new_reward_time);
    event EndTimeChanged(uint256 indexed _new_end_time);
    event NewPeriod(uint256 indexed _start_time, uint256 indexed _end_time);
    event Migrate(address indexed migrate_address, uint256 indexed migrate_amount);
    event MigrateAddressSet(address indexed migrate_address);
	event RootSet(bytes32 indexed root, uint256 indexed _index);
    event ModifyPeriodTime(uint256 indexed _index, uint256 _start_time, uint256 _end_time);

    constructor(IERC20 _dpr) public {
        dpr = _dpr;
        total_release_time = 90 days; // for initialize
        owner = msg.sender;
    }

    function stake(string calldata DPRAddress, uint256 level) external whenNotPaused returns(bool){
       //Check current lastest staking period
       require(periods.length > 0, "DPRStaking: No active staking period");
       Period memory lastest_period = periods[periods.length.sub(1)];
       require(isInCurrentPeriod(),"DPRStaking: Staking not start or already end");
       require(level <= staking_level.length.sub(1), "DPRStaking: Level does not exist");
       require(user_staking_amount[msg.sender] == 0, "DPRStaking: Already stake, use addStaking instead");
       //check if address already set DPRAddress and DPRAddress is not in use
       checkDPRAddress(msg.sender, DPRAddress);
       uint256 staking_amount = staking_level[level];
       dpr.safeTransferFrom(msg.sender, address(this), staking_amount);
       user_staking_amount[msg.sender] = staking_amount;
       user_staking_time[msg.sender] = block.timestamp;
       dpr_address_mapping[msg.sender] = DPRAddress;
       address_dpr_mapping[DPRAddress] = msg.sender;
       //update user staking period
       user_staking_periods[msg.sender] = lastest_period;
	   user_staking_period_index[msg.sender] = periods.length.sub(1);
       emit Stake(msg.sender, DPRAddress, staking_amount);
       return true;
    }

    function addStaking(uint256 level) external  whenNotPaused returns(bool) {
        // staking period checking
        require(periods.length >0, "DPRStaking: No active staking period");
        require(checkPeriod(msg.sender), "DRPStaking: Not current period, try to move to lastest period");
        require(isInCurrentPeriod(), "DPRStaking: Staking not start or already end");
        require(level <= staking_level.length.sub(1), "DPRStaking: Level does not exist");
        uint256 newStakingAmount = staking_level[level];
        uint256 oldStakingAmount = user_staking_amount[msg.sender];
        require(oldStakingAmount > 0, "DPRStaking: Please Stake first");
        require(oldStakingAmount < newStakingAmount, "DPRStaking: Can only upgrade your level");
        uint256 difference = newStakingAmount.sub(oldStakingAmount);
        dpr.safeTransferFrom(msg.sender, address(this), difference);
        //update user staking amount
        user_staking_amount[msg.sender] = staking_level[level];
        user_staking_time[msg.sender] = block.timestamp;
        emit StakeChange(msg.sender, oldStakingAmount, newStakingAmount);
        return true;
    }

    function claim() external whenNotPaused returns(bool){
        require(reward_time > 0, "DPRStaking: Reward time not set");
        require(block.timestamp >= reward_time.add(staking_time), "DPRStaking: Not reach the release time");
        if(user_release_time[msg.sender] == 0){
            user_release_time[msg.sender] = reward_time.add(staking_time);
        }
        // user staking end time checking
        require(block.timestamp >= user_release_time[msg.sender], "DPRStaking: Not release period");
        uint256 staking_amount = user_staking_amount[msg.sender];
        require(staking_amount > 0, "DPRStaking: Must stake first");
        uint256 user_claimed = user_claimed_map[msg.sender];
        uint256 claim_per_period = staking_amount.mul(1 days).div(total_release_time);
        uint256 time_pass = block.timestamp.sub(user_release_time[msg.sender]).div(1 days);
        uint256 total_claim_amount = claim_per_period * time_pass;
        if(total_claim_amount >= user_staking_amount[msg.sender]){
            total_claim_amount = user_staking_amount[msg.sender];
            user_staking_amount[msg.sender] = 0;
        }
        user_claimed_map[msg.sender] = total_claim_amount;
        uint256 claim_this_time = total_claim_amount.sub(user_claimed);
        dpr.safeTransfer(msg.sender, claim_this_time);
        return true;
    }

    function transferOwnership(address newOwner) onlyOwner external returns(bool){
        require(newOwner != address(0), "DPRStaking: Transfer Ownership to zero address");
        owner = newOwner;
        emit OwnerShipTransfer(msg.sender, newOwner);
    } 
    
    //for emergency case, Deeper Offical can help users to modify their staking info
    function modifyUserAddress(address user, string calldata DPRAddress) external onlyOwner returns(bool){
        require(user_staking_amount[user] > 0, "DPRStaking: User does not have any record");
        require(address_dpr_mapping[DPRAddress] == address(0), "DPRStaking: DPRAddress already in use");
        bytes32 oldDPRAddressHash = keccak256(abi.encodePacked(dpr_address_mapping[user]));
        bytes32 newDPRAddressHash = keccak256(abi.encodePacked(DPRAddress));
        require(oldDPRAddressHash != newDPRAddressHash, "DPRStaking: DPRAddress is same"); 
        dpr_address_mapping[user] = DPRAddress;
        delete address_dpr_mapping[dpr_address_mapping[user]];
        address_dpr_mapping[DPRAddress] = user;
        emit DPRAddressChange(oldDPRAddressHash, newDPRAddressHash);
        return true;

    }
    //for emergency case(User lost their control of their accounts), Deeper Offical can help users to transfer their staking info to a new address 
    function transferUserInfo(address oldUser, address newUser) external onlyOwner returns(bool){
        require(oldUser != newUser, "DPRStaking: Address are same");
        require(user_staking_amount[oldUser] > 0, "DPRStaking: Old user does not have any record");
        require(user_staking_amount[newUser] == 0, "DPRStaking: New user must a clean address");
        //Transfer Staking Info
        user_staking_amount[newUser] = user_staking_amount[oldUser];
		user_staking_period_index[newUser] = user_staking_period_index[oldUser];
		user_staking_periods[newUser] = user_staking_periods[oldUser];
        //Transfer release Info
        user_release_time[newUser] = user_release_time[oldUser];
        //Transfer claim Info
        user_claimed_map[newUser] = user_claimed_map[oldUser];
        //Transfer address mapping info
		address_dpr_mapping[dpr_address_mapping[oldUser]] = newUser;
        dpr_address_mapping[newUser] = dpr_address_mapping[oldUser];
        user_staking_time[msg.sender] = block.timestamp;
        //clear account
        clearAccount(oldUser,false);
        emit UserInfoChange(oldUser, newUser);
        return true;

    }
    //for emergency case, Deeper Offical have permission to withdraw all fund in the contract
    function withdrawAllFund(uint256 amount) external onlyOwner returns(bool){
        dpr.safeTransfer(owner,amount);
        emit WithdrawAllFunds(owner);
        return true;
    }
	
	function setRootForPeriod(bytes32 root, uint256 index) external onlyOwner returns(bool){
		require(index <= periods.length.sub(1), "DPRStaking: Not that period");
		Period storage period_to_modify = periods[index];
		period_to_modify.withdraw_root = root;
		emit RootSet(root, index);
		return true;
	}

    function modifyPeriodTime(uint256 index, uint256 start_time, uint256 end_time) external onlyOwner returns(bool){
        require(periods.length > 0, "DPRStaking: No period");
        require(index <= periods.length.sub(1), "DPRStaking: Wrong Period");
        Period storage period = periods[index];
        period.start_time = start_time;
        period.end_time = end_time;
        emit ModifyPeriodTime(index, start_time, end_time);
    }

    //Change the linear time before claim start
    //if reward_time is 0, means mainnet not lanuch, so there is no need to check the reward time
    function modifyLinearTime(uint256 newdays) onlyOwner external returns(bool){
        require(block.timestamp <= reward_time.add(staking_time), "DPRStaking: Claim period has started");
        total_release_time = newdays * 86400;
        emit LinearTimeChange(newdays);
        return true;
    }

    function setPause(bool is_pause) external onlyOwner returns(bool){
        pause = is_pause;
        return true;
    }
	
    function clearAccount(address user, bool is_clear_address) private{
        delete user_staking_amount[user];
        delete user_release_time[user];
        delete user_claimed_map[user];
		delete user_staking_period_index[user];
		delete user_staking_periods[user];
        delete user_staking_time[user];
        if(is_clear_address){
			delete address_dpr_mapping[dpr_address_mapping[user]];
		}
		delete dpr_address_mapping[user];
    }
	
	function generateUserHash(address user) private returns(bytes32){
		uint256 staking_amount = user_staking_amount[user];
		return keccak256(abi.encodePacked(user, staking_amount));
	}
	
	function moveToLastestPeriod() external returns(bool){
		uint256 staking_amount = user_staking_amount[msg.sender];
		require(staking_amount > 0, "DPRStaking: User does not stake");
		Period memory lastest_period = periods[periods.length.sub(1)];
		require(isInCurrentPeriod(), "DPRStaking: Not in current period");
		//if user's period is same as the current period, means there is no new period
		require(!checkPeriod(msg.sender), "DPRStaking: No new staking period");
		user_staking_periods[msg.sender] = lastest_period;
		user_staking_period_index[msg.sender] = periods.length.sub(1);
	}


    //only allow user withdraw his fund in one period
    //for user withdraw their fund before staking end
    function withdrawStaking(bytes32[] calldata path, address user) external returns(bool){
        require(periods.length >=0, "DPRStaking: No active staking period");
		uint256 index = user_staking_period_index[user];
		bytes32 root = periods[index].withdraw_root;
		bytes32 user_node = generateUserHash(user);
		require(MerkleProof.verify(path, root, user_node), "DPRStaking: User not allow to withdraw");
		uint256 withdraw_amount = user_staking_amount[user];
        require(withdraw_amount >0, "DPRStaking: User does not stake");
        require(withdraw_amount <= dpr.balanceOf(address(this)), "DPRStaking: Not enough balanbce");
		clearAccount(user, true);
        dpr.safeTransfer(user, withdraw_amount);
        emit WithdrawStaking(user, withdraw_amount);
        return true;
    }

    function addStakingPeriod(uint256 _start_time, uint256 _end_time) external onlyOwner returns(bool){
        require(_end_time >= _start_time, "DPRStaking: Time error");
        if(periods.length != 0){
            Period memory lastest_period = periods[periods.length.sub(1)];
            uint256 end_time = lastest_period.end_time;
            require(block.timestamp > end_time, "DPRStaking: last period was not end");
        }
        Period memory p;
        p.start_time = _start_time;
        p.end_time = _end_time;
        periods.push(p);
        emit NewPeriod(_start_time, _end_time);
        return true;
    }

    //modify reward time
    function setRewardTime(uint256 _new_reward_time) external onlyOwner returns(bool){
        require(reward_time == 0,  "DPRStaking: Reward time is already set");
        reward_time = _new_reward_time;
        emit UpdateRewardTime(_new_reward_time);
        return true;
    }
    //when staking end, user can choose to migrate their fund to new contract
    function migrate() external returns(bool){
        uint256 staking_amount = user_staking_amount[msg.sender];
        require(staking_amount >0, "DPRStaking: User does not stake");
        require(migrate_address != address(0), "DPRStaking: Staking not start");
        clearAccount(msg.sender, true);
        dpr.safeTransfer(migrate_address, staking_amount);
        emit Migrate(migrate_address, staking_amount);
        return true;
    }



    function setMigrateAddress(address _migrate_address) external onlyOwner returns(bool){
        migrate_address = _migrate_address;
        emit MigrateAddressSet(_migrate_address);
        return true;
    }

    function checkPeriod(address user) private returns(bool){
		Period memory lastest_period = periods[periods.length.sub(1)];
		Period memory user_period = user_staking_periods[user];
        return(lastest_period.start_time == user_period.start_time && lastest_period.end_time == user_period.end_time);
    }

    function checkDPRAddress(address _address, string memory _dprAddress) private{
        require(keccak256(abi.encodePacked(dpr_address_mapping[_address])) == bytes32(hex"c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"), "DPRStaking: DPRAddress already set");
        require(address_dpr_mapping[_dprAddress] == address(0), "DPRStaking: ETH address already bind an DPRAddress");
    }
	
	function isInCurrentPeriod() private returns(bool){
		Period memory lastest_period = periods[periods.length.sub(1)];
		uint256 start_time = lastest_period.start_time;
		uint256 end_time = lastest_period.end_time;
		return (block.timestamp >= start_time && end_time >= block.timestamp);
	}

    function getUserDPRAddress(address user) external view returns(string memory){
        return dpr_address_mapping[user];
    }
	
	function getUserAddressByDPRAddress(string calldata dpr_address) external view returns(address){
		return address_dpr_mapping[dpr_address];
	}

    function getReleaseTime(address user) external view returns(uint256){
        return user_release_time[user];
    }

    function getStaking(address user) external view returns(uint256){
        return user_staking_amount[user];
    }

    function getUserReleasePerDay(address user) external view returns(uint256){
        uint256 staking_amount = user_staking_amount[user];
        uint256 release_per_day = staking_amount.mul(1 days).div(total_release_time);
        return release_per_day;
    }

    function getUserClaimInfo(address user) external view returns(uint256){
        return user_claimed_map[user];
    }

    function getReleaseTimeInDays() external view returns(uint256){
        return total_release_time.div(1 days);
    }

    function getPeriodInfo(uint256 index) external view returns (Period memory){
		return periods[index];
    }

    function getRewardTime() external view returns(uint256){
        return reward_time;  
    }

    function getUserStakingPeriod(address user) external view returns(Period memory){
        return user_staking_periods[user];
    }
	
	function getUserStakingIndex(address user) external view returns(uint256){
		return user_staking_period_index[user];
	}

    function getUserStakingTime(address user) external view returns(uint256){
        return user_staking_time[user];
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IERC20","name":"_dpr","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"oldAddress","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"newAddress","type":"bytes32"}],"name":"DPRAddressChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_new_end_time","type":"uint256"}],"name":"EndTimeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"day","type":"uint256"}],"name":"LinearTimeChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"migrate_address","type":"address"},{"indexed":true,"internalType":"uint256","name":"migrate_amount","type":"uint256"}],"name":"Migrate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"migrate_address","type":"address"}],"name":"MigrateAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_start_time","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_end_time","type":"uint256"}],"name":"ModifyPeriodTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_start_time","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_end_time","type":"uint256"}],"name":"NewPeriod","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerShipTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"root","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"_index","type":"uint256"}],"name":"RootSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"string","name":"DPRAddress","type":"string"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"oldAmount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"StakeChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_new_reward_time","type":"uint256"}],"name":"UpdateRewardTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldUser","type":"address"},{"indexed":true,"internalType":"address","name":"newUser","type":"address"}],"name":"UserInfoChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"WithdrawAllFunds","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"WithdrawStaking","type":"event"},{"constant":false,"inputs":[{"internalType":"uint256","name":"level","type":"uint256"}],"name":"addStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_start_time","type":"uint256"},{"internalType":"uint256","name":"_end_time","type":"uint256"}],"name":"addStakingPeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"dpr","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPeriodInfo","outputs":[{"components":[{"internalType":"bytes32","name":"withdraw_root","type":"bytes32"},{"internalType":"uint256","name":"start_time","type":"uint256"},{"internalType":"uint256","name":"end_time","type":"uint256"}],"internalType":"struct DPRStaking.Period","name":"","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getReleaseTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getReleaseTimeInDays","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getRewardTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getStaking","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"dpr_address","type":"string"}],"name":"getUserAddressByDPRAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserClaimInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserDPRAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserReleasePerDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserStakingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserStakingPeriod","outputs":[{"components":[{"internalType":"bytes32","name":"withdraw_root","type":"bytes32"},{"internalType":"uint256","name":"start_time","type":"uint256"},{"internalType":"uint256","name":"end_time","type":"uint256"}],"internalType":"struct DPRStaking.Period","name":"","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserStakingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"migrate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"migrate_address","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"newdays","type":"uint256"}],"name":"modifyLinearTime","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"start_time","type":"uint256"},{"internalType":"uint256","name":"end_time","type":"uint256"}],"name":"modifyPeriodTime","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"string","name":"DPRAddress","type":"string"}],"name":"modifyUserAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"moveToLastestPeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_migrate_address","type":"address"}],"name":"setMigrateAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"is_pause","type":"bool"}],"name":"setPause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_new_reward_time","type":"uint256"}],"name":"setRewardTime","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"setRootForPeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"DPRAddress","type":"string"},{"internalType":"uint256","name":"level","type":"uint256"}],"name":"stake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"staking_time","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"oldUser","type":"address"},{"internalType":"address","name":"newUser","type":"address"}],"name":"transferUserInfo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawAllFund","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32[]","name":"path","type":"bytes32[]"},{"internalType":"address","name":"user","type":"address"}],"name":"withdrawStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

670de0b6b3a76400006000908155630163f50060035560055561018060405269043c33c193756480000060809081526909e908782af91940000060a052691043561a88293000000060c052691d38feb7acaa0240000060e052692e29cdbdfa7f9440000061010052693cfc82e37e9a7400000061012052694ded51e9cc70060000006101405269631a54b1adbafc80000061016052620000a49060109060086200010b565b50348015620000b257600080fd5b5060405162003a6b38038062003a6b833981016040819052620000d59162000181565b600280546001600160a01b039092166001600160a01b03199283161790556276a7006004556006805490911633179055620001ea565b82600881019282156200013c579160200282015b828111156200013c5782518255916020019190600101906200011f565b506200014a9291506200014e565b5090565b6200016b91905b808211156200014a576000815560010162000155565b90565b80516200017b81620001d0565b92915050565b6000602082840312156200019457600080fd5b6000620001a284846200016e565b949350505050565b60006200017b82620001c4565b60006200017b82620001aa565b6001600160a01b031690565b620001db81620001b7565b8114620001e757600080fd5b50565b61387180620001fa6000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806384204ea41161011a578063d0a3d6c8116100ad578063ee75defd1161007c578063ee75defd14610419578063f24b51a41461042c578063f2fde38b1461043f578063f4c8ad1414610452578063f63013aa1461046557610206565b8063d0a3d6c8146103d8578063d50912ef146103eb578063d9b26a69146103f3578063e266c8b41461040657610206565b80638fd3ab80116100e95780638fd3ab80146103975780639494c8ae1461039f5780639daaee6d146103b2578063bedb86fb146103c557610206565b806384204ea4146103615780638456cb5914610374578063877162181461037c5780638da5cb5b1461038f57610206565b80634ba4238d1161019d5780635f3797e81161016c5780635f3797e81461030057806368e1ed02146103205780636d5382641461033357806370f8b13b146103465780637d4c69ff1461034e57610206565b80634ba4238d146102ca5780634e71d92d146102dd5780635b9a889e146102e55780635d3841da146102f857610206565b806331fad828116101d957806331fad8281461027c5780633647bdfe1461028457806338eb239d146102975780634122869a146102aa57610206565b806305bcb6e41461020b5780630cb7eb4c1461022957806311c88633146102495780632af2311d1461025c575b600080fd5b61021361047a565b6040516102209190613481565b60405180910390f35b61023c610237366004612547565b6105af565b604051610220919061375c565b61023c610257366004612547565b6105ca565b61026f61026a366004612743565b6105e5565b604051610220919061374e565b61023c610638565b610213610292366004612565565b61063e565b6102136102a5366004612686565b610877565b6102bd6102b8366004612547565b61092f565b60405161022091906134bd565b6102136102d8366004612743565b6109da565b610213610a84565b61026f6102f3366004612547565b610c87565b61023c610cd1565b61031361030e3660046126b6565b610cd7565b6040516102209190613430565b61023c61032e366004612547565b610d0c565b610213610341366004612547565b610d27565b61023c610da3565b61023c61035c366004612547565b610dc1565b61021361036f366004612743565b610dfe565b610213610e8e565b61023c61038a366004612547565b610e9e565b610313610eb9565b610213610ec8565b6102136103ad3660046126f8565b610f8b565b6102136103c036600461277f565b611231565b6102136103d336600461264a565b611322565b6102136103e6366004612743565b611370565b61031361152e565b610213610401366004612686565b61153d565b61021361041436600461259f565b6116f0565b61023c610427366004612547565b61191f565b61021361043a3660046125f5565b61193a565b61021361044d366004612547565b611b1e565b610213610460366004612743565b611bbf565b61046d611c44565b604051610220919061349d565b33600090815260096020526040812054806104b05760405162461bcd60e51b81526004016104a7906136fe565b60405180910390fd5b6104b861230d565b600180546104cc908263ffffffff611c5316565b815481106104d657fe5b906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820154815250509050610517611c95565b6105335760405162461bcd60e51b81526004016104a79061351e565b61053c33611d0e565b156105595760405162461bcd60e51b81526004016104a7906134ce565b336000908152600e602090815260409182902083518155908301516001808301919091559183015160029091015580546105989163ffffffff611c5316565b336000908152600860205260409020555090919050565b6001600160a01b03166000908152600a602052604090205490565b6001600160a01b031660009081526009602052604090205490565b6105ed61230d565b600182815481106105fa57fe5b906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820154815250509050919050565b60035481565b6006546000906001600160a01b0316331461066b5760405162461bcd60e51b81526004016104a79061370e565b816001600160a01b0316836001600160a01b0316141561069d5760405162461bcd60e51b81526004016104a7906134fe565b6001600160a01b0383166000908152600960205260409020546106d25760405162461bcd60e51b81526004016104a7906135ee565b6001600160a01b038216600090815260096020526040902054156107085760405162461bcd60e51b81526004016104a7906136ae565b6001600160a01b0380841660008181526009602090815260408083205494871680845281842095909555838352600882528083205485845281842055838352600e82528083208584528184208154815560018083015490820155600291820154910155838352600a82528083205485845281842055838352600b82528083205494835280832094909455918152600c90915281902090518391600d916107ae9190613424565b908152604080516020928190038301902080546001600160a01b0319166001600160a01b039485161790558583166000908152600c90925280822092851682529020815461080f929060026101006001831615026000190190911604612331565b50336000908152600f6020526040812042905561082d908490611dd4565b816001600160a01b0316836001600160a01b03167f8483c64d8e9cddd729cab04f8100e6205ddab27d86bbbb75360ebe38d5e3817860405160405180910390a35060015b92915050565b6006546000906001600160a01b031633146108a45760405162461bcd60e51b81526004016104a79061370e565b600180546108b79163ffffffff611c5316565b8211156108d65760405162461bcd60e51b81526004016104a79061353e565b6000600183815481106108e557fe5b600091825260208220600390910201858155604051909250849186917f3b5f5a818114a962bf54493645ddf3f98a968b2d59eef1565233d4df40a996839190a35060019392505050565b6001600160a01b0381166000908152600c602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156109ce5780601f106109a3576101008083540402835291602001916109ce565b820191906000526020600020905b8154815290600101906020018083116109b157829003601f168201915b50505050509050919050565b6006546000906001600160a01b03163314610a075760405162461bcd60e51b81526004016104a79061370e565b600354600554610a1c9163ffffffff611ea016565b421115610a3b5760405162461bcd60e51b81526004016104a7906134de565b6201518082026004556040517f64f0e784bfff1250323a8b5d219d0a76638747ebd83d19e83d2845db7be3357590610a7490849061375c565b60405180910390a1506001919050565b600754600090600160a01b900460ff1615610ab15760405162461bcd60e51b81526004016104a79061360e565b600060055411610ad35760405162461bcd60e51b81526004016104a79061368e565b600354600554610ae89163ffffffff611ea016565b421015610b075760405162461bcd60e51b81526004016104a79061358e565b336000908152600a6020526040902054610b4157600354600554610b309163ffffffff611ea016565b336000908152600a60205260409020555b336000908152600a6020526040902054421015610b705760405162461bcd60e51b81526004016104a79061362e565b3360009081526009602052604090205480610b9d5760405162461bcd60e51b81526004016104a79061372e565b336000908152600b6020526040812054600454909190610bd690610bca856201518063ffffffff611ec516565b9063ffffffff611eff16565b336000908152600a602052604081205491925090610c04906201518090610bca90429063ffffffff611c5316565b33600090815260096020526040902054909150828202908110610c37575033600090815260096020526040812080549190555b336000908152600b60205260408120829055610c59828663ffffffff611c5316565b600254909150610c79906001600160a01b0316338363ffffffff611f4116565b600196505050505050505b90565b610c8f61230d565b506001600160a01b03166000908152600e6020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915290565b60055490565b6000600d8383604051610ceb929190613417565b908152604051908190036020019020546001600160a01b0316905092915050565b6001600160a01b031660009081526008602052604090205490565b6006546000906001600160a01b03163314610d545760405162461bcd60e51b81526004016104a79061370e565b600780546001600160a01b0319166001600160a01b0384169081179091556040517fe074a544f929ec91e7054c0efa2673b09d6369ab50e0b5f43266f263777b01c390600090a2506001919050565b600454600090610dbc906201518063ffffffff611eff16565b905090565b6001600160a01b0381166000908152600960205260408120546004548290610df690610bca846201518063ffffffff611ec516565b949350505050565b6006546000906001600160a01b03163314610e2b5760405162461bcd60e51b81526004016104a79061370e565b600654600254610e4e916001600160a01b0391821691168463ffffffff611f4116565b6006546040516001600160a01b03909116907f98bc5ca0f56697ed898c217b7562d70bd8fe2e90ef8ebc9950ef5470d366deca90600090a2506001919050565b600754600160a01b900460ff1681565b6001600160a01b03166000908152600f602052604090205490565b6006546001600160a01b031681565b3360009081526009602052604081205480610ef55760405162461bcd60e51b81526004016104a7906136fe565b6007546001600160a01b0316610f1d5760405162461bcd60e51b81526004016104a79061357e565b610f28336001611dd4565b600754600254610f4b916001600160a01b0391821691168363ffffffff611f4116565b60075460405182916001600160a01b0316907fa59785389b00cbd19745afbe8d59b28e3161395c6b1e3525861a2b0dede0b90d90600090a3600191505090565b600754600090600160a01b900460ff1615610fb85760405162461bcd60e51b81526004016104a79061360e565b600154610fd75760405162461bcd60e51b81526004016104a79061366e565b610fdf61230d565b60018054610ff3908263ffffffff611c5316565b81548110610ffd57fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905061103e611c95565b61105a5760405162461bcd60e51b81526004016104a79061365e565b61106c6008600163ffffffff611c5316565b83111561108b5760405162461bcd60e51b81526004016104a7906135ae565b33600090815260096020526040902054156110b85760405162461bcd60e51b81526004016104a7906136ce565b6110f83386868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f9f92505050565b60006010846008811061110757fe5b015460025490915061112a906001600160a01b031633308463ffffffff61207916565b336000908152600960209081526040808320849055600f8252808320429055600c909152902061115b9087876123b6565b5033600d878760405161116f929190613417565b908152604080516020928190038301902080546001600160a01b0319166001600160a01b039490941693909317909255336000908152600e825282902084518155908401516001828101919091559184015160029091015580546111d291611c53565b33600081815260086020526040908190209290925590518291907fb3b936b14d57c751f127281bf2581efcc913ded277a0d9d5acc68dfd2b9af1b99061121b908a908a906134ab565b60405180910390a36001925050505b9392505050565b6006546000906001600160a01b0316331461125e5760405162461bcd60e51b81526004016104a79061370e565b60015461127d5760405162461bcd60e51b81526004016104a79061359e565b600180546112909163ffffffff611c5316565b8411156112af5760405162461bcd60e51b81526004016104a79061367e565b6000600185815481106112be57fe5b90600052602060002090600302019050838160010181905550828160020181905550847ff0759515c9ebd144dff9ef88e3254d6369eb4077ec3eaa05fdde15dcfaf17296858560405161131292919061348f565b60405180910390a2509392505050565b6006546000906001600160a01b0316331461134f5760405162461bcd60e51b81526004016104a79061370e565b5060078054821515600160a01b0260ff60a01b199091161790556001919050565b600754600090600160a01b900460ff161561139d5760405162461bcd60e51b81526004016104a79061360e565b6001546113bc5760405162461bcd60e51b81526004016104a79061366e565b6113c533611d0e565b6113e15760405162461bcd60e51b81526004016104a79061369e565b6113e9611c95565b6114055760405162461bcd60e51b81526004016104a79061365e565b6114176008600163ffffffff611c5316565b8211156114365760405162461bcd60e51b81526004016104a7906135ae565b60006010836008811061144557fe5b015433600090815260096020526040902054909150806114775760405162461bcd60e51b81526004016104a79061354e565b8181106114965760405162461bcd60e51b81526004016104a7906135fe565b60006114a8838363ffffffff611c5316565b6002549091506114c9906001600160a01b031633308463ffffffff61207916565b601085600881106114d657fe5b015433600081815260096020908152604080832094909455600f9052828120429055915185928592917fe2c1bfe296058de814835611e32a9c3c43c9ced4a59565eea909bd4caf22667c9190a4506001949350505050565b6007546001600160a01b031681565b6006546000906001600160a01b0316331461156a5760405162461bcd60e51b81526004016104a79061370e565b8282101561158a5760405162461bcd60e51b81526004016104a79061364e565b6001541561161c5761159a61230d565b600180546115ae908263ffffffff611c5316565b815481106115b857fe5b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505090506000816040015190508042116116195760405162461bcd60e51b81526004016104a7906134ee565b50505b61162461230d565b602081018481526040808301858152600180548082018255600091825285517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf660039092029182015593517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf785015590517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf89093019290925551849186917f8a8740b235beb0956eaa387480dc99b8ee8af14a91e331ce5e49aa06fad87edd9190a35060019392505050565b6006546000906001600160a01b0316331461171d5760405162461bcd60e51b81526004016104a79061370e565b6001600160a01b0384166000908152600960205260409020546117525760405162461bcd60e51b81526004016104a79061350e565b60006001600160a01b0316600d848460405161176f929190613417565b908152604051908190036020019020546001600160a01b0316146117a55760405162461bcd60e51b81526004016104a7906135de565b6001600160a01b0384166000908152600c6020908152604080832090516117cc9201613424565b604051602081830303815290604052805190602001209050600084846040516020016117f9929190613417565b604051602081830303815290604052805190602001209050808214156118315760405162461bcd60e51b81526004016104a79061352e565b6001600160a01b0386166000908152600c602052604090206118549086866123b6565b506001600160a01b0386166000908152600c6020526040908190209051600d9161187d91613424565b90815260405190819003602001812080546001600160a01b03191690558690600d906118ac9088908890613417565b90815260405190819003602001812080546001600160a01b03939093166001600160a01b0319909316929092179091557f12300d967ae195230c7a1a16b46b4f4d12062911d36901f80d6e5524fadd1ed99061190b908490849061348f565b60405180910390a150600195945050505050565b6001600160a01b03166000908152600b602052604090205490565b6001600160a01b038116600090815260086020526040812054600180548391908390811061196457fe5b60009182526020822060039091020154915061197f856120a3565b90506119c18787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508692508591506120ef9050565b6119dd5760405162461bcd60e51b81526004016104a7906136be565b6001600160a01b03851660009081526009602052604090205480611a135760405162461bcd60e51b81526004016104a7906136fe565b6002546040516370a0823160e01b81526001600160a01b03909116906370a0823190611a43903090600401613430565b60206040518083038186803b158015611a5b57600080fd5b505afa158015611a6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a939190810190612761565b811115611ab25760405162461bcd60e51b81526004016104a79061361e565b611abd866001611dd4565b600254611ada906001600160a01b0316878363ffffffff611f4116565b60405181906001600160a01b038816907f2f4a5b5e4829b97ca085d8d984e5ba13a1cf30098599079420191e1b83279a0190600090a3506001979650505050505050565b6006546000906001600160a01b03163314611b4b5760405162461bcd60e51b81526004016104a79061370e565b6001600160a01b038216611b715760405162461bcd60e51b81526004016104a7906135be565b600680546001600160a01b0319166001600160a01b03841690811790915560405133907f39aa7b32e39346e4d63b7af2df2424277168303b5e5a6e01b6b1a014d501a7ab90600090a3919050565b6006546000906001600160a01b03163314611bec5760405162461bcd60e51b81526004016104a79061370e565b60055415611c0c5760405162461bcd60e51b81526004016104a79061371e565b600582905560405182907f14a8256c8d7f7c610ef09854ce69371a1719e564d36f6b6917cfe106dc709a3590600090a2506001919050565b6002546001600160a01b031681565b600061122a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061218c565b6000611c9f61230d565b60018054611cb3908263ffffffff611c5316565b81548110611cbd57fe5b600091825260209182902060408051606081018252600390930290910180548352600181015493830184905260020154908201819052909250428211801590611d065750428110155b935050505090565b6000611d1861230d565b60018054611d2c908263ffffffff611c5316565b81548110611d3657fe5b906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820154815250509050611d7761230d565b506001600160a01b0383166000908152600e602090815260409182902082516060810184528154815260018201548184018190526002909201549381019390935290830151148015610df657506040908101519101511492915050565b6001600160a01b0382166000908152600960209081526040808320839055600a8252808320839055600b825280832083905560088252808320839055600e825280832083815560018101849055600201839055600f9091528120558015611e7b576001600160a01b0382166000908152600c6020526040908190209051600d91611e5d91613424565b90815260405190819003602001902080546001600160a01b03191690555b6001600160a01b0382166000908152600c60205260408120611e9c91612424565b5050565b60008282018381101561122a5760405162461bcd60e51b81526004016104a79061355e565b600082611ed457506000610871565b82820282848281611ee157fe5b041461122a5760405162461bcd60e51b81526004016104a79061363e565b600061122a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506121b8565b604051611f9a90849063a9059cbb60e01b90611f639086908690602401613466565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526121ef565b505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470600c6000846001600160a01b03166001600160a01b03168152602001908152602001600020604051602001611ff59190613424565b60405160208183030381529060405280519060200120146120285760405162461bcd60e51b81526004016104a7906135ce565b60006001600160a01b0316600d82604051612043919061340b565b908152604051908190036020019020546001600160a01b031614611e9c5760405162461bcd60e51b81526004016104a7906136de565b60405161209d9085906323b872dd60e01b90611f639087908790879060240161343e565b50505050565b6001600160a01b038116600090815260096020908152604080832054905190916120d19185918491016133c9565b60405160208183030381529060405280519060200120915050919050565b600081815b855181101561218157600086828151811061210b57fe5b6020026020010151905080831161214c57828160405160200161212f9291906133ef565b604051602081830303815290604052805190602001209250612178565b808360405160200161215f9291906133ef565b6040516020818303038152906040528051906020012092505b506001016120f4565b509092149392505050565b600081848411156121b05760405162461bcd60e51b81526004016104a791906134bd565b505050900390565b600081836121d95760405162461bcd60e51b81526004016104a791906134bd565b5060008385816121e557fe5b0495945050505050565b612201826001600160a01b03166122d4565b61221d5760405162461bcd60e51b81526004016104a79061373e565b60006060836001600160a01b031683604051612239919061340b565b6000604051808303816000865af19150503d8060008114612276576040519150601f19603f3d011682016040523d82523d6000602084013e61227b565b606091505b50915091508161229d5760405162461bcd60e51b81526004016104a79061356e565b80511561209d57808060200190516122b89190810190612668565b61209d5760405162461bcd60e51b81526004016104a7906136ee565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610df6575050151592915050565b60405180606001604052806000801916815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061236a57805485556123a6565b828001600101855582156123a657600052602060002091601f016020900482015b828111156123a657825482559160010191906001019061238b565b506123b292915061246b565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123f75782800160ff198235161785556123a6565b828001600101855582156123a6579182015b828111156123a6578235825591602001919060010190612409565b50805460018160011615610100020316600290046000825580601f1061244a5750612468565b601f016020900490600052602060002090810190612468919061246b565b50565b610c8491905b808211156123b25760008155600101612471565b803561087181613808565b60008083601f8401126124a257600080fd5b50813567ffffffffffffffff8111156124ba57600080fd5b6020830191508360208202830111156124d257600080fd5b9250929050565b80356108718161381c565b80516108718161381c565b803561087181613825565b60008083601f84011261250c57600080fd5b50813567ffffffffffffffff81111561252457600080fd5b6020830191508360018202830111156124d257600080fd5b805161087181613825565b60006020828403121561255957600080fd5b6000610df68484612485565b6000806040838503121561257857600080fd5b60006125848585612485565b925050602061259585828601612485565b9150509250929050565b6000806000604084860312156125b457600080fd5b60006125c08686612485565b935050602084013567ffffffffffffffff8111156125dd57600080fd5b6125e9868287016124fa565b92509250509250925092565b60008060006040848603121561260a57600080fd5b833567ffffffffffffffff81111561262157600080fd5b61262d86828701612490565b9350935050602061264086828701612485565b9150509250925092565b60006020828403121561265c57600080fd5b6000610df684846124d9565b60006020828403121561267a57600080fd5b6000610df684846124e4565b6000806040838503121561269957600080fd5b60006126a585856124ef565b9250506020612595858286016124ef565b600080602083850312156126c957600080fd5b823567ffffffffffffffff8111156126e057600080fd5b6126ec858286016124fa565b92509250509250929050565b60008060006040848603121561270d57600080fd5b833567ffffffffffffffff81111561272457600080fd5b612730868287016124fa565b93509350506020612640868287016124ef565b60006020828403121561275557600080fd5b6000610df684846124ef565b60006020828403121561277357600080fd5b6000610df6848461253c565b60008060006060848603121561279457600080fd5b60006127a086866124ef565b93505060206127b1868287016124ef565b9250506040612640868287016124ef565b6127cb81613788565b82525050565b6127cb6127dd82613788565b6137e7565b6127cb81613793565b6127cb81610c84565b6127cb61280082610c84565b610c84565b600061281082613776565b61281a818561377a565b935061282a8185602086016137bb565b9290920192915050565b6127cb816137a4565b6000612849838561377f565b93506128568385846137af565b61285f836137f8565b9093019392505050565b6000612875838561377a565b93506128828385846137af565b50500190565b600061289382613776565b61289d818561377f565b93506128ad8185602086016137bb565b61285f816137f8565b6000815460018116600081146128d357600181146128f657612935565b607f60028304166128e4818761377a565b60ff1984168152955085019250612935565b60028204612904818761377a565b955061290f8561376a565b60005b8281101561292e57815488820152600190910190602001612912565b5050850192505b505092915050565b600061294a60218361377f565b7f4450525374616b696e673a204e6f206e6577207374616b696e6720706572696f8152601960fa1b602082015260400192915050565b600061298d60248361377f565b7f4450525374616b696e673a20436c61696d20706572696f6420686173207374618152631c9d195960e21b602082015260400192915050565b60006129d360238361377f565b7f4450525374616b696e673a206c61737420706572696f6420776173206e6f7420815262195b9960ea1b602082015260400192915050565b6000612a18601c8361377f565b7f4450525374616b696e673a2041646472657373206172652073616d6500000000815260200192915050565b6000612a5160298361377f565b7f4450525374616b696e673a205573657220646f6573206e6f74206861766520618152681b9e481c9958dbdc9960ba1b602082015260400192915050565b6000612a9c60218361377f565b7f4450525374616b696e673a204e6f7420696e2063757272656e7420706572696f8152601960fa1b602082015260400192915050565b6000612adf601e8361377f565b7f4450525374616b696e673a20445052416464726573732069732073616d650000815260200192915050565b6000612b18601b8361377f565b7f4450525374616b696e673a204e6f74207468617420706572696f640000000000815260200192915050565b6000612b51601e8361377f565b7f4450525374616b696e673a20506c65617365205374616b652066697273740000815260200192915050565b6000612b8a601b8361377f565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000612bc360208361377f565b7f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815260200192915050565b6000612bfc601d8361377f565b7f4450525374616b696e673a205374616b696e67206e6f74207374617274000000815260200192915050565b6000612c3560268361377f565b7f4450525374616b696e673a204e6f74207265616368207468652072656c656173815265652074696d6560d01b602082015260400192915050565b6000612c7d60158361377f565b7411141494dd185ada5b99ce88139bc81c195c9a5bd9605a1b815260200192915050565b6000612cae60208361377f565b7f4450525374616b696e673a204c6576656c20646f6573206e6f74206578697374815260200192915050565b6000612ce7602e8361377f565b7f4450525374616b696e673a205472616e73666572204f776e657273686970207481526d6f207a65726f206164647265737360901b602082015260400192915050565b6000612d3760228361377f565b7f4450525374616b696e673a204450524164647265737320616c72656164792073815261195d60f21b602082015260400192915050565b6000612d7b60258361377f565b7f4450525374616b696e673a204450524164647265737320616c726561647920698152646e2075736560d81b602082015260400192915050565b6000612dc2602d8361377f565b7f4450525374616b696e673a204f6c64207573657220646f6573206e6f7420686181526c1d9948185b9e481c9958dbdc99609a1b602082015260400192915050565b6000612e1160278361377f565b7f4450525374616b696e673a2043616e206f6e6c79207570677261646520796f758152661c881b195d995b60ca1b602082015260400192915050565b6000612e5a60128361377f565b714450525374616b696e673a2050617573652160701b815260200192915050565b6000612e88601f8361377f565b7f4450525374616b696e673a204e6f7420656e6f7567682062616c616e62636500815260200192915050565b6000612ec1601e8361377f565b7f4450525374616b696e673a204e6f742072656c6561736520706572696f640000815260200192915050565b6000612efa60218361377f565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b6000612f3d60168361377f565b7522282929ba30b5b4b7339d102a34b6b29032b93937b960511b815260200192915050565b6000612f6f602c8361377f565b7f4450525374616b696e673a205374616b696e67206e6f74207374617274206f7281526b08185b1c9958591e48195b9960a21b602082015260400192915050565b6000612fbd60248361377f565b7f4450525374616b696e673a204e6f20616374697665207374616b696e672070658152631c9a5bd960e21b602082015260400192915050565b600061300360188361377f565b7f4450525374616b696e673a2057726f6e6720506572696f640000000000000000815260200192915050565b600061303c601f8361377f565b7f4450525374616b696e673a205265776172642074696d65206e6f742073657400815260200192915050565b6000613075603d8361377f565b7f4452505374616b696e673a204e6f742063757272656e7420706572696f642c2081527f74727920746f206d6f766520746f206c61737465737420706572696f64000000602082015260400192915050565b60006130d460298361377f565b7f4450525374616b696e673a204e65772075736572206d757374206120636c65618152686e206164647265737360b81b602082015260400192915050565b600061311f60268361377f565b7f4450525374616b696e673a2055736572206e6f7420616c6c6f7720746f20776981526574686472617760d01b602082015260400192915050565b600061316760318361377f565b7f4450525374616b696e673a20416c7265616479207374616b652c207573652061815270191914dd185ada5b99c81a5b9cdd195859607a1b602082015260400192915050565b60006131ba60328361377f565b7f4450525374616b696e673a20455448206164647265737320616c72656164792081527162696e6420616e204450524164647265737360701b602082015260400192915050565b600061320e602a8361377f565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e8152691bdd081cdd58d8d9595960b21b602082015260400192915050565b600061325a601f8361377f565b7f4450525374616b696e673a205573657220646f6573206e6f74207374616b6500815260200192915050565b600061329360308361377f565b7f4450525374616b696e673a204f6e6c79206f776e65722063616e206f7065726181526f3a32903a3434b990333ab731ba34b7b760811b602082015260400192915050565b60006132e560268361377f565b7f4450525374616b696e673a205265776172642074696d6520697320616c726561815265191e481cd95d60d21b602082015260400192915050565b600061332d601c8361377f565b7f4450525374616b696e673a204d757374207374616b6520666972737400000000815260200192915050565b6000613366601f8361377f565b7f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400815260200192915050565b805160608301906133a384826127eb565b5060208201516133b660208501826127eb565b50604082015161209d60408501826127eb565b60006133d582856127d1565b6014820191506133e582846127f4565b5060200192915050565b60006133fb82856127f4565b6020820191506133e582846127f4565b600061122a8284612805565b6000610df6828486612869565b600061122a82846128b6565b6020810161087182846127c2565b6060810161344c82866127c2565b61345960208301856127c2565b610df660408301846127eb565b6040810161347482856127c2565b61122a60208301846127eb565b6020810161087182846127e2565b6040810161347482856127eb565b602081016108718284612834565b60208082528101610df681848661283d565b6020808252810161122a8184612888565b602080825281016108718161293d565b6020808252810161087181612980565b60208082528101610871816129c6565b6020808252810161087181612a0b565b6020808252810161087181612a44565b6020808252810161087181612a8f565b6020808252810161087181612ad2565b6020808252810161087181612b0b565b6020808252810161087181612b44565b6020808252810161087181612b7d565b6020808252810161087181612bb6565b6020808252810161087181612bef565b6020808252810161087181612c28565b6020808252810161087181612c70565b6020808252810161087181612ca1565b6020808252810161087181612cda565b6020808252810161087181612d2a565b6020808252810161087181612d6e565b6020808252810161087181612db5565b6020808252810161087181612e04565b6020808252810161087181612e4d565b6020808252810161087181612e7b565b6020808252810161087181612eb4565b6020808252810161087181612eed565b6020808252810161087181612f30565b6020808252810161087181612f62565b6020808252810161087181612fb0565b6020808252810161087181612ff6565b602080825281016108718161302f565b6020808252810161087181613068565b60208082528101610871816130c7565b6020808252810161087181613112565b602080825281016108718161315a565b60208082528101610871816131ad565b6020808252810161087181613201565b602080825281016108718161324d565b6020808252810161087181613286565b60208082528101610871816132d8565b6020808252810161087181613320565b6020808252810161087181613359565b606081016108718284613392565b6020810161087182846127eb565b60009081526020902090565b5190565b919050565b90815260200190565b600061087182613798565b151590565b6001600160a01b031690565b600061087182613788565b82818337506000910152565b60005b838110156137d65781810151838201526020016137be565b8381111561209d5750506000910152565b600061087182600061087182613802565b601f01601f191690565b60601b90565b61381181613788565b811461246857600080fd5b61381181613793565b61381181610c8456fea365627a7a723158200213b0eb2a60f3d77ea6f8e16564faf361fd03c3a41ea224e13f00f7ab14d52a6c6578706572696d656e74616cf564736f6c63430005110040000000000000000000000000f3ae5d769e153ef72b4e3591ac004e89f48107a1

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

000000000000000000000000f3ae5d769e153ef72b4e3591ac004e89f48107a1

-----Decoded View---------------
Arg [0] : _dpr (address): 0xf3AE5d769e153Ef72b4e3591aC004E89F48107a1

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000f3ae5d769e153ef72b4e3591ac004e89f48107a1


Deployed ByteCode Sourcemap

16258:17613:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16258:17613:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27929:599;;;:::i;:::-;;;;;;;;;;;;;;;;32488:117;;;;;;;;;:::i;:::-;;;;;;;;32613:115;;;;;;;;;:::i;33259:109::-;;;;;;;;;:::i;:::-;;;;;;;;16550:38;;;:::i;24454:1176::-;;;;;;;;;:::i;25920:308::-;;;;;;;;;:::i;32202:128::-;;;;;;;;;:::i;:::-;;;;;;;;26840:301;;;;;;;;;:::i;21727:1377::-;;;:::i;33478:132::-;;;;;;;;;:::i;33376:94::-;;;:::i;32336:144::-;;;;;;;;;:::i;:::-;;;;;;;;33616:121;;;;;;;;;:::i;30955:211::-;;;;;;;;;:::i;33133:118::-;;;:::i;32736:263::-;;;;;;;;;:::i;25731:183::-;;;;;;;;;:::i;16790:17::-;;;:::i;33745:121::-;;;;;;;;;:::i;16725:20::-;;;:::i;30494:449::-;;;:::i;19228:1305::-;;;;;;;;;:::i;26236:448::-;;;;;;;;;:::i;27149:122::-;;;;;;;;;:::i;20541:1178::-;;;;;;;;;:::i;16753:30::-;;;:::i;29458:636::-;;;;;;;;;:::i;23470:829::-;;;;;;;;;:::i;33007:118::-;;;;;;;;;:::i;28648:802::-;;;;;;;;;:::i;23112:259::-;;;;;;;;;:::i;30128:281::-;;;;;;;;;:::i;16526:17::-;;;:::i;:::-;;;;;;;;27929:599;28032:10;27977:4;28012:31;;;:19;:31;;;;;;28056:18;28048:62;;;;-1:-1:-1;;;28048:62:0;;;;;;;;;;;;;;;;;28115:28;;:::i;:::-;28146:7;28154:14;;:21;;28146:7;28154:21;:18;:21;:::i;:::-;28146:30;;;;;;;;;;;;;;;;;;28115:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28189:19;:17;:19::i;:::-;28181:65;;;;-1:-1:-1;;;28181:65:0;;;;;;;;;28342:23;28354:10;28342:11;:23::i;:::-;28341:24;28333:70;;;;-1:-1:-1;;;28333:70:0;;;;;;;;;28429:10;28408:32;;;;:20;:32;;;;;;;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;28502:14;;:21;;;:18;:21;:::i;:::-;28488:10;28462:37;;;;:25;:37;;;;;:61;-1:-1:-1;27929:599:0;;;-1:-1:-1;27929:599:0:o;32488:117::-;-1:-1:-1;;;;;32574:23:0;32548:7;32574:23;;;:17;:23;;;;;;;32488:117::o;32613:115::-;-1:-1:-1;;;;;32695:25:0;32669:7;32695:25;;;:19;:25;;;;;;;32613:115::o;33259:109::-;33320:13;;:::i;:::-;33346:7;33354:5;33346:14;;;;;;;;;;;;;;;;;;33339:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33259:109;;;:::o;16550:38::-;;;;:::o;24454:1176::-;17775:5;;24541:4;;-1:-1:-1;;;;;17775:5:0;17763:10;:17;17755:78;;;;-1:-1:-1;;;17755:78:0;;;;;;;;;24576:7;-1:-1:-1;;;;;24565:18:0;:7;-1:-1:-1;;;;;24565:18:0;;;24557:59;;;;-1:-1:-1;;;24557:59:0;;;;;;;;;-1:-1:-1;;;;;24635:28:0;;24666:1;24635:28;;;:19;:28;;;;;;24627:90;;;;-1:-1:-1;;;24627:90:0;;;;;;;;;-1:-1:-1;;;;;24736:28:0;;;;;;:19;:28;;;;;;:33;24728:87;;;;-1:-1:-1;;;24728:87:0;;;;;;;;;-1:-1:-1;;;;;24890:28:0;;;;;;;:19;:28;;;;;;;;;24859;;;;;;;;;:59;;;;24960:34;;;:25;:34;;;;;;24923;;;;;;:71;25031:29;;;:20;:29;;;;;24999;;;;;;:61;;;;;;;;;;;;;;;;;;;;;25133:26;;;:17;:26;;;;;;25104;;;;;;:55;25229:25;;;:16;:25;;;;;;25201;;;;;;:53;;;;25320:28;;;:19;:28;;;;;;25300:49;;24879:7;;25300:19;;:49;;25320:28;25300:49;;;;;;;;;;;;;;;;;;:59;;-1:-1:-1;;;;;;25300:59:0;-1:-1:-1;;;;;25300:59:0;;;;;;25401:28;;;-1:-1:-1;25401:28:0;;;:19;:28;;;;;;25370;;;;;;;:59;;;;25401:28;25370:59;25300;-1:-1:-1;25370:59:0;;;;-1:-1:-1;;25370:59:0;;;;;;:::i;:::-;-1:-1:-1;25458:10:0;25440:29;;;;:17;:29;;;;;25472:15;25440:47;;25523:27;;25536:7;;25523:12;:27::i;:::-;25590:7;-1:-1:-1;;;;;25566:32:0;25581:7;-1:-1:-1;;;;;25566:32:0;;;;;;;;;;;-1:-1:-1;25616:4:0;17844:1;24454:1176;;;;:::o;25920:308::-;17775:5;;26002:4;;-1:-1:-1;;;;;17775:5:0;17763:10;:17;17755:78;;;;-1:-1:-1;;;17755:78:0;;;;;;;;;26048:1;26029:14;;:21;;;:18;:21;:::i;:::-;26020:5;:30;;26012:70;;;;-1:-1:-1;;;26012:70:0;;;;;;;;;26087:31;26121:7;26129:5;26121:14;;;;;;;;;;;;;;;;;;;;26140:37;;;26187:20;;26121:14;;-1:-1:-1;26201:5:0;;26173:4;;26187:20;;26121:14;26187:20;-1:-1:-1;26219:4:0;;25920:308;-1:-1:-1;;;25920:308:0:o;32202:128::-;-1:-1:-1;;;;;32297:25:0;;;;;;:19;:25;;;;;;;;;32290:32;;;;;;-1:-1:-1;;32290:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32265:13;;32290:32;;;32297:25;32290:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32202:128;;;:::o;26840:301::-;17775:5;;26910:4;;-1:-1:-1;;;;;17775:5:0;17763:10;:17;17755:78;;;;-1:-1:-1;;;17755:78:0;;;;;;;;;26969:12;;26953:11;;:29;;;:15;:29;:::i;:::-;26934:15;:48;;26926:97;;;;-1:-1:-1;;;26926:97:0;;;;;;;;;27065:5;27055:15;;27034:18;:36;27086:25;;;;;;27055:7;;27086:25;;;;;;;;;;-1:-1:-1;27129:4:0;26840:301;;;:::o;21727:1377::-;17904:5;;21775:4;;-1:-1:-1;;;17904:5:0;;;;:14;17896:45;;;;-1:-1:-1;;;17896:45:0;;;;;;;;;21813:1;21799:11;;:15;21791:59;;;;-1:-1:-1;;;21791:59:0;;;;;;;;;21904:12;;21888:11;;:29;;;:15;:29;:::i;:::-;21869:15;:48;;21861:99;;;;-1:-1:-1;;;21861:99:0;;;;;;;;;21992:10;21974:29;;;;:17;:29;;;;;;21971:126;;22072:12;;22056:11;;:29;;;:15;:29;:::i;:::-;22042:10;22024:29;;;;:17;:29;;;;;:61;21971:126;22195:10;22177:29;;;;:17;:29;;;;;;22158:15;:48;;22150:91;;;;-1:-1:-1;;;22150:91:0;;;;;;;;;22297:10;22252:22;22277:31;;;:19;:31;;;;;;22327:18;22319:59;;;;-1:-1:-1;;;22319:59:0;;;;;;;;;22429:10;22389:20;22412:28;;;:16;:28;;;;;;22509:18;;22412:28;;22389:20;22478:50;;:26;:14;22497:6;22478:26;:18;:26;:::i;:::-;:30;:50;:30;:50;:::i;:::-;22597:10;22539:17;22579:29;;;:17;:29;;;;;;22451:77;;-1:-1:-1;22539:17:0;22559:62;;22614:6;;22559:50;;:15;;:50;:19;:50;:::i;:62::-;22745:10;22632:26;22725:31;;;:19;:31;;;;;;22539:82;;-1:-1:-1;22661:28:0;;;;22703:53;;22700:186;;-1:-1:-1;22813:10:0;22793:31;;;;:19;:31;;;;;;;22839:35;;;22700:186;22913:10;22896:28;;;;:16;:28;;;;;:49;;;22982:36;22927:18;23005:12;22982:36;:22;:36;:::i;:::-;23029:3;;22956:62;;-1:-1:-1;23029:45:0;;-1:-1:-1;;;;;23029:3:0;23046:10;22956:62;23029:45;:16;:45;:::i;:::-;23092:4;23085:11;;;;;;;;17952:1;21727:1377;:::o;33478:132::-;33544:13;;:::i;:::-;-1:-1:-1;;;;;;33576:26:0;;;;;:20;:26;;;;;;;;;33569:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33478:132::o;33376:94::-;33449:11;;33376:94;:::o;32336:144::-;32423:7;32443:19;32463:11;;32443:32;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32443:32:0;;-1:-1:-1;32336:144:0;;;;:::o;33616:121::-;-1:-1:-1;;;;;33701:31:0;33681:7;33701:31;;;:25;:31;;;;;;;33616:121::o;30955:211::-;17775:5;;31035:4;;-1:-1:-1;;;;;17775:5:0;17763:10;:17;17755:78;;;;-1:-1:-1;;;17755:78:0;;;;;;;;;31051:15;:34;;-1:-1:-1;;;;;;31051:34:0;-1:-1:-1;;;;;31051:34:0;;;;;;;;31101:35;;;;-1:-1:-1;;31101:35:0;-1:-1:-1;31154:4:0;30955:211;;;:::o;33133:118::-;33213:18;;33187:7;;33213:30;;33236:6;33213:30;:22;:30;:::i;:::-;33206:37;;33133:118;:::o;32736:263::-;-1:-1:-1;;;;;32846:25:0;;32802:7;32846:25;;;:19;:25;;;;;;32939:18;;32802:7;;32908:50;;:26;32846:25;32927:6;32908:26;:18;:26;:::i;:50::-;32882:76;32736:263;-1:-1:-1;;;;32736:263:0:o;25731:183::-;17775:5;;25799:4;;-1:-1:-1;;;;;17775:5:0;17763:10;:17;17755:78;;;;-1:-1:-1;;;17755:78:0;;;;;;;;;25832:5;;25815:3;;:30;;-1:-1:-1;;;;;25815:3:0;;;;25832:5;25838:6;25815:30;:16;:30;:::i;:::-;25878:5;;25861:23;;-1:-1:-1;;;;;25878:5:0;;;;25861:23;;25878:5;;25861:23;-1:-1:-1;25902:4:0;25731:183;;;:::o;16790:17::-;;;-1:-1:-1;;;16790:17:0;;;;;:::o;33745:121::-;-1:-1:-1;;;;;33835:23:0;33809:7;33835:23;;;:17;:23;;;;;;;33745:121::o;16725:20::-;;;-1:-1:-1;;;;;16725:20:0;;:::o;30494:449::-;30591:10;30530:4;30571:31;;;:19;:31;;;;;;30621:17;30613:61;;;;-1:-1:-1;;;30613:61:0;;;;;;;;;30693:15;;-1:-1:-1;;;;;30693:15:0;30685:71;;;;-1:-1:-1;;;30685:71:0;;;;;;;;;30767:30;30780:10;30792:4;30767:12;:30::i;:::-;30825:15;;30808:3;;:49;;-1:-1:-1;;;;;30808:3:0;;;;30825:15;30842:14;30808:49;:16;:49;:::i;:::-;30881:15;;30873:40;;30898:14;;-1:-1:-1;;;;;30881:15:0;;30873:40;;30881:15;;30873:40;30931:4;30924:11;;;30494:449;:::o;19228:1305::-;17904:5;;19317:4;;-1:-1:-1;;;17904:5:0;;;;:14;17896:45;;;;-1:-1:-1;;;17896:45:0;;;;;;;;;19387:7;:14;19379:67;;;;-1:-1:-1;;;19379:67:0;;;;;;;;;19456:28;;:::i;:::-;19487:7;19495:14;;:21;;19487:7;19495:21;:18;:21;:::i;:::-;19487:30;;;;;;;;;;;;;;;;;;19456:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19535:19;:17;:19::i;:::-;19527:75;;;;-1:-1:-1;;;19527:75:0;;;;;;;;;19629:27;:20;19654:1;19629:27;:24;:27;:::i;:::-;19620:5;:36;;19612:81;;;;-1:-1:-1;;;19612:81:0;;;;;;;;;19731:10;19711:31;;;;:19;:31;;;;;;:36;19703:98;;;;-1:-1:-1;;;19703:98:0;;;;;;;;;19890:39;19906:10;19918;;19890:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;19890:15:0;;-1:-1:-1;;;19890:39:0:i;:::-;19939:22;19964:13;19978:5;19964:20;;;;;;;;;19994:3;;19964:20;;-1:-1:-1;19994:63:0;;-1:-1:-1;;;;;19994:3:0;20015:10;20035:4;19964:20;19994:63;:20;:63;:::i;:::-;20087:10;20067:31;;;;:19;:31;;;;;;;;:48;;;20125:17;:29;;;;;20157:15;20125:47;;20182:19;:31;;;;;:44;;20216:10;;20182:44;:::i;:::-;;20270:10;20236:19;20256:10;;20236:31;;;;;;;;;;;;;;;;;;;;;;;;:44;;-1:-1:-1;;;;;;20236:44:0;-1:-1:-1;;;;;20236:44:0;;;;;;;;;;;20348:10;-1:-1:-1;20327:32:0;;;:20;:32;;;;;:49;;;;;;;;-1:-1:-1;20327:49:0;;;;;;;;;;;;;;;;20423:14;;:21;;:18;:21::i;:::-;20409:10;20383:37;;;;:25;:37;;;;;;;:61;;;;20459:45;;20489:14;;20409:10;20459:45;;;;20477:10;;;;20459:45;;;;;;;;;;20521:4;20514:11;;;;17952:1;19228:1305;;;;;:::o;26236:448::-;17775:5;;26342:4;;-1:-1:-1;;;;;17775:5:0;17763:10;:17;17755:78;;;;-1:-1:-1;;;17755:78:0;;;;;;;;;26366:7;:14;26358:52;;;;-1:-1:-1;;;26358:52:0;;;;;;;;;26457:1;26438:14;;:21;;;:18;:21;:::i;:::-;26429:5;:30;;26421:67;;;;-1:-1:-1;;;26421:67:0;;;;;;;;;26499:21;26523:7;26531:5;26523:14;;;;;;;;;;;;;;;;;;26499:38;;26568:10;26548:6;:17;;:30;;;;26607:8;26589:6;:15;;:26;;;;26648:5;26631:45;26655:10;26667:8;26631:45;;;;;;;;;;;;;;;;17844:1;26236:448;;;;;:::o;27149:122::-;17775:5;;27209:4;;-1:-1:-1;;;;;17775:5:0;17763:10;:17;17755:78;;;;-1:-1:-1;;;17755:78:0;;;;;;;;;-1:-1:-1;27225:5:0;:16;;;;;-1:-1:-1;;;27225:16:0;-1:-1:-1;;;;27225:16:0;;;;;;-1:-1:-1;27149:122:0;;;:::o;20541:1178::-;17904:5;;20608:4;;-1:-1:-1;;;17904:5:0;;;;:14;17896:45;;;;-1:-1:-1;;;17896:45:0;;;;;;;;;20669:7;:14;20661:66;;;;-1:-1:-1;;;20661:66:0;;;;;;;;;20746:23;20758:10;20746:11;:23::i;:::-;20738:97;;;;-1:-1:-1;;;20738:97:0;;;;;;;;;20854:19;:17;:19::i;:::-;20846:76;;;;-1:-1:-1;;;20846:76:0;;;;;;;;;20950:27;:20;20975:1;20950:27;:24;:27;:::i;:::-;20941:5;:36;;20933:81;;;;-1:-1:-1;;;20933:81:0;;;;;;;;;21025:24;21052:13;21066:5;21052:20;;;;;;;;;21130:10;21083:24;21110:31;;;:19;:31;;;;;;21052:20;;-1:-1:-1;21160:20:0;21152:63;;;;-1:-1:-1;;;21152:63:0;;;;;;;;;21253:16;21234;:35;21226:87;;;;-1:-1:-1;;;21226:87:0;;;;;;;;;21324:18;21345:38;:16;21366;21345:38;:20;:38;:::i;:::-;21394:3;;21324:59;;-1:-1:-1;21394:59:0;;-1:-1:-1;;;;;21394:3:0;21415:10;21435:4;21324:59;21394;:20;:59;:::i;:::-;21536:13;21550:5;21536:20;;;;;;;;;21522:10;21502:31;;;;:19;:31;;;;;;;;:54;;;;21567:17;:29;;;;;21599:15;21567:47;;21630:59;;21672:16;;21654;;21522:10;21630:59;;21502:31;21630:59;-1:-1:-1;21707:4:0;;20541:1178;-1:-1:-1;;;;20541:1178:0:o;16753:30::-;;;-1:-1:-1;;;;;16753:30:0;;:::o;29458:636::-;17775:5;;29551:4;;-1:-1:-1;;;;;17775:5:0;17763:10;:17;17755:78;;;;-1:-1:-1;;;17755:78:0;;;;;;;;;29588:11;29575:9;:24;;29567:59;;;;-1:-1:-1;;;29567:59:0;;;;;;;;;29640:7;:14;:19;29637:257;;29675:28;;:::i;:::-;29706:7;29714:14;;:21;;29706:7;29714:21;:18;:21;:::i;:::-;29706:30;;;;;;;;;;;;;;;;;;29675:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29751:16;29770:14;:23;;;29751:42;;29834:8;29816:15;:26;29808:74;;;;-1:-1:-1;;;29808:74:0;;;;;;;;;29637:257;;;29904:15;;:::i;:::-;29930:12;;;:26;;;29967:10;;;;:22;;;30000:7;27:10:-1;;23:18;;;45:23;;-1:-1;30000:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30031:33;29967:22;;29930:26;;30031:33;;-1:-1:-1;30031:33:0;-1:-1:-1;30082:4:0;;29458:636;-1:-1:-1;;;29458:636:0:o;23470:829::-;17775:5;;23566:4;;-1:-1:-1;;;;;17775:5:0;17763:10;:17;17755:78;;;;-1:-1:-1;;;17755:78:0;;;;;;;;;-1:-1:-1;;;;;23590:25:0;;23618:1;23590:25;;;:19;:25;;;;;;23582:83;;;;-1:-1:-1;;;23582:83:0;;;;;;;;;23727:1;-1:-1:-1;;;;;23684:45:0;:19;23704:10;;23684:31;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23684:31:0;:45;23676:95;;;;-1:-1:-1;;;23676:95:0;;;;;;;;;-1:-1:-1;;;;;23837:25:0;;23782;23837;;;:19;:25;;;;;;;;23820:43;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;23820:43:0;;;23810:54;;;;;;23782:82;;23875:25;23930:10;;23913:28;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;23913:28:0;;;23903:39;;;;;;23875:67;;23982:17;23961;:38;;23953:81;;;;-1:-1:-1;;;23953:81:0;;;;;;;;;-1:-1:-1;;;;;24046:25:0;;;;;;:19;:25;;;;;:38;;24074:10;;24046:38;:::i;:::-;-1:-1:-1;;;;;;24122:25:0;;;;;;:19;:25;;;;;;;24102:46;;:19;;:46;;;;;;;;;;;;;;;;;;24095:53;;-1:-1:-1;;;;;;24095:53:0;;;24193:4;;24159:19;;:31;;24179:10;;;;24159:31;;;;;;;;;;;;;;;;:38;;-1:-1:-1;;;;;24159:38:0;;;;-1:-1:-1;;;;;;24159:38:0;;;;;;;;;;24213:54;;;;24230:17;;24249;;24213:54;;;;;;;;;;-1:-1:-1;24285:4:0;;23470:829;-1:-1:-1;;;;;23470:829:0:o;33007:118::-;-1:-1:-1;;;;;33095:22:0;33069:7;33095:22;;;:16;:22;;;;;;;33007:118::o;28648:802::-;-1:-1:-1;;;;;28833:31:0;;28729:4;28833:31;;;:25;:31;;;;;;28884:7;:14;;28729:4;;28884:7;28833:31;;28884:14;;;;;;;;;;;;;;;;;;:28;;-1:-1:-1;28937:22:0;28954:4;28937:16;:22::i;:::-;28917:42;;28972:41;28991:4;;28972:41;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;28997:4:0;;-1:-1:-1;29003:9:0;;-1:-1:-1;28972:18:0;;-1:-1:-1;28972:41:0:i;:::-;28964:92;;;;-1:-1:-1;;;28964:92:0;;;;;;;;;-1:-1:-1;;;;;29087:25:0;;29061:23;29087:25;;;:19;:25;;;;;;29131:18;29123:62;;;;-1:-1:-1;;;29123:62:0;;;;;;;;;29223:3;;:28;;-1:-1:-1;;;29223:28:0;;-1:-1:-1;;;;;29223:3:0;;;;:13;;:28;;29245:4;;29223:28;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29223:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29223:28:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;29223:28:0;;;;;;;;;29204:15;:47;;29196:91;;;;-1:-1:-1;;;29196:91:0;;;;;;;;;29292:24;29305:4;29311;29292:12;:24::i;:::-;29327:3;;:39;;-1:-1:-1;;;;;29327:3:0;29344:4;29350:15;29327:39;:16;:39;:::i;:::-;29382:38;;29404:15;;-1:-1:-1;;;;;29382:38:0;;;;;;;;-1:-1:-1;29438:4:0;;28648:802;-1:-1:-1;;;;;;;28648:802:0:o;23112:259::-;17775:5;;23184:4;;-1:-1:-1;;;;;17775:5:0;17763:10;:17;17755:78;;;;-1:-1:-1;;;17755:78:0;;;;;;;;;-1:-1:-1;;;;;23208:22:0;;23200:81;;;;-1:-1:-1;;;23200:81:0;;;;;;;;;23292:5;:16;;-1:-1:-1;;;;;;23292:16:0;-1:-1:-1;;;;;23292:16:0;;;;;;;;23324:39;;23342:10;;23324:39;;-1:-1:-1;;23324:39:0;23112:259;;;:::o;30128:281::-;17775:5;;30204:4;;-1:-1:-1;;;;;17775:5:0;17763:10;:17;17755:78;;;;-1:-1:-1;;;17755:78:0;;;;;;;;;30228:11;;:16;30220:68;;;;-1:-1:-1;;;30220:68:0;;;;;;;;;30299:11;:30;;;30345:34;;30313:16;;30345:34;;;;;-1:-1:-1;30397:4:0;30128:281;;;:::o;16526:17::-;;;-1:-1:-1;;;;;16526:17:0;;:::o;1353:136::-;1411:7;1438:43;1442:1;1445;1438:43;;;;;;;;;;;;;;;;;:3;:43::i;31901:293::-;31946:4;31956:28;;:::i;:::-;31987:7;31995:14;;:21;;31987:7;31995:21;:18;:21;:::i;:::-;31987:30;;;;;;;;;;;;;;;;;31956:61;;;;;;;;31987:30;;;;;;;31956:61;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32128:15:0;:29;-1:-1:-1;32128:29:0;;;:60;;;32173:15;32161:8;:27;;32128:60;32120:69;;;;;31901:293;:::o;31174:310::-;31225:4;31235:28;;:::i;:::-;31266:7;31274:14;;:21;;31266:7;31274:21;:18;:21;:::i;:::-;31266:30;;;;;;;;;;;;;;;;;;31235:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31301:25;;:::i;:::-;-1:-1:-1;;;;;;31329:26:0;;;;;;:20;:26;;;;;;;;;31301:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31373:25;;;;:51;:102;;;;-1:-1:-1;31455:20:0;;;;;31428:23;;;:47;;31366:110;-1:-1:-1;;31174:310:0:o;27280:452::-;-1:-1:-1;;;;;27364:25:0;;;;;;:19;:25;;;;;;;;27357:32;;;27407:17;:23;;;;;27400:30;;;27448:16;:22;;;;;27441:29;;;27482:25;:31;;;;;27475:38;;;27525:20;:26;;;;;27518:33;;;;;;;;;;;;;;27569:17;:23;;;;;27562:30;27603:85;;;;-1:-1:-1;;;;;27656:25:0;;;;;;:19;:25;;;;;;;27636:46;;:19;;:46;;;;;;;;;;;;;;;;;;27629:53;;-1:-1:-1;;;;;;27629:53:0;;;27603:85;-1:-1:-1;;;;;27699:25:0;;;;;;:19;:25;;;;;27692:32;;;:::i;:::-;27280:452;;:::o;897:181::-;955:7;987:5;;;1011:6;;;;1003:46;;;;-1:-1:-1;;;1003:46:0;;;;;;;;2269:471;2327:7;2572:6;2568:47;;-1:-1:-1;2602:1:0;2595:8;;2568:47;2639:5;;;2643:1;2639;:5;:1;2663:5;;;;;:10;2655:56;;;;-1:-1:-1;;;2655:56:0;;;;;;;;3208:132;3266:7;3293:39;3297:1;3300;3293:39;;;;;;;;;;;;;;;;;:3;:39::i;11846:176::-;11955:58;;11929:85;;11948:5;;-1:-1:-1;;;11978:23:0;11955:58;;12003:2;;12007:5;;11955:58;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;11955:58:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;11955:58:0;;;179:29:-1;;;;160:49;;;11929:18:0;:85::i;:::-;11846:176;;;:::o;31492:403::-;31650:78;31615:19;:29;31635:8;-1:-1:-1;;;;;31615:29:0;-1:-1:-1;;;;;31615:29:0;;;;;;;;;;;;31598:47;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;31598:47:0;;;31588:58;;;;;;:140;31580:187;;;;-1:-1:-1;;;31580:187:0;;;;;;;;;31830:1;-1:-1:-1;;;;;31786:46:0;:19;31806:11;31786:32;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31786:32:0;:46;31778:109;;;;-1:-1:-1;;;31778:109:0;;;;;;;;12030:204;12157:68;;12131:95;;12150:5;;-1:-1:-1;;;12180:27:0;12157:68;;12209:4;;12215:2;;12219:5;;12157:68;;;;12131:95;12030:204;;;;:::o;27738:185::-;-1:-1:-1;;;;;27832:25:0;;27794:7;27832:25;;;:19;:25;;;;;;;;;27879:38;;27832:25;;27879:38;;27852:4;;27832:25;;27879:38;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;27879:38:0;;;27869:49;;;;;;27862:56;;;27738:185;;;:::o;15455:796::-;15546:4;15586;15546;15603:525;15627:5;:12;15623:1;:16;15603:525;;;15661:20;15684:5;15690:1;15684:8;;;;;;;;;;;;;;15661:31;;15729:12;15713;:28;15709:408;;15883:12;15897;15866:44;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;15866:44:0;;;15856:55;;;;;;15841:70;;15709:408;;;16073:12;16087;16056:44;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;16056:44:0;;;16046:55;;;;;;16031:70;;15709:408;-1:-1:-1;15641:3:0;;15603:525;;;-1:-1:-1;16223:20:0;;;;15455:796;-1:-1:-1;;;15455:796:0:o;1826:192::-;1912:7;1948:12;1940:6;;;;1932:29;;;;-1:-1:-1;;;1932:29:0;;;;;;;;;;-1:-1:-1;;;1984:5:0;;;1826:192::o;3870:345::-;3956:7;4058:12;4051:5;4043:28;;;;-1:-1:-1;;;4043:28:0;;;;;;;;;;;4082:9;4098:1;4094;:5;;;;;;;3870:345;-1:-1:-1;;;;;3870:345:0:o;13885:1114::-;14489:27;14497:5;-1:-1:-1;;;;;14489:25:0;;:27::i;:::-;14481:71;;;;-1:-1:-1;;;14481:71:0;;;;;;;;;14626:12;14640:23;14675:5;-1:-1:-1;;;;;14667:19:0;14687:4;14667:25;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;14625:67:0;;;;14711:7;14703:52;;;;-1:-1:-1;;;14703:52:0;;;;;;;;;14772:17;;:21;14768:224;;14914:10;14903:30;;;;;;;;;;;;;;14895:85;;;;-1:-1:-1;;;14895:85:0;;;;;;;;8970:619;9030:4;9498:20;;9341:66;9538:23;;;;;;:42;;-1:-1:-1;;9565:15:0;;;8970:619;-1:-1:-1;;8970:619:0:o;16258:17613::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16258:17613:0;;;-1:-1:-1;16258:17613:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16258:17613:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;5:130:-1;72:20;;97:33;72:20;97:33;;160:352;;;290:3;283:4;275:6;271:17;267:27;257:2;;308:1;305;298:12;257:2;-1:-1;328:20;;368:18;357:30;;354:2;;;400:1;397;390:12;354:2;434:4;426:6;422:17;410:29;;485:3;477:4;469:6;465:17;455:8;451:32;448:41;445:2;;;502:1;499;492:12;445:2;250:262;;;;;;520:124;584:20;;609:30;584:20;609:30;;651:128;726:13;;744:30;726:13;744:30;;786:130;853:20;;878:33;853:20;878:33;;938:337;;;1053:3;1046:4;1038:6;1034:17;1030:27;1020:2;;1071:1;1068;1061:12;1020:2;-1:-1;1091:20;;1131:18;1120:30;;1117:2;;;1163:1;1160;1153:12;1117:2;1197:4;1189:6;1185:17;1173:29;;1248:3;1240:4;1232:6;1228:17;1218:8;1214:32;1211:41;1208:2;;;1265:1;1262;1255:12;1420:134;1498:13;;1516:33;1498:13;1516:33;;1561:241;;1665:2;1653:9;1644:7;1640:23;1636:32;1633:2;;;1681:1;1678;1671:12;1633:2;1716:1;1733:53;1778:7;1758:9;1733:53;;1809:366;;;1930:2;1918:9;1909:7;1905:23;1901:32;1898:2;;;1946:1;1943;1936:12;1898:2;1981:1;1998:53;2043:7;2023:9;1998:53;;;1988:63;;1960:97;2088:2;2106:53;2151:7;2142:6;2131:9;2127:22;2106:53;;;2096:63;;2067:98;1892:283;;;;;;2182:492;;;;2323:2;2311:9;2302:7;2298:23;2294:32;2291:2;;;2339:1;2336;2329:12;2291:2;2374:1;2391:53;2436:7;2416:9;2391:53;;;2381:63;;2353:97;2509:2;2498:9;2494:18;2481:32;2533:18;2525:6;2522:30;2519:2;;;2565:1;2562;2555:12;2519:2;2593:65;2650:7;2641:6;2630:9;2626:22;2593:65;;;2583:75;;;;2460:204;2285:389;;;;;;2681:522;;;;2837:2;2825:9;2816:7;2812:23;2808:32;2805:2;;;2853:1;2850;2843:12;2805:2;2888:31;;2939:18;2928:30;;2925:2;;;2971:1;2968;2961:12;2925:2;2999:80;3071:7;3062:6;3051:9;3047:22;2999:80;;;2989:90;;;;2867:218;3116:2;3134:53;3179:7;3170:6;3159:9;3155:22;3134:53;;;3124:63;;3095:98;2799:404;;;;;;3210:235;;3311:2;3299:9;3290:7;3286:23;3282:32;3279:2;;;3327:1;3324;3317:12;3279:2;3362:1;3379:50;3421:7;3401:9;3379:50;;3452:257;;3564:2;3552:9;3543:7;3539:23;3535:32;3532:2;;;3580:1;3577;3570:12;3532:2;3615:1;3632:61;3685:7;3665:9;3632:61;;3716:366;;;3837:2;3825:9;3816:7;3812:23;3808:32;3805:2;;;3853:1;3850;3843:12;3805:2;3888:1;3905:53;3950:7;3930:9;3905:53;;;3895:63;;3867:97;3995:2;4013:53;4058:7;4049:6;4038:9;4034:22;4013:53;;4089:367;;;4213:2;4201:9;4192:7;4188:23;4184:32;4181:2;;;4229:1;4226;4219:12;4181:2;4264:31;;4315:18;4304:30;;4301:2;;;4347:1;4344;4337:12;4301:2;4375:65;4432:7;4423:6;4412:9;4408:22;4375:65;;;4365:75;;;;4243:203;4175:281;;;;;;4463:492;;;;4604:2;4592:9;4583:7;4579:23;4575:32;4572:2;;;4620:1;4617;4610:12;4572:2;4655:31;;4706:18;4695:30;;4692:2;;;4738:1;4735;4728:12;4692:2;4766:65;4823:7;4814:6;4803:9;4799:22;4766:65;;;4756:75;;;;4634:203;4868:2;4886:53;4931:7;4922:6;4911:9;4907:22;4886:53;;4962:241;;5066:2;5054:9;5045:7;5041:23;5037:32;5034:2;;;5082:1;5079;5072:12;5034:2;5117:1;5134:53;5179:7;5159:9;5134:53;;5210:263;;5325:2;5313:9;5304:7;5300:23;5296:32;5293:2;;;5341:1;5338;5331:12;5293:2;5376:1;5393:64;5449:7;5429:9;5393:64;;5853:491;;;;5991:2;5979:9;5970:7;5966:23;5962:32;5959:2;;;6007:1;6004;5997:12;5959:2;6042:1;6059:53;6104:7;6084:9;6059:53;;;6049:63;;6021:97;6149:2;6167:53;6212:7;6203:6;6192:9;6188:22;6167:53;;;6157:63;;6128:98;6257:2;6275:53;6320:7;6311:6;6300:9;6296:22;6275:53;;6351:113;6434:24;6452:5;6434:24;;;6429:3;6422:37;6416:48;;;6471:152;6572:45;6592:24;6610:5;6592:24;;;6572:45;;6630:104;6707:21;6722:5;6707:21;;6741:103;6814:24;6832:5;6814:24;;6971:152;7072:45;7092:24;7110:5;7092:24;;;7072:45;;7130:356;;7258:38;7290:5;7258:38;;;7308:88;7389:6;7384:3;7308:88;;;7301:95;;7401:52;7446:6;7441:3;7434:4;7427:5;7423:16;7401:52;;;7465:16;;;;;7238:248;-1:-1;;7238:248;7493:154;7590:51;7635:5;7590:51;;7679:300;;7795:71;7859:6;7854:3;7795:71;;;7788:78;;7878:43;7914:6;7909:3;7902:5;7878:43;;;7943:29;7965:6;7943:29;;;7934:39;;;;7781:198;-1:-1;;;7781:198;8012:313;;8146:89;8228:6;8223:3;8146:89;;;8139:96;;8247:43;8283:6;8278:3;8271:5;8247:43;;;-1:-1;;8303:16;;8132:193;8333:347;;8445:39;8478:5;8445:39;;;8496:71;8560:6;8555:3;8496:71;;;8489:78;;8572:52;8617:6;8612:3;8605:4;8598:5;8594:16;8572:52;;;8645:29;8667:6;8645:29;;9079:884;;9216:5;9210:12;9250:1;9239:9;9235:17;9263:1;9258:268;;;;9537:1;9532:425;;;;9228:729;;9258:268;9336:4;9332:1;9321:9;9317:17;9313:28;9355:89;9437:6;9432:3;9355:89;;;-1:-1;;9463:25;;9451:38;;9348:96;-1:-1;9503:16;;;-1:-1;9258:268;;9532:425;9601:1;9590:9;9586:17;9617:89;9699:6;9694:3;9617:89;;;9610:96;;9728:38;9760:5;9728:38;;;9782:1;9790:130;9804:6;9801:1;9798:13;9790:130;;;9863:14;;9850:11;;;9843:35;9910:1;9897:15;;;;9826:4;9819:12;9790:130;;;-1:-1;;9934:16;;;-1:-1;9228:729;;9186:777;;;;;;9972:370;;10132:67;10196:2;10191:3;10132:67;;;10232:34;10212:55;;-1:-1;;;10296:2;10287:12;;10280:25;10333:2;10324:12;;10118:224;-1:-1;;10118:224;10351:373;;10511:67;10575:2;10570:3;10511:67;;;10611:34;10591:55;;-1:-1;;;10675:2;10666:12;;10659:28;10715:2;10706:12;;10497:227;-1:-1;;10497:227;10733:372;;10893:67;10957:2;10952:3;10893:67;;;10993:34;10973:55;;-1:-1;;;11057:2;11048:12;;11041:27;11096:2;11087:12;;10879:226;-1:-1;;10879:226;11114:328;;11274:67;11338:2;11333:3;11274:67;;;11374:30;11354:51;;11433:2;11424:12;;11260:182;-1:-1;;11260:182;11451:378;;11611:67;11675:2;11670:3;11611:67;;;11711:34;11691:55;;-1:-1;;;11775:2;11766:12;;11759:33;11820:2;11811:12;;11597:232;-1:-1;;11597:232;11838:370;;11998:67;12062:2;12057:3;11998:67;;;12098:34;12078:55;;-1:-1;;;12162:2;12153:12;;12146:25;12199:2;12190:12;;11984:224;-1:-1;;11984:224;12217:330;;12377:67;12441:2;12436:3;12377:67;;;12477:32;12457:53;;12538:2;12529:12;;12363:184;-1:-1;;12363:184;12556:327;;12716:67;12780:2;12775:3;12716:67;;;12816:29;12796:50;;12874:2;12865:12;;12702:181;-1:-1;;12702:181;12892:330;;13052:67;13116:2;13111:3;13052:67;;;13152:32;13132:53;;13213:2;13204:12;;13038:184;-1:-1;;13038:184;13231:327;;13391:67;13455:2;13450:3;13391:67;;;13491:29;13471:50;;13549:2;13540:12;;13377:181;-1:-1;;13377:181;13567:332;;13727:67;13791:2;13786:3;13727:67;;;13827:34;13807:55;;13890:2;13881:12;;13713:186;-1:-1;;13713:186;13908:329;;14068:67;14132:2;14127:3;14068:67;;;14168:31;14148:52;;14228:2;14219:12;;14054:183;-1:-1;;14054:183;14246:375;;14406:67;14470:2;14465:3;14406:67;;;14506:34;14486:55;;-1:-1;;;14570:2;14561:12;;14554:30;14612:2;14603:12;;14392:229;-1:-1;;14392:229;14630:321;;14790:67;14854:2;14849:3;14790:67;;;-1:-1;;;14870:44;;14942:2;14933:12;;14776:175;-1:-1;;14776:175;14960:332;;15120:67;15184:2;15179:3;15120:67;;;15220:34;15200:55;;15283:2;15274:12;;15106:186;-1:-1;;15106:186;15301:383;;15461:67;15525:2;15520:3;15461:67;;;15561:34;15541:55;;-1:-1;;;15625:2;15616:12;;15609:38;15675:2;15666:12;;15447:237;-1:-1;;15447:237;15693:371;;15853:67;15917:2;15912:3;15853:67;;;15953:34;15933:55;;-1:-1;;;16017:2;16008:12;;16001:26;16055:2;16046:12;;15839:225;-1:-1;;15839:225;16073:374;;16233:67;16297:2;16292:3;16233:67;;;16333:34;16313:55;;-1:-1;;;16397:2;16388:12;;16381:29;16438:2;16429:12;;16219:228;-1:-1;;16219:228;16456:382;;16616:67;16680:2;16675:3;16616:67;;;16716:34;16696:55;;-1:-1;;;16780:2;16771:12;;16764:37;16829:2;16820:12;;16602:236;-1:-1;;16602:236;16847:376;;17007:67;17071:2;17066:3;17007:67;;;17107:34;17087:55;;-1:-1;;;17171:2;17162:12;;17155:31;17214:2;17205:12;;16993:230;-1:-1;;16993:230;17232:318;;17392:67;17456:2;17451:3;17392:67;;;-1:-1;;;17472:41;;17541:2;17532:12;;17378:172;-1:-1;;17378:172;17559:331;;17719:67;17783:2;17778:3;17719:67;;;17819:33;17799:54;;17881:2;17872:12;;17705:185;-1:-1;;17705:185;17899:330;;18059:67;18123:2;18118:3;18059:67;;;18159:32;18139:53;;18220:2;18211:12;;18045:184;-1:-1;;18045:184;18238:370;;18398:67;18462:2;18457:3;18398:67;;;18498:34;18478:55;;-1:-1;;;18562:2;18553:12;;18546:25;18599:2;18590:12;;18384:224;-1:-1;;18384:224;18617:322;;18777:67;18841:2;18836:3;18777:67;;;-1:-1;;;18857:45;;18930:2;18921:12;;18763:176;-1:-1;;18763:176;18948:381;;19108:67;19172:2;19167:3;19108:67;;;19208:34;19188:55;;-1:-1;;;19272:2;19263:12;;19256:36;19320:2;19311:12;;19094:235;-1:-1;;19094:235;19338:373;;19498:67;19562:2;19557:3;19498:67;;;19598:34;19578:55;;-1:-1;;;19662:2;19653:12;;19646:28;19702:2;19693:12;;19484:227;-1:-1;;19484:227;19720:324;;19880:67;19944:2;19939:3;19880:67;;;19980:26;19960:47;;20035:2;20026:12;;19866:178;-1:-1;;19866:178;20053:331;;20213:67;20277:2;20272:3;20213:67;;;20313:33;20293:54;;20375:2;20366:12;;20199:185;-1:-1;;20199:185;20393:398;;20553:67;20617:2;20612:3;20553:67;;;20653:34;20633:55;;20722:31;20717:2;20708:12;;20701:53;20782:2;20773:12;;20539:252;-1:-1;;20539:252;20800:378;;20960:67;21024:2;21019:3;20960:67;;;21060:34;21040:55;;-1:-1;;;21124:2;21115:12;;21108:33;21169:2;21160:12;;20946:232;-1:-1;;20946:232;21187:375;;21347:67;21411:2;21406:3;21347:67;;;21447:34;21427:55;;-1:-1;;;21511:2;21502:12;;21495:30;21553:2;21544:12;;21333:229;-1:-1;;21333:229;21571:386;;21731:67;21795:2;21790:3;21731:67;;;21831:34;21811:55;;-1:-1;;;21895:2;21886:12;;21879:41;21948:2;21939:12;;21717:240;-1:-1;;21717:240;21966:387;;22126:67;22190:2;22185:3;22126:67;;;22226:34;22206:55;;-1:-1;;;22290:2;22281:12;;22274:42;22344:2;22335:12;;22112:241;-1:-1;;22112:241;22362:379;;22522:67;22586:2;22581:3;22522:67;;;22622:34;22602:55;;-1:-1;;;22686:2;22677:12;;22670:34;22732:2;22723:12;;22508:233;-1:-1;;22508:233;22750:331;;22910:67;22974:2;22969:3;22910:67;;;23010:33;22990:54;;23072:2;23063:12;;22896:185;-1:-1;;22896:185;23090:385;;23250:67;23314:2;23309:3;23250:67;;;23350:34;23330:55;;-1:-1;;;23414:2;23405:12;;23398:40;23466:2;23457:12;;23236:239;-1:-1;;23236:239;23484:375;;23644:67;23708:2;23703:3;23644:67;;;23744:34;23724:55;;-1:-1;;;23808:2;23799:12;;23792:30;23850:2;23841:12;;23630:229;-1:-1;;23630:229;23868:328;;24028:67;24092:2;24087:3;24028:67;;;24128:30;24108:51;;24187:2;24178:12;;24014:182;-1:-1;;24014:182;24205:331;;24365:67;24429:2;24424:3;24365:67;;;24465:33;24445:54;;24527:2;24518:12;;24351:185;-1:-1;;24351:185;24603:645;24817:23;;24742:4;24733:14;;;24846:63;24737:3;24817:23;24846:63;;;24762:153;24994:4;24987:5;24983:16;24977:23;25006:63;25063:4;25058:3;25054:14;25040:12;25006:63;;;24925:150;25152:4;25145:5;25141:16;25135:23;25164:63;25221:4;25216:3;25212:14;25198:12;25164:63;;25644:383;;25791:75;25862:3;25853:6;25791:75;;;25888:2;25883:3;25879:12;25872:19;;25902:75;25973:3;25964:6;25902:75;;;-1:-1;25999:2;25990:12;;25779:248;-1:-1;;25779:248;26034:383;;26181:75;26252:3;26243:6;26181:75;;;26278:2;26273:3;26269:12;26262:19;;26292:75;26363:3;26354:6;26292:75;;26424:262;;26568:93;26657:3;26648:6;26568:93;;26693:286;;26849:105;26950:3;26941:6;26933;26849:105;;27259:260;;27402:92;27490:3;27481:6;27402:92;;27526:213;27644:2;27629:18;;27658:71;27633:9;27702:6;27658:71;;27746:435;27920:2;27905:18;;27934:71;27909:9;27978:6;27934:71;;;28016:72;28084:2;28073:9;28069:18;28060:6;28016:72;;;28099;28167:2;28156:9;28152:18;28143:6;28099:72;;28188:324;28334:2;28319:18;;28348:71;28323:9;28392:6;28348:71;;;28430:72;28498:2;28487:9;28483:18;28474:6;28430:72;;28519:201;28631:2;28616:18;;28645:65;28620:9;28683:6;28645:65;;28727:324;28873:2;28858:18;;28887:71;28862:9;28931:6;28887:71;;29058:241;29190:2;29175:18;;29204:85;29179:9;29262:6;29204:85;;29306:321;29454:2;29468:47;;;29439:18;;29529:88;29439:18;29603:6;29595;29529:88;;29634:301;29772:2;29786:47;;;29757:18;;29847:78;29757:18;29911:6;29847:78;;29942:407;30133:2;30147:47;;;30118:18;;30208:131;30118:18;30208:131;;30356:407;30547:2;30561:47;;;30532:18;;30622:131;30532:18;30622:131;;30770:407;30961:2;30975:47;;;30946:18;;31036:131;30946:18;31036:131;;31184:407;31375:2;31389:47;;;31360:18;;31450:131;31360:18;31450:131;;31598:407;31789:2;31803:47;;;31774:18;;31864:131;31774:18;31864:131;;32012:407;32203:2;32217:47;;;32188:18;;32278:131;32188:18;32278:131;;32426:407;32617:2;32631:47;;;32602:18;;32692:131;32602:18;32692:131;;32840:407;33031:2;33045:47;;;33016:18;;33106:131;33016:18;33106:131;;33254:407;33445:2;33459:47;;;33430:18;;33520:131;33430:18;33520:131;;33668:407;33859:2;33873:47;;;33844:18;;33934:131;33844:18;33934:131;;34082:407;34273:2;34287:47;;;34258:18;;34348:131;34258:18;34348:131;;34496:407;34687:2;34701:47;;;34672:18;;34762:131;34672:18;34762:131;;34910:407;35101:2;35115:47;;;35086:18;;35176:131;35086:18;35176:131;;35324:407;35515:2;35529:47;;;35500:18;;35590:131;35500:18;35590:131;;35738:407;35929:2;35943:47;;;35914:18;;36004:131;35914:18;36004:131;;36152:407;36343:2;36357:47;;;36328:18;;36418:131;36328:18;36418:131;;36566:407;36757:2;36771:47;;;36742:18;;36832:131;36742:18;36832:131;;36980:407;37171:2;37185:47;;;37156:18;;37246:131;37156:18;37246:131;;37394:407;37585:2;37599:47;;;37570:18;;37660:131;37570:18;37660:131;;37808:407;37999:2;38013:47;;;37984:18;;38074:131;37984:18;38074:131;;38222:407;38413:2;38427:47;;;38398:18;;38488:131;38398:18;38488:131;;38636:407;38827:2;38841:47;;;38812:18;;38902:131;38812:18;38902:131;;39050:407;39241:2;39255:47;;;39226:18;;39316:131;39226:18;39316:131;;39464:407;39655:2;39669:47;;;39640:18;;39730:131;39640:18;39730:131;;39878:407;40069:2;40083:47;;;40054:18;;40144:131;40054:18;40144:131;;40292:407;40483:2;40497:47;;;40468:18;;40558:131;40468:18;40558:131;;40706:407;40897:2;40911:47;;;40882:18;;40972:131;40882:18;40972:131;;41120:407;41311:2;41325:47;;;41296:18;;41386:131;41296:18;41386:131;;41534:407;41725:2;41739:47;;;41710:18;;41800:131;41710:18;41800:131;;41948:407;42139:2;42153:47;;;42124:18;;42214:131;42124:18;42214:131;;42362:407;42553:2;42567:47;;;42538:18;;42628:131;42538:18;42628:131;;42776:407;42967:2;42981:47;;;42952:18;;43042:131;42952:18;43042:131;;43190:407;43381:2;43395:47;;;43366:18;;43456:131;43366:18;43456:131;;43604:407;43795:2;43809:47;;;43780:18;;43870:131;43780:18;43870:131;;44018:407;44209:2;44223:47;;;44194:18;;44284:131;44194:18;44284:131;;44432:407;44623:2;44637:47;;;44608:18;;44698:131;44608:18;44698:131;;44846:407;45037:2;45051:47;;;45022:18;;45112:131;45022:18;45112:131;;45260:407;45451:2;45465:47;;;45436:18;;45526:131;45436:18;45526:131;;45674:407;45865:2;45879:47;;;45850:18;;45940:131;45850:18;45940:131;;46088:407;46279:2;46293:47;;;46264:18;;46354:131;46264:18;46354:131;;46502:305;46666:2;46651:18;;46680:117;46655:9;46770:6;46680:117;;46814:213;46932:2;46917:18;;46946:71;46921:9;46990:6;46946:71;;47365:158;;47460:14;;;47502:4;47489:18;;;47419:104;47530:121;47617:12;;47588:63;47788:144;47923:3;47901:31;-1:-1;47901:31;47941:163;48044:19;;;48093:4;48084:14;;48037:67;48266:91;;48328:24;48346:5;48328:24;;48364:85;48430:13;48423:21;;48406:43;48535:121;-1:-1;;;;;48597:54;;48580:76;48742:149;;48835:51;48880:5;48835:51;;49028:145;49109:6;49104:3;49099;49086:30;-1:-1;49165:1;49147:16;;49140:27;49079:94;49182:268;49247:1;49254:101;49268:6;49265:1;49262:13;49254:101;;;49335:11;;;49329:18;49316:11;;;49309:39;49290:2;49283:10;49254:101;;;49370:6;49367:1;49364:13;49361:2;;;-1:-1;;49435:1;49417:16;;49410:27;49231:219;49458:95;;49522:26;49542:5;49641:89;49705:20;49719:5;49705:20;;49818:97;49906:2;49886:14;-1:-1;;49882:28;;49866:49;49923:94;49997:2;49993:14;;49965:52;50025:117;50094:24;50112:5;50094:24;;;50087:5;50084:35;50074:2;;50133:1;50130;50123:12;50149:111;50215:21;50230:5;50215:21;;50267:117;50336:24;50354:5;50336:24;

Swarm Source

bzzr://0213b0eb2a60f3d77ea6f8e16564faf361fd03c3a41ea224e13f00f7ab14d52a
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading

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.