ETH Price: $2,274.38 (+0.08%)

Contract

0x658bCdfe51795BA43e9fD1aE9E39DDfbb1e70c5f
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Multi Send ERC20...205328662024-08-15 8:34:1124 days ago1723710851IN
0x658bCdfe...bb1e70c5f
0 ETH0.00135562.17836277
Multi Send ERC20...204904902024-08-09 10:37:1130 days ago1723199831IN
0x658bCdfe...bb1e70c5f
0 ETH0.003854282.11391446
Multi Send ERC20...204764332024-08-07 11:35:3532 days ago1723030535IN
0x658bCdfe...bb1e70c5f
0 ETH0.011432142.16964336
Multi Send ERC20...204759882024-08-07 10:06:1132 days ago1723025171IN
0x658bCdfe...bb1e70c5f
0 ETH0.012218721.83799217
Multi Send ERC20...202824012024-07-11 9:35:1159 days ago1720690511IN
0x658bCdfe...bb1e70c5f
0 ETH0.0234889613.51656246
Multi Send ERC20...202500442024-07-06 21:05:5963 days ago1720299959IN
0x658bCdfe...bb1e70c5f
0 ETH0.017752352.66353182
Multi Send ERC20...201920262024-06-28 18:38:3571 days ago1719599915IN
0x658bCdfe...bb1e70c5f
0 ETH0.018565723.55254729
Multi Send ERC20...201920092024-06-28 18:35:1171 days ago1719599711IN
0x658bCdfe...bb1e70c5f
0 ETH0.000596863.47118343
Multi Send ERC20...201686872024-06-25 12:26:4775 days ago1719318407IN
0x658bCdfe...bb1e70c5f
0 ETH0.041476325.13958941
Multi Send ERC20...200901662024-06-14 12:52:3586 days ago1718369555IN
0x658bCdfe...bb1e70c5f
0 ETH0.009143319.23601799
Multi Send ERC20...200743122024-06-12 7:39:5988 days ago1718177999IN
0x658bCdfe...bb1e70c5f
0 ETH0.013406388.23838567
Multi Send ERC20...200533492024-06-09 9:23:3591 days ago1717925015IN
0x658bCdfe...bb1e70c5f
0 ETH0.006572623.4127724
Multi Send ERC20...200239392024-06-05 6:48:5995 days ago1717570139IN
0x658bCdfe...bb1e70c5f
0 ETH0.005184637.10371535
Multi Send ERC20...200181032024-06-04 11:17:2396 days ago1717499843IN
0x658bCdfe...bb1e70c5f
0 ETH0.048668486.92881903
Multi Send ERC20...200180182024-06-04 11:00:2396 days ago1717498823IN
0x658bCdfe...bb1e70c5f
0 ETH0.04539927.67016649
Multi Send ERC20...200099652024-06-03 8:00:2397 days ago1717401623IN
0x658bCdfe...bb1e70c5f
0 ETH0.13743579.32155994
Multi Send ERC20...199687412024-05-28 13:43:59103 days ago1716903839IN
0x658bCdfe...bb1e70c5f
0 ETH0.0109836418.75949821
Multi Send ERC20...198819242024-05-16 10:24:59115 days ago1715855099IN
0x658bCdfe...bb1e70c5f
0 ETH0.009078787.5
0x60806040198262252024-05-08 15:26:35123 days ago1715181995IN
 Create: MultiSenderV2
0 ETH0.024488877.84912283

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MultiSenderV2

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-05-08
*/

// Sources flattened with hardhat v2.22.2 https://hardhat.org

// SPDX-License-Identifier: MIT

// File @ironblocks/firewall-consumer/contracts/interfaces/[email protected]


// See LICENSE file for full license text.
// Copyright (c) Ironblocks 2024
pragma solidity ^0.8;

interface IFirewall {
    function preExecution(address sender, bytes memory data, uint value) external;
    function postExecution(address sender, bytes memory data, uint value) external;
    function preExecutionPrivateInvariants(address sender, bytes memory data, uint value) external returns (bytes32[] calldata);
    function postExecutionPrivateInvariants(
        address sender,
        bytes memory data,
        uint value,
        bytes32[] calldata preValues,
        bytes32[] calldata postValues
    ) external;
}


// File @ironblocks/firewall-consumer/contracts/interfaces/[email protected]


// See LICENSE file for full license text.
// Copyright (c) Ironblocks 2024
pragma solidity ^0.8;

interface IFirewallConsumer {
    function firewallAdmin() external returns (address);
}


// File @openzeppelin/contracts/utils/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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://consensys.net/diligence/blog/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.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

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

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}


// File @ironblocks/firewall-consumer/contracts/[email protected]


// See LICENSE file for full license text.
// Copyright (c) Ironblocks 2024
pragma solidity ^0.8;




/**
 * @title Firewall Consumer Base Contract
 * @author David Benchimol @ Ironblocks 
 * @dev This contract is a parent contract that can be used to add firewall protection to any contract.
 *
 * The contract must define a firewall contract which will manage the policies that are applied to the contract.
 * It also must define a firewall admin which will be able to add and remove policies.
 *
 */
contract FirewallConsumerBase is IFirewallConsumer, Context {

    bytes32 private constant FIREWALL_STORAGE_SLOT = bytes32(uint256(keccak256("eip1967.firewall")) - 1);
    bytes32 private constant FIREWALL_ADMIN_STORAGE_SLOT = bytes32(uint256(keccak256("eip1967.firewall.admin")) - 1);
    bytes32 private constant NEW_FIREWALL_ADMIN_STORAGE_SLOT = bytes32(uint256(keccak256("eip1967.new.firewall.admin")) - 1);

    // This slot is special since it's used for mappings and not a single value
    bytes32 private constant APPROVED_TARGETS_MAPPING_SLOT = bytes32(uint256(keccak256("eip1967.approved.targets")) - 1);

    /**
     * @dev modifier that will run the preExecution and postExecution hooks of the firewall, applying each of
     * the subscribed policies.
     */
    modifier firewallProtected() {
        address firewall = _getAddressBySlot(FIREWALL_STORAGE_SLOT);
        if (firewall == address(0)) {
            _;
            return;
        }
        uint value = _msgValue();
        IFirewall(firewall).preExecution(msg.sender, msg.data, value);
        _; 
        IFirewall(firewall).postExecution(msg.sender, msg.data, value);
    }

    /**
     * @dev modifier that will run the preExecution and postExecution hooks of the firewall, applying each of
     * the subscribed policies. Allows passing custom data to the firewall, not necessarily msg.data.
     * Useful for checking internal function calls
     */
    modifier firewallProtectedCustom(bytes memory data) {
        address firewall = _getAddressBySlot(FIREWALL_STORAGE_SLOT);
        if (firewall == address(0)) {
            _;
            return;
        }
        uint value = _msgValue();
        IFirewall(firewall).preExecution(msg.sender, data, value);
        _; 
        IFirewall(firewall).postExecution(msg.sender, data, value);
    }

    /**
     * @dev identical to the rest of the modifiers in terms of logic, but makes it more
     * aesthetic when all you want to pass are signatures/unique identifiers.
     */
    modifier firewallProtectedSig(bytes4 selector) {
        address firewall = _getAddressBySlot(FIREWALL_STORAGE_SLOT);
        if (firewall == address(0)) {
            _;
            return;
        }
        uint value = _msgValue();
        IFirewall(firewall).preExecution(msg.sender, abi.encodePacked(selector), value);
        _; 
        IFirewall(firewall).postExecution(msg.sender, abi.encodePacked(selector), value);
    }

    /**
     * @dev modifier that will run the preExecution and postExecution hooks of the firewall invariant policy,
     * applying the subscribed invariant policy
     */
    modifier invariantProtected() {
        address firewall = _getAddressBySlot(FIREWALL_STORAGE_SLOT);
        if (firewall == address(0)) {
            _;
            return;
        }
        uint value = _msgValue();
        bytes32[] memory storageSlots = IFirewall(firewall).preExecutionPrivateInvariants(msg.sender, msg.data, value);
        bytes32[] memory preValues = _readStorage(storageSlots);
        _; 
        bytes32[] memory postValues = _readStorage(storageSlots);
        IFirewall(firewall).postExecutionPrivateInvariants(msg.sender, msg.data, value, preValues, postValues);
    }


    /**
     * @dev modifier asserting that the target is approved
     */
    modifier onlyApprovedTarget(address target) {
        // We use the same logic that solidity uses for mapping locations, but we add a pseudorandom 
        // constant "salt" instead of a constant placeholder so that there are no storage collisions
        // if adding this to an upgradeable contract implementation
        bytes32 _slot = keccak256(abi.encode(APPROVED_TARGETS_MAPPING_SLOT, target));
        bool isApprovedTarget = _getValueBySlot(_slot) != bytes32(0);
        require(isApprovedTarget, "FirewallConsumer: Not approved target");
        _;
    }

    /**
     * @dev modifier similar to onlyOwner, but for the firewall admin.
     */
    modifier onlyFirewallAdmin() {
        require(msg.sender == _getAddressBySlot(FIREWALL_ADMIN_STORAGE_SLOT), "FirewallConsumer: not firewall admin");
        _;
    }

    /**
     * @dev Initializes a contract protected by a firewall, with a firewall address and a firewall admin.
     *
     * IMPORTENT: need to add _setAddressBySlot(FIREWALL_ADMIN_STORAGE_SLOT, _firewallAdmin); in the initializer for upgradable contracts
     */
    /// @custom:oz-upgrades-unsafe-allow constructor
    constructor(
        address _firewall,
        address _firewallAdmin
    ) {
        _setAddressBySlot(FIREWALL_STORAGE_SLOT, _firewall);
        _setAddressBySlot(FIREWALL_ADMIN_STORAGE_SLOT, _firewallAdmin);
    }

    /**
     * @dev Allows calling an approved external target before executing a method.
     * 
     * This can be used for multiple purposes, but the initial one is to call `approveCallsViaSignature` before
     * executing a function, allowing synchronous transaction approvals.
     */
    function safeFunctionCall(
        address target,
        bytes calldata targetPayload,
        bytes calldata data
    ) external payable onlyApprovedTarget(target) {
        (bool success, ) = target.call(targetPayload);
        require(success);
        require(msg.sender == _msgSender(), "FirewallConsumer: No meta transactions");
        Address.functionDelegateCall(address(this), data);
    }

    /**
     * @dev Allows firewall admin to set approved targets.
     * IMPORTANT: Only set approved target if you know what you're doing. Anyone can cause this contract
     * to send any data to an approved target.
     */
    function setApprovedTarget(address target, bool status) external onlyFirewallAdmin {
        bytes32 _slot = keccak256(abi.encode(APPROVED_TARGETS_MAPPING_SLOT, target));
        assembly {
            sstore(_slot, status)
        }
    }

    /**
     * @dev View function for the firewall admin
     */
    function firewallAdmin() external view returns (address) {
        return _getAddressBySlot(FIREWALL_ADMIN_STORAGE_SLOT);
    }

    /**
     * @dev Admin only function allowing the consumers admin to set the firewall address.
     */
    function setFirewall(address _firewall) external onlyFirewallAdmin {
        _setAddressBySlot(FIREWALL_STORAGE_SLOT, _firewall);
    }

    /**
     * @dev Admin only function, sets new firewall admin. New admin must accept.
     */
    function setFirewallAdmin(address _firewallAdmin) external onlyFirewallAdmin {
        require(_firewallAdmin != address(0), "FirewallConsumer: zero address");
        _setAddressBySlot(NEW_FIREWALL_ADMIN_STORAGE_SLOT, _firewallAdmin);
    }

    /**
     * @dev Accept the role as firewall admin.
     */
    function acceptFirewallAdmin() external {
        require(msg.sender == _getAddressBySlot(NEW_FIREWALL_ADMIN_STORAGE_SLOT), "FirewallConsumer: not new admin");
        _setAddressBySlot(FIREWALL_ADMIN_STORAGE_SLOT, msg.sender);
    }

    function _msgValue() internal view returns (uint value) {
        // We do this because msg.value can only be accessed in payable functions.
        assembly {
            value := callvalue()
        }
    }

    function _readStorage(bytes32[] memory storageSlots) internal view returns (bytes32[] memory) {
        uint256 slotsLength = storageSlots.length;
        bytes32[] memory values = new bytes32[](slotsLength);

        for (uint256 i = 0; i < slotsLength; i++) {
            bytes32 slotValue = _getValueBySlot(storageSlots[i]);
            values[i] = slotValue;
        }
        return values;
    }

    function _setAddressBySlot(bytes32 _slot, address _address) internal {
        assembly {
            sstore(_slot, _address)
        }
    }

    function _getAddressBySlot(bytes32 _slot) internal view returns (address _address) {
        assembly {
            _address := sload(_slot)
        }
    }

    function _getValueBySlot(bytes32 _slot) internal view returns (bytes32 _value) {
        assembly {
            _value := sload(_slot)
        }
    }
}


// File @ironblocks/firewall-consumer/contracts/[email protected]


// See LICENSE file for full license text.
// Copyright (c) Ironblocks 2024
pragma solidity ^0.8;

/**
 * @title Firewall Consumer
 * @author David Benchimol @ Ironblocks 
 * @dev This contract is a parent contract that can be used to add firewall protection to any contract.
 *
 * The contract must initializes with the firewall contract disabled, and the deployer
 * as the firewall admin.
 *
 */
contract FirewallConsumer is FirewallConsumerBase(address(0), msg.sender) {
}


// File @openzeppelin/contracts/access/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File @openzeppelin/contracts/security/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

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

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

    bool private _paused;

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

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

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

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

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

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

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


// File @openzeppelin/contracts/token/ERC20/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev 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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount) external returns (bool);
}


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}


// File @openzeppelin/contracts/token/ERC20/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}


// File @poolzfinance/poolz-helper-v2/contracts/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.0;


contract ERC20Helper is FirewallConsumer {
    event TransferOut(uint256 Amount, address To, address Token);
    event TransferIn(uint256 Amount, address From, address Token);
    modifier TestAllowance(
        address _token,
        address _owner,
        uint256 _amount
    ) {
        require(
            ERC20(_token).allowance(_owner, address(this)) >= _amount,
            "ERC20Helper: no allowance"
        );
        _;
    }

    function TransferToken(
        address _Token,
        address _Reciver,
        uint256 _Amount
    ) internal firewallProtectedSig(0x3844b707) {
        uint256 OldBalance = ERC20(_Token).balanceOf(address(this));
        emit TransferOut(_Amount, _Reciver, _Token);
        ERC20(_Token).transfer(_Reciver, _Amount);
        require(
            (ERC20(_Token).balanceOf(address(this)) + _Amount) == OldBalance,
            "ERC20Helper: sent incorrect amount"
        );
    }

    function TransferInToken(
        address _Token,
        address _Subject,
        uint256 _Amount
    ) internal TestAllowance(_Token, _Subject, _Amount) {
        require(_Amount > 0);
        uint256 OldBalance = ERC20(_Token).balanceOf(address(this));
        ERC20(_Token).transferFrom(_Subject, address(this), _Amount);
        emit TransferIn(_Amount, _Subject, _Token);
        require(
            (OldBalance + _Amount) == ERC20(_Token).balanceOf(address(this)),
            "ERC20Helper: Received Incorrect Amount"
        );
    }

    function ApproveAllowanceERC20(
        address _Token,
        address _Subject,
        uint256 _Amount
    ) internal firewallProtectedSig(0x91251680) {
        require(_Amount > 0);
        ERC20(_Token).approve(_Subject, _Amount);
    }
}


// File @poolzfinance/poolz-helper-v2/contracts/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.0;


contract GovManager is Ownable, FirewallConsumer {
    event GovernorUpdated (
        address indexed oldGovernor,
        address indexed newGovernor
    );

    address public GovernorContract;

    modifier onlyOwnerOrGov() {
        require(
            msg.sender == owner() || msg.sender == GovernorContract,
            "Authorization Error"
        );
        _;
    }

    function setGovernorContract(address _address) external firewallProtected onlyOwnerOrGov {
        address oldGov = GovernorContract;
        GovernorContract = _address;
        emit GovernorUpdated(oldGov, GovernorContract);
    }

    constructor() {
        GovernorContract = address(0);
    }
}


// File @poolzfinance/poolz-helper-v2/contracts/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.0;

//For whitelist, 
interface IWhiteList {
    function Check(address _Subject, uint256 _Id) external view returns(uint);
    function Register(address _Subject,uint256 _Id,uint256 _Amount) external;
    function LastRoundRegister(address _Subject,uint256 _Id) external;
    function CreateManualWhiteList(uint256 _ChangeUntil, address _Contract) external payable returns(uint256 Id);
    function ChangeCreator(uint256 _Id, address _NewCreator) external;
    function AddAddress(uint256 _Id, address[] calldata _Users, uint256[] calldata _Amount) external;
    function RemoveAddress(uint256 _Id, address[] calldata _Users) external;
}


// File @poolzfinance/poolz-helper-v2/contracts/Fee/[email protected]

// Original license: SPDX_License_Identifier: MIT
pragma solidity ^0.8.0;


abstract contract WhiteListHelper is GovManager {
    error WhiteListNotSet();

    uint public WhiteListId;
    address public WhiteListAddress;

    modifier WhiteListSet {
        if(WhiteListAddress == address(0) || WhiteListId == 0) revert WhiteListNotSet();
        _;
    }

    function getCredits(address _user) public view returns(uint) {
        if(WhiteListAddress == address(0) || WhiteListId == 0) return 0;
        return IWhiteList(WhiteListAddress).Check(_user, WhiteListId);
    }

    function setupNewWhitelist(address _whiteListAddress) external firewallProtected onlyOwnerOrGov {
        WhiteListAddress = _whiteListAddress;
        WhiteListId = IWhiteList(_whiteListAddress).CreateManualWhiteList(type(uint256).max, address(this));
    }

    function addUsers(address[] calldata _users, uint256[] calldata _credits) external firewallProtected onlyOwnerOrGov WhiteListSet {        
        IWhiteList(WhiteListAddress).AddAddress(WhiteListId, _users, _credits);
    }

    function removeUsers(address[] calldata _users) external firewallProtected onlyOwnerOrGov WhiteListSet {
        IWhiteList(WhiteListAddress).RemoveAddress(WhiteListId, _users);
    }

    function _whiteListRegister(address _user, uint _credits) internal {
        IWhiteList(WhiteListAddress).Register(_user, WhiteListId, _credits);
    }
}


