Contract 0x45eecdada0b58b0e78f94549f65fdaf447b35c17

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x61691839437538f32216fefeaf3228cc5bc1e901e9f39e701ea2f221a731210aRemove Pool544948882023-01-21 11:50:1512 days 2 hrs ago0x6d174ed3c6b7b557b25e8103dcdbb4d6afe1c616 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.00002982
0x89839da2e86f167cf1ac41fd28c30020355633bde55ebd0751d982397886ca49Mint Extra Rewar...533718442023-01-16 2:20:3217 days 11 hrs ago0x8443d07d983a5ae4a68f749a7b9e05392384044f IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.00004293
0x9dccc50571a07de3074a81e67ff02c08a383e7af1a664bc903ea18f0349e90bcTransfer Ownersh...522046382023-01-11 2:59:5022 days 11 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.00002828
0xf8270902b4d42b0481d5c23de421279f0abfa358ef846f2bf8a800cae0551231Set Pool522043912023-01-11 2:58:2822 days 11 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.00009877
0x41413f886475359af22a490b3b96c6a37d2070307753a7e556a2ae86ad4e860eUpdate Pool521505232023-01-10 20:20:4622 days 17 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.00004844
0x0b0f33c1d02a4fdd4cb82b0781fc4c7e4a43f93b2dacb79cf41cf54e8b15e5f6Mass Update Pool...521504232023-01-10 20:20:0922 days 17 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.00008967
0x6f825297ecc9307c8e3e2051f57af8ff1f425052d61fe62bea8608b224eb095fTransfer Ownersh...519153472023-01-09 20:20:5323 days 17 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.00004072
0xda971d06134bd11f8080d3f15ecc94573af28828b3daa1ab3bc53d74001cbf6fAdd Pool519126512023-01-09 20:06:1823 days 17 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.0000772
0x6aa9cc8185ea43c9db198d0a52f336f824746f5d6be48830eec0cfb048458d82Add Pool519126092023-01-09 20:06:0223 days 17 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.00007674
0xb4de702570127ed86465269a982a81a460398e30398288283d78f2c5cdc6d3adAdd Pool519125752023-01-09 20:05:4723 days 17 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.00007628
0xfa5790fb8a3f77a6b05bee56f9f818317731069eaf3c970020aeee2bfff87ae8Add Pool519125462023-01-09 20:05:3523 days 17 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.00007583
0x2d8e5dd533ea8f9ab0e66a78a721509fc2c1cef84cb95630e608fedea8e18ed2Add Pool519125062023-01-09 20:05:2223 days 17 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.00007537
0x0a44cbea7bb5d3b025693429fc00a13f73768b1247c6cf155ed7de4fe2aa813dAdd Pool519124592023-01-09 20:05:0823 days 17 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.00007492
0xd0cc8f2445d8438d3d1359151f12199c84336365334932cb7732a4a2304ca8abAdd Stake Token ...519120522023-01-09 20:02:3823 days 18 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.0000602
0x24611fa8d15b862c3802e6377e14d55ccc4770de739d55cfbf7cdbcbfad1af5eSet Stake Token ...519120282023-01-09 20:02:3023 days 18 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.00005336
0xe73864c5a1c2b8879fc28dd26a04be878a1ab51ccbddcaddaea348b1aeda5296Add Stake Token ...519114742023-01-09 19:59:0423 days 18 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.00006461
0x6d131c8855cb3bdb70a4e17532e063e1c391e20a422fc557da395a72c8f9a609Set Stake Token ...519114532023-01-09 19:58:5623 days 18 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.00005778
0xcc10c0c71cce5bd9296df41a351f1c869fbd6f90bece4605d715af2c0d55b7f6Add Stake Token ...519112742023-01-09 19:57:4623 days 18 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.00006461
0xb79877c9b23909a5aa29c775a0bf963182683b1132fc9b1130124d8ffad5b249Set Stake Token ...519112532023-01-09 19:57:3923 days 18 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.00005977
0x4384eba53caa252d1c1ecdf0f1ee13faf39befe32105a1cf4669c4292329f03bAdd Stake Token ...519112212023-01-09 19:57:2723 days 18 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.00006461
0xf577fc1df4b479d020ba3b7833c3601311f1704fa04e768b2719e17752f8ef27Set Stake Token ...519112012023-01-09 19:57:2023 days 18 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.00005977
0xd01c8b90c91cf4a6a13fd37d0099ded768b2bcf896afffa8b66fd9b4a5298b7eAdd Stake Token ...519111742023-01-09 19:57:0823 days 18 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.00006431
0xe654cdffb6c6aff2baa0abcc208813588a188dc6ad1abc562a10c60ff4d27ccfSet Stake Token ...519111522023-01-09 19:56:5723 days 18 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.00005947
0xe5f4ae651a1944c835e62c48e68c5a777eb1bdd4d3f2415ffe872b530b45c5ccAdd Stake Token ...519111312023-01-09 19:56:4623 days 18 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.00006431
0xc3656a132427329d4cf5f0bb62edf30183361f516360fd6f2bd4b753ddfd8c73Set Stake Token ...519111112023-01-09 19:56:3823 days 18 hrs ago0x19ec14906a4d84eccca29cdf6428d08ce9cacdf9 IN  0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH0.00005947
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xe382021d67ea9cf659ea4409cd728dfcb3ba9066eb1fc3d1297b64413f3ba026548293122023-01-23 1:47:5410 days 12 hrs ago 0x45eecdada0b58b0e78f94549f65fdaf447b35c17 0x82af49447d8a07e3bd95bd0d56f35241523fbab10 ETH
0xe382021d67ea9cf659ea4409cd728dfcb3ba9066eb1fc3d1297b64413f3ba026548293122023-01-23 1:47:5410 days 12 hrs ago 0x45eecdada0b58b0e78f94549f65fdaf447b35c17 0x13319b5cab59084189f20bd66b2e9e12b52c2a6a0 ETH
0xe382021d67ea9cf659ea4409cd728dfcb3ba9066eb1fc3d1297b64413f3ba026548293122023-01-23 1:47:5410 days 12 hrs ago 0x45eecdada0b58b0e78f94549f65fdaf447b35c17 0x70916d8f5490a59d9912e2ffa136a4ea73fd36ab0 ETH
0xe382021d67ea9cf659ea4409cd728dfcb3ba9066eb1fc3d1297b64413f3ba026548293122023-01-23 1:47:5410 days 12 hrs ago 0x45eecdada0b58b0e78f94549f65fdaf447b35c17 0xd07b60ab845b720f2b792ed70367329ae87d02e80 ETH
0xe382021d67ea9cf659ea4409cd728dfcb3ba9066eb1fc3d1297b64413f3ba026548293122023-01-23 1:47:5410 days 12 hrs ago 0x45eecdada0b58b0e78f94549f65fdaf447b35c17 0x70916d8f5490a59d9912e2ffa136a4ea73fd36ab0 ETH
0xe382021d67ea9cf659ea4409cd728dfcb3ba9066eb1fc3d1297b64413f3ba026548293122023-01-23 1:47:5410 days 12 hrs ago 0x45eecdada0b58b0e78f94549f65fdaf447b35c17 0xd3ccbf3867ff0204730173eb4cad3c4b5fd07c690 ETH
0xe382021d67ea9cf659ea4409cd728dfcb3ba9066eb1fc3d1297b64413f3ba026548293122023-01-23 1:47:5410 days 12 hrs ago 0x45eecdada0b58b0e78f94549f65fdaf447b35c17 0xd3ccbf3867ff0204730173eb4cad3c4b5fd07c690 ETH
0xe382021d67ea9cf659ea4409cd728dfcb3ba9066eb1fc3d1297b64413f3ba026548293122023-01-23 1:47:5410 days 12 hrs ago 0x45eecdada0b58b0e78f94549f65fdaf447b35c17 0xd3ccbf3867ff0204730173eb4cad3c4b5fd07c690 ETH
0xe382021d67ea9cf659ea4409cd728dfcb3ba9066eb1fc3d1297b64413f3ba026548293122023-01-23 1:47:5410 days 12 hrs ago 0x45eecdada0b58b0e78f94549f65fdaf447b35c17 0xd3ccbf3867ff0204730173eb4cad3c4b5fd07c690 ETH
0xe382021d67ea9cf659ea4409cd728dfcb3ba9066eb1fc3d1297b64413f3ba026548293122023-01-23 1:47:5410 days 12 hrs ago 0x45eecdada0b58b0e78f94549f65fdaf447b35c17 0x82af49447d8a07e3bd95bd0d56f35241523fbab10 ETH
0xe382021d67ea9cf659ea4409cd728dfcb3ba9066eb1fc3d1297b64413f3ba026548293122023-01-23 1:47:5410 days 12 hrs ago 0xd07b60ab845b720f2b792ed70367329ae87d02e8 0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH
0x95b8775d125f1e9c70c09c3d83e317e282bd71174bb12637e1133d71ebad0f23547717482023-01-22 18:42:1310 days 19 hrs ago 0xd07b60ab845b720f2b792ed70367329ae87d02e8 0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH
0x6615225b99c3d27b827590f63380884eb4ca3f2ecd459df2f0a8badea0853a9a547576332023-01-22 17:16:0810 days 20 hrs ago 0x45eecdada0b58b0e78f94549f65fdaf447b35c17 0x82af49447d8a07e3bd95bd0d56f35241523fbab10 ETH
0x6615225b99c3d27b827590f63380884eb4ca3f2ecd459df2f0a8badea0853a9a547576332023-01-22 17:16:0810 days 20 hrs ago 0x45eecdada0b58b0e78f94549f65fdaf447b35c17 0x13319b5cab59084189f20bd66b2e9e12b52c2a6a0 ETH
0x6615225b99c3d27b827590f63380884eb4ca3f2ecd459df2f0a8badea0853a9a547576332023-01-22 17:16:0810 days 20 hrs ago 0x45eecdada0b58b0e78f94549f65fdaf447b35c17 0x70916d8f5490a59d9912e2ffa136a4ea73fd36ab0 ETH
0x6615225b99c3d27b827590f63380884eb4ca3f2ecd459df2f0a8badea0853a9a547576332023-01-22 17:16:0810 days 20 hrs ago 0x45eecdada0b58b0e78f94549f65fdaf447b35c17 0xd07b60ab845b720f2b792ed70367329ae87d02e80 ETH
0x6615225b99c3d27b827590f63380884eb4ca3f2ecd459df2f0a8badea0853a9a547576332023-01-22 17:16:0810 days 20 hrs ago 0x45eecdada0b58b0e78f94549f65fdaf447b35c17 0x70916d8f5490a59d9912e2ffa136a4ea73fd36ab0 ETH
0x6615225b99c3d27b827590f63380884eb4ca3f2ecd459df2f0a8badea0853a9a547576332023-01-22 17:16:0810 days 20 hrs ago 0x45eecdada0b58b0e78f94549f65fdaf447b35c17 0xd3ccbf3867ff0204730173eb4cad3c4b5fd07c690 ETH
0x6615225b99c3d27b827590f63380884eb4ca3f2ecd459df2f0a8badea0853a9a547576332023-01-22 17:16:0810 days 20 hrs ago 0x45eecdada0b58b0e78f94549f65fdaf447b35c17 0xd3ccbf3867ff0204730173eb4cad3c4b5fd07c690 ETH
0x6615225b99c3d27b827590f63380884eb4ca3f2ecd459df2f0a8badea0853a9a547576332023-01-22 17:16:0810 days 20 hrs ago 0x45eecdada0b58b0e78f94549f65fdaf447b35c17 0xd3ccbf3867ff0204730173eb4cad3c4b5fd07c690 ETH
0x6615225b99c3d27b827590f63380884eb4ca3f2ecd459df2f0a8badea0853a9a547576332023-01-22 17:16:0810 days 20 hrs ago 0x45eecdada0b58b0e78f94549f65fdaf447b35c17 0xd3ccbf3867ff0204730173eb4cad3c4b5fd07c690 ETH
0x6615225b99c3d27b827590f63380884eb4ca3f2ecd459df2f0a8badea0853a9a547576332023-01-22 17:16:0810 days 20 hrs ago 0x45eecdada0b58b0e78f94549f65fdaf447b35c17 0x82af49447d8a07e3bd95bd0d56f35241523fbab10 ETH
0x6615225b99c3d27b827590f63380884eb4ca3f2ecd459df2f0a8badea0853a9a547576332023-01-22 17:16:0810 days 20 hrs ago 0xd07b60ab845b720f2b792ed70367329ae87d02e8 0x45eecdada0b58b0e78f94549f65fdaf447b35c170 ETH
0x8931acc9fb1d483a1a8e32d0dd72b2241388765c53189efe1e9294f21062cff9547530102023-01-22 16:47:4110 days 21 hrs ago 0x45eecdada0b58b0e78f94549f65fdaf447b35c170xca9b7dc3495e8d1e8f3b78517612aa89a2edff580 ETH
0x8931acc9fb1d483a1a8e32d0dd72b2241388765c53189efe1e9294f21062cff9547530102023-01-22 16:47:4110 days 21 hrs ago 0x45eecdada0b58b0e78f94549f65fdaf447b35c17 0x13319b5cab59084189f20bd66b2e9e12b52c2a6a0 ETH
[ Download CSV Export 
Loading

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

Contract Name:
MasterChef

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan on 2023-01-05
*/

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

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

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

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

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // 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. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

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

pragma solidity >=0.6.2 <0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

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

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

pragma solidity >=0.6.0 <0.8.0;

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

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

    uint256 private _status;

    constructor () internal {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

pragma solidity 0.6.12;

library LinkList {
  address public constant start = address(1);
  address public constant end = address(1);
  address public constant empty = address(0);

  struct List {
    uint256 llSize;
    mapping(address => address) next;
  }

  function init(List storage list) internal returns (List memory) {
    list.next[start] = end;

    return list;
  }

  function has(List storage list, address addr) internal view returns (bool) {
    return list.next[addr] != empty;
  }

  function add(List storage list, address addr) internal returns (List memory) {
    require(!has(list, addr), "LinkList::add:: addr is already in the list");
    list.next[addr] = list.next[start];
    list.next[start] = addr;
    list.llSize++;

    return list;
  }

  function remove(
    List storage list,
    address addr,
    address prevAddr
  ) internal returns (List memory) {
    require(has(list, addr), "LinkList::remove:: addr not whitelisted yet");
    require(list.next[prevAddr] == addr, "LinkList::remove:: wrong prevConsumer");
    list.next[prevAddr] = list.next[addr];
    list.next[addr] = empty;
    list.llSize--;

    return list;
  }

  function getAll(List storage list) internal view returns (address[] memory) {
    address[] memory addrs = new address[](list.llSize);
    address curr = list.next[start];
    for (uint256 i = 0; curr != end; i++) {
      addrs[i] = curr;
      curr = list.next[curr];
    }
    return addrs;
  }

  function getPreviousOf(List storage list, address addr) internal view returns (address) {
    address curr = list.next[start];
    require(curr != empty, "LinkList::getPreviousOf:: please init the linkedlist first");
    for (uint256 i = 0; curr != end; i++) {
      if (list.next[curr] == addr) return curr;
      curr = list.next[curr];
    }
    return end;
  }

  function getNextOf(List storage list, address curr) internal view returns (address) {
    return list.next[curr];
  }

  function length(List storage list) internal view returns (uint256) {
    return list.llSize;
  }
}

pragma solidity 0.6.12;

interface ISUGAR {
  // SUGAR specific functions
  function lock(address _account, uint256 _amount) external;

  function lockOf(address _account) external view returns (uint256);

  function unlock() external;

  function mint(address _to, uint256 _amount) external;

  // Generic BEP20 functions
  function totalSupply() external view returns (uint256);

  function balanceOf(address account) external view returns (uint256);

  function transfer(address recipient, uint256 amount) external returns (bool);

  function allowance(address owner, address spender) external view returns (uint256);

  function approve(address spender, uint256 amount) external returns (bool);

  function transferFrom(
    address sender,
    address recipient,
    uint256 amount
  ) external returns (bool);

  // Getter functions
  function startReleaseBlock() external view returns (uint256);

  function endReleaseBlock() external view returns (uint256);

  event Transfer(address indexed from, address indexed to, uint256 value);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

pragma solidity 0.6.12;

interface IStake {
  // Stake specific functions
  function safeSugarTransfer(address _account, uint256 _amount) external;
}

pragma solidity 0.6.12;

interface IMasterChef {
  /// @dev functions return information. no states changed.
  function poolLength() external view returns (uint256);

  function pendingSugar(address _stakeToken, address _user) external view returns (uint256);

  function userInfo(address _stakeToken, address _user)
    external
    view
    returns (
      uint256,
      uint256,
      address
    );

  function poolInfo(address _stakeToken)
    external
    view
    returns (
      uint256,
      uint256,
      uint256,
      uint256
    );

  function devAddr() external view returns (address);

  function refAddr() external view returns (address);

  function bonusMultiplier() external view returns (uint256);

  function totalAllocPoint() external view returns (uint256);

  function sugarPerBlock() external view returns (uint256);

  /// @dev configuration functions
  function addPool(
    address _stakeToken,
    uint256 _allocPoint,
    uint256 _depositFee
  ) external;

  function setPool(
    address _stakeToken,
    uint256 _allocPoint,
    uint256 _depositFee
  ) external;

  function updatePool(address _stakeToken) external;

  function removePool(address _stakeToken) external;

  /// @dev user interaction functions
  function deposit(
    address _for,
    address _stakeToken,
    uint256 _amount
  ) external;

  function withdraw(
    address _for,
    address _stakeToken,
    uint256 _amount
  ) external;

  function depositSugar(address _for, uint256 _amount) external;

  function withdrawSugar(address _for, uint256 _amount) external;

  function harvest(address _for, address _stakeToken) external;

  function harvest(address _for, address[] calldata _stakeToken) external;

  function emergencyWithdraw(address _for, address _stakeToken) external;

  function mintExtraReward(
    address _stakeToken,
    address _to,
    uint256 _amount
  ) external;

  function sugar() external returns (ISUGAR);
}

pragma solidity 0.6.12;

interface IMasterChefCallback {
  function masterChefCall(
    address stakeToken,
    address userAddr,
    uint256 unboostedReward
  ) external;
}

pragma solidity 0.6.12;

interface IReferral {
  function setMasterChef(address _masterChef) external;

  function activate(address referrer) external;

  function activateBySign(
    address referee,
    address referrer,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external;

  function isActivated(address _address) external view returns (bool);

  function updateReferralReward(address accountAddress, uint256 reward) external;

  function claimReward() external;
}

pragma solidity >=0.6.0 <0.8.0;

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

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

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

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

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

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

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

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

pragma solidity >=0.6.0 <0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity 0.6.12;

// MasterChef is the master of SUGAR. He can make SUGAR and he is a fair guy.
//
// Note that it's ownable and the owner wields tremendous power. The ownership
// will be transferred to a governance smart contract once SUGAR is sufficiently
// distributed and the community can show to govern itself.
//
// Have fun reading it. Hopefully it's bug-free. God bless.
contract MasterChef is IMasterChef, Ownable, ReentrancyGuard {
  using SafeMath for uint256;
  using SafeERC20 for IERC20;
  using LinkList for LinkList.List;
  using Address for address;

  // Info of each user.
  struct UserInfo {
    uint256 amount; // How many Staking tokens the user has provided.
    uint256 rewardDebt; // Reward debt. See explanation below.
    address fundedBy;
  }

  // Info of each pool.
  struct PoolInfo {
    uint256 allocPoint; // How many allocation points assigned to this pool.
    uint256 lastRewardBlock; // Last block number that SUGAR distribution occurs.
    uint256 accSugarPerShare; // Accumulated SUGAR per share, times 1e12. See below.
    uint256 depositFee;
  }

  // SUGAR token.
  ISUGAR public override sugar;
  // Stake address.
  IStake public stake;
  // Dev address.
  address public override devAddr;
  uint256 public devBps;
  // Refferal address.
  address public override refAddr;
  uint256 public refBps;
  // SUGAR per block.
  uint256 public override sugarPerBlock;
  // Bonus muliplier for early users.
  uint256 public override bonusMultiplier;

  // Pool link list.
  LinkList.List public pools;
  // Info of each pool.
  mapping(address => PoolInfo) public override poolInfo;
  // Info of each user that stakes Staking tokens.
  mapping(address => mapping(address => UserInfo)) public override userInfo;
  // Total allocation poitns. Must be the sum of all allocation points in all pools.
  uint256 public override totalAllocPoint;
  // The block number when SUGAR mining starts.
  uint256 public startBlock;

  // Does the pool allows some contracts to fund for an account.
  mapping(address => bool) public stakeTokenCallerAllowancePool;

  // list of contracts that the pool allows to fund.
  mapping(address => LinkList.List) public stakeTokenCallerContracts;

  event Deposit(address indexed funder, address indexed fundee, address indexed stakeToken, uint256 amount);
  event Withdraw(address indexed funder, address indexed fundee, address indexed stakeToken, uint256 amount);
  event EmergencyWithdraw(address indexed user, address indexed stakeToken, uint256 amount);
  event Harvest(address indexed funder, address indexed fundee, address indexed stakeToken, uint256 reward);

  event SetStakeTokenCallerAllowancePool(address indexed stakeToken, bool isAllowed);
  event AddStakeTokenCallerContract(address indexed stakeToken, address indexed caller);
  event SetSugarPerBlock(uint256 prevSugarPerBlock, uint256 currentSugarPerBlock);
  event RemoveStakeTokenCallerContract(address indexed stakeToken, address indexed caller);
  event SetRefAddress(address indexed refAddress);
  event SetDevAddress(address indexed devAddress);
  event SetRefBps(uint256 refBps);
  event SetDevBps(uint256 devBps);
  event UpdateMultiplier(uint256 bonusMultiplier);

  constructor(
    ISUGAR _sugar,
    IStake _stake,
    address _devAddr,
    address _refAddr,
    uint256 _sugarPerBlock,
    uint256 _startBlock
  ) public {
    require(
      _devAddr != address(0) && _devAddr != address(1),
      "constructor: _devAddr must not be address(0) or address(1)"
    );
    require(
      _refAddr != address(0) && _refAddr != address(1),
      "constructor: _refAddr must not be address(0) or address(1)"
    );

    bonusMultiplier = 1;
    sugar = _sugar;
    stake = _stake;
    devAddr = _devAddr;
    refAddr = _refAddr;
    sugarPerBlock = _sugarPerBlock;
    startBlock = _startBlock;
    devBps = 0;
    refBps = 0;
    pools.init();

    // add SUGAR pool
    pools.add(address(_sugar));
    poolInfo[address(_sugar)] = PoolInfo({
      allocPoint: 0,
      lastRewardBlock: startBlock,
      accSugarPerShare: 0,
      depositFee: 0
    });
    totalAllocPoint = 0;
  }

  // Only permitted funder can continue the execution
  modifier onlyPermittedTokenFunder(address _beneficiary, address _stakeToken) {
    require(_isFunder(_beneficiary, _stakeToken), "onlyPermittedTokenFunder: caller is not permitted");
    _;
  }

  // Only stake token caller contract can continue the execution (stakeTokenCaller must be a funder contract)
  modifier onlyStakeTokenCallerContract(address _stakeToken) {
    require(stakeTokenCallerContracts[_stakeToken].has(_msgSender()), "onlyStakeTokenCallerContract: bad caller");
    _;
  }

  // Set funder allowance for a stake token pool
  function setStakeTokenCallerAllowancePool(address _stakeToken, bool _isAllowed) external onlyOwner {
    stakeTokenCallerAllowancePool[_stakeToken] = _isAllowed;
    emit SetStakeTokenCallerAllowancePool(_stakeToken, _isAllowed);
  }

  // Setter function for adding stake token contract caller
  function addStakeTokenCallerContract(address _stakeToken, address _caller) external onlyOwner {
    require(
      stakeTokenCallerAllowancePool[_stakeToken],
      "addStakeTokenCallerContract: the pool doesn't allow a contract caller"
    );
    LinkList.List storage list = stakeTokenCallerContracts[_stakeToken];
    if (list.getNextOf(LinkList.start) == LinkList.empty) {
      list.init();
    }
    list.add(_caller);
    emit AddStakeTokenCallerContract(_stakeToken, _caller);
  }

  // Setter function for removing stake token contract caller
  function removeStakeTokenCallerContract(address _stakeToken, address _caller) external onlyOwner {
    require(
      stakeTokenCallerAllowancePool[_stakeToken],
      "removeStakeTokenCallerContract: the pool doesn't allow a contract caller"
    );
    LinkList.List storage list = stakeTokenCallerContracts[_stakeToken];
    list.remove(_caller, list.getPreviousOf(_caller));
    emit RemoveStakeTokenCallerContract(_stakeToken, _caller);
  }

  function setDevAddress(address _devAddr) external onlyOwner {
    require(
      _devAddr != address(0) && _devAddr != address(1),
      "setDevAddress: _devAddr must not be address(0) or address(1)"
    );
    devAddr = _devAddr;
    emit SetDevAddress(_devAddr);
  }

  function setDevBps(uint256 _devBps) external onlyOwner {
    require(_devBps <= 1000, "setDevBps::bad devBps");
    massUpdatePools();
    devBps = _devBps;
    emit SetDevBps(_devBps);
  }

  function setRefAddress(address _refAddr) external onlyOwner {
    require(
      _refAddr != address(0) && _refAddr != address(1),
      "setRefAddress: _refAddr must not be address(0) or address(1)"
    );
    refAddr = _refAddr;
    emit SetRefAddress(_refAddr);
  }

  function setRefBps(uint256 _refBps) external onlyOwner {
    require(_refBps <= 100, "setRefBps::bad refBps");
    massUpdatePools();
    refBps = _refBps;
    emit SetRefBps(_refBps);
  }

  // Set SUGAR per block.
  function setSugarPerBlock(uint256 _sugarPerBlock) external onlyOwner {
    massUpdatePools();
    uint256 prevSugarPerBlock = sugarPerBlock;
    sugarPerBlock = _sugarPerBlock;
    emit SetSugarPerBlock(prevSugarPerBlock, sugarPerBlock);
  }

  // Add a pool. Can only be called by the owner.
  function addPool(
    address _stakeToken,
    uint256 _allocPoint,
    uint256 _depositFee
  ) external override onlyOwner {
    require(
      _stakeToken != address(0) && _stakeToken != address(1),
      "addPool: _stakeToken must not be address(0) or address(1)"
    );
    require(!pools.has(_stakeToken), "addPool: _stakeToken duplicated");

    massUpdatePools();

    uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock;
    totalAllocPoint = totalAllocPoint.add(_allocPoint);
    pools.add(_stakeToken);
    poolInfo[_stakeToken] = PoolInfo({
      allocPoint: _allocPoint,
      lastRewardBlock: lastRewardBlock,
      accSugarPerShare: 0,
      depositFee: _depositFee
    });
  }

  // Update the given pool's SUGAR allocation point. Can only be called by the owner.
  function setPool(
    address _stakeToken,
    uint256 _allocPoint,
    uint256 _depositFee
  ) external override onlyOwner {
    require(
      _stakeToken != address(0) && _stakeToken != address(1),
      "setPool: _stakeToken must not be address(0) or address(1)"
    );
    require(pools.has(_stakeToken), "setPool: _stakeToken not in the list");

    massUpdatePools();

    totalAllocPoint = totalAllocPoint.sub(poolInfo[_stakeToken].allocPoint).add(_allocPoint);
    poolInfo[_stakeToken].allocPoint = _allocPoint;
    poolInfo[_stakeToken].depositFee = _depositFee;
  }

  // Remove pool. Can only be called by the owner.
  function removePool(address _stakeToken) external override onlyOwner {
    require(_stakeToken != address(sugar), "removePool: can't remove SUGAR pool");
    require(pools.has(_stakeToken), "removePool: pool not add yet");
    require(IERC20(_stakeToken).balanceOf(address(this)) == 0, "removePool: pool not empty");

    massUpdatePools();

    totalAllocPoint = totalAllocPoint.sub(poolInfo[_stakeToken].allocPoint);
    pools.remove(_stakeToken, pools.getPreviousOf(_stakeToken));
    poolInfo[_stakeToken].allocPoint = 0;
    poolInfo[_stakeToken].lastRewardBlock = 0;
    poolInfo[_stakeToken].accSugarPerShare = 0;
    poolInfo[_stakeToken].depositFee = 0;
  }

  // Return the length of poolInfo
  function poolLength() external view override returns (uint256) {
    return pools.length();
  }

  // Return reward multiplier over the given _from to _to block.
  function getMultiplier(uint256 _lastRewardBlock, uint256 _currentBlock) private view returns (uint256) {
    return _currentBlock.sub(_lastRewardBlock).mul(bonusMultiplier);
  }

  function updateMultiplier(uint256 _bonusMultiplier) public onlyOwner {
    bonusMultiplier = _bonusMultiplier;
    emit UpdateMultiplier(_bonusMultiplier);
  }

  // Validating if a msg sender is a funder
  function _isFunder(address _beneficiary, address _stakeToken) internal view returns (bool) {
    if (stakeTokenCallerAllowancePool[_stakeToken]) return stakeTokenCallerContracts[_stakeToken].has(_msgSender());
    return _beneficiary == _msgSender();
  }

  // View function to see pending SUGARs on frontend.
  function pendingSugar(address _stakeToken, address _user) external view override returns (uint256) {
    PoolInfo storage pool = poolInfo[_stakeToken];
    UserInfo storage user = userInfo[_stakeToken][_user];
    uint256 accSugarPerShare = pool.accSugarPerShare;
    uint256 totalStakeToken = IERC20(_stakeToken).balanceOf(address(this));
    if (block.number > pool.lastRewardBlock && totalStakeToken != 0) {
      uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
      uint256 sugarReward = multiplier.mul(sugarPerBlock).mul(pool.allocPoint).div(totalAllocPoint);
      accSugarPerShare = accSugarPerShare.add(sugarReward.mul(1e12).div(totalStakeToken));
    }
    return user.amount.mul(accSugarPerShare).div(1e12).sub(user.rewardDebt);
  }

  // Update reward variables for all pools. Be careful of gas spending!
  function massUpdatePools() public {
    address current = pools.next[LinkList.start];
    while (current != LinkList.end) {
      updatePool(current);
      current = pools.getNextOf(current);
    }
  }

  // Update reward variables of the given pool to be up-to-date.
  function updatePool(address _stakeToken) public override {
    PoolInfo storage pool = poolInfo[_stakeToken];
    if (block.number <= pool.lastRewardBlock) {
      return;
    }
    uint256 totalStakeToken = IERC20(_stakeToken).balanceOf(address(this));
    if (totalStakeToken == 0) {
      pool.lastRewardBlock = block.number;
      return;
    }
    uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
    uint256 sugarReward = multiplier.mul(sugarPerBlock).mul(pool.allocPoint).div(totalAllocPoint);
    sugar.mint(devAddr, sugarReward.mul(devBps).div(10000));
    sugar.mint(address(stake), sugarReward.mul(refBps).div(10000));
    sugar.mint(address(stake), sugarReward);
    pool.accSugarPerShare = pool.accSugarPerShare.add(sugarReward.mul(1e12).div(totalStakeToken));
    pool.lastRewardBlock = block.number;
  }

  // Deposit token to MasterChef for SUGAR allocation.
  function deposit(
    address _for,
    address _stakeToken,
    uint256 _amount
  ) external override onlyPermittedTokenFunder(_for, _stakeToken) nonReentrant {
    require(
      _stakeToken != address(0) && _stakeToken != address(1),
      "setPool: _stakeToken must not be address(0) or address(1)"
    );
    require(_stakeToken != address(sugar), "deposit: use depositSugar instead");
    require(pools.has(_stakeToken), "deposit: no pool");

    PoolInfo storage pool = poolInfo[_stakeToken];
    UserInfo storage user = userInfo[_stakeToken][_for];

    if (user.fundedBy != address(0)) require(user.fundedBy == _msgSender(), "deposit: only funder");

    updatePool(_stakeToken);

    if (user.amount > 0) _harvest(_for, _stakeToken);
    if (user.fundedBy == address(0)) user.fundedBy = _msgSender();
    if (_amount > 0) {
      uint256 depositFeeAmount = _amount.mul(pool.depositFee).div(10000);
      if (depositFeeAmount > 0) {
        _amount = _amount.sub(depositFeeAmount);
        IERC20(_stakeToken).safeTransferFrom(address(_msgSender()), devAddr, depositFeeAmount);
      }
      IERC20(_stakeToken).safeTransferFrom(address(_msgSender()), address(this), _amount);
      user.amount = user.amount.add(_amount);
    }
    user.rewardDebt = user.amount.mul(pool.accSugarPerShare).div(1e12);
    emit Deposit(_msgSender(), _for, _stakeToken, _amount);
  }

  // Withdraw token from MasterChef.
  function withdraw(
    address _for,
    address _stakeToken,
    uint256 _amount
  ) external override nonReentrant {
    require(
      _stakeToken != address(0) && _stakeToken != address(1),
      "setPool: _stakeToken must not be address(0) or address(1)"
    );
    require(_stakeToken != address(sugar), "withdraw: use withdrawSugar instead");
    require(pools.has(_stakeToken), "withdraw: no pool");

    PoolInfo storage pool = poolInfo[_stakeToken];
    UserInfo storage user = userInfo[_stakeToken][_for];

    require(user.fundedBy == _msgSender(), "withdraw: only funder");
    require(user.amount >= _amount, "withdraw: not good");

    updatePool(_stakeToken);
    _harvest(_for, _stakeToken);

    if (_amount > 0) {
      user.amount = user.amount.sub(_amount);
      IERC20(_stakeToken).safeTransfer(_msgSender(), _amount);
    }
    user.rewardDebt = user.amount.mul(pool.accSugarPerShare).div(1e12);
    if (user.amount == 0) user.fundedBy = address(0);
    emit Withdraw(_msgSender(), _for, _stakeToken, _amount);
  }

  // Deposit SUGAR to MasterChef.
  function depositSugar(address _for, uint256 _amount)
    external
    override
    onlyPermittedTokenFunder(_for, address(sugar))
    nonReentrant
  {
    PoolInfo storage pool = poolInfo[address(sugar)];
    UserInfo storage user = userInfo[address(sugar)][_for];

    if (user.fundedBy != address(0)) require(user.fundedBy == _msgSender(), "depositSugar: bad sof");

    updatePool(address(sugar));

    if (user.amount > 0) _harvest(_for, address(sugar));
    if (user.fundedBy == address(0)) user.fundedBy = _msgSender();
    if (_amount > 0) {
      uint256 depositFeeAmount = _amount.mul(pool.depositFee).div(10000);
      if (depositFeeAmount > 0) {
        _amount = _amount.sub(depositFeeAmount);
        IERC20(address(sugar)).safeTransferFrom(address(_msgSender()), devAddr, depositFeeAmount);
      }
      IERC20(address(sugar)).safeTransferFrom(address(_msgSender()), address(this), _amount);
      user.amount = user.amount.add(_amount);
    }
    user.rewardDebt = user.amount.mul(pool.accSugarPerShare).div(1e12);
    emit Deposit(_msgSender(), _for, address(sugar), _amount);
  }

  // Withdraw SUGAR
  function withdrawSugar(address _for, uint256 _amount) external override nonReentrant {
    PoolInfo storage pool = poolInfo[address(sugar)];
    UserInfo storage user = userInfo[address(sugar)][_for];

    require(user.fundedBy == _msgSender(), "withdrawSugar: only funder");
    require(user.amount >= _amount, "withdrawSugar: not good");

    updatePool(address(sugar));
    _harvest(_for, address(sugar));

    if (_amount > 0) {
      user.amount = user.amount.sub(_amount);
      IERC20(address(sugar)).safeTransfer(address(_msgSender()), _amount);
    }
    user.rewardDebt = user.amount.mul(pool.accSugarPerShare).div(1e12);
    if (user.amount == 0) user.fundedBy = address(0);
    emit Withdraw(_msgSender(), _for, address(sugar), user.amount);
  }

  // Harvest SUGAR earned from a specific pool.
  function harvest(address _for, address _stakeToken) external override nonReentrant {
    PoolInfo storage pool = poolInfo[_stakeToken];
    UserInfo storage user = userInfo[_stakeToken][_for];

    updatePool(_stakeToken);
    _harvest(_for, _stakeToken);

    user.rewardDebt = user.amount.mul(pool.accSugarPerShare).div(1e12);
  }

  // Harvest SUGAR earned from pools.
  function harvest(address _for, address[] calldata _stakeTokens) external override nonReentrant {
    for (uint256 i = 0; i < _stakeTokens.length; i++) {
      PoolInfo storage pool = poolInfo[_stakeTokens[i]];
      UserInfo storage user = userInfo[_stakeTokens[i]][_for];
      updatePool(_stakeTokens[i]);
      _harvest(_for, _stakeTokens[i]);
      user.rewardDebt = user.amount.mul(pool.accSugarPerShare).div(1e12);
    }
  }

  // Internal function to harvest SUGAR
  function _harvest(address _for, address _stakeToken) internal {
    PoolInfo memory pool = poolInfo[_stakeToken];
    UserInfo memory user = userInfo[_stakeToken][_for];
    require(user.fundedBy == _msgSender(), "_harvest: only funder");
    require(user.amount > 0, "_harvest: nothing to harvest");
    uint256 pending = user.amount.mul(pool.accSugarPerShare).div(1e12).sub(user.rewardDebt);
    require(pending <= sugar.balanceOf(address(stake)), "_harvest: wait what.. not enough SUGAR");
    stake.safeSugarTransfer(_for, pending);
    if (stakeTokenCallerContracts[_stakeToken].has(_msgSender())) {
      _masterChefCallee(_msgSender(), _stakeToken, _for, pending);
    }
    _referralCallee(_for, pending);
    emit Harvest(_msgSender(), _for, _stakeToken, pending);
  }

  function _referralCallee(address _for, uint256 _pending) internal {
    if (!refAddr.isContract()) {
      return;
    }
    stake.safeSugarTransfer(address(refAddr), _pending.mul(refBps).div(10000));
    (bool success, ) = refAddr.call(
      abi.encodeWithSelector(IReferral.updateReferralReward.selector, _for, _pending.mul(refBps).div(10000))
    );
    require(success, "_referralCallee:  failed to execute updateReferralReward");
  }

  // Observer function for those contract implementing onBeforeLock, execute an onBeforelock statement
  function _masterChefCallee(
    address _caller,
    address _stakeToken,
    address _for,
    uint256 _pending
  ) internal {
    if (!_caller.isContract()) {
      return;
    }
    (bool success, ) = _caller.call(
      abi.encodeWithSelector(IMasterChefCallback.masterChefCall.selector, _stakeToken, _for, _pending)
    );
    require(success, "_masterChefCallee:  failed to execute masterChefCall");
  }

  // Withdraw without caring about rewards. EMERGENCY ONLY.
  function emergencyWithdraw(address _for, address _stakeToken) external override nonReentrant {
    UserInfo storage user = userInfo[_stakeToken][_for];
    require(user.fundedBy == _msgSender(), "emergencyWithdraw: only funder");
    IERC20(_stakeToken).safeTransfer(address(_for), user.amount);

    emit EmergencyWithdraw(_for, _stakeToken, user.amount);

    user.amount = 0;
    user.rewardDebt = 0;
    user.fundedBy = address(0);
  }

  // This is a function for mining an extra amount of sugar, should be called only by stake token caller contract (boosting purposed)
  function mintExtraReward(
    address _stakeToken,
    address _to,
    uint256 _amount
  ) external override onlyStakeTokenCallerContract(_stakeToken) {
    sugar.mint(_to, _amount);
  }
}

Contract ABI

[{"inputs":[{"internalType":"contract ISUGAR","name":"_sugar","type":"address"},{"internalType":"contract IStake","name":"_stake","type":"address"},{"internalType":"address","name":"_devAddr","type":"address"},{"internalType":"address","name":"_refAddr","type":"address"},{"internalType":"uint256","name":"_sugarPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakeToken","type":"address"},{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"AddStakeTokenCallerContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"funder","type":"address"},{"indexed":true,"internalType":"address","name":"fundee","type":"address"},{"indexed":true,"internalType":"address","name":"stakeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"stakeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"funder","type":"address"},{"indexed":true,"internalType":"address","name":"fundee","type":"address"},{"indexed":true,"internalType":"address","name":"stakeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakeToken","type":"address"},{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"RemoveStakeTokenCallerContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"devAddress","type":"address"}],"name":"SetDevAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"devBps","type":"uint256"}],"name":"SetDevBps","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"refAddress","type":"address"}],"name":"SetRefAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"refBps","type":"uint256"}],"name":"SetRefBps","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakeToken","type":"address"},{"indexed":false,"internalType":"bool","name":"isAllowed","type":"bool"}],"name":"SetStakeTokenCallerAllowancePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevSugarPerBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentSugarPerBlock","type":"uint256"}],"name":"SetSugarPerBlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bonusMultiplier","type":"uint256"}],"name":"UpdateMultiplier","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"funder","type":"address"},{"indexed":true,"internalType":"address","name":"fundee","type":"address"},{"indexed":true,"internalType":"address","name":"stakeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint256","name":"_depositFee","type":"uint256"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"address","name":"_caller","type":"address"}],"name":"addStakeTokenCallerContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bonusMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositSugar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"address","name":"_stakeToken","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"address[]","name":"_stakeTokens","type":"address[]"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"address","name":"_stakeToken","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintExtraReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingSugar","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accSugarPerShare","type":"uint256"},{"internalType":"uint256","name":"depositFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pools","outputs":[{"internalType":"uint256","name":"llSize","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"}],"name":"removePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"address","name":"_caller","type":"address"}],"name":"removeStakeTokenCallerContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devAddr","type":"address"}],"name":"setDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_devBps","type":"uint256"}],"name":"setDevBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint256","name":"_depositFee","type":"uint256"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_refAddr","type":"address"}],"name":"setRefAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_refBps","type":"uint256"}],"name":"setRefBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"bool","name":"_isAllowed","type":"bool"}],"name":"setStakeTokenCallerAllowancePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sugarPerBlock","type":"uint256"}],"name":"setSugarPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stake","outputs":[{"internalType":"contract IStake","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakeTokenCallerAllowancePool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakeTokenCallerContracts","outputs":[{"internalType":"uint256","name":"llSize","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sugar","outputs":[{"internalType":"contract ISUGAR","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sugarPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bonusMultiplier","type":"uint256"}],"name":"updateMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"address","name":"fundedBy","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawSugar","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620045d8380380620045d8833981810160405260c08110156200003757600080fd5b508051602082015160408301516060840151608085015160a090950151939492939192909160006200006862000277565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180556001600160a01b03841615801590620000d957506001600160a01b038416600114155b620001165760405162461bcd60e51b815260040180806020018281038252603a81526020018062004573603a913960400191505060405180910390fd5b6001600160a01b038316158015906200013957506001600160a01b038316600114155b620001765760405162461bcd60e51b815260040180806020018281038252603a81526020018062004539603a913960400191505060405180910390fd5b6001600955600280546001600160a01b03199081166001600160a01b0389811691909117909255600380548216888416179055600480548216878416179055600680549091169185169190911790556008829055600f81905560006005819055600755620001f1600a6200027b602090811b62002d0c17901c565b506200020d86600a620002bb60201b62002d4a1790919060201c565b5050604080516080810182526000808252600f546020808401918252838501838152606085018481526001600160a01b03909b168452600c90915293822092518355516001830155915160028201559551600390960195909555505050600e9190915550620003aa565b3390565b6200028562000397565b5060016000818152828201602090815260409182902080546001600160a01b031916909317909255805191820190529054815290565b620002c562000397565b620002d1838362000372565b156200030f5760405162461bcd60e51b815260040180806020018281038252602b815260200180620045ad602b913960400191505060405180910390fd5b50600160008181528382016020908152604080832080546001600160a01b039687168086528386208054989092166001600160a01b0319988916179091559385905280549095169092179093558354909101928390558051918201905290815290565b6001600160a01b03818116600090815260018401602052604090205416151592915050565b6040518060200160405280600081525090565b61417f80620003ba6000396000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c806366cc1857116101465780638da5cb5b116100c3578063d0d3f18d11610087578063d0d3f18d14610781578063d0d41fe11461079e578063d9caed12146107c4578063da09c72c146107fa578063f2fde38b14610802578063fa8e15b9146108285761025e565b80638da5cb5b146107155780639a7b5f111461071d578063a0e0e13c14610769578063a8b973a114610771578063c5c51dca146107795761025e565b806378b2c1791161010a57806378b2c1791461065f578063799352cb146106675780637b46c54f1461068d5780637fb595f7146106b35780638340f549146106df5761025e565b806366cc1857146105eb57806366eed48e1461061957806369d0c5b814610621578063715018a614610629578063773b4dfe146106315761025e565b80633a4b66f1116101df57806348cd4cb1116101a357806348cd4cb11461053d5780634a0ee32c146105455780634b372dd6146105625780635ffe614614610598578063630b5ba1146105b55780636382d9ad146105bd5761025e565b80633a4b66f1146104765780633b7d09461461049a5780633dff45e9146104c05780633f98b267146104f2578063424362db1461050f5761025e565b80630f208beb116102265780630f208beb1461038b578063178a5f98146103e057806317caf6f11461040e57806317ccd7ee14610416578063363e7317146104485761025e565b80630196d0af146102635780630504f9cd1461029d578063061e26af146102cb57806307a10005146102f1578063081e3eda14610371575b600080fd5b6102896004803603602081101561027957600080fd5b50356001600160a01b0316610830565b604080519115158252519081900360200190f35b6102c9600480360360408110156102b357600080fd5b506001600160a01b038135169060200135610845565b005b6102c9600480360360208110156102e157600080fd5b50356001600160a01b0316610b0e565b6102c96004803603604081101561030757600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561033257600080fd5b82018360208201111561034457600080fd5b8035906020019184602083028401116401000000008311171561036657600080fd5b509092509050610c17565b610379610d75565b60408051918252519081900360200190f35b6103b9600480360360408110156103a157600080fd5b506001600160a01b0381358116916020013516610d86565b6040805193845260208401929092526001600160a01b031682820152519081900360600190f35b6102c9600480360360408110156103f657600080fd5b506001600160a01b0381351690602001351515610dbb565b610379610e7d565b6102c96004803603606081101561042c57600080fd5b506001600160a01b038135169060208101359060400135610e83565b6103796004803603604081101561045e57600080fd5b506001600160a01b038135811691602001351661102d565b61047e611180565b604080516001600160a01b039092168252519081900360200190f35b6102c9600480360360208110156104b057600080fd5b50356001600160a01b031661118f565b6102c9600480360360608110156104d657600080fd5b506001600160a01b0381351690602081013590604001356113d5565b6102c96004803603602081101561050857600080fd5b5035611538565b6102c96004803603604081101561052557600080fd5b506001600160a01b038135811691602001351661162b565b610379611772565b6102c96004803603602081101561055b57600080fd5b5035611778565b6102c96004803603606081101561057857600080fd5b506001600160a01b0381358116916020810135909116906040013561186c565b6102c9600480360360208110156105ae57600080fd5b5035611944565b6102c96119e1565b6102c9600480360360408110156105d357600080fd5b506001600160a01b0381358116916020013516611a46565b6102c96004803603604081101561060157600080fd5b506001600160a01b0381358116916020013516611ba5565b610379611c59565b61047e611c5f565b6102c9611c6e565b6102c96004803603604081101561064757600080fd5b506001600160a01b0381358116916020013516611d1a565b610379611e47565b6103796004803603602081101561067d57600080fd5b50356001600160a01b0316611e4d565b6102c9600480360360208110156106a357600080fd5b50356001600160a01b0316611e5f565b6102c9600480360360408110156106c957600080fd5b506001600160a01b03813516906020013561211f565b6102c9600480360360608110156106f557600080fd5b506001600160a01b03813581169160208101359091169060400135612358565b61047e6126e5565b6107436004803603602081101561073357600080fd5b50356001600160a01b03166126f4565b604080519485526020850193909352838301919091526060830152519081900360800190f35b61047e61271b565b61037961272a565b610379612730565b6102c96004803603602081101561079757600080fd5b5035612736565b6102c9600480360360208110156107b457600080fd5b50356001600160a01b03166127e7565b6102c9600480360360608110156107da57600080fd5b506001600160a01b038135811691602081013590911690604001356128f0565b61047e612bf5565b6102c96004803603602081101561081857600080fd5b50356001600160a01b0316612c04565b610379612d06565b60106020526000908152604090205460ff1681565b60025482906001600160a01b031661085d8282612dfb565b6108985760405162461bcd60e51b8152600401808060200182810382526031815260200180613d976031913960400191505060405180910390fd5b600260015414156108de576040805162461bcd60e51b815260206004820152601f6024820152600080516020613cf5833981519152604482015290519081900360640190fd5b6002600181905580546001600160a01b039081166000908152600c60209081526040808320600d83528184208a861685529092529091209283015490929116156109865761092a612e70565b60028201546001600160a01b03908116911614610986576040805162461bcd60e51b81526020600482015260156024820152743232b837b9b4ba29bab3b0b91d103130b21039b7b360591b604482015290519081900360640190fd5b60025461099b906001600160a01b0316611e5f565b8054156109b9576002546109b99087906001600160a01b0316612e74565b60028101546001600160a01b03166109f6576109d3612e70565b6002820180546001600160a01b0319166001600160a01b03929092169190911790555b8415610a89576000610a21612710610a1b8560030154896131dc90919063ffffffff16565b9061323c565b90508015610a5a57610a3386826132a3565b9550610a5a610a40612e70565b6004546002546001600160a01b0390811692911684613300565b610a79610a65612e70565b6002546001600160a01b0316903089613300565b8154610a859087613360565b8255505b60028201548154610aa49164e8d4a5100091610a1b916131dc565b60018201556002546001600160a01b03908116908716610ac2612e70565b6001600160a01b03167f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96886040518082815260200191505060405180910390a450506001805550505050565b610b16612e70565b6001600160a01b0316610b276126e5565b6001600160a01b031614610b70576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b03811615801590610b9257506001600160a01b038116600114155b610bcd5760405162461bcd60e51b815260040180806020018281038252603c815260200180613e8c603c913960400191505060405180910390fd5b600680546001600160a01b0319166001600160a01b0383169081179091556040517f43c33f61b2cd06a9dcb62807aef5440f6388e0b77658248697d1d9be01820a0f90600090a250565b60026001541415610c5d576040805162461bcd60e51b815260206004820152601f6024820152600080516020613cf5833981519152604482015290519081900360640190fd5b600260015560005b81811015610d6b576000600c6000858585818110610c7f57fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002090506000600d6000868686818110610cc357fe5b6001600160a01b036020918202939093013583168452838101949094525060409182016000908120918a168152925290209050610d1a858585818110610d0557fe5b905060200201356001600160a01b0316611e5f565b610d3f86868686818110610d2a57fe5b905060200201356001600160a01b0316612e74565b60028201548154610d5a9164e8d4a5100091610a1b916131dc565b600191820155919091019050610c65565b5050600180555050565b6000610d81600a6133ba565b905090565b600d6020908152600092835260408084209091529082529020805460018201546002909201549091906001600160a01b031683565b610dc3612e70565b6001600160a01b0316610dd46126e5565b6001600160a01b031614610e1d576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260106020908152604091829020805460ff1916851515908117909155825190815291517fa74a0b200dafba5df263e0d0c90173d62fda8752c351a8a83cdb5bd33cb4d38e9281900390910190a25050565b600e5481565b610e8b612e70565b6001600160a01b0316610e9c6126e5565b6001600160a01b031614610ee5576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b03831615801590610f0757506001600160a01b038316600114155b610f425760405162461bcd60e51b8152600401808060200182810382526039815260200180613ec86039913960400191505060405180910390fd5b610f4d600a846133be565b15610f9f576040805162461bcd60e51b815260206004820152601f60248201527f616464506f6f6c3a205f7374616b65546f6b656e206475706c69636174656400604482015290519081900360640190fd5b610fa76119e1565b6000600f544311610fba57600f54610fbc565b435b600e54909150610fcc9084613360565b600e55610fda600a85612d4a565b506040805160808101825293845260208085019283526000858301818152606087019586526001600160a01b039097168152600c9091522092518355516001830155915160028201559051600390910155565b6001600160a01b038083166000818152600c60209081526040808320600d83528184209587168452948252808320600286015482516370a0823160e01b815230600482015292519496959194909387936370a082319260248083019392829003018186803b15801561109e57600080fd5b505afa1580156110b2573d6000803e3d6000fd5b505050506040513d60208110156110c857600080fd5b50516001850154909150431180156110df57508015155b156111455760006110f48560010154436133e3565b90506000611121600e54610a1b886000015461111b600854876131dc90919063ffffffff16565b906131dc565b905061114061113984610a1b8464e8d4a510006131dc565b8590613360565b935050505b611173836001015461116d64e8d4a51000610a1b8688600001546131dc90919063ffffffff16565b906132a3565b9450505050505b92915050565b6003546001600160a01b031681565b611197612e70565b6001600160a01b03166111a86126e5565b6001600160a01b0316146111f1576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6002546001600160a01b038281169116141561123e5760405162461bcd60e51b8152600401808060200182810382526023815260200180613f996023913960400191505060405180910390fd5b611249600a826133be565b61129a576040805162461bcd60e51b815260206004820152601c60248201527f72656d6f7665506f6f6c3a20706f6f6c206e6f74206164642079657400000000604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b1580156112e057600080fd5b505afa1580156112f4573d6000803e3d6000fd5b505050506040513d602081101561130a57600080fd5b50511561135e576040805162461bcd60e51b815260206004820152601a60248201527f72656d6f7665506f6f6c3a20706f6f6c206e6f7420656d707479000000000000604482015290519081900360640190fd5b6113666119e1565b6001600160a01b0381166000908152600c6020526040902054600e5461138b916132a3565b600e556113a68161139d600a826133f7565b600a91906134c4565b506001600160a01b03166000908152600c60205260408120818155600181018290556002810182905560030155565b6113dd612e70565b6001600160a01b03166113ee6126e5565b6001600160a01b031614611437576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b0383161580159061145957506001600160a01b038316600114155b6114945760405162461bcd60e51b81526004018080602001828103825260398152602001806140c16039913960400191505060405180910390fd5b61149f600a846133be565b6114da5760405162461bcd60e51b8152600401808060200182810382526024815260200180613cd16024913960400191505060405180910390fd5b6114e26119e1565b6001600160a01b0383166000908152600c6020526040902054600e5461151391849161150d916132a3565b90613360565b600e556001600160a01b039092166000908152600c6020526040902090815560030155565b611540612e70565b6001600160a01b03166115516126e5565b6001600160a01b03161461159a576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b60648111156115e8576040805162461bcd60e51b81526020600482015260156024820152747365745265664270733a3a6261642072656642707360581b604482015290519081900360640190fd5b6115f06119e1565b60078190556040805182815290517f5596a3fb1cf7d976a0d68cf433833e2abf8922c45ba5213d682555abba37c9499181900360200190a150565b611633612e70565b6001600160a01b03166116446126e5565b6001600160a01b03161461168d576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b03821660009081526010602052604090205460ff166116e45760405162461bcd60e51b81526004018080602001828103825260458152602001806140526045913960600191505060405180910390fd5b6001600160a01b0382166000908152601160205260408120906117088260016135d3565b6001600160a01b031614156117225761172081612d0c565b505b61172c8183612d4a565b50816001600160a01b0316836001600160a01b03167f3d744029323ee9a48b6e3067d6f614fb9542fb23c76df2053f783d4244d814b960405160405180910390a3505050565b600f5481565b611780612e70565b6001600160a01b03166117916126e5565b6001600160a01b0316146117da576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6103e8811115611829576040805162461bcd60e51b81526020600482015260156024820152747365744465764270733a3a6261642064657642707360581b604482015290519081900360640190fd5b6118316119e1565b60058190556040805182815290517f1e59efd4b015a26bfc328db57b6753ffa0139e8010ff1a5aa48a6471b5332c919181900360200190a150565b82611896611878612e70565b6001600160a01b0383166000908152601160205260409020906133be565b6118d15760405162461bcd60e51b8152600401808060200182810382526028815260200180613d156028913960400191505060405180910390fd5b600254604080516340c10f1960e01b81526001600160a01b03868116600483015260248201869052915191909216916340c10f1991604480830192600092919082900301818387803b15801561192657600080fd5b505af115801561193a573d6000803e3d6000fd5b5050505050505050565b61194c612e70565b6001600160a01b031661195d6126e5565b6001600160a01b0316146119a6576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b60098190556040805182815290517fa0be54773ac26c27d6d0e44698c6b7c95df74fcf44847d1561849a34fc48b0789181900360200190a150565b6001600052600b6020527f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf546001600160a01b03165b6001600160a01b038116600114611a4357611a3181611e5f565b611a3c600a826135d3565b9050611a17565b50565b60026001541415611a8c576040805162461bcd60e51b815260206004820152601f6024820152600080516020613cf5833981519152604482015290519081900360640190fd5b60026001556001600160a01b038082166000908152600d60209081526040808320938616835292905220611abe612e70565b60028201546001600160a01b03908116911614611b22576040805162461bcd60e51b815260206004820152601e60248201527f656d657267656e637957697468647261773a206f6e6c792066756e6465720000604482015290519081900360640190fd5b8054611b3a906001600160a01b0384169085906135f6565b805460408051918252516001600160a01b0380851692908616917ff24ef89f38eadc1bde50701ad6e4d6d11a2dc24f7cf834a486991f38833285049181900360200190a36000808255600180830191909155600290910180546001600160a01b031916905580555050565b60026001541415611beb576040805162461bcd60e51b815260206004820152601f6024820152600080516020613cf5833981519152604482015290519081900360640190fd5b60026001556001600160a01b038082166000908152600c60209081526040808320600d83528184209487168452939091529020611c2783611e5f565b611c318484612e74565b60028201548154611c4c9164e8d4a5100091610a1b916131dc565b6001918201558055505050565b60085481565b6006546001600160a01b031681565b611c76612e70565b6001600160a01b0316611c876126e5565b6001600160a01b031614611cd0576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b611d22612e70565b6001600160a01b0316611d336126e5565b6001600160a01b031614611d7c576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b03821660009081526010602052604090205460ff16611dd35760405162461bcd60e51b8152600401808060200182810382526048815260200180613fbc6048913960600191505060405180910390fd5b6001600160a01b0382166000908152601160205260409020611e0182611df983826133f7565b8391906134c4565b50816001600160a01b0316836001600160a01b03167fa8c3c290cefaeb1444073366880836da0f1d35e164c7163216e5d0e2c979e5f760405160405180910390a3505050565b60055481565b60116020526000908152604090205481565b6001600160a01b0381166000908152600c6020526040902060018101544311611e885750611a43565b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611ed757600080fd5b505afa158015611eeb573d6000803e3d6000fd5b505050506040513d6020811015611f0157600080fd5b5051905080611f17575043600190910155611a43565b6000611f278360010154436133e3565b90506000611f4e600e54610a1b866000015461111b600854876131dc90919063ffffffff16565b6002546004546005549293506001600160a01b03918216926340c10f199290911690611f839061271090610a1b9087906131dc565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611fc957600080fd5b505af1158015611fdd573d6000803e3d6000fd5b50506002546003546007546001600160a01b0392831694506340c10f1993509116906120129061271090610a1b9087906131dc565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561205857600080fd5b505af115801561206c573d6000803e3d6000fd5b5050600254600354604080516340c10f1960e01b81526001600160a01b0392831660048201526024810187905290519190921693506340c10f199250604480830192600092919082900301818387803b1580156120c857600080fd5b505af11580156120dc573d6000803e3d6000fd5b5050505061210a6120ff84610a1b64e8d4a51000856131dc90919063ffffffff16565b600286015490613360565b60028501555050436001909201919091555050565b60026001541415612165576040805162461bcd60e51b815260206004820152601f6024820152600080516020613cf5833981519152604482015290519081900360640190fd5b60026001819055546001600160a01b039081166000908152600c60209081526040808320600d835281842094871684529390915290206121a3612e70565b60028201546001600160a01b03908116911614612207576040805162461bcd60e51b815260206004820152601a60248201527f776974686472617753756761723a206f6e6c792066756e646572000000000000604482015290519081900360640190fd5b805483111561225d576040805162461bcd60e51b815260206004820152601760248201527f776974686472617753756761723a206e6f7420676f6f64000000000000000000604482015290519081900360640190fd5b600254612272906001600160a01b0316611e5f565b6002546122899085906001600160a01b0316612e74565b82156122bb57805461229b90846132a3565b81556122bb6122a8612e70565b6002546001600160a01b031690856135f6565b600282015481546122d69164e8d4a5100091610a1b916131dc565b600182015580546122f4576002810180546001600160a01b03191690555b6002546001600160a01b0390811690851661230d612e70565b835460408051918252516001600160a01b0392909216917f3115d1449a7b732c986cba18244e897a450f61e1bb8d589cd2e69e6c8924f9f79181900360200190a45050600180555050565b82826123648282612dfb565b61239f5760405162461bcd60e51b8152600401808060200182810382526031815260200180613d976031913960400191505060405180910390fd5b600260015414156123e5576040805162461bcd60e51b815260206004820152601f6024820152600080516020613cf5833981519152604482015290519081900360640190fd5b60026001556001600160a01b0384161580159061240c57506001600160a01b038416600114155b6124475760405162461bcd60e51b81526004018080602001828103825260398152602001806140c16039913960400191505060405180910390fd5b6002546001600160a01b03858116911614156124945760405162461bcd60e51b8152600401808060200182810382526021815260200180613e2a6021913960400191505060405180910390fd5b61249f600a856133be565b6124e3576040805162461bcd60e51b815260206004820152601060248201526f19195c1bdcda5d0e881b9bc81c1bdbdb60821b604482015290519081900360640190fd5b6001600160a01b038085166000908152600c60209081526040808320600d83528184208a86168552909252909120600281015491929091161561258357612528612e70565b60028201546001600160a01b03908116911614612583576040805162461bcd60e51b81526020600482015260146024820152733232b837b9b4ba1d1037b7363c90333ab73232b960611b604482015290519081900360640190fd5b61258c86611e5f565b80541561259d5761259d8787612e74565b60028101546001600160a01b03166125da576125b7612e70565b6002820180546001600160a01b0319166001600160a01b03929092169190911790555b84156126625760006125ff612710610a1b8560030154896131dc90919063ffffffff16565b905080156126355761261186826132a3565b955061263561261e612e70565b6004546001600160a01b038a811692911684613300565b612652612640612e70565b6001600160a01b038916903089613300565b815461265e9087613360565b8255505b6002820154815461267d9164e8d4a5100091610a1b916131dc565b60018201556001600160a01b03808716908816612698612e70565b6001600160a01b03167f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96886040518082815260200191505060405180910390a45050600180555050505050565b6000546001600160a01b031690565b600c6020526000908152604090208054600182015460028301546003909301549192909184565b6002546001600160a01b031681565b60095481565b600a5481565b61273e612e70565b6001600160a01b031661274f6126e5565b6001600160a01b031614612798576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6127a06119e1565b6008805490829055604080518281526020810184905281517ffdb01ec377cc02ae17303f4a9fcc1222ec17f21497f1be21a4b72281d12c85a7929181900390910190a15050565b6127ef612e70565b6001600160a01b03166128006126e5565b6001600160a01b031614612849576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b0381161580159061286b57506001600160a01b038116600114155b6128a65760405162461bcd60e51b815260040180806020018281038252603c815260200180613dc8603c913960400191505060405180910390fd5b600480546001600160a01b0319166001600160a01b0383169081179091556040517ff5721dfa6ddbf8e4a2cd38b2152fff4008050b9b37de59ae1e022dde4bd5df7390600090a250565b60026001541415612936576040805162461bcd60e51b815260206004820152601f6024820152600080516020613cf5833981519152604482015290519081900360640190fd5b60026001556001600160a01b0382161580159061295d57506001600160a01b038216600114155b6129985760405162461bcd60e51b81526004018080602001828103825260398152602001806140c16039913960400191505060405180910390fd5b6002546001600160a01b03838116911614156129e55760405162461bcd60e51b815260040180806020018281038252602381526020018061402f6023913960400191505060405180910390fd5b6129f0600a836133be565b612a35576040805162461bcd60e51b81526020600482015260116024820152701dda5d1a191c985dce881b9bc81c1bdbdb607a1b604482015290519081900360640190fd5b6001600160a01b038083166000908152600c60209081526040808320600d83528184209488168452939091529020612a6b612e70565b60028201546001600160a01b03908116911614612ac7576040805162461bcd60e51b81526020600482015260156024820152743bb4ba34323930bb9d1037b7363c90333ab73232b960591b604482015290519081900360640190fd5b8054831115612b12576040805162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015290519081900360640190fd5b612b1b84611e5f565b612b258585612e74565b8215612b55578054612b3790846132a3565b8155612b55612b44612e70565b6001600160a01b03861690856135f6565b60028201548154612b709164e8d4a5100091610a1b916131dc565b60018201558054612b8e576002810180546001600160a01b03191690555b836001600160a01b0316856001600160a01b0316612baa612e70565b6001600160a01b03167f3115d1449a7b732c986cba18244e897a450f61e1bb8d589cd2e69e6c8924f9f7866040518082815260200191505060405180910390a4505060018055505050565b6004546001600160a01b031681565b612c0c612e70565b6001600160a01b0316612c1d6126e5565b6001600160a01b031614612c66576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b038116612cab5760405162461bcd60e51b8152600401808060200182810382526026815260200180613d3d6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60075481565b612d14613c6b565b5060016000818152828201602090815260409182902080546001600160a01b031916909317909255805191820190529054815290565b612d52613c6b565b612d5c83836133be565b15612d985760405162461bcd60e51b815260040180806020018281038252602b815260200180614004602b913960400191505060405180910390fd5b50600160008181528382016020908152604080832080546001600160a01b039687168086528386208054989092166001600160a01b0319988916179091559385905280549095169092179093558354909101928390558051918201905290815290565b6001600160a01b03811660009081526010602052604081205460ff1615612e4c57612e45612e27612e70565b6001600160a01b0384166000908152601160205260409020906133be565b905061117a565b612e54612e70565b6001600160a01b0316836001600160a01b031614905092915050565b3390565b612e7c613c7e565b506001600160a01b0381166000908152600c60209081526040918290208251608081018452815481526001820154928101929092526002810154928201929092526003909101546060820152612ed0613ca6565b506001600160a01b038083166000908152600d6020908152604080832087851684528252918290208251606081018452815481526001820154928101929092526002015490921690820152612f23612e70565b6001600160a01b031681604001516001600160a01b031614612f84576040805162461bcd60e51b81526020600482015260156024820152742fb430b93b32b9ba1d1037b7363c90333ab73232b960591b604482015290519081900360640190fd5b8051612fd7576040805162461bcd60e51b815260206004820152601c60248201527f5f686172766573743a206e6f7468696e6720746f206861727665737400000000604482015290519081900360640190fd5b6000613005826020015161116d64e8d4a51000610a1b876040015187600001516131dc90919063ffffffff16565b600254600354604080516370a0823160e01b81526001600160a01b03928316600482015290519394509116916370a0823191602480820192602092909190829003018186803b15801561305757600080fd5b505afa15801561306b573d6000803e3d6000fd5b505050506040513d602081101561308157600080fd5b50518111156130c15760405162461bcd60e51b8152600401808060200182810382526026815260200180613f016026913960400191505060405180910390fd5b6003546040805163987273e960e01b81526001600160a01b038881166004830152602482018590529151919092169163987273e991604480830192600092919082900301818387803b15801561311657600080fd5b505af115801561312a573d6000803e3d6000fd5b50505050613157613139612e70565b6001600160a01b0386166000908152601160205260409020906133be565b1561316f5761316f613167612e70565b85878461364d565b6131798582613796565b836001600160a01b0316856001600160a01b0316613195612e70565b6001600160a01b03167fd63109fd5abeceff0b6bf54fb909359dfa09a0bc2984733a6d5573dbd0c17573846040518082815260200191505060405180910390a45050505050565b6000826131eb5750600061117a565b828202828482816131f857fe5b04146132355760405162461bcd60e51b8152600401808060200182810382526021815260200180613e4b6021913960400191505060405180910390fd5b9392505050565b6000808211613292576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161329b57fe5b049392505050565b6000828211156132fa576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261335a90859061399d565b50505050565b600082820183811015613235576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b5490565b6001600160a01b03818116600090815260018401602052604090205416151592915050565b6009546000906132359061111b84866132a3565b6001600081815290830160205260408120546001600160a01b03168061344e5760405162461bcd60e51b815260040180806020018281038252603a815260200180613f5f603a913960400191505060405180910390fd5b60005b6001600160a01b0382166001146134b9576001600160a01b038281166000908152600187016020526040902054811690851614156134915750905061117a565b6001600160a01b03918216600090815260018087016020526040909120549092169101613451565b506001949350505050565b6134cc613c6b565b6134d684846133be565b6135115760405162461bcd60e51b815260040180806020018281038252602b81526020018061411f602b913960400191505060405180910390fd5b6001600160a01b03828116600090815260018601602052604090205481169084161461356e5760405162461bcd60e51b81526004018080602001828103825260258152602001806140fa6025913960400191505060405180910390fd5b506001600160a01b0382811660008181526001860160209081526040808320805487871685528285208054919097166001600160a01b031991821617909655939092528254909316909155845460001901808655815192830190915281529392505050565b6001600160a01b0380821660009081526001840160205260409020541692915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261364890849061399d565b505050565b61365f846001600160a01b0316613a4e565b6136685761335a565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b0316632a7862d560e11b17815292518251600094928916939282918083835b602083106136e85780518252601f1990920191602091820191016136c9565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461374a576040519150601f19603f3d011682016040523d82523d6000602084013e61374f565b606091505b505090508061378f5760405162461bcd60e51b8152600401808060200182810382526034815260200180613d636034913960400191505060405180910390fd5b5050505050565b6006546137ab906001600160a01b0316613a4e565b6137b457613999565b6003546006546007546001600160a01b039283169263987273e99216906137e49061271090610a1b9087906131dc565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561382a57600080fd5b505af115801561383e573d6000803e3d6000fd5b5050600654600754600093506001600160a01b03909116915063040ea03960e31b9085906138759061271090610a1b9088906131dc565b604080516001600160a01b03909316602484015260448084019290925280518084039092018252606490920182526020810180516001600160e01b03166001600160e01b031990941693909317835290518151919290918291908083835b602083106138f25780518252601f1990920191602091820191016138d3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613954576040519150601f19603f3d011682016040523d82523d6000602084013e613959565b606091505b50509050806136485760405162461bcd60e51b8152600401808060200182810382526038815260200180613f276038913960400191505060405180910390fd5b5050565b60606139f2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a549092919063ffffffff16565b80519091501561364857808060200190516020811015613a1157600080fd5b50516136485760405162461bcd60e51b815260040180806020018281038252602a815260200180614097602a913960400191505060405180910390fd5b3b151590565b6060613a638484600085613a6b565b949350505050565b606082471015613aac5760405162461bcd60e51b8152600401808060200182810382526026815260200180613e046026913960400191505060405180910390fd5b613ab585613a4e565b613b06576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613b455780518252601f199092019160209182019101613b26565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613ba7576040519150601f19603f3d011682016040523d82523d6000602084013e613bac565b606091505b5091509150613bbc828286613bc7565b979650505050505050565b60608315613bd6575081613235565b825115613be65782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613c30578181015183820152602001613c18565b50505050905090810190601f168015613c5d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040518060200160405280600081525090565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6040518060600160405280600081526020016000815260200160006001600160a01b03168152509056fe736574506f6f6c3a205f7374616b65546f6b656e206e6f7420696e20746865206c6973745265656e7472616e637947756172643a207265656e7472616e742063616c6c006f6e6c795374616b65546f6b656e43616c6c6572436f6e74726163743a206261642063616c6c65724f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735f6d61737465724368656643616c6c65653a20206661696c656420746f2065786563757465206d61737465724368656643616c6c6f6e6c795065726d6974746564546f6b656e46756e6465723a2063616c6c6572206973206e6f74207065726d6974746564736574446576416464726573733a205f64657641646472206d757374206e6f742062652061646472657373283029206f722061646472657373283129416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c6465706f7369743a20757365206465706f736974537567617220696e7374656164536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572736574526566416464726573733a205f72656641646472206d757374206e6f742062652061646472657373283029206f722061646472657373283129616464506f6f6c3a205f7374616b65546f6b656e206d757374206e6f742062652061646472657373283029206f7220616464726573732831295f686172766573743a207761697420776861742e2e206e6f7420656e6f7567682053554741525f726566657272616c43616c6c65653a20206661696c656420746f206578656375746520757064617465526566657272616c5265776172644c696e6b4c6973743a3a67657450726576696f75734f663a3a20706c6561736520696e697420746865206c696e6b65646c69737420666972737472656d6f7665506f6f6c3a2063616e27742072656d6f766520535547415220706f6f6c72656d6f76655374616b65546f6b656e43616c6c6572436f6e74726163743a2074686520706f6f6c20646f65736e277420616c6c6f77206120636f6e74726163742063616c6c65724c696e6b4c6973743a3a6164643a3a206164647220697320616c726561647920696e20746865206c69737477697468647261773a20757365207769746864726177537567617220696e73746561646164645374616b65546f6b656e43616c6c6572436f6e74726163743a2074686520706f6f6c20646f65736e277420616c6c6f77206120636f6e74726163742063616c6c65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564736574506f6f6c3a205f7374616b65546f6b656e206d757374206e6f742062652061646472657373283029206f7220616464726573732831294c696e6b4c6973743a3a72656d6f76653a3a2077726f6e672070726576436f6e73756d65724c696e6b4c6973743a3a72656d6f76653a3a2061646472206e6f742077686974656c697374656420796574a26469706673582212204836b6baae3e9dfcfa505ce8acaaf91f0126c7f1f90d2e34a658a5bcc91a323f64736f6c634300060c0033636f6e7374727563746f723a205f72656641646472206d757374206e6f742062652061646472657373283029206f722061646472657373283129636f6e7374727563746f723a205f64657641646472206d757374206e6f742062652061646472657373283029206f7220616464726573732831294c696e6b4c6973743a3a6164643a3a206164647220697320616c726561647920696e20746865206c697374000000000000000000000000d3ccbf3867ff0204730173eb4cad3c4b5fd07c6900000000000000000000000059d7175203f0330fe163e3e5ac9dea55dd31039600000000000000000000000019ec14906a4d84eccca29cdf6428d08ce9cacdf900000000000000000000000013319b5cab59084189f20bd66b2e9e12b52c2a6a0000000000000000000000000000000000000000000000004563918244f4000000000000000000000000000000000000000000000000000000000000031735c1

Deployed ByteCode Sourcemap

34214:20267:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35904:61;;;;;;;;;;;;;;;;-1:-1:-1;35904:61:0;-1:-1:-1;;;;;35904:61:0;;:::i;:::-;;;;;;;;;;;;;;;;;;49003:1123;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;49003:1123:0;;;;;;;;:::i;:::-;;40489:275;;;;;;;;;;;;;;;;-1:-1:-1;40489:275:0;-1:-1:-1;;;;;40489:275:0;;:::i;51367:438::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51367:438:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51367:438:0;;-1:-1:-1;51367:438:0;-1:-1:-1;51367:438:0;:::i;43505:97::-;;;:::i;:::-;;;;;;;;;;;;;;;;35549:73;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35549:73:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;35549:73:0;;;;;;;;;;;;;;38679:236;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38679:236:0;;;;;;;;;;:::i;35713:39::-;;;:::i;41299:741::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;41299:741:0;;;;;;;;;;;;;:::i;44390:778::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44390:778:0;;;;;;;;;;:::i;35020:19::-;;;:::i;:::-;;;;-1:-1:-1;;;;;35020:19:0;;;;;;;;;;;;;;42784:679;;;;;;;;;;;;;;;;-1:-1:-1;42784:679:0;-1:-1:-1;;;;;42784:679:0;;:::i;42133:593::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42133:593:0;;;;;;;;;;;;;:::i;40770:193::-;;;;;;;;;;;;;;;;-1:-1:-1;40770:193:0;;:::i;38982:499::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38982:499:0;;;;;;;;;;:::i;35806:25::-;;;:::i;40289:194::-;;;;;;;;;;;;;;;;-1:-1:-1;40289:194:0;;:::i;54285:193::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;54285:193:0;;;;;;;;;;;;;;;;;:::i;43859:162::-;;;;;;;;;;;;;;;;-1:-1:-1;43859:162:0;;:::i;45247:208::-;;;:::i;53695:449::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53695:449:0;;;;;;;;;;:::i;50982:340::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50982:340:0;;;;;;;;;;:::i;35234:37::-;;;:::i;35149:31::-;;;:::i;16948:148::-;;;:::i;39550:452::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39550:452:0;;;;;;;;;;:::i;35099:21::-;;;:::i;36026:66::-;;;;;;;;;;;;;;;;-1:-1:-1;36026:66:0;-1:-1:-1;;;;;36026:66:0;;:::i;45527:858::-;;;;;;;;;;;;;;;;-1:-1:-1;45527:858:0;-1:-1:-1;;;;;45527:858:0;;:::i;50153:774::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50153:774:0;;;;;;;;:::i;46447:1405::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46447:1405:0;;;;;;;;;;;;;;;;;:::i;16297:87::-;;;:::i;35439:53::-;;;;;;;;;;;;;;;;-1:-1:-1;35439:53:0;-1:-1:-1;;;;;35439:53:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34966:28;;;:::i;35315:39::-;;;:::i;35383:26::-;;;:::i;40996:246::-;;;;;;;;;;;;;;;;-1:-1:-1;40996:246:0;;:::i;40008:275::-;;;;;;;;;;;;;;;;-1:-1:-1;40008:275:0;-1:-1:-1;;;;;40008:275:0;;:::i;47896:1066::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;47896:1066:0;;;;;;;;;;;;;;;;;:::i;35063:31::-;;;:::i;17251:244::-;;;;;;;;;;;;;;;;-1:-1:-1;17251:244:0;-1:-1:-1;;;;;17251:244:0;;:::i;35185:21::-;;;:::i;35904:61::-;;;;;;;;;;;;;;;:::o;49003:1123::-;49128:5;;49114:4;;-1:-1:-1;;;;;49128:5:0;38213:36;49114:4;49128:5;38213:9;:36::i;:::-;38205:98;;;;-1:-1:-1;;;38205:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14293:1:::1;14899:7;;:19;;14891:63;;;::::0;;-1:-1:-1;;;14891:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;14891:63:0;;;;;;;;;;;;;::::1;;14293:1;15032:7;:18:::0;;;49205:5;;-1:-1:-1;;;;;49205:5:0;;::::2;49164:21;49188:24:::0;;;:8:::2;:24;::::0;;;;;;;49243:8:::2;:24:::0;;;;;:30;;::::2;::::0;;;;;;;;49286:13;;::::2;::::0;49188:24;;49243:30;49286:13:::2;:27:::0;49282:96:::2;;49340:12;:10;:12::i;:::-;49323:13;::::0;::::2;::::0;-1:-1:-1;;;;;49323:13:0;;::::2;:29:::0;::::2;;49315:63;;;::::0;;-1:-1:-1;;;49315:63:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;49315:63:0;;;;;;;;;;;;;::::2;;49406:5;::::0;49387:26:::2;::::0;-1:-1:-1;;;;;49406:5:0::2;49387:10;:26::i;:::-;49426:11:::0;;:15;49422:51:::2;;49466:5;::::0;49443:30:::2;::::0;49452:4;;-1:-1:-1;;;;;49466:5:0::2;49443:8;:30::i;:::-;49484:13;::::0;::::2;::::0;-1:-1:-1;;;;;49484:13:0::2;49480:61;;49529:12;:10;:12::i;:::-;49513:13;::::0;::::2;:28:::0;;-1:-1:-1;;;;;;49513:28:0::2;-1:-1:-1::0;;;;;49513:28:0;;;::::2;::::0;;;::::2;::::0;;49480:61:::2;49552:11:::0;;49548:436:::2;;49574:24;49601:39;49634:5;49601:28;49613:4;:15;;;49601:7;:11;;:28;;;;:::i;:::-;:32:::0;::::2;:39::i;:::-;49574:66:::0;-1:-1:-1;49653:20:0;;49649:186:::2;;49696:29;:7:::0;49708:16;49696:11:::2;:29::i;:::-;49686:39;;49736:89;49784:12;:10;:12::i;:::-;49799:7;::::0;49751:5:::2;::::0;-1:-1:-1;;;;;49751:5:0;;::::2;::::0;49736:89;49799:7:::2;49808:16:::0;49736:39:::2;:89::i;:::-;49843:86;49891:12;:10;:12::i;:::-;49858:5;::::0;-1:-1:-1;;;;;49858:5:0::2;::::0;49914:4:::2;49921:7:::0;49843:39:::2;:86::i;:::-;49952:11:::0;;:24:::2;::::0;49968:7;49952:15:::2;:24::i;:::-;49938:38:::0;;-1:-1:-1;49548:436:0::2;50024:21;::::0;::::2;::::0;50008:11;;:48:::2;::::0;50051:4:::2;::::0;50008:38:::2;::::0;:15:::2;:38::i;:48::-;49990:15;::::0;::::2;:66:::0;50104:5:::2;::::0;-1:-1:-1;;;;;50104:5:0;;::::2;::::0;50068:52;::::2;50076:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;50068:52:0::2;;50112:7;50068:52;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;14249:1:0::1;15211:22:::0;;-1:-1:-1;;;;49003:1123:0:o;40489:275::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;40572:22:0;::::1;::::0;;::::1;::::0;:48:::1;;-1:-1:-1::0;;;;;;40598:22:0;::::1;40618:1;40598:22;;40572:48;40556:142;;;;-1:-1:-1::0;;;40556:142:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40705:7;:18:::0;;-1:-1:-1;;;;;;40705:18:0::1;-1:-1:-1::0;;;;;40705:18:0;::::1;::::0;;::::1;::::0;;;40735:23:::1;::::0;::::1;::::0;-1:-1:-1;;40735:23:0::1;40489:275:::0;:::o;51367:438::-;14293:1;14899:7;;:19;;14891:63;;;;;-1:-1:-1;;;14891:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14891:63:0;;;;;;;;;;;;;;;14293:1;15032:7;:18;51474:9:::1;51469:331;51489:23:::0;;::::1;51469:331;;;51528:21;51552:8;:25;51561:12;;51574:1;51561:15;;;;;;;;;;;;;-1:-1:-1::0;;;;;51561:15:0::1;-1:-1:-1::0;;;;;51552:25:0::1;-1:-1:-1::0;;;;;51552:25:0::1;;;;;;;;;;;;51528:49;;51586:21;51610:8;:25;51619:12;;51632:1;51619:15;;;;;;;-1:-1:-1::0;;;;;51619:15:0::1;::::0;;::::1;::::0;;;::::1;;::::0;::::1;51610:25:::0;;;;::::1;::::0;;;;-1:-1:-1;51610:25:0;;;;-1:-1:-1;51610:25:0;;;:31;;::::1;::::0;;;;;;;-1:-1:-1;51650:27:0::1;51661:12:::0;;51674:1;51661:15;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;51661:15:0::1;51650:10;:27::i;:::-;51686:31;51695:4;51701:12;;51714:1;51701:15;;;;;;;;;;;;;-1:-1:-1::0;;;;;51701:15:0::1;51686:8;:31::i;:::-;51760:21;::::0;::::1;::::0;51744:11;;:48:::1;::::0;51787:4:::1;::::0;51744:38:::1;::::0;:15:::1;:38::i;:48::-;51726:15;::::0;;::::1;:66:::0;51514:3;;;::::1;::::0;-1:-1:-1;51469:331:0::1;;;-1:-1:-1::0;;14249:1:0;15211:22;;-1:-1:-1;;51367:438:0:o;43505:97::-;43559:7;43582:14;:5;:12;:14::i;:::-;43575:21;;43505:97;:::o;35549:73::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35549:73:0;;:::o;38679:236::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;38785:42:0;::::1;;::::0;;;:29:::1;:42;::::0;;;;;;;;:55;;-1:-1:-1;;38785:55:0::1;::::0;::::1;;::::0;;::::1;::::0;;;38852:57;;;;;;;::::1;::::0;;;;;;;;::::1;38679:236:::0;;:::o;35713:39::-;;;;:::o;41299:741::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;41450:25:0;::::1;::::0;;::::1;::::0;:54:::1;;-1:-1:-1::0;;;;;;41479:25:0;::::1;41502:1;41479:25;;41450:54;41434:145;;;;-1:-1:-1::0;;;41434:145:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41595:22;:5;41605:11:::0;41595:9:::1;:22::i;:::-;41594:23;41586:67;;;::::0;;-1:-1:-1;;;41586:67:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;41662:17;:15;:17::i;:::-;41688:23;41729:10;;41714:12;:25;:53;;41757:10;;41714:53;;;41742:12;41714:53;41792:15;::::0;41688:79;;-1:-1:-1;41792:32:0::1;::::0;41812:11;41792:19:::1;:32::i;:::-;41774:15;:50:::0;41831:22:::1;:5;41841:11:::0;41831:9:::1;:22::i;:::-;-1:-1:-1::0;41884:150:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;41884:150:0;;;;;;;;;;;;-1:-1:-1;;;;;41860:21:0;;::::1;::::0;;:8:::1;:21:::0;;;;:174;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;41299:741::o;44390:778::-;-1:-1:-1;;;;;44520:21:0;;;44480:7;44520:21;;;:8;:21;;;;;;;;44572:8;:21;;;;;:28;;;;;;;;;;;44634:21;;;;44688:44;;-1:-1:-1;;;44688:44:0;;44726:4;44688:44;;;;;;44480:7;;44520:21;44572:28;;44634:21;;44480:7;;44688:29;;:44;;;;;44520:21;44688:44;;;;;44520:21;44688:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44688:44:0;44758:20;;;;44688:44;;-1:-1:-1;44743:12:0;:35;:59;;;;-1:-1:-1;44782:20:0;;;44743:59;44739:346;;;44813:18;44834:49;44848:4;:20;;;44870:12;44834:13;:49::i;:::-;44813:70;;44892:19;44914:71;44969:15;;44914:50;44948:4;:15;;;44914:29;44929:13;;44914:10;:14;;:29;;;;:::i;:::-;:33;;:50::i;:71::-;44892:93;-1:-1:-1;45013:64:0;45034:42;45060:15;45034:21;44892:93;45050:4;45034:15;:21::i;:42::-;45013:16;;:20;:64::i;:::-;44994:83;;44739:346;;;45098:64;45146:4;:15;;;45098:43;45136:4;45098:33;45114:16;45098:4;:11;;;:15;;:33;;;;:::i;:43::-;:47;;:64::i;:::-;45091:71;;;;;;44390:778;;;;;:::o;35020:19::-;;;-1:-1:-1;;;;;35020:19:0;;:::o;42784:679::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;42891:5:::1;::::0;-1:-1:-1;;;;;42868:29:0;;::::1;42891:5:::0;::::1;42868:29;;42860:77;;;;-1:-1:-1::0;;;42860:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42952:22;:5;42962:11:::0;42952:9:::1;:22::i;:::-;42944:63;;;::::0;;-1:-1:-1;;;42944:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;43022:44;::::0;;-1:-1:-1;;;43022:44:0;;43060:4:::1;43022:44;::::0;::::1;::::0;;;-1:-1:-1;;;;;43022:29:0;::::1;::::0;::::1;::::0;:44;;;;;::::1;::::0;;;;;;;;:29;:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;43022:44:0;:49;43014:88:::1;;;::::0;;-1:-1:-1;;;43014:88:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;43111:17;:15;:17::i;:::-;-1:-1:-1::0;;;;;43175:21:0;::::1;;::::0;;;:8:::1;:21;::::0;;;;:32;43155:15:::1;::::0;:53:::1;::::0;:19:::1;:53::i;:::-;43137:15;:71:::0;43215:59:::1;43228:11:::0;43241:32:::1;:5;43228:11:::0;43241:19:::1;:32::i;:::-;43215:5;::::0;:59;:12:::1;:59::i;:::-;-1:-1:-1::0;;;;;;43281:21:0::1;43316:1;43281:21:::0;;;:8:::1;:21;::::0;;;;:36;;;43324:37:::1;::::0;::::1;:41:::0;;;43372:38:::1;::::0;::::1;:42:::0;;;43421:32:::1;;:36:::0;42784:679::o;42133:593::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42284:25:0;::::1;::::0;;::::1;::::0;:54:::1;;-1:-1:-1::0;;;;;;42313:25:0;::::1;42336:1;42313:25;;42284:54;42268:145;;;;-1:-1:-1::0;;;42268:145:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42428:22;:5;42438:11:::0;42428:9:::1;:22::i;:::-;42420:71;;;;-1:-1:-1::0;;;42420:71:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42500:17;:15;:17::i;:::-;-1:-1:-1::0;;;;;42564:21:0;::::1;;::::0;;;:8:::1;:21;::::0;;;;:32;42544:15:::1;::::0;:70:::1;::::0;42602:11;;42544:53:::1;::::0;:19:::1;:53::i;:::-;:57:::0;::::1;:70::i;:::-;42526:15;:88:::0;-1:-1:-1;;;;;42621:21:0;;::::1;;::::0;;;:8:::1;:21;::::0;;;;:46;;;42674:32:::1;;:46:::0;42133:593::o;40770:193::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;40851:3:::1;40840:7;:14;;40832:48;;;::::0;;-1:-1:-1;;;40832:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40832:48:0;;;;;;;;;;;;;::::1;;40887:17;:15;:17::i;:::-;40911:6;:16:::0;;;40939:18:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;40770:193:::0;:::o;38982:499::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39099:42:0;::::1;;::::0;;;:29:::1;:42;::::0;;;;;::::1;;39083:145;;;;-1:-1:-1::0;;;39083:145:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;39264:38:0;::::1;39235:26;39264:38:::0;;;:25:::1;:38;::::0;;;;;39313:30:::1;39264:38:::0;17591:1:::1;39313:14;:30::i;:::-;-1:-1:-1::0;;;;;39313:48:0::1;;39309:82;;;39372:11;:4;:9;:11::i;:::-;;39309:82;39397:17;:4:::0;39406:7;39397:8:::1;:17::i;:::-;;39467:7;-1:-1:-1::0;;;;;39426:49:0::1;39454:11;-1:-1:-1::0;;;;;39426:49:0::1;;;;;;;;;;;16588:1;38982:499:::0;;:::o;35806:25::-;;;;:::o;40289:194::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;40370:4:::1;40359:7;:15;;40351:49;;;::::0;;-1:-1:-1;;;40351:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40351:49:0;;;;;;;;;;;;;::::1;;40407:17;:15;:17::i;:::-;40431:6;:16:::0;;;40459:18:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;40289:194:::0;:::o;54285:193::-;54428:11;38508:56;38551:12;:10;:12::i;:::-;-1:-1:-1;;;;;38508:38:0;;;;;;:25;:38;;;;;;:42;:56::i;:::-;38500:109;;;;-1:-1:-1;;;38500:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54448:5:::1;::::0;:24:::1;::::0;;-1:-1:-1;;;54448:24:0;;-1:-1:-1;;;;;54448:24:0;;::::1;;::::0;::::1;::::0;;;;;;;;;:5;;;::::1;::::0;:10:::1;::::0;:24;;;;;:5:::1;::::0;:24;;;;;;;:5;;:24;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;54285:193:::0;;;;:::o;43859:162::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;43935:15:::1;:34:::0;;;43981::::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;43859:162:::0;:::o;45247:208::-;45306:10;45288:15;45306:26;:10;:26;;;;-1:-1:-1;;;;;45306:26:0;45339:111;-1:-1:-1;;;;;45346:23:0;;17636:1;45346:23;45339:111;;45380:19;45391:7;45380:10;:19::i;:::-;45418:24;:5;45434:7;45418:15;:24::i;:::-;45408:34;;45339:111;;;45247:208;:::o;53695:449::-;14293:1;14899:7;;:19;;14891:63;;;;;-1:-1:-1;;;14891:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14891:63:0;;;;;;;;;;;;;;;14293:1;15032:7;:18;-1:-1:-1;;;;;53819:21:0;;::::1;53795;53819::::0;;;:8:::1;:21;::::0;;;;;;;:27;;::::1;::::0;;;;;;53878:12:::1;:10;:12::i;:::-;53861:13;::::0;::::1;::::0;-1:-1:-1;;;;;53861:13:0;;::::1;:29:::0;::::1;;53853:72;;;::::0;;-1:-1:-1;;;53853:72:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;53980:11:::0;;53932:60:::1;::::0;-1:-1:-1;;;;;53932:32:0;::::1;::::0;53973:4;;53932:32:::1;:60::i;:::-;54043:11:::0;;54006:49:::1;::::0;;;;;;-1:-1:-1;;;;;54006:49:0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;54078:1;54064:15:::0;;;54086::::1;::::0;;::::1;:19:::0;;;;54112:13:::1;::::0;;::::1;:26:::0;;-1:-1:-1;;;;;;54112:26:0::1;::::0;;15211:22;;-1:-1:-1;;53695:449:0:o;50982:340::-;14293:1;14899:7;;:19;;14891:63;;;;;-1:-1:-1;;;14891:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14891:63:0;;;;;;;;;;;;;;;14293:1;15032:7;:18;-1:-1:-1;;;;;51096:21:0;;::::1;51072;51096::::0;;;:8:::1;:21;::::0;;;;;;;51148:8:::1;:21:::0;;;;;:27;;::::1;::::0;;;;;;;;51184:23:::1;51105:11:::0;51184:10:::1;:23::i;:::-;51214:27;51223:4;51229:11;51214:8;:27::i;:::-;51284:21;::::0;::::1;::::0;51268:11;;:48:::1;::::0;51311:4:::1;::::0;51268:38:::1;::::0;:15:::1;:38::i;:48::-;51250:15;::::0;;::::1;:66:::0;15211:22;;-1:-1:-1;;;50982:340:0:o;35234:37::-;;;;:::o;35149:31::-;;;-1:-1:-1;;;;;35149:31:0;;:::o;16948:148::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;17055:1:::1;17039:6:::0;;17018:40:::1;::::0;-1:-1:-1;;;;;17039:6:0;;::::1;::::0;17018:40:::1;::::0;17055:1;;17018:40:::1;17086:1;17069:19:::0;;-1:-1:-1;;;;;;17069:19:0::1;::::0;;16948:148::o;39550:452::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39670:42:0;::::1;;::::0;;;:29:::1;:42;::::0;;;;;::::1;;39654:148;;;;-1:-1:-1::0;;;39654:148:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;39838:38:0;::::1;39809:26;39838:38:::0;;;:25:::1;:38;::::0;;;;39883:49:::1;39895:7:::0;39904:27:::1;39838:38:::0;39895:7;39904:18:::1;:27::i;:::-;39883:4:::0;;:49;:11:::1;:49::i;:::-;;39988:7;-1:-1:-1::0;;;;;39944:52:0::1;39975:11;-1:-1:-1::0;;;;;39944:52:0::1;;;;;;;;;;;16588:1;39550:452:::0;;:::o;35099:21::-;;;;:::o;36026:66::-;;;;;;;;;;;;;:::o;45527:858::-;-1:-1:-1;;;;;45615:21:0;;45591;45615;;;:8;:21;;;;;45663:20;;;;45647:12;:36;45643:65;;45694:7;;;45643:65;45714:23;45747:11;-1:-1:-1;;;;;45740:29:0;;45778:4;45740:44;;;;;;;;;;;;;-1:-1:-1;;;;;45740:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45740:44:0;;-1:-1:-1;45795:20:0;45791:93;;-1:-1:-1;45849:12:0;45826:20;;;;:35;45870:7;;45791:93;45890:18;45911:49;45925:4;:20;;;45947:12;45911:13;:49::i;:::-;45890:70;;45967:19;45989:71;46044:15;;45989:50;46023:4;:15;;;45989:29;46004:13;;45989:10;:14;;:29;;;;:::i;:71::-;46067:5;;46078:7;;46103:6;;45967:93;;-1:-1:-1;;;;;;46067:5:0;;;;:10;;46078:7;;;;46087:34;;46115:5;;46087:23;;45967:93;;46087:15;:23::i;:34::-;46067:55;;;;;;;;;;;;;-1:-1:-1;;;;;46067:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46129:5:0;;46148;;46172:6;;-1:-1:-1;;;;;46129:5:0;;;;-1:-1:-1;46129:10:0;;-1:-1:-1;46148:5:0;;;46156:34;;46184:5;;46156:23;;:11;;:15;:23::i;:34::-;46129:62;;;;;;;;;;;;;-1:-1:-1;;;;;46129:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46198:5:0;;46217;;46198:39;;;-1:-1:-1;;;46198:39:0;;-1:-1:-1;;;;;46217:5:0;;;46198:39;;;;;;;;;;;;:5;;;;;-1:-1:-1;46198:10:0;;-1:-1:-1;46198:39:0;;;;;:5;;:39;;;;;;;:5;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46268:69;46294:42;46320:15;46294:21;46310:4;46294:11;:15;;:21;;;;:::i;:42::-;46268:21;;;;;:25;:69::i;:::-;46244:21;;;:93;-1:-1:-1;;46367:12:0;46344:20;;;;:35;;;;-1:-1:-1;45527:858:0;:::o;50153:774::-;14293:1;14899:7;;:19;;14891:63;;;;;-1:-1:-1;;;14891:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14891:63:0;;;;;;;;;;;;;;;14293:1;15032:7;:18;;;50286:5;-1:-1:-1;;;;;50286:5:0;;::::1;50245:21;50269:24:::0;;;:8:::1;:24;::::0;;;;;;;50324:8:::1;:24:::0;;;;;:30;;::::1;::::0;;;;;;;;50388:12:::1;:10;:12::i;:::-;50371:13;::::0;::::1;::::0;-1:-1:-1;;;;;50371:13:0;;::::1;:29:::0;::::1;;50363:68;;;::::0;;-1:-1:-1;;;50363:68:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;50446:11:::0;;:22;-1:-1:-1;50446:22:0::1;50438:58;;;::::0;;-1:-1:-1;;;50438:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;50524:5;::::0;50505:26:::1;::::0;-1:-1:-1;;;;;50524:5:0::1;50505:10;:26::i;:::-;50561:5;::::0;50538:30:::1;::::0;50547:4;;-1:-1:-1;;;;;50561:5:0::1;50538:8;:30::i;:::-;50581:11:::0;;50577:148:::1;;50617:11:::0;;:24:::1;::::0;50633:7;50617:15:::1;:24::i;:::-;50603:38:::0;;50650:67:::1;50694:12;:10;:12::i;:::-;50665:5;::::0;-1:-1:-1;;;;;50665:5:0::1;::::0;50709:7;50650:35:::1;:67::i;:::-;50765:21;::::0;::::1;::::0;50749:11;;:48:::1;::::0;50792:4:::1;::::0;50749:38:::1;::::0;:15:::1;:38::i;:48::-;50731:15;::::0;::::1;:66:::0;50808:11;;50804:48:::1;;50826:13;::::0;::::1;:26:::0;;-1:-1:-1;;;;;;50826:26:0::1;::::0;;50804:48:::1;50901:5;::::0;-1:-1:-1;;;;;50901:5:0;;::::1;::::0;50864:57;::::1;50873:12;:10;:12::i;:::-;50909:11:::0;;50864:57:::1;::::0;;;;;;-1:-1:-1;;;;;50864:57:0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;14249:1:0;15211:22;;-1:-1:-1;;50153:774:0:o;46447:1405::-;46579:4;46585:11;38213:36;38223:12;38237:11;38213:9;:36::i;:::-;38205:98;;;;-1:-1:-1;;;38205:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14293:1:::1;14899:7;;:19;;14891:63;;;::::0;;-1:-1:-1;;;14891:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;14891:63:0;;;;;;;;;;;;;::::1;;14293:1;15032:7;:18:::0;-1:-1:-1;;;;;46634:25:0;::::2;::::0;;::::2;::::0;:54:::2;;-1:-1:-1::0;;;;;;46663:25:0;::::2;46686:1;46663:25;;46634:54;46618:145;;;;-1:-1:-1::0;;;46618:145:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46801:5;::::0;-1:-1:-1;;;;;46778:29:0;;::::2;46801:5:::0;::::2;46778:29;;46770:75;;;;-1:-1:-1::0;;;46770:75:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46860:22;:5;46870:11:::0;46860:9:::2;:22::i;:::-;46852:51;;;::::0;;-1:-1:-1;;;46852:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;46852:51:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;46936:21:0;;::::2;46912;46936::::0;;;:8:::2;:21;::::0;;;;;;;46988:8:::2;:21:::0;;;;;:27;;::::2;::::0;;;;;;;;47028:13:::2;::::0;::::2;::::0;46936:21;;46988:27;;47028:13:::2;:27:::0;47024:95:::2;;47082:12;:10;:12::i;:::-;47065:13;::::0;::::2;::::0;-1:-1:-1;;;;;47065:13:0;;::::2;:29:::0;::::2;;47057:62;;;::::0;;-1:-1:-1;;;47057:62:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;47057:62:0;;;;;;;;;;;;;::::2;;47128:23;47139:11;47128:10;:23::i;:::-;47164:11:::0;;:15;47160:48:::2;;47181:27;47190:4;47196:11;47181:8;:27::i;:::-;47219:13;::::0;::::2;::::0;-1:-1:-1;;;;;47219:13:0::2;47215:61;;47264:12;:10;:12::i;:::-;47248:13;::::0;::::2;:28:::0;;-1:-1:-1;;;;;;47248:28:0::2;-1:-1:-1::0;;;;;47248:28:0;;;::::2;::::0;;;::::2;::::0;;47215:61:::2;47287:11:::0;;47283:430:::2;;47309:24;47336:39;47369:5;47336:28;47348:4;:15;;;47336:7;:11;;:28;;;;:::i;:39::-;47309:66:::0;-1:-1:-1;47388:20:0;;47384:183:::2;;47431:29;:7:::0;47443:16;47431:11:::2;:29::i;:::-;47421:39;;47471:86;47516:12;:10;:12::i;:::-;47531:7;::::0;-1:-1:-1;;;;;47471:36:0;;::::2;::::0;:86;47531:7:::2;47540:16:::0;47471:36:::2;:86::i;:::-;47575:83;47620:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;47575:36:0;::::2;::::0;47643:4:::2;47650:7:::0;47575:36:::2;:83::i;:::-;47681:11:::0;;:24:::2;::::0;47697:7;47681:15:::2;:24::i;:::-;47667:38:::0;;-1:-1:-1;47283:430:0::2;47753:21;::::0;::::2;::::0;47737:11;;:48:::2;::::0;47780:4:::2;::::0;47737:38:::2;::::0;:15:::2;:38::i;:48::-;47719:15;::::0;::::2;:66:::0;-1:-1:-1;;;;;47797:49:0;;::::2;::::0;;::::2;47805:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;47797:49:0::2;;47838:7;47797:49;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;14249:1:0::1;15211:22:::0;;-1:-1:-1;;;;;46447:1405:0:o;16297:87::-;16343:7;16370:6;-1:-1:-1;;;;;16370:6:0;16297:87;:::o;35439:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34966:28::-;;;-1:-1:-1;;;;;34966:28:0;;:::o;35315:39::-;;;;:::o;35383:26::-;;;;:::o;40996:246::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;41072:17:::1;:15;:17::i;:::-;41124:13;::::0;;41144:30;;;;41186:50:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;16588:1;40996:246:::0;:::o;40008:275::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;40091:22:0;::::1;::::0;;::::1;::::0;:48:::1;;-1:-1:-1::0;;;;;;40117:22:0;::::1;40137:1;40117:22;;40091:48;40075:142;;;;-1:-1:-1::0;;;40075:142:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40224:7;:18:::0;;-1:-1:-1;;;;;;40224:18:0::1;-1:-1:-1::0;;;;;40224:18:0;::::1;::::0;;::::1;::::0;;;40254:23:::1;::::0;::::1;::::0;-1:-1:-1;;40254:23:0::1;40008:275:::0;:::o;47896:1066::-;14293:1;14899:7;;:19;;14891:63;;;;;-1:-1:-1;;;14891:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14891:63:0;;;;;;;;;;;;;;;14293:1;15032:7;:18;-1:-1:-1;;;;;48040:25:0;::::1;::::0;;::::1;::::0;:54:::1;;-1:-1:-1::0;;;;;;48069:25:0;::::1;48092:1;48069:25;;48040:54;48024:145;;;;-1:-1:-1::0;;;48024:145:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48207:5;::::0;-1:-1:-1;;;;;48184:29:0;;::::1;48207:5:::0;::::1;48184:29;;48176:77;;;;-1:-1:-1::0;;;48176:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48268:22;:5;48278:11:::0;48268:9:::1;:22::i;:::-;48260:52;;;::::0;;-1:-1:-1;;;48260:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;48260:52:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;48345:21:0;;::::1;48321;48345::::0;;;:8:::1;:21;::::0;;;;;;;48397:8:::1;:21:::0;;;;;:27;;::::1;::::0;;;;;;;;48458:12:::1;:10;:12::i;:::-;48441:13;::::0;::::1;::::0;-1:-1:-1;;;;;48441:13:0;;::::1;:29:::0;::::1;;48433:63;;;::::0;;-1:-1:-1;;;48433:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;48433:63:0;;;;;;;;;;;;;::::1;;48511:11:::0;;:22;-1:-1:-1;48511:22:0::1;48503:53;;;::::0;;-1:-1:-1;;;48503:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;48503:53:0;;;;;;;;;;;;;::::1;;48565:23;48576:11;48565:10;:23::i;:::-;48595:27;48604:4;48610:11;48595:8;:27::i;:::-;48635:11:::0;;48631:136:::1;;48671:11:::0;;:24:::1;::::0;48687:7;48671:15:::1;:24::i;:::-;48657:38:::0;;48704:55:::1;48737:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;48704:32:0;::::1;::::0;48751:7;48704:32:::1;:55::i;:::-;48807:21;::::0;::::1;::::0;48791:11;;:48:::1;::::0;48834:4:::1;::::0;48791:38:::1;::::0;:15:::1;:38::i;:48::-;48773:15;::::0;::::1;:66:::0;48850:11;;48846:48:::1;;48868:13;::::0;::::1;:26:::0;;-1:-1:-1;;;;;;48868:26:0::1;::::0;;48846:48:::1;48935:11;-1:-1:-1::0;;;;;48906:50:0::1;48929:4;-1:-1:-1::0;;;;;48906:50:0::1;48915:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;48906:50:0::1;;48948:7;48906:50;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;14249:1:0;15211:22;;-1:-1:-1;;;47896:1066:0:o;35063:31::-;;;-1:-1:-1;;;;;35063:31:0;;:::o;17251:244::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;17340:22:0;::::1;17332:73;;;;-1:-1:-1::0;;;17332:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17442:6;::::0;;17421:38:::1;::::0;-1:-1:-1;;;;;17421:38:0;;::::1;::::0;17442:6;::::1;::::0;17421:38:::1;::::0;::::1;17470:6;:17:::0;;-1:-1:-1;;;;;;17470:17:0::1;-1:-1:-1::0;;;;;17470:17:0;;;::::1;::::0;;;::::1;::::0;;17251:244::o;35185:21::-;;;;:::o;17776:119::-;17827:11;;:::i;:::-;-1:-1:-1;17636:1:0;17847:16;;;;:9;;;:16;;;;;;;;;:22;;-1:-1:-1;;;;;;17847:22:0;;;;;;;17878:11;;;;;;;;;;;;17776:119::o;18026:273::-;18090:11;;:::i;:::-;18119:15;18123:4;18129;18119:3;:15::i;:::-;18118:16;18110:72;;;;-1:-1:-1;;;18110:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18207:9:0;:16;;;;:9;;;:16;;;;;;;;;;-1:-1:-1;;;;;18189:15:0;;;;;;;;;:34;;18207:16;;;;-1:-1:-1;;;;;;18189:34:0;;;;;;;18230:16;;;;:23;;;;;;;;;;;18260:13;;;;;;;;;18282:11;;;;;;;;;;;18026:273::o;44072:257::-;-1:-1:-1;;;;;44174:42:0;;44157:4;44174:42;;;:29;:42;;;;;;;;44170:111;;;44225:56;44268:12;:10;:12::i;:::-;-1:-1:-1;;;;;44225:38:0;;;;;;:25;:38;;;;;;:42;:56::i;:::-;44218:63;;;;44170:111;44311:12;:10;:12::i;:::-;-1:-1:-1;;;;;44295:28:0;:12;-1:-1:-1;;;;;44295:28:0;;44288:35;;44072:257;;;;:::o;613:106::-;701:10;613:106;:::o;51852:790::-;51921:20;;:::i;:::-;-1:-1:-1;;;;;;51944:21:0;;;;;;:8;:21;;;;;;;;;51921:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51972:20;;:::i;:::-;-1:-1:-1;;;;;;51995:21:0;;;;;;;:8;:21;;;;;;;;:27;;;;;;;;;;;51972:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52054:12;:10;:12::i;:::-;-1:-1:-1;;;;;52037:29:0;:4;:13;;;-1:-1:-1;;;;;52037:29:0;;52029:63;;;;;-1:-1:-1;;;52029:63:0;;;;;;;;;;;;-1:-1:-1;;;52029:63:0;;;;;;;;;;;;;;;52107:11;;52099:56;;;;;-1:-1:-1;;;52099:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52162:15;52180:69;52233:4;:15;;;52180:48;52223:4;52180:38;52196:4;:21;;;52180:4;:11;;;:15;;:38;;;;:::i;:69::-;52275:5;;52299;;52275:31;;;-1:-1:-1;;;52275:31:0;;-1:-1:-1;;;;;52299:5:0;;;52275:31;;;;;;52162:87;;-1:-1:-1;52275:5:0;;;:15;;:31;;;;;;;;;;;;;;;:5;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52275:31:0;52264:42;;;52256:93;;;;-1:-1:-1;;;52256:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52356:5;;:38;;;-1:-1:-1;;;52356:38:0;;-1:-1:-1;;;;;52356:38:0;;;;;;;;;;;;;;;:5;;;;;:23;;:38;;;;;:5;;:38;;;;;;;:5;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52405:56;52448:12;:10;:12::i;:::-;-1:-1:-1;;;;;52405:38:0;;;;;;:25;:38;;;;;;:42;:56::i;:::-;52401:138;;;52472:59;52490:12;:10;:12::i;:::-;52504:11;52517:4;52523:7;52472:17;:59::i;:::-;52545:30;52561:4;52567:7;52545:15;:30::i;:::-;52615:11;-1:-1:-1;;;;;52587:49:0;52609:4;-1:-1:-1;;;;;52587:49:0;52595:12;:10;:12::i;:::-;-1:-1:-1;;;;;52587:49:0;;52628:7;52587:49;;;;;;;;;;;;;;;;;;51852:790;;;;;:::o;30028:220::-;30086:7;30110:6;30106:20;;-1:-1:-1;30125:1:0;30118:8;;30106:20;30149:5;;;30153:1;30149;:5;:1;30173:5;;;;;:10;30165:56;;;;-1:-1:-1;;;30165:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30239:1;30028:220;-1:-1:-1;;;30028:220:0:o;30726:153::-;30784:7;30816:1;30812;:5;30804:44;;;;;-1:-1:-1;;;30804:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30870:1;30866;:5;;;;;;;30726:153;-1:-1:-1;;;30726:153:0:o;29611:158::-;29669:7;29702:1;29697;:6;;29689:49;;;;;-1:-1:-1;;;29689:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29756:5:0;;;29611:158::o;1744:205::-;1872:68;;;-1:-1:-1;;;;;1872:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1872:68:0;-1:-1:-1;;;1872:68:0;;;1845:96;;1865:5;;1845:19;:96::i;:::-;1744:205;;;;:::o;29149:179::-;29207:7;29239:5;;;29263:6;;;;29255:46;;;;;-1:-1:-1;;;29255:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;19524:98;19605:11;;19524:98::o;17901:119::-;-1:-1:-1;;;;;17990:15:0;;;17970:4;17990:15;;;:9;;;:15;;;;;;;:24;;17901:119;;;;:::o;43674:179::-;43831:15;;43768:7;;43791:56;;:35;:13;43809:16;43791:17;:35::i;19021:372::-;19131:9;19100:7;19131:16;;;:9;;;:16;;;;;;-1:-1:-1;;;;;19131:16:0;19162:13;19154:84;;;;-1:-1:-1;;;19154:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19250:9;19245:126;-1:-1:-1;;;;;19265:11:0;;17636:1;19265:11;19245:126;;-1:-1:-1;;;;;19296:15:0;;;;;;;:9;;;:15;;;;;;;;:23;;;;19292:40;;;-1:-1:-1;19328:4:0;-1:-1:-1;19321:11:0;;19292:40;-1:-1:-1;;;;;19348:15:0;;;;;;;:9;;;;:15;;;;;;;;;;;19278:3;19245:126;;;-1:-1:-1;17636:1:0;;19021:372;-1:-1:-1;;;;19021:372:0:o;18305:400::-;18410:11;;:::i;:::-;18438:15;18442:4;18448;18438:3;:15::i;:::-;18430:71;;;;-1:-1:-1;;;18430:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18516:19:0;;;;;;;:9;;;:19;;;;;;;;:27;;;;18508:77;;;;-1:-1:-1;;;18508:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18614:15:0;;;;;;;:9;;;:15;;;;;;;;;;18592:19;;;;;;;;:37;;18614:15;;;;-1:-1:-1;;;;;;18592:37:0;;;;;;;18636:15;;;;:23;;;;;;;;18666:13;;-1:-1:-1;;18666:13:0;;;;18688:11;;;;;;;;;;18305:400;;;;;:::o;19399:119::-;-1:-1:-1;;;;;19497:15:0;;;19474:7;19497:15;;;:9;;;:15;;;;;;;19399:119;;;;:::o;1559:177::-;1669:58;;;-1:-1:-1;;;;;1669:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1669:58:0;-1:-1:-1;;;1669:58:0;;;1642:86;;1662:5;;1642:19;:86::i;:::-;1559:177;;;:::o;53206:422::-;53349:20;:7;-1:-1:-1;;;;;53349:18:0;;:20::i;:::-;53344:50;;53380:7;;53344:50;53440:96;;;-1:-1:-1;;;;;53440:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53440:96:0;-1:-1:-1;;;53440:96:0;;;53419:124;;;;53401:12;;53419;;;;53440:96;53419:124;;;;53440:96;53419:124;;;;;;;;;;-1:-1:-1;;53419:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53400:143;;;53558:7;53550:72;;;;-1:-1:-1;;;53550:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53206:422;;;;;:::o;52648:448::-;52726:7;;:20;;-1:-1:-1;;;;;52726:7:0;:18;:20::i;:::-;52721:50;;52757:7;;52721:50;52777:5;;52809:7;;52832:6;;-1:-1:-1;;;;;52777:5:0;;;;:23;;52809:7;;52819:31;;52844:5;;52819:20;;:8;;:12;:20::i;:31::-;52777:74;;;;;;;;;;;;;-1:-1:-1;;;;;52777:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52877:7:0;;52981:6;;52859:12;;-1:-1:-1;;;;;;52877:7:0;;;;-1:-1:-1;;;;52921:39:0;52962:4;;52968:31;;52993:5;;52968:20;;:8;;:12;:20::i;:31::-;52898:102;;;-1:-1:-1;;;;;52898:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52898:102:0;-1:-1:-1;;;;;;52898:102:0;;;;;;;;;52877:130;;;;52898:102;;52877:130;;;;52898:102;52877:130;;52898:102;52877:130;;;;;;;;;;-1:-1:-1;;52877:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52858:149;;;53022:7;53014:76;;;;-1:-1:-1;;;53014:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52648:448;;;:::o;3864:761::-;4288:23;4314:69;4342:4;4314:69;;;;;;;;;;;;;;;;;4322:5;-1:-1:-1;;;;;4314:27:0;;;:69;;;;;:::i;:::-;4398:17;;4288:95;;-1:-1:-1;4398:21:0;4394:224;;4540:10;4529:30;;;;;;;;;;;;;;;-1:-1:-1;4529:30:0;4521:85;;;;-1:-1:-1;;;4521:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5348:422;5715:20;5754:8;;;5348:422::o;8266:195::-;8369:12;8401:52;8423:6;8431:4;8437:1;8440:12;8401:21;:52::i;:::-;8394:59;8266:195;-1:-1:-1;;;;8266:195:0:o;9318:530::-;9445:12;9503:5;9478:21;:30;;9470:81;;;;-1:-1:-1;;;9470:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9570:18;9581:6;9570:10;:18::i;:::-;9562:60;;;;;-1:-1:-1;;;9562:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9696:12;9710:23;9737:6;-1:-1:-1;;;;;9737:11:0;9757:5;9765:4;9737:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9737:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9695:75;;;;9788:52;9806:7;9815:10;9827:12;9788:17;:52::i;:::-;9781:59;9318:530;-1:-1:-1;;;;;;;9318:530:0:o;11858:742::-;11973:12;12002:7;11998:595;;;-1:-1:-1;12033:10:0;12026:17;;11998:595;12147:17;;:21;12143:439;;12410:10;12404:17;12471:15;12458:10;12454:2;12450:19;12443:44;12358:148;12553:12;12546:20;;-1:-1:-1;;;12546:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Metadata Hash

4836b6baae3e9dfcfa505ce8acaaf91f0126c7f1f90d2e34a658a5bcc91a323f
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.