// File @poolzfinance/poolz-helper-v2/contracts/Fee/[email protected]

// Original license: SPDX_License_Identifier: MIT
pragma solidity ^0.8.0;


abstract contract FeeBaseHelper is ERC20Helper, WhiteListHelper {
    event TransferInETH(uint Amount, address From);
    event NewFeeAmount(uint NewFeeAmount, uint OldFeeAmount);
    event NewFeeToken(address NewFeeToken, address OldFeeToken);

    error NotEnoughFeeProvided();
    error FeeAmountIsZero();
    error TransferFailed();

    uint public FeeAmount;
    address public FeeToken;
    
    mapping(address => uint) public FeeReserve;

    function TakeFee() internal virtual firewallProtected returns(uint feeToPay){
        feeToPay = FeeAmount;
        if(feeToPay == 0) return 0;
        uint credits = getCredits(msg.sender);
        if(credits > 0) {
            _whiteListRegister(msg.sender, credits < feeToPay ? credits : feeToPay);
            if(credits < feeToPay) {
                feeToPay -= credits;
            } else {
                return 0;
            }
        }
        _TakeFee(feeToPay);
    }

    function _TakeFee(uint _fee) private {
        address _feeToken = FeeToken;   // cache storage reads
        if (_feeToken == address(0)) {
            if (msg.value < _fee) revert NotEnoughFeeProvided();
            emit TransferInETH(msg.value, msg.sender);
        } else {
            TransferInToken(_feeToken, msg.sender, _fee);
        }
        FeeReserve[_feeToken] += _fee;
    }

    function setFee(address _token, uint _amount) external firewallProtected onlyOwnerOrGov {
        FeeToken = _token;
        FeeAmount = _amount;
    }

    function WithdrawFee(address _token, address _to) external firewallProtected onlyOwnerOrGov {
        if (FeeReserve[_token] == 0) revert FeeAmountIsZero();
        uint feeAmount = FeeReserve[_token];
        FeeReserve[_token] = 0;
        if (_token == address(0)) {
            (bool success, ) = _to.call{value: feeAmount}("");
            if (!success) revert TransferFailed();
        } else {
            TransferToken(_token, _to, feeAmount);
        }
    }
}


// File contracts/MultiManageable.sol

// Original license: SPDX_License_Identifier: MIT
pragma solidity ^0.8.0;



/// @title MultiManageable: An abstract contract for managing MultiSenderV2 with administrative controls
abstract contract MultiManageable is FeeBaseHelper, Pausable {
    event MultiTransferredERC20(
        address indexed token,
        uint256 indexed userCount,
        uint256 indexed totalAmount
    );

    event MultiTransferredETH(uint256 indexed userCount, uint256 indexed totalAmount);

    error ETHTransferFail(address user, uint amount);
    error ArrayZeroLength();
    error NoZeroAddress();
    error TotalMismatch(uint amountProvided, uint amountRequired);

    struct MultiSendData {
        address user;
        uint amount;
    }

    /// @notice Ensures token is not paused and the address is not zero before proceeding
    /// @dev Modifier that calls `_baseStartUp` with token address checks
    modifier erc20FullCheck(address _token) {
        _baseStartUp(_token);
        _;
    }


    /// @notice Starts base operations, checks for paused state and zero address, and takes fee
    /// @dev Private function called by the `erc20FullCheck` modifier
    function _baseStartUp(address _token) private whenNotPaused {
        if (_token == address(0)) revert NoZeroAddress();
        TakeFee();
    }

    /// @notice Checks if a number is not zero, returns the same number if true
    /// @dev Internal pure function for validating non-zero values
    function _notZero(
        uint256 _number
    ) internal pure returns (uint256 _sameNumber) {
        if (_number == 0) revert ArrayZeroLength();
        return _number;
    }

    /// @notice Validates that the value after fee deduction matches the expected value
    /// @dev Takes a fee and compares the provided value with transaction value minus the fee
    function _validateValueAfterFee(uint _value) internal {
        uint feeTaken = TakeFee();
        _validateEqual(_value, msg.value - feeTaken);
    }

    /// @notice Validates that two values are equal, reverts if not
    /// @dev Internal pure function for value comparison
    function _validateEqual(uint _value, uint _value2) internal pure {
        if (_value != _value2) revert TotalMismatch(_value2, _value);
    }

    /// @notice Transfers ETH based on `MultiSendData`
    /// @dev Wraps `_sendETH` call to provide value return
    function _sendETH(
        MultiSendData calldata _multiSendData
    ) internal returns (uint value) {
        _sendETH(_multiSendData.user, _multiSendData.amount);
        return _multiSendData.amount;
    }

    /// @notice Calls ERC20 `transferFrom` to collect tokens before distribution
    /// @dev Allows contract to collect the specified amount of ERC20 tokens from the sender
    function _getERC20(address _token, uint _amount) internal {
        IERC20(_token).transferFrom(msg.sender, address(this), _amount);
    }

    /// @notice Transfers ERC20 tokens based on `MultiSendData`
    /// @dev Wraps `_sendERC20` call to provide value return
    function _sendERC20(
        address _token,
        MultiSendData calldata _multiSendData
    ) internal returns (uint value) {
        _sendERC20(_token, _multiSendData.user, _multiSendData.amount);
        return _multiSendData.amount;
    }

    /// @notice Directly transfers ERC20 tokens to a user
    /// @dev Uses ERC20 `transfer` to send specified amount to user
    function _sendERC20(address _token, address _user, uint _amount) internal {
        IERC20(_token).transfer(_user, _amount);
    }

    /// @notice Transfers ERC20 tokens from sender to recipient based on `MultiSendData`
    /// @dev Wraps `_sendERC20From` call for direct use in other functions
    function _sendERC20From(
        address _token,
        MultiSendData calldata _multiSendData
    ) internal returns (uint value) {
        _sendERC20From(_token, _multiSendData.user, _multiSendData.amount);
        return _multiSendData.amount;
    }

    /// @notice Allows contract to transfer ERC20 tokens from sender to a specified recipient
    /// @dev Uses ERC20 `transferFrom` for token distribution
    function _sendERC20From(
        address _token,
        address _to,
        uint _amount
    ) internal {
        IERC20(_token).transferFrom(msg.sender, _to, _amount);
    }

    /// @notice Sends ETH to a specified address, reverts on failure
    /// @dev Performs a low-level call to transfer ETH and handle failure
    function _sendETH(address _user, uint _amount) internal {
        (bool success, ) = _user.call{value: _amount}("");
        if (!success) revert ETHTransferFail(_user, _amount);
    }

    /// @notice Pauses the contract, disabling certain functions
    /// @dev Only callable by the owner or governance, wraps OpenZeppelin's `_pause`
    function Pause() external onlyOwnerOrGov {
        _pause();
    }

    /// @notice Unpauses the contract, re-enabling certain functions
    /// @dev Only callable by the owner or governance, wraps OpenZeppelin's `_unpause`
    function Unpause() external onlyOwnerOrGov {
        _unpause();
    }
}


// File contracts/MultiSenderETH.sol

// Original license: SPDX_License_Identifier: MIT
pragma solidity ^0.8.0;

/// @title Main multi transfer settings contract
/// @dev Extends `MultiManageable` to enable multi-sending of ETH with various utilities.
/// @author The-Poolz contract team
contract MultiSenderETH is MultiManageable {

    /// @notice Sends ETH to multiple addresses with different amounts.
    /// @dev Iterates over the `_multiSendData` array, sending ETH to each specified address.
    /// Requires the contract not to be paused.
    /// @param _multiSendData An array of `MultiSendData` structs, each containing an address and the amount of ETH to send.
    /// @return sum The total amount of ETH sent.
    function MultiSendETH(
        MultiSendData[] calldata _multiSendData
    ) external payable whenNotPaused returns (uint256 sum) {
        uint length = _notZero(_multiSendData.length);
        for (uint256 i; i < length; ) {
            MultiSendData calldata data = _multiSendData[i];
            sum += _sendETH(data);
            unchecked {
                ++i;
            }
        }
        _validateValueAfterFee(sum);
        emit MultiTransferredETH(length, sum);
    }

    /// @notice Sends the same amount of ETH to multiple addresses.
    /// @dev Iterates over the `_users` array, sending the specified `_amount` of ETH to each.
    /// Requires the contract not to be paused.
    /// @param _users An array of addresses to receive ETH.
    /// @param _amount The amount of ETH to send to each address.
    function MultiSendETHSameValue(
        address[] calldata _users,
        uint _amount
    ) external payable whenNotPaused {
        uint length = _notZero(_users.length);
        _validateValueAfterFee(_amount * length);
        for (uint256 i; i < length; ) {
            address user = _users[i];
            _sendETH(user, _amount);
            unchecked {
                ++i;
            }
        }
        emit MultiTransferredETH(length, _amount * length);
    }
}


// File contracts/MultiSenderERC20Direct.sol

// Original license: SPDX_License_Identifier: MIT
pragma solidity ^0.8.0;

/// @title A contract for batch sending ERC20 tokens directly to multiple addresses
/// @notice This contract extends MultiSenderETH to support direct ERC20 token transfers, where token are sent from the sender directly to recipients
/// @author The-Poolz contract team
contract MultiSenderERC20Direct is MultiSenderETH {
    
    /// @notice Sends specified amounts of an ERC20 token to multiple addresses
    /// @param _token The ERC20 token address to send
    /// @param _multiSendData An array of `MultiSendData` structs containing recipient addresses and amounts
    /// @return sum The total amount of tokens sent
    /// @dev Emits a `MultiTransferredERC20` event upon completion
    function MultiSendERC20Direct(
        address _token,
        MultiSendData[] calldata _multiSendData
    ) external payable erc20FullCheck(_token) returns (uint256 sum) {
        uint length = _notZero(_multiSendData.length);
        for (uint256 i; i < length; ) {
            MultiSendData calldata data = _multiSendData[i];
            sum += _sendERC20From(_token, data);
            unchecked {
                ++i;
            }
        }
        emit MultiTransferredERC20(_token, length, sum);
    }

    /// @notice Sends the same amount of an ERC20 token to multiple addresses
    /// @param _token The ERC20 token address to send
    /// @param _users An array of recipient addresses
    /// @param _amount The amount of tokens to send to each address
    /// @dev Emits a `MultiTransferredERC20` event upon completion with the total tokens sent
    function MultiSendERC20DirectSameValue(
        address _token,
        address[] calldata _users,
        uint _amount
    ) external payable erc20FullCheck(_token) {
        uint length = _notZero(_users.length);
        for (uint256 i; i < length; ) {
            address user = _users[i];
            _sendERC20From(_token, user, _amount);
            unchecked {
                ++i;
            }
        }
        emit MultiTransferredERC20(_token, length, _amount * length);
    }
}


// File contracts/MultiSender.sol

// Original license: SPDX_License_Identifier: MIT
pragma solidity ^0.8.0;

/// @title A contract for batch sending ERC20 tokens indirectly to multiple addresses
/// @notice This contract extends MultiSenderERC20Direct to support indirect ERC20 token transfers, where tokens are first collected from the sender then distributed
/// @author The-Poolz contract team
contract MultiSenderV2 is MultiSenderERC20Direct {
    
    /// @notice Collects a specified total amount of ERC20 tokens from the sender and sends varying amounts to multiple addresses
    /// @param _token The ERC20 token address to be sent
    /// @param _totalAmount The total amount of ERC20 tokens to collect from the sender
    /// @param _multiSendData An array of `MultiSendData` structs containing recipient addresses and amounts
    /// @return sum The total amount of tokens distributed
    /// @dev Ensures the total collected amount equals the sum of individual amounts sent; emits a `MultiTransferredERC20` event
    function MultiSendERC20Indirect(
        address _token,
        uint256 _totalAmount,
        MultiSendData[] calldata _multiSendData
    ) external payable erc20FullCheck(_token) returns (uint256 sum) {
        uint length = _notZero(_multiSendData.length);
        _getERC20(_token, _totalAmount);
        for (uint256 i; i < length; ) {
            MultiSendData calldata data = _multiSendData[i];
            sum += _sendERC20(_token, data);
            unchecked {
                ++i;
            }
        }
        _validateEqual(sum, _totalAmount);
        emit MultiTransferredERC20(_token, length, sum);
    }

    /// @notice Collects a total amount of ERC20 tokens from the sender based on a fixed amount per recipient, and sends this amount to each address
    /// @param _token The ERC20 token address to be sent
    /// @param _users An array of recipient addresses
    /// @param _amount The amount of tokens to send to each address
    /// @dev Calculates the total amount by multiplying the number of users by the fixed amount; emits a `MultiTransferredERC20` event
    function MultiSendERC20IndirectSameValue(
        address _token,
        address[] calldata _users,
        uint _amount
    ) external payable erc20FullCheck(_token) {
        uint length = _notZero(_users.length);
        uint sum = _amount * length;
        _getERC20(_token, sum);
        for (uint256 i; i < length; ) {
            address user = _users[i];
            _sendERC20(_token, user, _amount);
            unchecked{
                ++i;
            }
        }
        emit MultiTransferredERC20(_token, length, sum);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"name":"ArrayZeroLength","type":"error"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ETHTransferFail","type":"error"},{"inputs":[],"name":"FeeAmountIsZero","type":"error"},{"inputs":[],"name":"NoZeroAddress","type":"error"},{"inputs":[],"name":"NotEnoughFeeProvided","type":"error"},{"inputs":[{"internalType":"uint256","name":"amountProvided","type":"uint256"},{"internalType":"uint256","name":"amountRequired","type":"uint256"}],"name":"TotalMismatch","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"WhiteListNotSet","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldGovernor","type":"address"},{"indexed":true,"internalType":"address","name":"newGovernor","type":"address"}],"name":"GovernorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"userCount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"totalAmount","type":"uint256"}],"name":"MultiTransferredERC20","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"userCount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"totalAmount","type":"uint256"}],"name":"MultiTransferredETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"NewFeeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"OldFeeAmount","type":"uint256"}],"name":"NewFeeAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"NewFeeToken","type":"address"},{"indexed":false,"internalType":"address","name":"OldFeeToken","type":"address"}],"name":"NewFeeToken","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"Amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"From","type":"address"},{"indexed":false,"internalType":"address","name":"Token","type":"address"}],"name":"TransferIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"Amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"From","type":"address"}],"name":"TransferInETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"Amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"To","type":"address"},{"indexed":false,"internalType":"address","name":"Token","type":"address"}],"name":"TransferOut","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"FeeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"FeeReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FeeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GovernorContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct MultiManageable.MultiSendData[]","name":"_multiSendData","type":"tuple[]"}],"name":"MultiSendERC20Direct","outputs":[{"internalType":"uint256","name":"sum","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"MultiSendERC20DirectSameValue","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_totalAmount","type":"uint256"},{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct MultiManageable.MultiSendData[]","name":"_multiSendData","type":"tuple[]"}],"name":"MultiSendERC20Indirect","outputs":[{"internalType":"uint256","name":"sum","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"MultiSendERC20IndirectSameValue","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct MultiManageable.MultiSendData[]","name":"_multiSendData","type":"tuple[]"}],"name":"MultiSendETH","outputs":[{"internalType":"uint256","name":"sum","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"MultiSendETHSameValue","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"Pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"WhiteListAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WhiteListId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"WithdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"acceptFirewallAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256[]","name":"_credits","type":"uint256[]"}],"name":"addUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"firewallAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getCredits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"removeUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"targetPayload","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeFunctionCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setApprovedTarget","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_firewall","type":"address"}],"name":"setFirewall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_firewallAdmin","type":"address"}],"name":"setFirewallAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setGovernorContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_whiteListAddress","type":"address"}],"name":"setupNewWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506000336200002081620000ae565b620000566200005160017f5dd2e3b890564a8f99f7f203f226a27a8aa59aee19a4ece5cf5eaa77ab91f662620000fe565b839055565b6200008c6200008760017f29982a6ac507a2a707ced6dee5d76285dd49725db977de83d9702c628c974136620000fe565b829055565b5050600180546001600160a01b03191690556007805460ff1916905562000126565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b818103818111156200012057634e487b7160e01b600052601160045260246000fd5b92915050565b61367180620001366000396000f3fe6080604052600436106101d85760003560e01c80637c65c38b11610102578063b7f9a74811610095578063e55156b511610064578063e55156b5146104e7578063e76bb75614610507578063f05c85821461051d578063f2fde38b1461053257600080fd5b8063b7f9a74814610474578063be256bfb14610494578063db16cfb0146104b4578063dede40a7146104c757600080fd5b80638da5cb5b116100d15780638da5cb5b1461040d57806391cdd78b1461042b578063933454991461044b5780639b87893d1461045e57600080fd5b80637c65c38b146103a55780638447b23b146103ba5780638baa9f9c146103cd5780638c36d02d146103ed57600080fd5b80635620a94b1161017a578063716f20f911610149578063716f20f91461033d578063734b7198146103505780637805862f146103705780637a14583a1461038557600080fd5b80635620a94b146102dd5780635c975abb146102f05780636985a02214610313578063715018a61461032857600080fd5b80632f8f1328116101b65780632f8f1328146102325780633ae4f003146102725780633b66e9f614610285578063481531e9146102a557600080fd5b806306c49822146101dd5780631a8828f4146101ff5780632be4a90314610212575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004612e5c565b610552565b005b6101fd61020d366004612ec0565b610796565b34801561021e57600080fd5b506101fd61022d366004612f86565b61091e565b34801561023e57600080fd5b5061025f61024d366004612e5c565b60066020526000908152604090205481565b6040519081526020015b60405180910390f35b6101fd610280366004612fc8565b610bbc565b34801561029157600080fd5b5061025f6102a0366004612e5c565b610c54565b3480156102b157600080fd5b506005546102c5906001600160a01b031681565b6040516001600160a01b039091168152602001610269565b6101fd6102eb366004612fc8565b610cfa565b3480156102fc57600080fd5b5060075460ff166040519015158152602001610269565b34801561031f57600080fd5b506101fd610da3565b34801561033457600080fd5b506101fd610dec565b6101fd61034b366004613022565b610dfe565b34801561035c57600080fd5b506101fd61036b366004612e5c565b610eaa565b34801561037c57600080fd5b506101fd610f82565b34801561039157600080fd5b506001546102c5906001600160a01b031681565b3480156103b157600080fd5b506101fd610fc9565b61025f6103c83660046130b3565b611078565b3480156103d957600080fd5b506101fd6103e83660046130e9565b611111565b3480156103f957600080fd5b506101fd610408366004612e5c565b611434565b34801561041957600080fd5b506000546001600160a01b03166102c5565b34801561043757600080fd5b506003546102c5906001600160a01b031681565b61025f61045936600461311c565b61149c565b34801561046a57600080fd5b5061025f60045481565b34801561048057600080fd5b506101fd61048f36600461317d565b61152a565b3480156104a057600080fd5b506101fd6104af3660046131b4565b6115e0565b61025f6104c2366004613220565b6118b4565b3480156104d357600080fd5b506101fd6104e2366004612e5c565b611957565b3480156104f357600080fd5b506101fd61050236600461326e565b611bc9565b34801561051357600080fd5b5061025f60025481565b34801561052957600080fd5b506102c5611d6a565b34801561053e57600080fd5b506101fd61054d366004612e5c565b611d8d565b600061057461057060016000805160206135d58339815191526132ae565b5490565b90506001600160a01b03811661061f576000546001600160a01b03163314806105a757506001546001600160a01b031633145b6105cc5760405162461bcd60e51b81526004016105c3906132c1565b60405180910390fd5b600180546001600160a01b038481166001600160a01b0319831681179093556040519116919082907f5af6a85e864342d4f108c43dd574d98480c91f1de0ac2a9f66d826dee49bd9bb90600090a3505050565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90610654903390600090369087906004016132ee565b600060405180830381600087803b15801561066e57600080fd5b505af1158015610682573d6000803e3d6000fd5b505050506106986000546001600160a01b031690565b6001600160a01b0316336001600160a01b031614806106c157506001546001600160a01b031633145b6106dd5760405162461bcd60e51b81526004016105c3906132c1565b600180546001600160a01b038581166001600160a01b0319831681179093556040519116919082907f5af6a85e864342d4f108c43dd574d98480c91f1de0ac2a9f66d826dee49bd9bb90600090a3506040516393163a9160e01b81526001600160a01b038316906393163a919061075f903390600090369087906004016132ee565b600060405180830381600087803b15801561077957600080fd5b505af115801561078d573d6000803e3d6000fd5b50505050505050565b8460006107c460017fbee718c342db2a725c831b0c655757cef911f31a4454aacc1b8b75f39bda09a96132ae565b6040805160208101929092526001600160a01b0384169082015260600160405160208183030381529060405280519060200120905060008060001b610807835490565b14159050806108665760405162461bcd60e51b815260206004820152602560248201527f4669726577616c6c436f6e73756d65723a204e6f7420617070726f7665642074604482015264185c99d95d60da1b60648201526084016105c3565b6000886001600160a01b03168888604051610882929190613338565b6000604051808303816000865af19150503d80600081146108bf576040519150601f19603f3d011682016040523d82523d6000602084013e6108c4565b606091505b50509050806108d257600080fd5b6109123087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e0392505050565b50505050505050505050565b600061093c61057060016000805160206135d58339815191526132ae565b90506001600160a01b0381166109f6576000546001600160a01b031633148061096f57506001546001600160a01b031633145b61098b5760405162461bcd60e51b81526004016105c3906132c1565b6003546001600160a01b031615806109a35750600254155b156109c1576040516363af9b0360e11b815260040160405180910390fd5b6003546002546040516301ad22f960e01b81526001600160a01b03909216916301ad22f99161075f918790879060040161338f565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90610a2b903390600090369087906004016132ee565b600060405180830381600087803b158015610a4557600080fd5b505af1158015610a59573d6000803e3d6000fd5b50505050610a6f6000546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480610a9857506001546001600160a01b031633145b610ab45760405162461bcd60e51b81526004016105c3906132c1565b6003546001600160a01b03161580610acc5750600254155b15610aea576040516363af9b0360e11b815260040160405180910390fd5b6003546002546040516301ad22f960e01b81526001600160a01b03909216916301ad22f991610b1f918890889060040161338f565b600060405180830381600087803b158015610b3957600080fd5b505af1158015610b4d573d6000803e3d6000fd5b50506040516393163a9160e01b81526001600160a01b03851692506393163a919150610b84903390600090369087906004016132ee565b600060405180830381600087803b158015610b9e57600080fd5b505af1158015610bb2573d6000803e3d6000fd5b5050505050505050565b83610bc681611e2f565b6000610bd184611e6a565b905060005b81811015610c1d576000868683818110610bf257610bf26133b2565b9050602002016020810190610c079190612e5c565b9050610c14888287611e91565b50600101610bd6565b50610c2881846133c8565b60405182906001600160a01b038916906000805160206135b583398151915290600090a4505050505050565b6003546000906001600160a01b03161580610c6f5750600254155b15610c7c57506000919050565b60035460025460405163cc44919b60e01b81526001600160a01b038581166004830152602482019290925291169063cc44919b90604401602060405180830381865afa158015610cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf491906133df565b92915050565b83610d0481611e2f565b6000610d0f84611e6a565b90506000610d1d82856133c8565b9050610d298782611f0b565b60005b82811015610d73576000878783818110610d4857610d486133b2565b9050602002016020810190610d5d9190612e5c565b9050610d6a898288611f87565b50600101610d2c565b508082886001600160a01b03166000805160206135b583398151915260405160405180910390a450505050505050565b6000546001600160a01b0316331480610dc657506001546001600160a01b031633145b610de25760405162461bcd60e51b81526004016105c3906132c1565b610dea611fbc565b565b610df4612016565b610dea6000612070565b610e066120c0565b6000610e1183611e6a565b9050610e25610e2082846133c8565b612106565b60005b81811015610e6e576000858583818110610e4457610e446133b2565b9050602002016020810190610e599190612e5c565b9050610e658185612125565b50600101610e28565b50610e7981836133c8565b60405182907f0e5fe6f6a28b4cdb21bb2673b7ff7c8695a8463d5dd0b00b888026def1ea11d490600090a350505050565b610ec6610570600160008051602061361c8339815191526132ae565b6001600160a01b0316336001600160a01b031614610ef65760405162461bcd60e51b81526004016105c3906133f8565b6001600160a01b038116610f4c5760405162461bcd60e51b815260206004820152601e60248201527f4669726577616c6c436f6e73756d65723a207a65726f2061646472657373000060448201526064016105c3565b610f7f610f7a60017f8583d637b7eb6415d11ef26648cf0702cf161a357dfe51b6ff7a332110d4bdd36132ae565b829055565b50565b6000546001600160a01b0316331480610fa557506001546001600160a01b031633145b610fc15760405162461bcd60e51b81526004016105c3906132c1565b610dea6121ab565b610ff761057060017f8583d637b7eb6415d11ef26648cf0702cf161a357dfe51b6ff7a332110d4bdd36132ae565b6001600160a01b0316336001600160a01b0316146110575760405162461bcd60e51b815260206004820152601f60248201527f4669726577616c6c436f6e73756d65723a206e6f74206e65772061646d696e0060448201526064016105c3565b610dea611073600160008051602061361c8339815191526132ae565b339055565b60006110826120c0565b600061108d83611e6a565b905060005b818110156110d357368585838181106110ad576110ad6133b2565b90506040020190506110be816121e4565b6110c8908561343c565b935050600101611092565b506110dd82612106565b604051829082907f0e5fe6f6a28b4cdb21bb2673b7ff7c8695a8463d5dd0b00b888026def1ea11d490600090a35092915050565b600061112f61057060016000805160206135d58339815191526132ae565b90506001600160a01b038116611263576000546001600160a01b031633148061116257506001546001600160a01b031633145b61117e5760405162461bcd60e51b81526004016105c3906132c1565b6001600160a01b03831660009081526006602052604081205490036111b657604051633027fed560e01b815260040160405180910390fd5b6001600160a01b0383166000818152600660205260408120805491905590611252576000836001600160a01b03168260405160006040518083038185875af1925050503d8060008114611225576040519150601f19603f3d011682016040523d82523d6000602084013e61122a565b606091505b505090508061124c576040516312171d8360e31b815260040160405180910390fd5b5061125d565b61125d848483612208565b50505050565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90611298903390600090369087906004016132ee565b600060405180830381600087803b1580156112b257600080fd5b505af11580156112c6573d6000803e3d6000fd5b505050506112dc6000546001600160a01b031690565b6001600160a01b0316336001600160a01b0316148061130557506001546001600160a01b031633145b6113215760405162461bcd60e51b81526004016105c3906132c1565b6001600160a01b038416600090815260066020526040812054900361135957604051633027fed560e01b815260040160405180910390fd5b6001600160a01b03841660008181526006602052604081208054919055906113f5576000846001600160a01b03168260405160006040518083038185875af1925050503d80600081146113c8576040519150601f19603f3d011682016040523d82523d6000602084013e6113cd565b606091505b50509050806113ef576040516312171d8360e31b815260040160405180910390fd5b50611400565b611400858583612208565b506040516393163a9160e01b81526001600160a01b038316906393163a9190610b84903390600090369087906004016132ee565b611450610570600160008051602061361c8339815191526132ae565b6001600160a01b0316336001600160a01b0316146114805760405162461bcd60e51b81526004016105c3906133f8565b610f7f610f7a60016000805160206135d58339815191526132ae565b6000836114a881611e2f565b60006114b384611e6a565b905060005b818110156114fa57368686838181106114d3576114d36133b2565b90506040020190506114e5888261269d565b6114ef908661343c565b9450506001016114b8565b508281876001600160a01b03166000805160206135b583398151915260405160405180910390a450509392505050565b611546610570600160008051602061361c8339815191526132ae565b6001600160a01b0316336001600160a01b0316146115765760405162461bcd60e51b81526004016105c3906133f8565b60006115a360017fbee718c342db2a725c831b0c655757cef911f31a4454aacc1b8b75f39bda09a96132ae565b6040805160208101929092526001600160a01b03851690820152606001604051602081830303815290604052805190602001209050818155505050565b60006115fe61057060016000805160206135d58339815191526132ae565b90506001600160a01b0381166116f4576000546001600160a01b031633148061163157506001546001600160a01b031633145b61164d5760405162461bcd60e51b81526004016105c3906132c1565b6003546001600160a01b031615806116655750600254155b15611683576040516363af9b0360e11b815260040160405180910390fd5b600354600254604051635c989d4960e11b81526001600160a01b039092169163b9313a92916116bc91899089908990899060040161344f565b600060405180830381600087803b1580156116d657600080fd5b505af11580156116ea573d6000803e3d6000fd5b505050505061125d565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90611729903390600090369087906004016132ee565b600060405180830381600087803b15801561174357600080fd5b505af1158015611757573d6000803e3d6000fd5b5050505061176d6000546001600160a01b031690565b6001600160a01b0316336001600160a01b0316148061179657506001546001600160a01b031633145b6117b25760405162461bcd60e51b81526004016105c3906132c1565b6003546001600160a01b031615806117ca5750600254155b156117e8576040516363af9b0360e11b815260040160405180910390fd5b600354600254604051635c989d4960e11b81526001600160a01b039092169163b9313a9291611821918a908a908a908a9060040161344f565b600060405180830381600087803b15801561183b57600080fd5b505af115801561184f573d6000803e3d6000fd5b50506040516393163a9160e01b81526001600160a01b03851692506393163a919150611886903390600090369087906004016132ee565b600060405180830381600087803b1580156118a057600080fd5b505af1158015610912573d6000803e3d6000fd5b6000846118c081611e2f565b60006118cb84611e6a565b90506118d78787611f0b565b60005b8181101561191c57368686838181106118f5576118f56133b2565b905060400201905061190789826126c4565b611911908661343c565b9450506001016118da565b5061192783876126e1565b8281886001600160a01b03166000805160206135b583398151915260405160405180910390a45050949350505050565b600061197561057060016000805160206135d58339815191526132ae565b90506001600160a01b038116611a50576000546001600160a01b03163314806119a857506001546001600160a01b031633145b6119c45760405162461bcd60e51b81526004016105c3906132c1565b600380546001600160a01b0319166001600160a01b0384169081179091556040516313d0ca6f60e21b81526000196004820152306024820152634f4329bc906044016020604051808303816000875af1158015611a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4991906133df565b6002555050565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90611a85903390600090369087906004016132ee565b600060405180830381600087803b158015611a9f57600080fd5b505af1158015611ab3573d6000803e3d6000fd5b50505050611ac96000546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480611af257506001546001600160a01b031633145b611b0e5760405162461bcd60e51b81526004016105c3906132c1565b600380546001600160a01b0319166001600160a01b0385169081179091556040516313d0ca6f60e21b81526000196004820152306024820152634f4329bc906044016020604051808303816000875af1158015611b6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9391906133df565b6002556040516393163a9160e01b81526001600160a01b038316906393163a919061075f903390600090369087906004016132ee565b6000611be761057060016000805160206135d58339815191526132ae565b90506001600160a01b038116611c5d576000546001600160a01b0316331480611c1a57506001546001600160a01b031633145b611c365760405162461bcd60e51b81526004016105c3906132c1565b50600580546001600160a01b0319166001600160a01b039390931692909217909155600455565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90611c92903390600090369087906004016132ee565b600060405180830381600087803b158015611cac57600080fd5b505af1158015611cc0573d6000803e3d6000fd5b50505050611cd66000546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480611cff57506001546001600160a01b031633145b611d1b5760405162461bcd60e51b81526004016105c3906132c1565b600580546001600160a01b0319166001600160a01b038681169190911790915560048481556040516393163a9160e01b8152918416916393163a9191610b8491339160009136918891016132ee565b6000611d88610570600160008051602061361c8339815191526132ae565b905090565b611d95612016565b6001600160a01b038116611dfa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105c3565b610f7f81612070565b6060611e2883836040518060600160405280602781526020016135f56027913961270b565b9392505050565b611e376120c0565b6001600160a01b038116611e5e5760405163ddbadd5f60e01b815260040160405180910390fd5b611e66612783565b5050565b600081600003611e8d5760405163093ad0d360e21b815260040160405180910390fd5b5090565b6040516323b872dd60e01b81523360048201526001600160a01b038381166024830152604482018390528416906323b872dd906064015b6020604051808303816000875af1158015611ee7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125d91906134a2565b6040516323b872dd60e01b8152336004820152306024820152604481018290526001600160a01b038316906323b872dd906064016020604051808303816000875af1158015611f5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8291906134a2565b505050565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401611ec8565b611fc46120c0565b6007805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ff93390565b6040516001600160a01b03909116815260200160405180910390a1565b6000546001600160a01b03163314610dea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105c3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60075460ff1615610dea5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016105c3565b6000612110612783565b9050611e668261212083346132ae565b6126e1565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612172576040519150601f19603f3d011682016040523d82523d6000602084013e612177565b606091505b5050905080611f8257604051635a5e037360e11b81526001600160a01b0384166004820152602481018390526044016105c3565b6121b361295a565b6007805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611ff9565b60006122006121f66020840184612e5c565b8360200135612125565b506020013590565b633844b70760e01b600061222e61057060016000805160206135d58339815191526132ae565b90506001600160a01b038116612404576040516370a0823160e01b81523060048201526000906001600160a01b038716906370a0823190602401602060405180830381865afa158015612285573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a991906133df565b604080518681526001600160a01b03888116602083015289168183015290519192507fe4d818e6f992efbd60db553f3edce819a199baec79a784b95c89bc8ee86f2584919081900360600190a160405163a9059cbb60e01b81526001600160a01b0386811660048301526024820186905287169063a9059cbb906044016020604051808303816000875af1158015612345573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236991906134a2565b506040516370a0823160e01b8152306004820152819085906001600160a01b038916906370a0823190602401602060405180830381865afa1580156123b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d691906133df565b6123e0919061343c565b146123fd5760405162461bcd60e51b81526004016105c3906134bf565b505061125d565b604080516001600160e01b031984166020820152815160048183030181526024820192839052631bf8659f60e21b90925234916001600160a01b03841691636fe1967c91612459913391908690602801613551565b600060405180830381600087803b15801561247357600080fd5b505af1158015612487573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092506001600160a01b03891691506370a0823190602401602060405180830381865afa1580156124d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f691906133df565b604080518781526001600160a01b0389811660208301528a168183015290519192507fe4d818e6f992efbd60db553f3edce819a199baec79a784b95c89bc8ee86f2584919081900360600190a160405163a9059cbb60e01b81526001600160a01b0387811660048301526024820187905288169063a9059cbb906044016020604051808303816000875af1158015612592573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b691906134a2565b506040516370a0823160e01b8152306004820152819086906001600160a01b038a16906370a0823190602401602060405180830381865afa1580156125ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262391906133df565b61262d919061343c565b1461264a5760405162461bcd60e51b81526004016105c3906134bf565b50604080516001600160e01b0319851660208201528151600481830301815260248201928390526393163a9160e01b9092526001600160a01b038416916393163a91916118869133918690602801613551565b60006126ba836126b06020850185612e5c565b8460200135611e91565b5060200135919050565b60006126ba836126d76020850185612e5c565b8460200135611f87565b808214611e66576040516306f4750f60e41b815260048101829052602481018390526044016105c3565b6060600080856001600160a01b0316856040516127289190613585565b600060405180830381855af49150503d8060008114612763576040519150601f19603f3d011682016040523d82523d6000602084013e612768565b606091505b5091509150612779868383876129a3565b9695505050505050565b6000806127a261057060016000805160206135d58339815191526132ae565b90506001600160a01b038116612821576004549150816000036127c757600091505090565b60006127d233610c54565b90508015612813576127f1338483106127eb5784612a24565b82612a24565b8281101561280a5761280381846132ae565b9250612813565b60009250505090565b61281c83612a98565b505090565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90612856903390600090369087906004016132ee565b600060405180830381600087803b15801561287057600080fd5b505af1158015612884573d6000803e3d6000fd5b5050505060045492508260000361289e57600092506128f0565b60006128a933610c54565b905080156128e5576128c2338583106127eb5785612a24565b838110156128db576128d481856132ae565b93506128e5565b60009350506128f0565b6128ee84612a98565b505b6040516393163a9160e01b81526001600160a01b038316906393163a9190612923903390600090369087906004016132ee565b600060405180830381600087803b15801561293d57600080fd5b505af1158015612951573d6000803e3d6000fd5b50505050505090565b60075460ff16610dea5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016105c3565b60608315612a12578251600003612a0b576001600160a01b0385163b612a0b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105c3565b5081612a1c565b612a1c8383612b43565b949350505050565b600354600254604051630ebacfd960e11b81526001600160a01b038581166004830152602482019290925260448101849052911690631d759fb290606401600060405180830381600087803b158015612a7c57600080fd5b505af1158015612a90573d6000803e3d6000fd5b505050505050565b6005546001600160a01b031680612b075781341015612aca5760405163cc361e3d60e01b815260040160405180910390fd5b604080513481523360208201527f3a32cdd14cdfd431946dfa0b2aef5ace661340411aaadcaee6aef6738d302326910160405180910390a1612b12565b612b12813384612b6d565b6001600160a01b03811660009081526006602052604081208054849290612b3a90849061343c565b90915550505050565b815115612b535781518083602001fd5b8060405162461bcd60e51b81526004016105c391906135a1565b604051636eb1769f60e11b81526001600160a01b038084166004830152306024830152849184918491829185169063dd62ed3e90604401602060405180830381865afa158015612bc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612be591906133df565b1015612c335760405162461bcd60e51b815260206004820152601960248201527f455243323048656c7065723a206e6f20616c6c6f77616e63650000000000000060448201526064016105c3565b60008411612c4057600080fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038816906370a0823190602401602060405180830381865afa158015612c87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cab91906133df565b6040516323b872dd60e01b81526001600160a01b03888116600483015230602483015260448201889052919250908816906323b872dd906064016020604051808303816000875af1158015612d04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2891906134a2565b50604080518681526001600160a01b03888116602083015289168183015290517f1fecf4702e692891a7c2f0d328779b085efb5edd094fa5558bd5cd147a1679229181900360600190a16040516370a0823160e01b81523060048201526001600160a01b038816906370a0823190602401602060405180830381865afa158015612db6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dda91906133df565b612de4868361343c565b1461078d5760405162461bcd60e51b815260206004820152602660248201527f455243323048656c7065723a20526563656976656420496e636f727265637420604482015265105b5bdd5b9d60d21b60648201526084016105c3565b80356001600160a01b0381168114612e5757600080fd5b919050565b600060208284031215612e6e57600080fd5b611e2882612e40565b60008083601f840112612e8957600080fd5b50813567ffffffffffffffff811115612ea157600080fd5b602083019150836020828501011115612eb957600080fd5b9250929050565b600080600080600060608688031215612ed857600080fd5b612ee186612e40565b9450602086013567ffffffffffffffff80821115612efe57600080fd5b612f0a89838a01612e77565b90965094506040880135915080821115612f2357600080fd5b50612f3088828901612e77565b969995985093965092949392505050565b60008083601f840112612f5357600080fd5b50813567ffffffffffffffff811115612f6b57600080fd5b6020830191508360208260051b8501011115612eb957600080fd5b60008060208385031215612f9957600080fd5b823567ffffffffffffffff811115612fb057600080fd5b612fbc85828601612f41565b90969095509350505050565b60008060008060608587031215612fde57600080fd5b612fe785612e40565b9350602085013567ffffffffffffffff81111561300357600080fd5b61300f87828801612f41565b9598909750949560400135949350505050565b60008060006040848603121561303757600080fd5b833567ffffffffffffffff81111561304e57600080fd5b61305a86828701612f41565b909790965060209590950135949350505050565b60008083601f84011261308057600080fd5b50813567ffffffffffffffff81111561309857600080fd5b6020830191508360208260061b8501011115612eb957600080fd5b600080602083850312156130c657600080fd5b823567ffffffffffffffff8111156130dd57600080fd5b612fbc8582860161306e565b600080604083850312156130fc57600080fd5b61310583612e40565b915061311360208401612e40565b90509250929050565b60008060006040848603121561313157600080fd5b61313a84612e40565b9250602084013567ffffffffffffffff81111561315657600080fd5b6131628682870161306e565b9497909650939450505050565b8015158114610f7f57600080fd5b6000806040838503121561319057600080fd5b61319983612e40565b915060208301356131a98161316f565b809150509250929050565b600080600080604085870312156131ca57600080fd5b843567ffffffffffffffff808211156131e257600080fd5b6131ee88838901612f41565b9096509450602087013591508082111561320757600080fd5b5061321487828801612f41565b95989497509550505050565b6000806000806060858703121561323657600080fd5b61323f85612e40565b935060208501359250604085013567ffffffffffffffff81111561326257600080fd5b6132148782880161306e565b6000806040838503121561328157600080fd5b61328a83612e40565b946020939093013593505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610cf457610cf4613298565b60208082526013908201527220baba3437b934bd30ba34b7b71022b93937b960691b604082015260600190565b6001600160a01b038516815260606020820181905281018390528284608083013760006080848301015260006080601f19601f860116830101905082604083015295945050505050565b8183823760009101908152919050565b8183526000602080850194508260005b85811015613384576001600160a01b0361337183612e40565b1687529582019590820190600101613358565b509495945050505050565b8381526040602082015260006133a9604083018486613348565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610cf457610cf4613298565b6000602082840312156133f157600080fd5b5051919050565b60208082526024908201527f4669726577616c6c436f6e73756d65723a206e6f74206669726577616c6c20616040820152633236b4b760e11b606082015260800190565b80820180821115610cf457610cf4613298565b858152606060208201526000613469606083018688613348565b82810360408401528381526001600160fb1b0384111561348857600080fd5b8360051b8086602084013701602001979650505050505050565b6000602082840312156134b457600080fd5b8151611e288161316f565b60208082526022908201527f455243323048656c7065723a2073656e7420696e636f727265637420616d6f756040820152611b9d60f21b606082015260800190565b60005b8381101561351c578181015183820152602001613504565b50506000910152565b6000815180845261353d816020860160208601613501565b601f01601f19169290920160200192915050565b6001600160a01b038416815260606020820181905260009061357590830185613525565b9050826040830152949350505050565b60008251613597818460208701613501565b9190910192915050565b602081526000611e28602083018461352556febd92d122ffb1b8cecbdfdc76285b361b1ab09e8a58b0406b65326589ee1d65ef5dd2e3b890564a8f99f7f203f226a27a8aa59aee19a4ece5cf5eaa77ab91f662416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656429982a6ac507a2a707ced6dee5d76285dd49725db977de83d9702c628c974136a264697066735822122057ba9d84968badcaf1be197d2b8395432838f82ae7d26ff0f8692b83a87f47b264736f6c63430008180033

Deployed Bytecode

0x6080604052600436106101d85760003560e01c80637c65c38b11610102578063b7f9a74811610095578063e55156b511610064578063e55156b5146104e7578063e76bb75614610507578063f05c85821461051d578063f2fde38b1461053257600080fd5b8063b7f9a74814610474578063be256bfb14610494578063db16cfb0146104b4578063dede40a7146104c757600080fd5b80638da5cb5b116100d15780638da5cb5b1461040d57806391cdd78b1461042b578063933454991461044b5780639b87893d1461045e57600080fd5b80637c65c38b146103a55780638447b23b146103ba5780638baa9f9c146103cd5780638c36d02d146103ed57600080fd5b80635620a94b1161017a578063716f20f911610149578063716f20f91461033d578063734b7198146103505780637805862f146103705780637a14583a1461038557600080fd5b80635620a94b146102dd5780635c975abb146102f05780636985a02214610313578063715018a61461032857600080fd5b80632f8f1328116101b65780632f8f1328146102325780633ae4f003146102725780633b66e9f614610285578063481531e9146102a557600080fd5b806306c49822146101dd5780631a8828f4146101ff5780632be4a90314610212575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004612e5c565b610552565b005b6101fd61020d366004612ec0565b610796565b34801561021e57600080fd5b506101fd61022d366004612f86565b61091e565b34801561023e57600080fd5b5061025f61024d366004612e5c565b60066020526000908152604090205481565b6040519081526020015b60405180910390f35b6101fd610280366004612fc8565b610bbc565b34801561029157600080fd5b5061025f6102a0366004612e5c565b610c54565b3480156102b157600080fd5b506005546102c5906001600160a01b031681565b6040516001600160a01b039091168152602001610269565b6101fd6102eb366004612fc8565b610cfa565b3480156102fc57600080fd5b5060075460ff166040519015158152602001610269565b34801561031f57600080fd5b506101fd610da3565b34801561033457600080fd5b506101fd610dec565b6101fd61034b366004613022565b610dfe565b34801561035c57600080fd5b506101fd61036b366004612e5c565b610eaa565b34801561037c57600080fd5b506101fd610f82565b34801561039157600080fd5b506001546102c5906001600160a01b031681565b3480156103b157600080fd5b506101fd610fc9565b61025f6103c83660046130b3565b611078565b3480156103d957600080fd5b506101fd6103e83660046130e9565b611111565b3480156103f957600080fd5b506101fd610408366004612e5c565b611434565b34801561041957600080fd5b506000546001600160a01b03166102c5565b34801561043757600080fd5b506003546102c5906001600160a01b031681565b61025f61045936600461311c565b61149c565b34801561046a57600080fd5b5061025f60045481565b34801561048057600080fd5b506101fd61048f36600461317d565b61152a565b3480156104a057600080fd5b506101fd6104af3660046131b4565b6115e0565b61025f6104c2366004613220565b6118b4565b3480156104d357600080fd5b506101fd6104e2366004612e5c565b611957565b3480156104f357600080fd5b506101fd61050236600461326e565b611bc9565b34801561051357600080fd5b5061025f60025481565b34801561052957600080fd5b506102c5611d6a565b34801561053e57600080fd5b506101fd61054d366004612e5c565b611d8d565b600061057461057060016000805160206135d58339815191526132ae565b5490565b90506001600160a01b03811661061f576000546001600160a01b03163314806105a757506001546001600160a01b031633145b6105cc5760405162461bcd60e51b81526004016105c3906132c1565b60405180910390fd5b600180546001600160a01b038481166001600160a01b0319831681179093556040519116919082907f5af6a85e864342d4f108c43dd574d98480c91f1de0ac2a9f66d826dee49bd9bb90600090a3505050565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90610654903390600090369087906004016132ee565b600060405180830381600087803b15801561066e57600080fd5b505af1158015610682573d6000803e3d6000fd5b505050506106986000546001600160a01b031690565b6001600160a01b0316336001600160a01b031614806106c157506001546001600160a01b031633145b6106dd5760405162461bcd60e51b81526004016105c3906132c1565b600180546001600160a01b038581166001600160a01b0319831681179093556040519116919082907f5af6a85e864342d4f108c43dd574d98480c91f1de0ac2a9f66d826dee49bd9bb90600090a3506040516393163a9160e01b81526001600160a01b038316906393163a919061075f903390600090369087906004016132ee565b600060405180830381600087803b15801561077957600080fd5b505af115801561078d573d6000803e3d6000fd5b50505050505050565b8460006107c460017fbee718c342db2a725c831b0c655757cef911f31a4454aacc1b8b75f39bda09a96132ae565b6040805160208101929092526001600160a01b0384169082015260600160405160208183030381529060405280519060200120905060008060001b610807835490565b14159050806108665760405162461bcd60e51b815260206004820152602560248201527f4669726577616c6c436f6e73756d65723a204e6f7420617070726f7665642074604482015264185c99d95d60da1b60648201526084016105c3565b6000886001600160a01b03168888604051610882929190613338565b6000604051808303816000865af19150503d80600081146108bf576040519150601f19603f3d011682016040523d82523d6000602084013e6108c4565b606091505b50509050806108d257600080fd5b6109123087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e0392505050565b50505050505050505050565b600061093c61057060016000805160206135d58339815191526132ae565b90506001600160a01b0381166109f6576000546001600160a01b031633148061096f57506001546001600160a01b031633145b61098b5760405162461bcd60e51b81526004016105c3906132c1565b6003546001600160a01b031615806109a35750600254155b156109c1576040516363af9b0360e11b815260040160405180910390fd5b6003546002546040516301ad22f960e01b81526001600160a01b03909216916301ad22f99161075f918790879060040161338f565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90610a2b903390600090369087906004016132ee565b600060405180830381600087803b158015610a4557600080fd5b505af1158015610a59573d6000803e3d6000fd5b50505050610a6f6000546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480610a9857506001546001600160a01b031633145b610ab45760405162461bcd60e51b81526004016105c3906132c1565b6003546001600160a01b03161580610acc5750600254155b15610aea576040516363af9b0360e11b815260040160405180910390fd5b6003546002546040516301ad22f960e01b81526001600160a01b03909216916301ad22f991610b1f918890889060040161338f565b600060405180830381600087803b158015610b3957600080fd5b505af1158015610b4d573d6000803e3d6000fd5b50506040516393163a9160e01b81526001600160a01b03851692506393163a919150610b84903390600090369087906004016132ee565b600060405180830381600087803b158015610b9e57600080fd5b505af1158015610bb2573d6000803e3d6000fd5b5050505050505050565b83610bc681611e2f565b6000610bd184611e6a565b905060005b81811015610c1d576000868683818110610bf257610bf26133b2565b9050602002016020810190610c079190612e5c565b9050610c14888287611e91565b50600101610bd6565b50610c2881846133c8565b60405182906001600160a01b038916906000805160206135b583398151915290600090a4505050505050565b6003546000906001600160a01b03161580610c6f5750600254155b15610c7c57506000919050565b60035460025460405163cc44919b60e01b81526001600160a01b038581166004830152602482019290925291169063cc44919b90604401602060405180830381865afa158015610cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf491906133df565b92915050565b83610d0481611e2f565b6000610d0f84611e6a565b90506000610d1d82856133c8565b9050610d298782611f0b565b60005b82811015610d73576000878783818110610d4857610d486133b2565b9050602002016020810190610d5d9190612e5c565b9050610d6a898288611f87565b50600101610d2c565b508082886001600160a01b03166000805160206135b583398151915260405160405180910390a450505050505050565b6000546001600160a01b0316331480610dc657506001546001600160a01b031633145b610de25760405162461bcd60e51b81526004016105c3906132c1565b610dea611fbc565b565b610df4612016565b610dea6000612070565b610e066120c0565b6000610e1183611e6a565b9050610e25610e2082846133c8565b612106565b60005b81811015610e6e576000858583818110610e4457610e446133b2565b9050602002016020810190610e599190612e5c565b9050610e658185612125565b50600101610e28565b50610e7981836133c8565b60405182907f0e5fe6f6a28b4cdb21bb2673b7ff7c8695a8463d5dd0b00b888026def1ea11d490600090a350505050565b610ec6610570600160008051602061361c8339815191526132ae565b6001600160a01b0316336001600160a01b031614610ef65760405162461bcd60e51b81526004016105c3906133f8565b6001600160a01b038116610f4c5760405162461bcd60e51b815260206004820152601e60248201527f4669726577616c6c436f6e73756d65723a207a65726f2061646472657373000060448201526064016105c3565b610f7f610f7a60017f8583d637b7eb6415d11ef26648cf0702cf161a357dfe51b6ff7a332110d4bdd36132ae565b829055565b50565b6000546001600160a01b0316331480610fa557506001546001600160a01b031633145b610fc15760405162461bcd60e51b81526004016105c3906132c1565b610dea6121ab565b610ff761057060017f8583d637b7eb6415d11ef26648cf0702cf161a357dfe51b6ff7a332110d4bdd36132ae565b6001600160a01b0316336001600160a01b0316146110575760405162461bcd60e51b815260206004820152601f60248201527f4669726577616c6c436f6e73756d65723a206e6f74206e65772061646d696e0060448201526064016105c3565b610dea611073600160008051602061361c8339815191526132ae565b339055565b60006110826120c0565b600061108d83611e6a565b905060005b818110156110d357368585838181106110ad576110ad6133b2565b90506040020190506110be816121e4565b6110c8908561343c565b935050600101611092565b506110dd82612106565b604051829082907f0e5fe6f6a28b4cdb21bb2673b7ff7c8695a8463d5dd0b00b888026def1ea11d490600090a35092915050565b600061112f61057060016000805160206135d58339815191526132ae565b90506001600160a01b038116611263576000546001600160a01b031633148061116257506001546001600160a01b031633145b61117e5760405162461bcd60e51b81526004016105c3906132c1565b6001600160a01b03831660009081526006602052604081205490036111b657604051633027fed560e01b815260040160405180910390fd5b6001600160a01b0383166000818152600660205260408120805491905590611252576000836001600160a01b03168260405160006040518083038185875af1925050503d8060008114611225576040519150601f19603f3d011682016040523d82523d6000602084013e61122a565b606091505b505090508061124c576040516312171d8360e31b815260040160405180910390fd5b5061125d565b61125d848483612208565b50505050565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90611298903390600090369087906004016132ee565b600060405180830381600087803b1580156112b257600080fd5b505af11580156112c6573d6000803e3d6000fd5b505050506112dc6000546001600160a01b031690565b6001600160a01b0316336001600160a01b0316148061130557506001546001600160a01b031633145b6113215760405162461bcd60e51b81526004016105c3906132c1565b6001600160a01b038416600090815260066020526040812054900361135957604051633027fed560e01b815260040160405180910390fd5b6001600160a01b03841660008181526006602052604081208054919055906113f5576000846001600160a01b03168260405160006040518083038185875af1925050503d80600081146113c8576040519150601f19603f3d011682016040523d82523d6000602084013e6113cd565b606091505b50509050806113ef576040516312171d8360e31b815260040160405180910390fd5b50611400565b611400858583612208565b506040516393163a9160e01b81526001600160a01b038316906393163a9190610b84903390600090369087906004016132ee565b611450610570600160008051602061361c8339815191526132ae565b6001600160a01b0316336001600160a01b0316146114805760405162461bcd60e51b81526004016105c3906133f8565b610f7f610f7a60016000805160206135d58339815191526132ae565b6000836114a881611e2f565b60006114b384611e6a565b905060005b818110156114fa57368686838181106114d3576114d36133b2565b90506040020190506114e5888261269d565b6114ef908661343c565b9450506001016114b8565b508281876001600160a01b03166000805160206135b583398151915260405160405180910390a450509392505050565b611546610570600160008051602061361c8339815191526132ae565b6001600160a01b0316336001600160a01b0316146115765760405162461bcd60e51b81526004016105c3906133f8565b60006115a360017fbee718c342db2a725c831b0c655757cef911f31a4454aacc1b8b75f39bda09a96132ae565b6040805160208101929092526001600160a01b03851690820152606001604051602081830303815290604052805190602001209050818155505050565b60006115fe61057060016000805160206135d58339815191526132ae565b90506001600160a01b0381166116f4576000546001600160a01b031633148061163157506001546001600160a01b031633145b61164d5760405162461bcd60e51b81526004016105c3906132c1565b6003546001600160a01b031615806116655750600254155b15611683576040516363af9b0360e11b815260040160405180910390fd5b600354600254604051635c989d4960e11b81526001600160a01b039092169163b9313a92916116bc91899089908990899060040161344f565b600060405180830381600087803b1580156116d657600080fd5b505af11580156116ea573d6000803e3d6000fd5b505050505061125d565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90611729903390600090369087906004016132ee565b600060405180830381600087803b15801561174357600080fd5b505af1158015611757573d6000803e3d6000fd5b5050505061176d6000546001600160a01b031690565b6001600160a01b0316336001600160a01b0316148061179657506001546001600160a01b031633145b6117b25760405162461bcd60e51b81526004016105c3906132c1565b6003546001600160a01b031615806117ca5750600254155b156117e8576040516363af9b0360e11b815260040160405180910390fd5b600354600254604051635c989d4960e11b81526001600160a01b039092169163b9313a9291611821918a908a908a908a9060040161344f565b600060405180830381600087803b15801561183b57600080fd5b505af115801561184f573d6000803e3d6000fd5b50506040516393163a9160e01b81526001600160a01b03851692506393163a919150611886903390600090369087906004016132ee565b600060405180830381600087803b1580156118a057600080fd5b505af1158015610912573d6000803e3d6000fd5b6000846118c081611e2f565b60006118cb84611e6a565b90506118d78787611f0b565b60005b8181101561191c57368686838181106118f5576118f56133b2565b905060400201905061190789826126c4565b611911908661343c565b9450506001016118da565b5061192783876126e1565b8281886001600160a01b03166000805160206135b583398151915260405160405180910390a45050949350505050565b600061197561057060016000805160206135d58339815191526132ae565b90506001600160a01b038116611a50576000546001600160a01b03163314806119a857506001546001600160a01b031633145b6119c45760405162461bcd60e51b81526004016105c3906132c1565b600380546001600160a01b0319166001600160a01b0384169081179091556040516313d0ca6f60e21b81526000196004820152306024820152634f4329bc906044016020604051808303816000875af1158015611a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4991906133df565b6002555050565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90611a85903390600090369087906004016132ee565b600060405180830381600087803b158015611a9f57600080fd5b505af1158015611ab3573d6000803e3d6000fd5b50505050611ac96000546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480611af257506001546001600160a01b031633145b611b0e5760405162461bcd60e51b81526004016105c3906132c1565b600380546001600160a01b0319166001600160a01b0385169081179091556040516313d0ca6f60e21b81526000196004820152306024820152634f4329bc906044016020604051808303816000875af1158015611b6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9391906133df565b6002556040516393163a9160e01b81526001600160a01b038316906393163a919061075f903390600090369087906004016132ee565b6000611be761057060016000805160206135d58339815191526132ae565b90506001600160a01b038116611c5d576000546001600160a01b0316331480611c1a57506001546001600160a01b031633145b611c365760405162461bcd60e51b81526004016105c3906132c1565b50600580546001600160a01b0319166001600160a01b039390931692909217909155600455565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90611c92903390600090369087906004016132ee565b600060405180830381600087803b158015611cac57600080fd5b505af1158015611cc0573d6000803e3d6000fd5b50505050611cd66000546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480611cff57506001546001600160a01b031633145b611d1b5760405162461bcd60e51b81526004016105c3906132c1565b600580546001600160a01b0319166001600160a01b038681169190911790915560048481556040516393163a9160e01b8152918416916393163a9191610b8491339160009136918891016132ee565b6000611d88610570600160008051602061361c8339815191526132ae565b905090565b611d95612016565b6001600160a01b038116611dfa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105c3565b610f7f81612070565b6060611e2883836040518060600160405280602781526020016135f56027913961270b565b9392505050565b611e376120c0565b6001600160a01b038116611e5e5760405163ddbadd5f60e01b815260040160405180910390fd5b611e66612783565b5050565b600081600003611e8d5760405163093ad0d360e21b815260040160405180910390fd5b5090565b6040516323b872dd60e01b81523360048201526001600160a01b038381166024830152604482018390528416906323b872dd906064015b6020604051808303816000875af1158015611ee7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125d91906134a2565b6040516323b872dd60e01b8152336004820152306024820152604481018290526001600160a01b038316906323b872dd906064016020604051808303816000875af1158015611f5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8291906134a2565b505050565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401611ec8565b611fc46120c0565b6007805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ff93390565b6040516001600160a01b03909116815260200160405180910390a1565b6000546001600160a01b03163314610dea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105c3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60075460ff1615610dea5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016105c3565b6000612110612783565b9050611e668261212083346132ae565b6126e1565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612172576040519150601f19603f3d011682016040523d82523d6000602084013e612177565b606091505b5050905080611f8257604051635a5e037360e11b81526001600160a01b0384166004820152602481018390526044016105c3565b6121b361295a565b6007805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611ff9565b60006122006121f66020840184612e5c565b8360200135612125565b506020013590565b633844b70760e01b600061222e61057060016000805160206135d58339815191526132ae565b90506001600160a01b038116612404576040516370a0823160e01b81523060048201526000906001600160a01b038716906370a0823190602401602060405180830381865afa158015612285573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a991906133df565b604080518681526001600160a01b03888116602083015289168183015290519192507fe4d818e6f992efbd60db553f3edce819a199baec79a784b95c89bc8ee86f2584919081900360600190a160405163a9059cbb60e01b81526001600160a01b0386811660048301526024820186905287169063a9059cbb906044016020604051808303816000875af1158015612345573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236991906134a2565b506040516370a0823160e01b8152306004820152819085906001600160a01b038916906370a0823190602401602060405180830381865afa1580156123b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d691906133df565b6123e0919061343c565b146123fd5760405162461bcd60e51b81526004016105c3906134bf565b505061125d565b604080516001600160e01b031984166020820152815160048183030181526024820192839052631bf8659f60e21b90925234916001600160a01b03841691636fe1967c91612459913391908690602801613551565b600060405180830381600087803b15801561247357600080fd5b505af1158015612487573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092506001600160a01b03891691506370a0823190602401602060405180830381865afa1580156124d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f691906133df565b604080518781526001600160a01b0389811660208301528a168183015290519192507fe4d818e6f992efbd60db553f3edce819a199baec79a784b95c89bc8ee86f2584919081900360600190a160405163a9059cbb60e01b81526001600160a01b0387811660048301526024820187905288169063a9059cbb906044016020604051808303816000875af1158015612592573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b691906134a2565b506040516370a0823160e01b8152306004820152819086906001600160a01b038a16906370a0823190602401602060405180830381865afa1580156125ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262391906133df565b61262d919061343c565b1461264a5760405162461bcd60e51b81526004016105c3906134bf565b50604080516001600160e01b0319851660208201528151600481830301815260248201928390526393163a9160e01b9092526001600160a01b038416916393163a91916118869133918690602801613551565b60006126ba836126b06020850185612e5c565b8460200135611e91565b5060200135919050565b60006126ba836126d76020850185612e5c565b8460200135611f87565b808214611e66576040516306f4750f60e41b815260048101829052602481018390526044016105c3565b6060600080856001600160a01b0316856040516127289190613585565b600060405180830381855af49150503d8060008114612763576040519150601f19603f3d011682016040523d82523d6000602084013e612768565b606091505b5091509150612779868383876129a3565b9695505050505050565b6000806127a261057060016000805160206135d58339815191526132ae565b90506001600160a01b038116612821576004549150816000036127c757600091505090565b60006127d233610c54565b90508015612813576127f1338483106127eb5784612a24565b82612a24565b8281101561280a5761280381846132ae565b9250612813565b60009250505090565b61281c83612a98565b505090565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90612856903390600090369087906004016132ee565b600060405180830381600087803b15801561287057600080fd5b505af1158015612884573d6000803e3d6000fd5b5050505060045492508260000361289e57600092506128f0565b60006128a933610c54565b905080156128e5576128c2338583106127eb5785612a24565b838110156128db576128d481856132ae565b93506128e5565b60009350506128f0565b6128ee84612a98565b505b6040516393163a9160e01b81526001600160a01b038316906393163a9190612923903390600090369087906004016132ee565b600060405180830381600087803b15801561293d57600080fd5b505af1158015612951573d6000803e3d6000fd5b50505050505090565b60075460ff16610dea5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016105c3565b60608315612a12578251600003612a0b576001600160a01b0385163b612a0b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105c3565b5081612a1c565b612a1c8383612b43565b949350505050565b600354600254604051630ebacfd960e11b81526001600160a01b038581166004830152602482019290925260448101849052911690631d759fb290606401600060405180830381600087803b158015612a7c57600080fd5b505af1158015612a90573d6000803e3d6000fd5b505050505050565b6005546001600160a01b031680612b075781341015612aca5760405163cc361e3d60e01b815260040160405180910390fd5b604080513481523360208201527f3a32cdd14cdfd431946dfa0b2aef5ace661340411aaadcaee6aef6738d302326910160405180910390a1612b12565b612b12813384612b6d565b6001600160a01b03811660009081526006602052604081208054849290612b3a90849061343c565b90915550505050565b815115612b535781518083602001fd5b8060405162461bcd60e51b81526004016105c391906135a1565b604051636eb1769f60e11b81526001600160a01b038084166004830152306024830152849184918491829185169063dd62ed3e90604401602060405180830381865afa158015612bc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612be591906133df565b1015612c335760405162461bcd60e51b815260206004820152601960248201527f455243323048656c7065723a206e6f20616c6c6f77616e63650000000000000060448201526064016105c3565b60008411612c4057600080fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038816906370a0823190602401602060405180830381865afa158015612c87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cab91906133df565b6040516323b872dd60e01b81526001600160a01b03888116600483015230602483015260448201889052919250908816906323b872dd906064016020604051808303816000875af1158015612d04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2891906134a2565b50604080518681526001600160a01b03888116602083015289168183015290517f1fecf4702e692891a7c2f0d328779b085efb5edd094fa5558bd5cd147a1679229181900360600190a16040516370a0823160e01b81523060048201526001600160a01b038816906370a0823190602401602060405180830381865afa158015612db6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dda91906133df565b612de4868361343c565b1461078d5760405162461bcd60e51b815260206004820152602660248201527f455243323048656c7065723a20526563656976656420496e636f727265637420604482015265105b5bdd5b9d60d21b60648201526084016105c3565b80356001600160a01b0381168114612e5757600080fd5b919050565b600060208284031215612e6e57600080fd5b611e2882612e40565b60008083601f840112612e8957600080fd5b50813567ffffffffffffffff811115612ea157600080fd5b602083019150836020828501011115612eb957600080fd5b9250929050565b600080600080600060608688031215612ed857600080fd5b612ee186612e40565b9450602086013567ffffffffffffffff80821115612efe57600080fd5b612f0a89838a01612e77565b90965094506040880135915080821115612f2357600080fd5b50612f3088828901612e77565b969995985093965092949392505050565b60008083601f840112612f5357600080fd5b50813567ffffffffffffffff811115612f6b57600080fd5b6020830191508360208260051b8501011115612eb957600080fd5b60008060208385031215612f9957600080fd5b823567ffffffffffffffff811115612fb057600080fd5b612fbc85828601612f41565b90969095509350505050565b60008060008060608587031215612fde57600080fd5b612fe785612e40565b9350602085013567ffffffffffffffff81111561300357600080fd5b61300f87828801612f41565b9598909750949560400135949350505050565b60008060006040848603121561303757600080fd5b833567ffffffffffffffff81111561304e57600080fd5b61305a86828701612f41565b909790965060209590950135949350505050565b60008083601f84011261308057600080fd5b50813567ffffffffffffffff81111561309857600080fd5b6020830191508360208260061b8501011115612eb957600080fd5b600080602083850312156130c657600080fd5b823567ffffffffffffffff8111156130dd57600080fd5b612fbc8582860161306e565b600080604083850312156130fc57600080fd5b61310583612e40565b915061311360208401612e40565b90509250929050565b60008060006040848603121561313157600080fd5b61313a84612e40565b9250602084013567ffffffffffffffff81111561315657600080fd5b6131628682870161306e565b9497909650939450505050565b8015158114610f7f57600080fd5b6000806040838503121561319057600080fd5b61319983612e40565b915060208301356131a98161316f565b809150509250929050565b600080600080604085870312156131ca57600080fd5b843567ffffffffffffffff808211156131e257600080fd5b6131ee88838901612f41565b9096509450602087013591508082111561320757600080fd5b5061321487828801612f41565b95989497509550505050565b6000806000806060858703121561323657600080fd5b61323f85612e40565b935060208501359250604085013567ffffffffffffffff81111561326257600080fd5b6132148782880161306e565b6000806040838503121561328157600080fd5b61328a83612e40565b946020939093013593505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610cf457610cf4613298565b60208082526013908201527220baba3437b934bd30ba34b7b71022b93937b960691b604082015260600190565b6001600160a01b038516815260606020820181905281018390528284608083013760006080848301015260006080601f19601f860116830101905082604083015295945050505050565b8183823760009101908152919050565b8183526000602080850194508260005b85811015613384576001600160a01b0361337183612e40565b1687529582019590820190600101613358565b509495945050505050565b8381526040602082015260006133a9604083018486613348565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610cf457610cf4613298565b6000602082840312156133f157600080fd5b5051919050565b60208082526024908201527f4669726577616c6c436f6e73756d65723a206e6f74206669726577616c6c20616040820152633236b4b760e11b606082015260800190565b80820180821115610cf457610cf4613298565b858152606060208201526000613469606083018688613348565b82810360408401528381526001600160fb1b0384111561348857600080fd5b8360051b8086602084013701602001979650505050505050565b6000602082840312156134b457600080fd5b8151611e288161316f565b60208082526022908201527f455243323048656c7065723a2073656e7420696e636f727265637420616d6f756040820152611b9d60f21b606082015260800190565b60005b8381101561351c578181015183820152602001613504565b50506000910152565b6000815180845261353d816020860160208601613501565b601f01601f19169290920160200192915050565b6001600160a01b038416815260606020820181905260009061357590830185613525565b9050826040830152949350505050565b60008251613597818460208701613501565b9190910192915050565b602081526000611e28602083018461352556febd92d122ffb1b8cecbdfdc76285b361b1ab09e8a58b0406b65326589ee1d65ef5dd2e3b890564a8f99f7f203f226a27a8aa59aee19a4ece5cf5eaa77ab91f662416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656429982a6ac507a2a707ced6dee5d76285dd49725db977de83d9702c628c974136a264697066735822122057ba9d84968badcaf1be197d2b8395432838f82ae7d26ff0f8692b83a87f47b264736f6c63430008180033

Deployed Bytecode Sourcemap

60964:2313:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46149:236;;;;;;;;;;-1:-1:-1;46149:236:0;;;;;:::i;:::-;;:::i;:::-;;17587:410;;;;;;:::i;:::-;;:::i;48462:185::-;;;;;;;;;;-1:-1:-1;48462:185:0;;;;;:::i;:::-;;:::i;49392:42::-;;;;;;;;;;-1:-1:-1;49392:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2491:25:1;;;2479:2;2464:18;49392:42:0;;;;;;;;60047:502;;;;;;:::i;:::-;;:::i;47736:215::-;;;;;;;;;;-1:-1:-1;47736:215:0;;;;;:::i;:::-;;:::i;49356:23::-;;;;;;;;;;-1:-1:-1;49356:23:0;;;;-1:-1:-1;;;;;49356:23:0;;;;;;-1:-1:-1;;;;;3275:32:1;;;3257:51;;3245:2;3230:18;49356:23:0;3111:203:1;62717:557:0;;;;;;:::i;:::-;;:::i;25785:86::-;;;;;;;;;;-1:-1:-1;25856:7:0;;;;25785:86;;3484:14:1;;3477:22;3459:41;;3447:2;3432:18;25785:86:0;3319:187:1;55938:68:0;;;;;;;;;;;;;:::i;23240:103::-;;;;;;;;;;;;;:::i;57839:487::-;;;;;;:::i;:::-;;:::i;19048:244::-;;;;;;;;;;-1:-1:-1;19048:244:0;;;;;:::i;:::-;;:::i;56172:72::-;;;;;;;;;;;;;:::i;45920:31::-;;;;;;;;;;-1:-1:-1;45920:31:0;;;;-1:-1:-1;;;;;45920:31:0;;;19366:236;;;;;;;;;;;;;:::i;56995:494::-;;;;;;:::i;:::-;;:::i;50513:477::-;;;;;;;;;;-1:-1:-1;50513:477:0;;;;;:::i;:::-;;:::i;18803:137::-;;;;;;;;;;-1:-1:-1;18803:137:0;;;;;:::i;:::-;;:::i;22599:87::-;;;;;;;;;;-1:-1:-1;22645:7:0;22672:6;-1:-1:-1;;;;;22672:6:0;22599:87;;47556:31;;;;;;;;;;-1:-1:-1;47556:31:0;;;;-1:-1:-1;;;;;47556:31:0;;;59164:522;;;;;;:::i;:::-;;:::i;49328:21::-;;;;;;;;;;;;;;;;18237:244;;;;;;;;;;-1:-1:-1;18237:244:0;;;;;:::i;:::-;;:::i;48228:226::-;;;;;;;;;;-1:-1:-1;48228:226:0;;;;;:::i;:::-;;:::i;61604:637::-;;;;;;:::i;:::-;;:::i;47959:261::-;;;;;;;;;;-1:-1:-1;47959:261:0;;;;;:::i;:::-;;:::i;50351:154::-;;;;;;;;;;-1:-1:-1;50351:154:0;;;;;:::i;:::-;;:::i;47526:23::-;;;;;;;;;;;;;;;;18557:129;;;;;;;;;;;;;:::i;23498:201::-;;;;;;;;;;-1:-1:-1;23498:201:0;;;;;:::i;:::-;;:::i;46149:236::-;13325:16;13344:40;12619:42;12660:1;-1:-1:-1;;;;;;;;;;;12619:42:0;:::i;:::-;20532:12;;20402:160;13344:40;13325:59;-1:-1:-1;;;;;;13399:22:0;;13395:77;;22645:7;22672:6;-1:-1:-1;;;;;22672:6:0;46019:10:::1;:21;::::0;:55:::1;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;;;;;;;;;46266:16:::2;::::0;;-1:-1:-1;;;;;46293:27:0;;::::2;-1:-1:-1::0;;;;;;46293:27:0;::::2;::::0;::::2;::::0;;;46336:41:::2;::::0;46266:16;::::2;::::0;46293:27;46266:16;;46336:41:::2;::::0;46249:14:::2;::::0;46336:41:::2;46238:147;13454:7:::0;46149:236;:::o;13395:77::-;13517:61;;-1:-1:-1;;;13517:61:0;;19794:11;;-1:-1:-1;;;;;13517:32:0;;;;;:61;;13550:10;;13482;;13562:8;;19794:11;;13517:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46033:7:::1;22645::::0;22672:6;-1:-1:-1;;;;;22672:6:0;;22599:87;46033:7:::1;-1:-1:-1::0;;;;;46019:21:0::1;:10;-1:-1:-1::0;;;;;46019:21:0::1;;:55;;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;46266:16:::2;::::0;;-1:-1:-1;;;;;46293:27:0;;::::2;-1:-1:-1::0;;;;;;46293:27:0;::::2;::::0;::::2;::::0;;;46336:41:::2;::::0;46266:16;::::2;::::0;46293:27;46266:16;;46336:41:::2;::::0;46249:14:::2;::::0;46336:41:::2;-1:-1:-1::0;13602:62:0;;-1:-1:-1;;;13602:62:0;;-1:-1:-1;;;;;13602:33:0;;;;;:62;;13636:10;;13648:8;;;;13658:5;;13602:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13314:358;;46149:236;:::o;17587:410::-;17750:6;16214:13;13063:50;13112:1;13071:37;13063:50;:::i;:::-;16240:49;;;;;;9218:25:1;;;;-1:-1:-1;;;;;9279:32:1;;9259:18;;;9252:60;9191:18;;16240:49:0;;;;;;;;;;;;16230:60;;;;;;16214:76;;16301:21;16359:1;16351:10;;16325:22;16341:5;20532:12;;20402:160;16325:22;:36;;16301:60;;16380:16;16372:66;;;;-1:-1:-1;;;16372:66:0;;9525:2:1;16372:66:0;;;9507:21:1;9564:2;9544:18;;;9537:30;9603:34;9583:18;;;9576:62;-1:-1:-1;;;9654:18:1;;;9647:35;9699:19;;16372:66:0;9323:401:1;16372:66:0;17770:12:::1;17788:6;-1:-1:-1::0;;;;;17788:11:0::1;17800:13;;17788:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17769:45;;;17833:7;17825:16;;;::::0;::::1;;17940:49;17977:4;17984;;17940:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;17940:28:0::1;::::0;-1:-1:-1;;;17940:49:0:i:1;:::-;;17758:239;15929:529:::0;;17587:410;;;;;;:::o;48462:185::-;13325:16;13344:40;12619:42;12660:1;-1:-1:-1;;;;;;;;;;;12619:42:0;:::i;13344:40::-;13325:59;-1:-1:-1;;;;;;13399:22:0;;13395:77;;22645:7;22672:6;-1:-1:-1;;;;;22672:6:0;46019:10:::1;:21;::::0;:55:::1;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;47632:16:::2;::::0;-1:-1:-1;;;;;47632:16:0::2;:30:::0;;:50:::2;;-1:-1:-1::0;47666:11:0::2;::::0;:16;47632:50:::2;47629:79;;;47691:17;;-1:-1:-1::0;;;47691:17:0::2;;;;;;;;;;;47629:79;48587:16:::3;::::0;48619:11:::3;::::0;48576:63:::3;::::0;-1:-1:-1;;;48576:63:0;;-1:-1:-1;;;;;48587:16:0;;::::3;::::0;48576:42:::3;::::0;:63:::3;::::0;48632:6;;;;48576:63:::3;;;:::i;13395:77::-:0;13517:61;;-1:-1:-1;;;13517:61:0;;19794:11;;-1:-1:-1;;;;;13517:32:0;;;;;:61;;13550:10;;13482;;13562:8;;19794:11;;13517:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46033:7:::1;22645::::0;22672:6;-1:-1:-1;;;;;22672:6:0;;22599:87;46033:7:::1;-1:-1:-1::0;;;;;46019:21:0::1;:10;-1:-1:-1::0;;;;;46019:21:0::1;;:55;;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;47632:16:::2;::::0;-1:-1:-1;;;;;47632:16:0::2;:30:::0;;:50:::2;;-1:-1:-1::0;47666:11:0::2;::::0;:16;47632:50:::2;47629:79;;;47691:17;;-1:-1:-1::0;;;47691:17:0::2;;;;;;;;;;;47629:79;48587:16:::3;::::0;48619:11:::3;::::0;48576:63:::3;::::0;-1:-1:-1;;;48576:63:0;;-1:-1:-1;;;;;48587:16:0;;::::3;::::0;48576:42:::3;::::0;:63:::3;::::0;48632:6;;;;48576:63:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;13602:62:0;;-1:-1:-1;;;13602:62:0;;-1:-1:-1;;;;;13602:33:0;;;-1:-1:-1;13602:33:0;;-1:-1:-1;13602:62:0;;13636:10;;13648:8;;;;13658:5;;13602:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13314:358;;48462:185;;:::o;60047:502::-;60209:6;52017:20;52030:6;52017:12;:20::i;:::-;60228:11:::1;60242:23;60251:6:::0;60242:8:::1;:23::i;:::-;60228:37;;60281:9;60276:195;60296:6;60292:1;:10;60276:195;;;60321:12;60336:6;;60343:1;60336:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;60321:24;;60360:37;60375:6;60383:4;60389:7;60360:14;:37::i;:::-;-1:-1:-1::0;60441:3:0::1;;60276:195;;;-1:-1:-1::0;60524:16:0::1;60534:6:::0;60524:7;:16:::1;:::i;:::-;60486:55;::::0;60516:6;;-1:-1:-1;;;;;60486:55:0;::::1;::::0;-1:-1:-1;;;;;;;;;;;60486:55:0;;;::::1;60217:332;60047:502:::0;;;;;:::o;47736:215::-;47811:16;;47791:4;;-1:-1:-1;;;;;47811:16:0;:30;;:50;;-1:-1:-1;47845:11:0;;:16;47811:50;47808:63;;;-1:-1:-1;47870:1:0;;47736:215;-1:-1:-1;47736:215:0:o;47808:63::-;47900:16;;47931:11;;47889:54;;-1:-1:-1;;;47889:54:0;;-1:-1:-1;;;;;11727:32:1;;;47889:54:0;;;11709:51:1;11776:18;;;11769:34;;;;47900:16:0;;;47889:34;;11682:18:1;;47889:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47882:61;47736:215;-1:-1:-1;;47736:215:0:o;62717:557::-;62881:6;52017:20;52030:6;52017:12;:20::i;:::-;62900:11:::1;62914:23;62923:6:::0;62914:8:::1;:23::i;:::-;62900:37:::0;-1:-1:-1;62948:8:0::1;62959:16;62900:37:::0;62959:7;:16:::1;:::i;:::-;62948:27;;62986:22;62996:6;63004:3;62986:9;:22::i;:::-;63024:9;63019:190;63039:6;63035:1;:10;63019:190;;;63064:12;63079:6;;63086:1;63079:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;63064:24;;63103:33;63114:6;63122:4;63128:7;63103:10;:33::i;:::-;-1:-1:-1::0;63179:3:0::1;;63019:190;;;;63262:3;63254:6;63246;-1:-1:-1::0;;;;;63224:42:0::1;-1:-1:-1::0;;;;;;;;;;;63224:42:0::1;;;;;;;;;62889:385;;62717:557:::0;;;;;:::o;55938:68::-;22645:7;22672:6;-1:-1:-1;;;;;22672:6:0;46019:10;:21;;:55;;-1:-1:-1;46058:16:0;;-1:-1:-1;;;;;46058:16:0;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1;;;45997:124:0;;;;;;;:::i;:::-;55990:8:::1;:6;:8::i;:::-;55938:68::o:0;23240:103::-;22485:13;:11;:13::i;:::-;23305:30:::1;23332:1;23305:18;:30::i;57839:487::-:0;25390:19;:17;:19::i;:::-;57978:11:::1;57992:23;58001:6:::0;57992:8:::1;:23::i;:::-;57978:37:::0;-1:-1:-1;58026:40:0::1;58049:16;57978:37:::0;58049:7;:16:::1;:::i;:::-;58026:22;:40::i;:::-;58082:9;58077:181;58097:6;58093:1;:10;58077:181;;;58122:12;58137:6;;58144:1;58137:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;58122:24;;58161:23;58170:4;58176:7;58161:8;:23::i;:::-;-1:-1:-1::0;58228:3:0::1;;58077:181;;;-1:-1:-1::0;58301:16:0::1;58311:6:::0;58301:7;:16:::1;:::i;:::-;58273:45;::::0;58293:6;;58273:45:::1;::::0;;;::::1;57967:359;57839:487:::0;;;:::o;19048:244::-;16618:46;12732:48;12779:1;-1:-1:-1;;;;;;;;;;;12732:48:0;:::i;16618:46::-;-1:-1:-1;;;;;16604:60:0;:10;-1:-1:-1;;;;;16604:60:0;;16596:109;;;;-1:-1:-1;;;16596:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19144:28:0;::::1;19136:71;;;::::0;-1:-1:-1;;;19136:71:0;;12610:2:1;19136:71:0::1;::::0;::::1;12592:21:1::0;12649:2;12629:18;;;12622:30;12688:32;12668:18;;;12661:60;12738:18;;19136:71:0::1;12408:354:1::0;19136:71:0::1;19218:66;12855:52;12906:1;12863:39;12855:52;:::i;:::-;19269:14:::0;20353:23;;20249:145;19218:66:::1;19048:244:::0;:::o;56172:72::-;22645:7;22672:6;-1:-1:-1;;;;;22672:6:0;46019:10;:21;;:55;;-1:-1:-1;46058:16:0;;-1:-1:-1;;;;;46058:16:0;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1;;;45997:124:0;;;;;;;:::i;:::-;56226:10:::1;:8;:10::i;19366:236::-:0;19439:50;12855:52;12906:1;12863:39;12855:52;:::i;19439:50::-;-1:-1:-1;;;;;19425:64:0;:10;-1:-1:-1;;;;;19425:64:0;;19417:108;;;;-1:-1:-1;;;19417:108:0;;12969:2:1;19417:108:0;;;12951:21:1;13008:2;12988:18;;;12981:30;13047:33;13027:18;;;13020:61;13098:18;;19417:108:0;12767:355:1;19417:108:0;19536:58;12732:48;12779:1;-1:-1:-1;;;;;;;;;;;12732:48:0;:::i;:::-;19583:10;20353:23;;20249:145;56995:494;57114:11;25390:19;:17;:19::i;:::-;57138:11:::1;57152:31;57161:14:::0;57152:8:::1;:31::i;:::-;57138:45;;57199:9;57194:202;57214:6;57210:1;:10;57194:202;;;57239:27;57269:14;;57284:1;57269:17;;;;;;;:::i;:::-;;;;;;57239:47;;57308:14;57317:4;57308:8;:14::i;:::-;57301:21;::::0;;::::1;:::i;:::-;::::0;-1:-1:-1;;57366:3:0::1;;57194:202;;;;57406:27;57429:3;57406:22;:27::i;:::-;57449:32;::::0;57477:3;;57469:6;;57449:32:::1;::::0;;;::::1;57127:362;56995:494:::0;;;;:::o;50513:477::-;13325:16;13344:40;12619:42;12660:1;-1:-1:-1;;;;;;;;;;;12619:42:0;:::i;13344:40::-;13325:59;-1:-1:-1;;;;;;13399:22:0;;13395:77;;22645:7;22672:6;-1:-1:-1;;;;;22672:6:0;46019:10:::1;:21;::::0;:55:::1;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50620:18:0;::::2;;::::0;;;:10:::2;:18;::::0;;;;;:23;;50616:53:::2;;50652:17;;-1:-1:-1::0;;;50652:17:0::2;;;;;;;;;;;50616:53;-1:-1:-1::0;;;;;50697:18:0;::::2;50680:14;50697:18:::0;;;:10:::2;:18;::::0;;;;;;50726:22;;;50697:18;50759:224:::2;;50801:12;50819:3;-1:-1:-1::0;;;;;50819:8:0::2;50835:9;50819:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50800:49;;;50869:7;50864:37;;50885:16;;-1:-1:-1::0;;;50885:16:0::2;;;;;;;;;;;50864:37;50785:128;50759:224;;;50934:37;50948:6;50956:3;50961:9;50934:13;:37::i;:::-;50605:385;13454:7:::0;50513:477;;:::o;13395:77::-;13517:61;;-1:-1:-1;;;13517:61:0;;19794:11;;-1:-1:-1;;;;;13517:32:0;;;;;:61;;13550:10;;13482;;13562:8;;19794:11;;13517:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46033:7:::1;22645::::0;22672:6;-1:-1:-1;;;;;22672:6:0;;22599:87;46033:7:::1;-1:-1:-1::0;;;;;46019:21:0::1;:10;-1:-1:-1::0;;;;;46019:21:0::1;;:55;;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50620:18:0;::::2;;::::0;;;:10:::2;:18;::::0;;;;;:23;;50616:53:::2;;50652:17;;-1:-1:-1::0;;;50652:17:0::2;;;;;;;;;;;50616:53;-1:-1:-1::0;;;;;50697:18:0;::::2;50680:14;50697:18:::0;;;:10:::2;:18;::::0;;;;;;50726:22;;;50697:18;50759:224:::2;;50801:12;50819:3;-1:-1:-1::0;;;;;50819:8:0::2;50835:9;50819:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50800:49;;;50869:7;50864:37;;50885:16;;-1:-1:-1::0;;;50885:16:0::2;;;;;;;;;;;50864:37;50785:128;50759:224;;;50934:37;50948:6;50956:3;50961:9;50934:13;:37::i;:::-;-1:-1:-1::0;13602:62:0;;-1:-1:-1;;;13602:62:0;;-1:-1:-1;;;;;13602:33:0;;;;;:62;;13636:10;;13648:8;;;;13658:5;;13602:62;;;:::i;18803:137::-;16618:46;12732:48;12779:1;-1:-1:-1;;;;;;;;;;;12732:48:0;:::i;16618:46::-;-1:-1:-1;;;;;16604:60:0;:10;-1:-1:-1;;;;;16604:60:0;;16596:109;;;;-1:-1:-1;;;16596:109:0;;;;;;;:::i;:::-;18881:51:::1;12619:42;12660:1;-1:-1:-1::0;;;;;;;;;;;12619:42:0::1;:::i;59164:522::-:0;59325:11;59308:6;52017:20;52030:6;52017:12;:20::i;:::-;59349:11:::1;59363:31;59372:14:::0;59363:8:::1;:31::i;:::-;59349:45;;59410:9;59405:216;59425:6;59421:1;:10;59405:216;;;59450:27;59480:14;;59495:1;59480:17;;;;;;;:::i;:::-;;;;;;59450:47;;59519:28;59534:6;59542:4;59519:14;:28::i;:::-;59512:35;::::0;;::::1;:::i;:::-;::::0;-1:-1:-1;;59591:3:0::1;;59405:216;;;;59674:3;59666:6;59658;-1:-1:-1::0;;;;;59636:42:0::1;-1:-1:-1::0;;;;;;;;;;;59636:42:0::1;;;;;;;;;59338:348;59164:522:::0;;;;;;:::o;18237:244::-;16618:46;12732:48;12779:1;-1:-1:-1;;;;;;;;;;;12732:48:0;:::i;16618:46::-;-1:-1:-1;;;;;16604:60:0;:10;-1:-1:-1;;;;;16604:60:0;;16596:109;;;;-1:-1:-1;;;16596:109:0;;;;;;;:::i;:::-;18331:13:::1;13063:50;13112:1;13071:37;13063:50;:::i;:::-;18357:49;::::0;;::::1;::::0;::::1;9218:25:1::0;;;;-1:-1:-1;;;;;9279:32:1;;9259:18;;;9252:60;9191:18;;18357:49:0::1;;;;;;;;;;;;18347:60;;;;;;18331:76;;18456:6;18449:5;18442:21;18427:47;18237:244:::0;;:::o;48228:226::-;13325:16;13344:40;12619:42;12660:1;-1:-1:-1;;;;;;;;;;;12619:42:0;:::i;13344:40::-;13325:59;-1:-1:-1;;;;;;13399:22:0;;13395:77;;22645:7;22672:6;-1:-1:-1;;;;;22672:6:0;46019:10:::1;:21;::::0;:55:::1;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;47632:16:::2;::::0;-1:-1:-1;;;;;47632:16:0::2;:30:::0;;:50:::2;;-1:-1:-1::0;47666:11:0::2;::::0;:16;47632:50:::2;47629:79;;;47691:17;;-1:-1:-1::0;;;47691:17:0::2;;;;;;;;;;;47629:79;48387:16:::3;::::0;48416:11:::3;::::0;48376:70:::3;::::0;-1:-1:-1;;;48376:70:0;;-1:-1:-1;;;;;48387:16:0;;::::3;::::0;48376:39:::3;::::0;:70:::3;::::0;48429:6;;;;48437:8;;;;48376:70:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;13454:7:::0;;;13395:77;13517:61;;-1:-1:-1;;;13517:61:0;;19794:11;;-1:-1:-1;;;;;13517:32:0;;;;;:61;;13550:10;;13482;;13562:8;;19794:11;;13517:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46033:7:::1;22645::::0;22672:6;-1:-1:-1;;;;;22672:6:0;;22599:87;46033:7:::1;-1:-1:-1::0;;;;;46019:21:0::1;:10;-1:-1:-1::0;;;;;46019:21:0::1;;:55;;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;47632:16:::2;::::0;-1:-1:-1;;;;;47632:16:0::2;:30:::0;;:50:::2;;-1:-1:-1::0;47666:11:0::2;::::0;:16;47632:50:::2;47629:79;;;47691:17;;-1:-1:-1::0;;;47691:17:0::2;;;;;;;;;;;47629:79;48387:16:::3;::::0;48416:11:::3;::::0;48376:70:::3;::::0;-1:-1:-1;;;48376:70:0;;-1:-1:-1;;;;;48387:16:0;;::::3;::::0;48376:39:::3;::::0;:70:::3;::::0;48429:6;;;;48437:8;;;;48376:70:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;13602:62:0;;-1:-1:-1;;;13602:62:0;;-1:-1:-1;;;;;13602:33:0;;;-1:-1:-1;13602:33:0;;-1:-1:-1;13602:62:0;;13636:10;;13648:8;;;;13658:5;;13602:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61604:637;61798:11;61781:6;52017:20;52030:6;52017:12;:20::i;:::-;61822:11:::1;61836:31;61845:14:::0;61836:8:::1;:31::i;:::-;61822:45;;61878:31;61888:6;61896:12;61878:9;:31::i;:::-;61925:9;61920:212;61940:6;61936:1;:10;61920:212;;;61965:27;61995:14;;62010:1;61995:17;;;;;;;:::i;:::-;;;;;;61965:47;;62034:24;62045:6;62053:4;62034:10;:24::i;:::-;62027:31;::::0;;::::1;:::i;:::-;::::0;-1:-1:-1;;62102:3:0::1;;61920:212;;;;62142:33;62157:3;62162:12;62142:14;:33::i;:::-;62229:3;62221:6;62213;-1:-1:-1::0;;;;;62191:42:0::1;-1:-1:-1::0;;;;;;;;;;;62191:42:0::1;;;;;;;;;61811:430;61604:637:::0;;;;;;;:::o;47959:261::-;13325:16;13344:40;12619:42;12660:1;-1:-1:-1;;;;;;;;;;;12619:42:0;:::i;13344:40::-;13325:59;-1:-1:-1;;;;;;13399:22:0;;13395:77;;22645:7;22672:6;-1:-1:-1;;;;;22672:6:0;46019:10:::1;:21;::::0;:55:::1;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;48066:16:::2;:36:::0;;-1:-1:-1;;;;;;48066:36:0::2;-1:-1:-1::0;;;;;48066:36:0;::::2;::::0;;::::2;::::0;;;48127:85:::2;::::0;-1:-1:-1;;;48127:85:0;;-1:-1:-1;;48127:85:0::2;::::0;::::2;9218:25:1::0;48206:4:0::2;9259:18:1::0;;;9252:60;48127:51:0::2;::::0;9191:18:1;;48127:85:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48113:11;:99:::0;-1:-1:-1;;47959:261:0:o;13395:77::-;13517:61;;-1:-1:-1;;;13517:61:0;;19794:11;;-1:-1:-1;;;;;13517:32:0;;;;;:61;;13550:10;;13482;;13562:8;;19794:11;;13517:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46033:7:::1;22645::::0;22672:6;-1:-1:-1;;;;;22672:6:0;;22599:87;46033:7:::1;-1:-1:-1::0;;;;;46019:21:0::1;:10;-1:-1:-1::0;;;;;46019:21:0::1;;:55;;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;48066:16:::2;:36:::0;;-1:-1:-1;;;;;;48066:36:0::2;-1:-1:-1::0;;;;;48066:36:0;::::2;::::0;;::::2;::::0;;;48127:85:::2;::::0;-1:-1:-1;;;48127:85:0;;-1:-1:-1;;48127:85:0::2;::::0;::::2;9218:25:1::0;48206:4:0::2;9259:18:1::0;;;9252:60;48127:51:0::2;::::0;9191:18:1;;48127:85:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48113:11;:99:::0;13602:62;;-1:-1:-1;;;13602:62:0;;-1:-1:-1;;;;;13602:33:0;;;;;:62;;13636:10;;13648:8;;;;13658:5;;13602:62;;;:::i;50351:154::-;13325:16;13344:40;12619:42;12660:1;-1:-1:-1;;;;;;;;;;;12619:42:0;:::i;13344:40::-;13325:59;-1:-1:-1;;;;;;13399:22:0;;13395:77;;22645:7;22672:6;-1:-1:-1;;;;;22672:6:0;46019:10:::1;:21;::::0;:55:::1;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;50450:8:0::2;:17:::0;;-1:-1:-1;;;;;;50450:17:0::2;-1:-1:-1::0;;;;;50450:17:0;;;::::2;::::0;;;::::2;::::0;;;50478:9:::2;:19:::0;50351:154::o;13395:77::-;13517:61;;-1:-1:-1;;;13517:61:0;;19794:11;;-1:-1:-1;;;;;13517:32:0;;;;;:61;;13550:10;;13482;;13562:8;;19794:11;;13517:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46033:7:::1;22645::::0;22672:6;-1:-1:-1;;;;;22672:6:0;;22599:87;46033:7:::1;-1:-1:-1::0;;;;;46019:21:0::1;:10;-1:-1:-1::0;;;;;46019:21:0::1;;:55;;;-1:-1:-1::0;46058:16:0::1;::::0;-1:-1:-1;;;;;46058:16:0::1;46044:10;:30;46019:55;45997:124;;;;-1:-1:-1::0;;;45997:124:0::1;;;;;;;:::i;:::-;50450:8:::2;:17:::0;;-1:-1:-1;;;;;;50450:17:0::2;-1:-1:-1::0;;;;;50450:17:0;;::::2;::::0;;;::::2;::::0;;;50478:9:::2;:19:::0;;;13602:62;;-1:-1:-1;;;13602:62:0;;:33;;;;;;:62;;13636:10;;-1:-1:-1;;13648:8:0;;13658:5;;13602:62;;:::i;18557:129::-;18605:7;18632:46;12732:48;12779:1;-1:-1:-1;;;;;;;;;;;12732:48:0;:::i;18632:46::-;18625:53;;18557:129;:::o;23498:201::-;22485:13;:11;:13::i;:::-;-1:-1:-1;;;;;23587:22:0;::::1;23579:73;;;::::0;-1:-1:-1;;;23579:73:0;;14692:2:1;23579:73:0::1;::::0;::::1;14674:21:1::0;14731:2;14711:18;;;14704:30;14770:34;14750:18;;;14743:62;-1:-1:-1;;;14821:18:1;;;14814:36;14867:19;;23579:73:0::1;14490:402:1::0;23579:73:0::1;23663:28;23682:8;23663:18;:28::i;8047:200::-:0;8130:12;8162:77;8183:6;8191:4;8162:77;;;;;;;;;;;;;;;;;:20;:77::i;:::-;8155:84;8047:200;-1:-1:-1;;;8047:200:0:o;52235:147::-;25390:19;:17;:19::i;:::-;-1:-1:-1;;;;;52310:20:0;::::1;52306:48;;52339:15;;-1:-1:-1::0;;;52339:15:0::1;;;;;;;;;;;52306:48;52365:9;:7;:9::i;:::-;;52235:147:::0;:::o;52539:181::-;52613:19;52649:7;52660:1;52649:12;52645:42;;52670:17;;-1:-1:-1;;;52670:17:0;;;;;;;;;;;52645:42;-1:-1:-1;52705:7:0;52539:181::o;55256:182::-;55377:53;;-1:-1:-1;;;55377:53:0;;55405:10;55377:53;;;15137:34:1;-1:-1:-1;;;;;15207:15:1;;;15187:18;;;15180:43;15239:18;;;15232:34;;;55377:27:0;;;;;15072:18:1;;55377:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;53865:140::-;53934:63;;-1:-1:-1;;;53934:63:0;;53962:10;53934:63;;;15137:34:1;53982:4:0;15187:18:1;;;15180:43;15239:18;;;15232:34;;;-1:-1:-1;;;;;53934:27:0;;;;;15072:18:1;;53934:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53865:140;;:::o;54526:132::-;54611:39;;-1:-1:-1;;;54611:39:0;;-1:-1:-1;;;;;11727:32:1;;;54611:39:0;;;11709:51:1;11776:18;;;11769:34;;;54611:23:0;;;;;11682:18:1;;54611:39:0;11535:274:1;26381:118:0;25390:19;:17;:19::i;:::-;26441:7:::1;:14:::0;;-1:-1:-1;;26441:14:0::1;26451:4;26441:14;::::0;;26471:20:::1;26478:12;11645:10:::0;;11565:98;26478:12:::1;26471:20;::::0;-1:-1:-1;;;;;3275:32:1;;;3257:51;;3245:2;3230:18;26471:20:0::1;;;;;;;26381:118::o:0;22764:132::-;22645:7;22672:6;-1:-1:-1;;;;;22672:6:0;11645:10;22828:23;22820:68;;;;-1:-1:-1;;;22820:68:0;;15729:2:1;22820:68:0;;;15711:21:1;;;15748:18;;;15741:30;15807:34;15787:18;;;15780:62;15859:18;;22820:68:0;15527:356:1;23859:191:0;23933:16;23952:6;;-1:-1:-1;;;;;23969:17:0;;;-1:-1:-1;;;;;;23969:17:0;;;;;;24002:40;;23952:6;;;;;;;24002:40;;23933:16;24002:40;23922:128;23859:191;:::o;25944:108::-;25856:7;;;;26014:9;26006:38;;;;-1:-1:-1;;;26006:38:0;;16090:2:1;26006:38:0;;;16072:21:1;16129:2;16109:18;;;16102:30;-1:-1:-1;;;16148:18:1;;;16141:46;16204:18;;26006:38:0;15888:340:1;52912:153:0;52977:13;52993:9;:7;:9::i;:::-;52977:25;-1:-1:-1;53013:44:0;53028:6;53036:20;52977:25;53036:9;:20;:::i;:::-;53013:14;:44::i;55591:187::-;55659:12;55677:5;-1:-1:-1;;;;;55677:10:0;55695:7;55677:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55658:49;;;55723:7;55718:52;;55739:31;;-1:-1:-1;;;55739:31:0;;-1:-1:-1;;;;;11727:32:1;;55739:31:0;;;11709:51:1;11776:18;;;11769:34;;;11682:18;;55739:31:0;11535:274:1;26640:120:0;25649:16;:14;:16::i;:::-;26699:7:::1;:15:::0;;-1:-1:-1;;26699:15:0::1;::::0;;26730:22:::1;11645:10:::0;26739:12:::1;11565:98:::0;53468:213;53559:10;53582:52;53591:19;;;;:14;:19;:::i;:::-;53612:14;:21;;;53582:8;:52::i;:::-;-1:-1:-1;53652:21:0;;;;53468:213::o;44273:493::-;-1:-1:-1;;;14618:16:0;14637:40;12619:42;12660:1;-1:-1:-1;;;;;;;;;;;12619:42:0;:::i;14637:40::-;14618:59;-1:-1:-1;;;;;;14692:22:0;;14688:77;;44455:38:::1;::::0;-1:-1:-1;;;44455:38:0;;44487:4:::1;44455:38;::::0;::::1;3257:51:1::0;44434:18:0::1;::::0;-1:-1:-1;;;;;44455:23:0;::::1;::::0;::::1;::::0;3230:18:1;;44455:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44509;::::0;;16435:25:1;;;-1:-1:-1;;;;;16534:15:1;;;16529:2;16514:18;;16507:43;16586:15;;16566:18;;;16559:43;44509:38:0;;44434:59;;-1:-1:-1;44509:38:0::1;::::0;;;;;16423:2:1;44509:38:0;;::::1;44558:41;::::0;-1:-1:-1;;;44558:41:0;;-1:-1:-1;;;;;11727:32:1;;;44558:41:0::1;::::0;::::1;11709:51:1::0;11776:18;;;11769:34;;;44558:22:0;::::1;::::0;::::1;::::0;11682:18:1;;44558:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;44633:38:0::1;::::0;-1:-1:-1;;;44633:38:0;;44665:4:::1;44633:38;::::0;::::1;3257:51:1::0;44686:10:0;;44674:7;;-1:-1:-1;;;;;44633:23:0;::::1;::::0;::::1;::::0;3230:18:1;;44633:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;;;:::i;:::-;44632:64;44610:148;;;;-1:-1:-1::0;;;44610:148:0::1;;;;;;;:::i;:::-;44423:343;14747:7:::0;;;14688:77;14855:26;;;-1:-1:-1;;;;;;17155:33:1;;14855:26:0;;;17143:46:1;14855:26:0;;;;;;;;;17205:11:1;;;14855:26:0;;;;-1:-1:-1;;;14810:79:0;;;19794:11;;-1:-1:-1;;;;;14810:32:0;;;;;:79;;14843:10;;14855:26;19794:11;;14810:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44455:38:0::1;::::0;-1:-1:-1;;;44455:38:0;;44487:4:::1;44455:38;::::0;::::1;3257:51:1::0;44434:18:0::1;::::0;-1:-1:-1;;;;;;44455:23:0;::::1;::::0;-1:-1:-1;44455:23:0::1;::::0;3230:18:1;;44455:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44509;::::0;;16435:25:1;;;-1:-1:-1;;;;;16534:15:1;;;16529:2;16514:18;;16507:43;16586:15;;16566:18;;;16559:43;44509:38:0;;44434:59;;-1:-1:-1;44509:38:0::1;::::0;;;;;16423:2:1;44509:38:0;;::::1;44558:41;::::0;-1:-1:-1;;;44558:41:0;;-1:-1:-1;;;;;11727:32:1;;;44558:41:0::1;::::0;::::1;11709:51:1::0;11776:18;;;11769:34;;;44558:22:0;::::1;::::0;::::1;::::0;11682:18:1;;44558:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;44633:38:0::1;::::0;-1:-1:-1;;;44633:38:0;;44665:4:::1;44633:38;::::0;::::1;3257:51:1::0;44686:10:0;;44674:7;;-1:-1:-1;;;;;44633:23:0;::::1;::::0;::::1;::::0;3230:18:1;;44633:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;;;:::i;:::-;44632:64;44610:148;;;;-1:-1:-1::0;;;44610:148:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;14959:26:0;;;-1:-1:-1;;;;;;17155:33:1;;14959:26:0;;;17143:46:1;14959:26:0;;;;;;;;;17205:11:1;;;14959:26:0;;;;-1:-1:-1;;;14913:80:0;;;-1:-1:-1;;;;;14913:33:0;;;;;:80;;14947:10;;14987:5;;14913:80;;;:::i;54832:258::-;54954:10;54977:66;54992:6;55000:19;;;;:14;:19;:::i;:::-;55021:14;:21;;;54977:14;:66::i;:::-;-1:-1:-1;55061:21:0;;;;54832:258;-1:-1:-1;54832:258:0:o;54140:250::-;54258:10;54281:62;54292:6;54300:19;;;;:14;:19;:::i;:::-;54321:14;:21;;;54281:10;:62::i;53200:144::-;53290:7;53280:6;:17;53276:60;;53306:30;;-1:-1:-1;;;53306:30:0;;;;;18321:25:1;;;18362:18;;;18355:34;;;18294:18;;53306:30:0;18147:248:1;8441:332:0;8586:12;8612;8626:23;8653:6;-1:-1:-1;;;;;8653:19:0;8673:4;8653:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8611:67;;;;8696:69;8723:6;8731:7;8740:10;8752:12;8696:26;:69::i;:::-;8689:76;8441:332;-1:-1:-1;;;;;;8441:332:0:o;49443:493::-;49505:13;;13344:40;12619:42;12660:1;-1:-1:-1;;;;;;;;;;;12619:42:0;:::i;13344:40::-;13325:59;-1:-1:-1;;;;;;13399:22:0;;13395:77;;49541:9:::1;;49530:20;;49564:8;49576:1;49564:13:::0;49561:26:::1;;49586:1;49579:8;;13454:7:::0;49443:493;:::o;49561:26::-:1;49598:12;49613:22;49624:10;49613;:22::i;:::-;49598:37:::0;-1:-1:-1;49649:11:0;;49646:254:::1;;49677:71;49696:10;49718:8;49708:7;:18;:39;;49739:8;49677:18;:71::i;49708:39::-;49729:7;49677:18;:71::i;:::-;49776:8;49766:7;:18;49763:126;;;49805:19;49817:7:::0;49805:19;::::1;:::i;:::-;;;49763:126;;;49872:1;49865:8;;;13454:7:::0;49443:493;:::o;49763:126::-:1;49910:18;49919:8;49910;:18::i;:::-;49519:417;13454:7:::0;49443:493;:::o;13395:77::-;13517:61;;-1:-1:-1;;;13517:61:0;;19794:11;;-1:-1:-1;;;;;13517:32:0;;;;;:61;;13550:10;;13482;;13562:8;;19794:11;;13517:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49541:9:::1;;49530:20;;49564:8;49576:1;49564:13:::0;49561:26:::1;;49586:1;49579:8;;;;49561:26;49598:12;49613:22;49624:10;49613;:22::i;:::-;49598:37:::0;-1:-1:-1;49649:11:0;;49646:254:::1;;49677:71;49696:10;49718:8;49708:7;:18;:39;;49739:8;49677:18;:71::i;:::-;49776:8;49766:7;:18;49763:126;;;49805:19;49817:7:::0;49805:19;::::1;:::i;:::-;;;49763:126;;;49872:1;49865:8;;;;;49763:126;49910:18;49919:8;49910;:18::i;:::-;49519:417;13589:1;13602:62:::0;;-1:-1:-1;;;13602:62:0;;-1:-1:-1;;;;;13602:33:0;;;;;:62;;13636:10;;13648:8;;;;13658:5;;13602:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13314:358;;49443:493;:::o;26129:108::-;25856:7;;;;26188:41;;;;-1:-1:-1;;;26188:41:0;;18894:2:1;26188:41:0;;;18876:21:1;18933:2;18913:18;;;18906:30;-1:-1:-1;;;18952:18:1;;;18945:50;19012:18;;26188:41:0;18692:344:1;9069:644:0;9254:12;9283:7;9279:427;;;9311:10;:17;9332:1;9311:22;9307:290;;-1:-1:-1;;;;;2950:19:0;;;9521:60;;;;-1:-1:-1;;;9521:60:0;;19243:2:1;9521:60:0;;;19225:21:1;19282:2;19262:18;;;19255:30;19321:31;19301:18;;;19294:59;19370:18;;9521:60:0;19041:353:1;9521:60:0;-1:-1:-1;9618:10:0;9611:17;;9279:427;9661:33;9669:10;9681:12;9661:7;:33::i;:::-;9069:644;;;;;;:::o;48655:153::-;48744:16;;48778:11;;48733:67;;-1:-1:-1;;;48733:67:0;;-1:-1:-1;;;;;19619:32:1;;;48733:67:0;;;19601:51:1;19668:18;;;19661:34;;;;19711:18;;;19704:34;;;48744:16:0;;;48733:37;;19574:18:1;;48733:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48655:153;;:::o;49944:399::-;50012:8;;-1:-1:-1;;;;;50012:8:0;;50056:240;;50116:4;50104:9;:16;50100:51;;;50129:22;;-1:-1:-1;;;50129:22:0;;;;;;;;;;;50100:51;50171:36;;;50185:9;9218:25:1;;50196:10:0;9274:2:1;9259:18;;9252:60;50171:36:0;;9191:18:1;50171:36:0;;;;;;;50056:240;;;50240:44;50256:9;50267:10;50279:4;50240:15;:44::i;:::-;-1:-1:-1;;;;;50306:21:0;;;;;;:10;:21;;;;;:29;;50331:4;;50306:21;:29;;50331:4;;50306:29;:::i;:::-;;;;-1:-1:-1;;;;49944:399:0:o;10255:552::-;10416:17;;:21;10412:388;;10648:10;10642:17;10705:15;10692:10;10688:2;10684:19;10677:44;10412:388;10775:12;10768:20;;-1:-1:-1;;;10768:20:0;;;;;;;;:::i;44774:556::-;44135:46;;-1:-1:-1;;;44135:46:0;;-1:-1:-1;;;;;20203:15:1;;;44135:46:0;;;20185:34:1;44175:4:0;20235:18:1;;;20228:43;44907:6:0;;44915:8;;44925:7;;;;44135:23;;;;;20120:18:1;;44135:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;44113:132;;;;-1:-1:-1;;;44113:132:0;;20484:2:1;44113:132:0;;;20466:21:1;20523:2;20503:18;;;20496:30;20562:27;20542:18;;;20535:55;20607:18;;44113:132:0;20282:349:1;44113:132:0;44963:1:::1;44953:7;:11;44945:20;;;::::0;::::1;;44997:38;::::0;-1:-1:-1;;;44997:38:0;;45029:4:::1;44997:38;::::0;::::1;3257:51:1::0;44976:18:0::1;::::0;-1:-1:-1;;;;;44997:23:0;::::1;::::0;::::1;::::0;3230:18:1;;44997:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45046:60;::::0;-1:-1:-1;;;45046:60:0;;-1:-1:-1;;;;;15155:15:1;;;45046:60:0::1;::::0;::::1;15137:34:1::0;45091:4:0::1;15187:18:1::0;;;15180:43;15239:18;;;15232:34;;;44976:59:0;;-1:-1:-1;45046:26:0;;::::1;::::0;::::1;::::0;15072:18:1;;45046:60:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;45122:37:0::1;::::0;;16435:25:1;;;-1:-1:-1;;;;;16534:15:1;;;16529:2;16514:18;;16507:43;16586:15;;16566:18;;;16559:43;45122:37:0;;::::1;::::0;;;;16423:2:1;45122:37:0;;::::1;45218:38;::::0;-1:-1:-1;;;45218:38:0;;45250:4:::1;45218:38;::::0;::::1;3257:51:1::0;-1:-1:-1;;;;;45218:23:0;::::1;::::0;::::1;::::0;3230:18:1;;45218:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45193:20;45206:7:::0;45193:10;:20:::1;:::i;:::-;45192:64;45170:152;;;::::0;-1:-1:-1;;;45170:152:0;;20838:2:1;45170:152:0::1;::::0;::::1;20820:21:1::0;20877:2;20857:18;;;20850:30;20916:34;20896:18;;;20889:62;-1:-1:-1;;;20967:18:1;;;20960:36;21013:19;;45170:152:0::1;20636:402:1::0;14:173;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;383:347::-;434:8;444:6;498:3;491:4;483:6;479:17;475:27;465:55;;516:1;513;506:12;465:55;-1:-1:-1;539:20:1;;582:18;571:30;;568:50;;;614:1;611;604:12;568:50;651:4;643:6;639:17;627:29;;703:3;696:4;687:6;679;675:19;671:30;668:39;665:59;;;720:1;717;710:12;665:59;383:347;;;;;:::o;735:791::-;834:6;842;850;858;866;919:2;907:9;898:7;894:23;890:32;887:52;;;935:1;932;925:12;887:52;958:29;977:9;958:29;:::i;:::-;948:39;;1038:2;1027:9;1023:18;1010:32;1061:18;1102:2;1094:6;1091:14;1088:34;;;1118:1;1115;1108:12;1088:34;1157:58;1207:7;1198:6;1187:9;1183:22;1157:58;:::i;:::-;1234:8;;-1:-1:-1;1131:84:1;-1:-1:-1;1322:2:1;1307:18;;1294:32;;-1:-1:-1;1338:16:1;;;1335:36;;;1367:1;1364;1357:12;1335:36;;1406:60;1458:7;1447:8;1436:9;1432:24;1406:60;:::i;:::-;735:791;;;;-1:-1:-1;735:791:1;;-1:-1:-1;1485:8:1;;1380:86;735:791;-1:-1:-1;;;735:791:1:o;1531:367::-;1594:8;1604:6;1658:3;1651:4;1643:6;1639:17;1635:27;1625:55;;1676:1;1673;1666:12;1625:55;-1:-1:-1;1699:20:1;;1742:18;1731:30;;1728:50;;;1774:1;1771;1764:12;1728:50;1811:4;1803:6;1799:17;1787:29;;1871:3;1864:4;1854:6;1851:1;1847:14;1839:6;1835:27;1831:38;1828:47;1825:67;;;1888:1;1885;1878:12;1903:437;1989:6;1997;2050:2;2038:9;2029:7;2025:23;2021:32;2018:52;;;2066:1;2063;2056:12;2018:52;2106:9;2093:23;2139:18;2131:6;2128:30;2125:50;;;2171:1;2168;2161:12;2125:50;2210:70;2272:7;2263:6;2252:9;2248:22;2210:70;:::i;:::-;2299:8;;2184:96;;-1:-1:-1;1903:437:1;-1:-1:-1;;;;1903:437:1:o;2527:579::-;2631:6;2639;2647;2655;2708:2;2696:9;2687:7;2683:23;2679:32;2676:52;;;2724:1;2721;2714:12;2676:52;2747:29;2766:9;2747:29;:::i;:::-;2737:39;;2827:2;2816:9;2812:18;2799:32;2854:18;2846:6;2843:30;2840:50;;;2886:1;2883;2876:12;2840:50;2925:70;2987:7;2978:6;2967:9;2963:22;2925:70;:::i;:::-;2527:579;;3014:8;;-1:-1:-1;2899:96:1;;3096:2;3081:18;3068:32;;2527:579;-1:-1:-1;;;;2527:579:1:o;3511:505::-;3606:6;3614;3622;3675:2;3663:9;3654:7;3650:23;3646:32;3643:52;;;3691:1;3688;3681:12;3643:52;3731:9;3718:23;3764:18;3756:6;3753:30;3750:50;;;3796:1;3793;3786:12;3750:50;3835:70;3897:7;3888:6;3877:9;3873:22;3835:70;:::i;:::-;3924:8;;3809:96;;-1:-1:-1;4006:2:1;3991:18;;;;3978:32;;3511:505;-1:-1:-1;;;;3511:505:1:o;4021:389::-;4106:8;4116:6;4170:3;4163:4;4155:6;4151:17;4147:27;4137:55;;4188:1;4185;4178:12;4137:55;-1:-1:-1;4211:20:1;;4254:18;4243:30;;4240:50;;;4286:1;4283;4276:12;4240:50;4323:4;4315:6;4311:17;4299:29;;4383:3;4376:4;4366:6;4363:1;4359:14;4351:6;4347:27;4343:38;4340:47;4337:67;;;4400:1;4397;4390:12;4415:492;4534:6;4542;4595:2;4583:9;4574:7;4570:23;4566:32;4563:52;;;4611:1;4608;4601:12;4563:52;4651:9;4638:23;4684:18;4676:6;4673:30;4670:50;;;4716:1;4713;4706:12;4670:50;4755:92;4839:7;4830:6;4819:9;4815:22;4755:92;:::i;4912:260::-;4980:6;4988;5041:2;5029:9;5020:7;5016:23;5012:32;5009:52;;;5057:1;5054;5047:12;5009:52;5080:29;5099:9;5080:29;:::i;:::-;5070:39;;5128:38;5162:2;5151:9;5147:18;5128:38;:::i;:::-;5118:48;;4912:260;;;;;:::o;5177:566::-;5305:6;5313;5321;5374:2;5362:9;5353:7;5349:23;5345:32;5342:52;;;5390:1;5387;5380:12;5342:52;5413:29;5432:9;5413:29;:::i;:::-;5403:39;;5493:2;5482:9;5478:18;5465:32;5520:18;5512:6;5509:30;5506:50;;;5552:1;5549;5542:12;5506:50;5591:92;5675:7;5666:6;5655:9;5651:22;5591:92;:::i;:::-;5177:566;;5702:8;;-1:-1:-1;5565:118:1;;-1:-1:-1;;;;5177:566:1:o;5748:118::-;5834:5;5827:13;5820:21;5813:5;5810:32;5800:60;;5856:1;5853;5846:12;5871:315;5936:6;5944;5997:2;5985:9;5976:7;5972:23;5968:32;5965:52;;;6013:1;6010;6003:12;5965:52;6036:29;6055:9;6036:29;:::i;:::-;6026:39;;6115:2;6104:9;6100:18;6087:32;6128:28;6150:5;6128:28;:::i;:::-;6175:5;6165:15;;;5871:315;;;;;:::o;6191:773::-;6313:6;6321;6329;6337;6390:2;6378:9;6369:7;6365:23;6361:32;6358:52;;;6406:1;6403;6396:12;6358:52;6446:9;6433:23;6475:18;6516:2;6508:6;6505:14;6502:34;;;6532:1;6529;6522:12;6502:34;6571:70;6633:7;6624:6;6613:9;6609:22;6571:70;:::i;:::-;6660:8;;-1:-1:-1;6545:96:1;-1:-1:-1;6748:2:1;6733:18;;6720:32;;-1:-1:-1;6764:16:1;;;6761:36;;;6793:1;6790;6783:12;6761:36;;6832:72;6896:7;6885:8;6874:9;6870:24;6832:72;:::i;:::-;6191:773;;;;-1:-1:-1;6923:8:1;-1:-1:-1;;;;6191:773:1:o;6969:634::-;7106:6;7114;7122;7130;7183:2;7171:9;7162:7;7158:23;7154:32;7151:52;;;7199:1;7196;7189:12;7151:52;7222:29;7241:9;7222:29;:::i;:::-;7212:39;;7298:2;7287:9;7283:18;7270:32;7260:42;;7353:2;7342:9;7338:18;7325:32;7380:18;7372:6;7369:30;7366:50;;;7412:1;7409;7402:12;7366:50;7451:92;7535:7;7526:6;7515:9;7511:22;7451:92;:::i;7608:254::-;7676:6;7684;7737:2;7725:9;7716:7;7712:23;7708:32;7705:52;;;7753:1;7750;7743:12;7705:52;7776:29;7795:9;7776:29;:::i;:::-;7766:39;7852:2;7837:18;;;;7824:32;;-1:-1:-1;;;7608:254:1:o;7867:127::-;7928:10;7923:3;7919:20;7916:1;7909:31;7959:4;7956:1;7949:15;7983:4;7980:1;7973:15;7999:128;8066:9;;;8087:11;;;8084:37;;;8101:18;;:::i;8132:343::-;8334:2;8316:21;;;8373:2;8353:18;;;8346:30;-1:-1:-1;;;8407:2:1;8392:18;;8385:49;8466:2;8451:18;;8132:343::o;8480:559::-;-1:-1:-1;;;;;8693:32:1;;8675:51;;8762:2;8757;8742:18;;8735:30;;;8781:18;;8774:34;;;8801:6;8851;8845:3;8830:19;;8817:49;8916:1;8910:3;8901:6;8890:9;8886:22;8882:32;8875:43;8656:4;8986:3;8979:2;8975:7;8970:2;8962:6;8958:15;8954:29;8943:9;8939:45;8935:55;8927:63;;9026:6;9021:2;9010:9;9006:18;8999:34;8480:559;;;;;;;:::o;9729:271::-;9912:6;9904;9899:3;9886:33;9868:3;9938:16;;9963:13;;;9938:16;9729:271;-1:-1:-1;9729:271:1:o;10412:449::-;10512:6;10507:3;10500:19;10482:3;10538:4;10567;10562:3;10558:14;10551:21;;10595:5;10618:1;10628:208;10642:6;10639:1;10636:13;10628:208;;;-1:-1:-1;;;;;10707:26:1;10726:6;10707:26;:::i;:::-;10703:52;10691:65;;10776:12;;;;10811:15;;;;10664:1;10657:9;10628:208;;;-1:-1:-1;10852:3:1;;10412:449;-1:-1:-1;;;;;10412:449:1:o;10866:359::-;11083:6;11072:9;11065:25;11126:2;11121;11110:9;11106:18;11099:30;11046:4;11146:73;11215:2;11204:9;11200:18;11192:6;11184;11146:73;:::i;:::-;11138:81;10866:359;-1:-1:-1;;;;;10866:359:1:o;11230:127::-;11291:10;11286:3;11282:20;11279:1;11272:31;11322:4;11319:1;11312:15;11346:4;11343:1;11336:15;11362:168;11435:9;;;11466;;11483:15;;;11477:22;;11463:37;11453:71;;11504:18;;:::i;11814:184::-;11884:6;11937:2;11925:9;11916:7;11912:23;11908:32;11905:52;;;11953:1;11950;11943:12;11905:52;-1:-1:-1;11976:16:1;;11814:184;-1:-1:-1;11814:184:1:o;12003:400::-;12205:2;12187:21;;;12244:2;12224:18;;;12217:30;12283:34;12278:2;12263:18;;12256:62;-1:-1:-1;;;12349:2:1;12334:18;;12327:34;12393:3;12378:19;;12003:400::o;13127:125::-;13192:9;;;13213:10;;;13210:36;;;13226:18;;:::i;13467:739::-;13772:6;13761:9;13754:25;13815:2;13810;13799:9;13795:18;13788:30;13735:4;13841:73;13910:2;13899:9;13895:18;13887:6;13879;13841:73;:::i;:::-;13950:22;;;13945:2;13930:18;;13923:50;13982:22;;;-1:-1:-1;;;;;14016:31:1;;14013:51;;;14060:1;14057;14050:12;14013:51;14094:6;14091:1;14087:14;14148:6;14140;14135:2;14127:6;14123:15;14110:45;14176:19;14197:2;14172:28;;13467:739;-1:-1:-1;;;;;;;13467:739:1:o;15277:245::-;15344:6;15397:2;15385:9;15376:7;15372:23;15368:32;15365:52;;;15413:1;15410;15403:12;15365:52;15445:9;15439:16;15464:28;15486:5;15464:28;:::i;16613:398::-;16815:2;16797:21;;;16854:2;16834:18;;;16827:30;16893:34;16888:2;16873:18;;16866:62;-1:-1:-1;;;16959:2:1;16944:18;;16937:32;17001:3;16986:19;;16613:398::o;17227:250::-;17312:1;17322:113;17336:6;17333:1;17330:13;17322:113;;;17412:11;;;17406:18;17393:11;;;17386:39;17358:2;17351:10;17322:113;;;-1:-1:-1;;17469:1:1;17451:16;;17444:27;17227:250::o;17482:270::-;17523:3;17561:5;17555:12;17588:6;17583:3;17576:19;17604:76;17673:6;17666:4;17661:3;17657:14;17650:4;17643:5;17639:16;17604:76;:::i;:::-;17734:2;17713:15;-1:-1:-1;;17709:29:1;17700:39;;;;17741:4;17696:50;;17482:270;-1:-1:-1;;17482:270:1:o;17757:385::-;-1:-1:-1;;;;;17960:32:1;;17942:51;;18029:2;18024;18009:18;;18002:30;;;-1:-1:-1;;18049:44:1;;18074:18;;18066:6;18049:44;:::i;:::-;18041:52;;18129:6;18124:2;18113:9;18109:18;18102:34;17757:385;;;;;;:::o;18400:287::-;18529:3;18567:6;18561:13;18583:66;18642:6;18637:3;18630:4;18622:6;18618:17;18583:66;:::i;:::-;18665:16;;;;;18400:287;-1:-1:-1;;18400:287:1:o;19749:219::-;19898:2;19887:9;19880:21;19861:4;19918:44;19958:2;19947:9;19943:18;19935:6;19918:44;:::i

Swarm Source

ipfs://57ba9d84968badcaf1be197d2b8395432838f82ae7d26ff0f8692b83a87f47b2

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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