ETH Price: $2,899.89 (-10.00%)
Gas: 12 Gwei

Contract

0xDae2Ba97ae5aDa624060E8f14A182Eb0a2e293e2
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Pause153085752022-08-09 14:37:00695 days ago1660055820IN
0xDae2Ba97...0a2e293e2
0 ETH0.0007839126.05740586
Init Pool153085722022-08-09 14:36:13695 days ago1660055773IN
0xDae2Ba97...0a2e293e2
0 ETH0.0009694425.93963802
Init Pool153084582022-08-09 14:13:47695 days ago1660054427IN
0xDae2Ba97...0a2e293e2
0 ETH0.0017692347.30953555
Withdraw Stake153076362022-08-09 11:06:01695 days ago1660043161IN
0xDae2Ba97...0a2e293e2
0 ETH0.0016029515.98100462
Burn Keys153069632022-08-09 8:35:10695 days ago1660034110IN
0xDae2Ba97...0a2e293e2
0 ETH0.000958348.41643096
Burn Keys153069352022-08-09 8:29:19695 days ago1660033759IN
0xDae2Ba97...0a2e293e2
0 ETH0.0011835710.3944874
Burn Keys153069222022-08-09 8:25:48695 days ago1660033548IN
0xDae2Ba97...0a2e293e2
0 ETH0.001119239.82936952
Burn Keys153069122022-08-09 8:23:35695 days ago1660033415IN
0xDae2Ba97...0a2e293e2
0 ETH0.001122479.85785486
Burn Keys153069032022-08-09 8:21:02695 days ago1660033262IN
0xDae2Ba97...0a2e293e2
0 ETH0.000985468.6545969
Burn Keys153068922022-08-09 8:19:04695 days ago1660033144IN
0xDae2Ba97...0a2e293e2
0 ETH0.001100039.66075725
Burn Keys153068812022-08-09 8:16:56695 days ago1660033016IN
0xDae2Ba97...0a2e293e2
0 ETH0.0011514710.11252681
Burn Keys153068632022-08-09 8:12:37695 days ago1660032757IN
0xDae2Ba97...0a2e293e2
0 ETH0.001063059.33599374
Burn Keys153068512022-08-09 8:09:49695 days ago1660032589IN
0xDae2Ba97...0a2e293e2
0 ETH0.000933478.19799689
Burn Keys153068252022-08-09 8:04:32695 days ago1660032272IN
0xDae2Ba97...0a2e293e2
0 ETH0.000930418.17116097
Burn Keys153066792022-08-09 7:27:24695 days ago1660030044IN
0xDae2Ba97...0a2e293e2
0 ETH0.000892827.84104256
Burn Keys153066342022-08-09 7:17:22695 days ago1660029442IN
0xDae2Ba97...0a2e293e2
0 ETH0.001024228.99495949
Set Partial With...153039842022-08-08 21:22:47696 days ago1659993767IN
0xDae2Ba97...0a2e293e2
0 ETH0.0005224918.01640926
Begin Stake153034172022-08-08 19:25:10696 days ago1659986710IN
0xDae2Ba97...0a2e293e2
1 ETH0.0110040629.14420838
Admin_withdraw_c...153025402022-08-08 16:11:56696 days ago1659975116IN
0xDae2Ba97...0a2e293e2
0 ETH0.0021627835.63310468
Admin_withdraw_c...153025362022-08-08 16:11:24696 days ago1659975084IN
0xDae2Ba97...0a2e293e2
0 ETH0.0037801243.86927033
Burn Keys153009942022-08-08 10:21:12696 days ago1659954072IN
0xDae2Ba97...0a2e293e2
0 ETH0.000723896.35740007
Begin Stake153008962022-08-08 10:03:42696 days ago1659953022IN
0xDae2Ba97...0a2e293e2
4.49 ETH0.003353998.88331871
Admin_withdraw_c...153008782022-08-08 10:00:22696 days ago1659952822IN
0xDae2Ba97...0a2e293e2
0 ETH0.0008986512.78826222
Init Pool153008442022-08-08 9:51:46696 days ago1659952306IN
0xDae2Ba97...0a2e293e2
0 ETH0.0004251811.75897859
Admin_withdraw_c...153008342022-08-08 9:48:47696 days ago1659952127IN
0xDae2Ba97...0a2e293e2
0 ETH0.0007247210.65263601
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
153085722022-08-09 14:36:13695 days ago1660055773
0xDae2Ba97...0a2e293e2
0.595 ETH
153084582022-08-09 14:13:47695 days ago1660054427
0xDae2Ba97...0a2e293e2
111.31937599 ETH
153076362022-08-09 11:06:01695 days ago1660043161
0xDae2Ba97...0a2e293e2
0.105 ETH
153034172022-08-08 19:25:10696 days ago1659986710
0xDae2Ba97...0a2e293e2
0.3 ETH
153008962022-08-08 10:03:42696 days ago1659953022
0xDae2Ba97...0a2e293e2
1.347 ETH
153008782022-08-08 10:00:22696 days ago1659952822
0xDae2Ba97...0a2e293e2
10.5 ETH
153008442022-08-08 9:51:46696 days ago1659952306
0xDae2Ba97...0a2e293e2
0.5 ETH
153008342022-08-08 9:48:47696 days ago1659952127
0xDae2Ba97...0a2e293e2
9.5 ETH
153006682022-08-08 9:11:25696 days ago1659949885
0xDae2Ba97...0a2e293e2
0.5 ETH
153001382022-08-08 7:11:00696 days ago1659942660
0xDae2Ba97...0a2e293e2
0.145 ETH
152968552022-08-07 18:36:24697 days ago1659897384
0xDae2Ba97...0a2e293e2
0.03 ETH
152966812022-08-07 17:58:17697 days ago1659895097
0xDae2Ba97...0a2e293e2
2.67 ETH
152904592022-08-06 18:57:25698 days ago1659812245
0xDae2Ba97...0a2e293e2
1.5 ETH
152903532022-08-06 18:34:56698 days ago1659810896
0xDae2Ba97...0a2e293e2
0.3 ETH
152882332022-08-06 10:42:16698 days ago1659782536
0xDae2Ba97...0a2e293e2
0.03 ETH
152881782022-08-06 10:27:37698 days ago1659781657
0xDae2Ba97...0a2e293e2
0.447 ETH
152844612022-08-05 20:28:02699 days ago1659731282
0xDae2Ba97...0a2e293e2
0.03 ETH
152844532022-08-05 20:24:43699 days ago1659731083
0xDae2Ba97...0a2e293e2
0.1 ETH
152844482022-08-05 20:23:06699 days ago1659730986
0xDae2Ba97...0a2e293e2
0.03 ETH
152844222022-08-05 20:18:33699 days ago1659730713
0xDae2Ba97...0a2e293e2
0.1 ETH
152844182022-08-05 20:17:17699 days ago1659730637
0xDae2Ba97...0a2e293e2
0.03 ETH
152843872022-08-05 20:09:49699 days ago1659730189
0xDae2Ba97...0a2e293e2
0.1 ETH
152843772022-08-05 20:08:20699 days ago1659730100
0xDae2Ba97...0a2e293e2
0.03 ETH
152843162022-08-05 19:53:41699 days ago1659729221
0xDae2Ba97...0a2e293e2
0.1 ETH
152843162022-08-05 19:53:41699 days ago1659729221
0xDae2Ba97...0a2e293e2
0.1 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FlippingClubStakingContract

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 20000 runs

Other Settings:
default evmVersion
File 1 of 11 : StakingContract.sol
// SPDX-License-Identifier: MIT
// Copyright (c) 2022 Flipping Club - flippingclub.xyz
/**
 *  ______ _ _             _                _____ _       _
 * |  ____| (_)           (_)              / ____| |     | |
 * | |__  | |_ _ __  _ __  _ _ __   __ _  | |    | |_   _| |__
 * |  __| | | | '_ \| '_ \| | '_ \ / _` | | |    | | | | | '_ \
 * | |    | | | |_) | |_) | | | | | (_| | | |____| | |_| | |_) |
 * |_|    |_|_| .__/| .__/|_|_| |_|\__, |  \_____|_|\__,_|_.__/
 *            | |   | |             __/ |
 *   _____ _  |_|   |_|  _         |___/  _____            _                  _
 *  / ____| |      | |  (_)              / ____|          | |                | |
 * | (___ | |_ __ _| | ___ _ __   __ _  | |     ___  _ __ | |_ _ __ __ _  ___| |_
 *  \___ \| __/ _` | |/ / | '_ \ / _` | | |    / _ \| '_ \| __| '__/ _` |/ __| __|
 *  ____) | || (_| |   <| | | | | (_| | | |___| (_) | | | | |_| | | (_| | (__| |_
 * |_____/ \__\__,_|_|\_\_|_| |_|\__, |  \_____\___/|_| |_|\__|_|  \__,_|\___|\__|
 *                                __/ |
 *                               |___/
 *
 * @title Flipping Club Staking Contract v2.1 - flippingclub.xyz
 * @author Flipping Club Team
 * @dev Using v1 contract for burn function so a new Approval is not required.
 * @notice Direct interaction with this contract not recommended. Always use the frontend provided.
 */

pragma solidity 0.8.15;

import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "./stakeable.sol";
import "./IClaim.sol";
import "./NFTContractFunctions.sol";
import "./burnFunctions.sol";

contract FlippingClubStakingContract is Stakeable, Pausable, Ownable {
    using SafeMath for uint256;
    uint256 private maxAllowancePerKey = 5000000000000000000;
    bytes32 private constant ADMIN = keccak256(abi.encodePacked("ADMIN"));
    bytes32 private constant EXEC = keccak256(abi.encodePacked("EXEC"));
    bytes32 private constant CLAIM = keccak256(abi.encodePacked("CLAIM"));
    bool private delegateBurn = true;
    address private __checkKeys;
    address private __burnKeys;
    address private _claimContract;
    event LogDepositReceived(address indexed payee);
    event Claimed(uint256 indexed amount, address indexed payee);
    NFTContractFunctions private ERC721KeyCards;
    burnFunctions private ERC721KeyBurn;
    struct StakePackage {
        uint256 duration;
        uint256 reward;
        uint256 min;
        uint256 max;
    }
    mapping(uint256 => StakePackage[]) private Packages;

    constructor(address payable _newAdmin) {
        _grantRole(ADMIN, _newAdmin);
        _grantRole(EXEC, _newAdmin);
    }

    receive() external payable {
        emit LogDepositReceived(msg.sender);
    }

    function addPackage(
        uint256 _name,
        uint256 duration,
        uint256 reward,
        uint256 min,
        uint256 max
    ) public {
        Packages[_name].push(StakePackage(duration, reward, min, max));
    }

    function getPackage(uint256 packageName)
        private
        view
        returns (StakePackage memory)
    {
        require(Packages[packageName].length > 0, "No Package");
        StakePackage memory package = Packages[packageName][0];
        return package;
    }

    function beginStake(
        uint256 _amount,
        uint256 _package,
        uint256[] memory _keysToBeUsed
    ) external payable nonReentrant whenNotPaused {
        _beginStake(_amount, _package, _keysToBeUsed, msg.sender);
    }

    function exec_beginStake(
        uint256 _amount,
        uint256 _package,
        uint256 _startTime,
        address _spender,
        uint256 _numKeys
    ) external payable nonReentrant onlyRole(EXEC) whenNotPaused {
        StakePackage memory package = getPackage(_package);
        uint256 _reward = package.reward;
        uint256 _timePeriodInSeconds = package.duration;
        uint256 _minStakeValue = package.min;
        uint256 _maxStakeValue = package.max;
        require(
            _amount >= _minStakeValue && _amount <= _maxStakeValue,
            "Value not in range"
        );
        require(
            _amount.mul(_reward).div(100) <= _numKeys.mul(maxAllowancePerKey),
            "Not enough Keys."
        );

        _admin_stake(
            _amount,
            _reward,
            _timePeriodInSeconds,
            _spender,
            _startTime,
            _numKeys
        );
    }

    function _beginStake(
        uint256 _amount,
        uint256 _package,
        uint256[] memory _keysToBeUsed,
        address _spender
    ) private {
        StakePackage memory package = getPackage(_package);
        uint256 _reward = package.reward;
        uint256 _timePeriodInSeconds = package.duration;
        uint256 _minStakeValue = package.min;
        uint256 _maxStakeValue = package.max;

        require(
            _amount >= _minStakeValue && _amount <= _maxStakeValue,
            "Stake value not in range"
        );
        require(msg.value == _amount, "Invalid amount sent.");
        require(
            checkTokens(_keysToBeUsed, _spender) == true,
            "Not all Keys owned by address."
        );
        require(checkKey() >= 1, "Address have no Key.");

        require(
            _amount.mul(_reward).div(100) <=
                _keysToBeUsed.length.mul(maxAllowancePerKey),
            "Not enough Keys."
        );
        delegateBurn
            ? burnKeys(_keysToBeUsed, _spender)
            : _burnKeys(_keysToBeUsed, _spender);

        _stake(
            _amount,
            _reward,
            _timePeriodInSeconds,
            _spender,
            _keysToBeUsed.length
        );
    }

    function withdrawStake(bool all, uint256 index)
        external
        nonReentrant
        whenNotPaused
    {
        require(_hasStake(msg.sender, index), "No active positions.");
        _withdrawStake(all, index);
    }

    function admin_withdraw_close(
        uint256 stake_index,
        address payable _spender,
        bool refund
    ) external onlyRole(ADMIN) {
        require(_hasStake(_spender, stake_index), "Nothing available.");
        _admin_withdraw_close(stake_index, _spender, refund);
    }

    function checkTokens(uint256[] memory _tokenList, address _msgSender)
        private
        view
        returns (bool)
    {
        require(__checkKeys != address(0), "Key Contract not set.");
        for (uint256 i = 0; i < _tokenList.length; i++) {
            if (ERC721KeyCards.ownerOf(_tokenList[i]) != _msgSender) {
                return false;
            }
        }
        return true;
    }

    function burnKeys(uint256[] memory _keysToBeUsed, address _spender)
        public
        whenNotPaused
    {
        require(__burnKeys != address(0), "Delegated Burn not set.");
        ERC721KeyBurn.burnKeys(_keysToBeUsed, _spender);
    }

    function _burnKeys(uint256[] memory _keysToBeUsed, address _spender)
        public
        whenNotPaused
    {
        address burnAddress = 0x000000000000000000000000000000000000dEaD;
        for (uint256 i = 0; i < _keysToBeUsed.length; i++) {
            require(
                ERC721KeyCards.isApprovedForAll(_spender, address(this)) ==
                    true,
                "BurnKeys: Contract is not approved to spend Keys."
            );
            ERC721KeyCards.safeTransferFrom(
                _spender,
                burnAddress,
                _keysToBeUsed[i]
            );
        }
    }

    function checkKey() private view returns (uint256) {
        require(__checkKeys != address(0), "Key Contract not set.");
        return ERC721KeyCards.balanceOf(msg.sender);
    }

    function initPool(uint256 _amount, address _payee)
        external
        nonReentrant
        onlyRole(ADMIN)
    {
        payable(_payee).transfer(_amount);
    }

    function initClaim(uint256 _amount, address _payee)
        external
        nonReentrant
        whenNotPaused
        onlyRole(CLAIM)
    {
        require(address(this).balance > _amount, "Not enough balance.");
        payable(_payee).transfer(_amount);
        emit Claimed(_amount, _payee);
    }

    function broadcastClaim(address payable _payee, uint256 _amount)
        external
        payable
        onlyRole(EXEC)
        nonReentrant
        whenNotPaused
    {
        require(_claimContract != address(0), "Claim Contract not set.");
        IClaim(_claimContract).initClaim{value: msg.value}(_payee, _amount);
        emit Claimed(_amount, _payee);
    }

    function getBalance() external view returns (uint256) {
        return address(this).balance;
    }

    function setCheckKeysContractAddress(address KeysContract)
        external
        onlyRole(ADMIN)
    {
        __checkKeys = KeysContract;
        ERC721KeyCards = NFTContractFunctions(__checkKeys);
    }

    function setBurnContractAddress(address BurnContract)
        external
        onlyRole(ADMIN)
    {
        __burnKeys = BurnContract;
        ERC721KeyBurn = burnFunctions(__burnKeys);
    }

    function setClaimContract(address ClaimContract) external onlyRole(ADMIN) {
        _claimContract = ClaimContract;
    }

    function setmaxAllowancePerKey(uint256 _maxAllowancePerKey)
        external
        onlyRole(ADMIN)
    {
        maxAllowancePerKey = _maxAllowancePerKey;
    }

    function pause() external whenNotPaused onlyRole(ADMIN) {
        _pause();
    }

    function unPause() external whenPaused onlyRole(ADMIN) {
        _unpause();
    }

    function setDelegateBurn(bool status) external {
        delegateBurn = status;
    }

    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external pure returns (bytes4) {
        return this.onERC721Received.selector;
    }
}

File 2 of 11 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 3 of 11 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 4 of 11 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @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 5 of 11 : SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

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

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

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

File 6 of 11 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

File 7 of 11 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @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 anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _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 8 of 11 : stakeable.sol
// SPDX-License-Identifier: MIT
// Copyright (c) 2022 Flipping Club - flippingclub.xyz
/**
 *  ______ _ _             _                _____ _       _
 * |  ____| (_)           (_)              / ____| |     | |
 * | |__  | |_ _ __  _ __  _ _ __   __ _  | |    | |_   _| |__
 * |  __| | | | '_ \| '_ \| | '_ \ / _` | | |    | | | | | '_ \
 * | |    | | | |_) | |_) | | | | | (_| | | |____| | |_| | |_) |
 * |_|    |_|_| .__/| .__/|_|_| |_|\__, |  \_____|_|\__,_|_.__/
 *            | |   | |             __/ |
 *   _____ _  |_|   |_|  _         |___/  _____            _                  _
 *  / ____| |      | |  (_)              / ____|          | |                | |
 * | (___ | |_ __ _| | ___ _ __   __ _  | |     ___  _ __ | |_ _ __ __ _  ___| |_
 *  \___ \| __/ _` | |/ / | '_ \ / _` | | |    / _ \| '_ \| __| '__/ _` |/ __| __|
 *  ____) | || (_| |   <| | | | | (_| | | |___| (_) | | | | |_| | | (_| | (__| |_
 * |_____/ \__\__,_|_|\_\_|_| |_|\__, |  \_____\___/|_| |_|\__|_|  \__,_|\___|\__|
 *                                __/ |
 *                               |___/
 *
 * @title Flipping Club Staking Contract - Dependency v2.0 - flippingclub.xyz
 * @author Flipping Club Team
 * @notice Direct interaction with this contract not recommended. Always use the frontend provided.
 */
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

pragma solidity 0.8.15;

contract Stakeable is ReentrancyGuard {
    using SafeMath for uint256;
    uint256 private initialTimestamp;
    uint256 private _maxAllowancePerKey = 5000000000000000000;
    uint256 private timePeriod;
    uint256 private maxPositions = 4;
    uint256 private MinStakeValueToClosePosition = 100000000000000000;
    uint256 private MovePercentageBasisNumber = 30;
    uint256 private minWithdraw = 100000000000000000;
    address private StakingAccount;
    bool private MoveFundsUponReceipt;
    bool private partialWithdraw = true;
    bool private MovePercentageOfFundsUponReceipt = true;
    bytes32 private constant ADMIN = keccak256(abi.encodePacked("ADMIN"));
    bytes32 private constant EXEC = keccak256(abi.encodePacked("EXEC"));
    bytes32 private constant CLAIM = keccak256(abi.encodePacked("CLAIM"));
    Stakeholder[] internal stakeholders;
    mapping(bytes32 => mapping(address => bool)) public roles;
    mapping(address => uint256) internal stakes;
    event GrantRole(bytes32 indexed role, address indexed account);
    event RevokeRole(bytes32 indexed role, address indexed account);
    event Withdrawn(address indexed, uint256 amount, uint256 timestamp);
    event Extended(
        address user,
        uint256 amount,
        uint256 since,
        uint256 reward,
        uint256 timePeriod,
        uint256 usedKeys
    );
    event Staked(
        address indexed user,
        uint256 amount,
        uint256 index,
        uint256 timestamp,
        uint256 _plan,
        uint256 timePeriod,
        uint256 usedKeys
    );

    struct Stake {
        address user;
        uint256 amount;
        uint256 since;
        uint256 totalReturn;
        uint256 timePeriod;
        uint256 reward;
        uint256 usedKeys;
    }
    struct Stakeholder {
        address user;
        Stake[] address_stakes;
    }

    struct StakingSummary {
        Stake[] stakes;
    }

    constructor() {
        stakeholders.push();
    }

    function _addStakeholder(address staker) private returns (uint256) {
        stakeholders.push();
        uint256 userIndex = stakeholders.length - 1;
        stakeholders[userIndex].user = staker;
        stakes[staker] = userIndex;
        return userIndex;
    }

    function _stake(
        uint256 _amount,
        uint256 _totalReturn,
        uint256 _timePeriodInSeconds,
        address _Sender,
        uint256 usedKeys
    ) internal {
        require(StakingAccount != address(0), "Staking account not set.");
        require(canStake(_Sender), "Max open positions.");
        if (MoveFundsUponReceipt) {
            payable(StakingAccount).transfer(_amount);
        }
        if (MovePercentageOfFundsUponReceipt) {
            payable(StakingAccount).transfer(
                (_amount.mul(MovePercentageBasisNumber)).div(100)
            );
        }
        uint256 index = stakes[_Sender];
        uint256 timestamp = block.timestamp;
        if (index == 0) {
            index = _addStakeholder(_Sender);
        }
        initialTimestamp = block.timestamp;
        timePeriod = initialTimestamp.add(_timePeriodInSeconds);
        stakeholders[index].address_stakes.push(
            Stake(
                payable(_Sender),
                _amount,
                timestamp,
                _totalReturn,
                timePeriod,
                0,
                usedKeys
            )
        );
        emit Staked(
            _Sender,
            _amount,
            index,
            timestamp,
            _totalReturn,
            timePeriod,
            usedKeys
        );
    }

    function _admin_stake(
        uint256 _amount,
        uint256 _totalReturn,
        uint256 _timePeriodInSeconds,
        address _Sender,
        uint256 _startTime,
        uint256 usedKeys
    ) internal {
        require(canStake(_Sender), "Max open positions.");

        uint256 index = stakes[_Sender];
        uint256 timestamp = _startTime;
        if (index == 0) {
            index = _addStakeholder(_Sender);
        }
        initialTimestamp = _startTime;
        timePeriod = initialTimestamp.add(_timePeriodInSeconds);
        stakeholders[index].address_stakes.push(
            Stake(
                payable(_Sender),
                _amount,
                timestamp,
                _totalReturn,
                timePeriod,
                0,
                usedKeys
            )
        );
        emit Staked(
            _Sender,
            _amount,
            index,
            timestamp,
            _totalReturn,
            timePeriod,
            usedKeys
        );
    }

    function calculateStakeReward(Stake memory _current_stake)
        private
        view
        returns (uint256)
    {
        if (block.timestamp > _current_stake.timePeriod) {
            return
                (_current_stake.amount.mul(_current_stake.totalReturn)).div(
                    100
                );
        }
        return 0;
    }

    function _withdrawStake(bool all, uint256 index) internal {
        uint256 user_index = stakes[msg.sender];
        uint256 _amount;
        require(user_index > 0, "Address not registered.");
        require(index <= maxPositions - 1, "Index out of range.");
        Stake memory current_stake = stakeholders[user_index].address_stakes[
            index
        ];
        require(current_stake.amount > 0, "No active positions.");
        require(address(this).balance > _amount, "Not enough balance.");
        require(
            block.timestamp >= current_stake.timePeriod,
            "Not matured yet."
        );
        uint256 reward = current_stake.reward.add(
            calculateStakeReward(current_stake)
        );
        require(reward > 0, "Claim not ready.");
        uint256 totalClaimable = current_stake.amount.add(reward);

        all ? _amount = totalClaimable : _amount = reward;
        require(_amount >= minWithdraw, "Amount is less than minimum");

        if (
            partialWithdraw &&
            (
                stakeholders[user_index]
                    .address_stakes[index]
                    .amount
                    .mul(
                        stakeholders[user_index]
                            .address_stakes[index]
                            .totalReturn
                    )
                    .div(100)
            ).add(
                    stakeholders[user_index].address_stakes[index].reward.add(
                        reward
                    )
                ) <=
            stakeholders[user_index].address_stakes[index].usedKeys.mul(
                _maxAllowancePerKey
            )
        ) {
            if (
                stakeholders[user_index].address_stakes[index].amount.sub(
                    _amount
                ) < MinStakeValueToClosePosition
            ) {
                delete current_stake;
                current_stake = stakeholders[user_index].address_stakes[
                    stakeholders[user_index].address_stakes.length - 1
                ];
                stakeholders[user_index].address_stakes.pop();
            } else {
                stakeholders[user_index]
                    .address_stakes[index]
                    .amount = stakeholders[user_index]
                    .address_stakes[index]
                    .amount
                    .sub(_amount);
                uint256 timeDiff = (
                    stakeholders[user_index].address_stakes[index].timePeriod
                ).sub(stakeholders[user_index].address_stakes[index].since);
                stakeholders[user_index].address_stakes[index].since = block
                    .timestamp;
                stakeholders[user_index]
                    .address_stakes[index]
                    .timePeriod = block.timestamp.add(timeDiff);
            }
            payable(msg.sender).transfer(_amount);
            emit Withdrawn(msg.sender, _amount, block.timestamp);
        } else {
            delete stakeholders[user_index].address_stakes[index];
            stakeholders[user_index].address_stakes[index] = stakeholders[
                user_index
            ].address_stakes[
                    stakeholders[user_index].address_stakes.length - 1
                ];
            stakeholders[user_index].address_stakes.pop();
            payable(msg.sender).transfer(_amount);
            emit Withdrawn(msg.sender, _amount, block.timestamp);
        }
    }

    function _admin_withdraw_close(
        uint256 index,
        address payable _spender,
        bool refund
    ) internal {
        uint256 user_index = stakes[_spender];
        Stake memory current_stake = stakeholders[user_index].address_stakes[
            index
        ];
        uint256 reward = current_stake.reward.add(
            calculateStakeReward(current_stake)
        );
        uint256 claimable = current_stake.amount.add(reward);
        delete stakeholders[user_index].address_stakes[index];
        stakeholders[user_index].address_stakes[index] = stakeholders[
            user_index
        ].address_stakes[stakeholders[user_index].address_stakes.length - 1];
        stakeholders[user_index].address_stakes.pop();
        if (refund) {
            require(address(this).balance >= claimable, "Not enough balance.");
            payable(_spender).transfer(claimable);
        }
    }

    function _extendStake(uint256 index) external returns (string memory) {
        uint256 user_index = stakes[msg.sender];
        require(user_index > 0, "Address not registered.");
        require(index <= maxPositions - 1, "Index out of range.");
        Stake memory current_stake = stakeholders[user_index].address_stakes[
            index
        ];
        require(current_stake.amount > 0, "No active positions.");
        uint256 reward = calculateStakeReward(current_stake);

        require(reward > 0, "Reward not ready.");

        if (
            (
                stakeholders[user_index]
                    .address_stakes[index]
                    .amount
                    .mul(
                        stakeholders[user_index]
                            .address_stakes[index]
                            .totalReturn
                    )
                    .div(100)
            ).add(
                    stakeholders[user_index].address_stakes[index].reward.add(
                        reward
                    )
                ) <=
            stakeholders[user_index].address_stakes[index].usedKeys.mul(
                _maxAllowancePerKey
            )
        ) {
            uint256 timeDiff = (
                stakeholders[user_index].address_stakes[index].timePeriod
            ).sub(stakeholders[user_index].address_stakes[index].since);

            stakeholders[user_index].address_stakes[index].since = block
                .timestamp;
            stakeholders[user_index].address_stakes[index].timePeriod = block
                .timestamp
                .add(timeDiff);
            stakeholders[user_index]
                .address_stakes[index]
                .reward = stakeholders[user_index]
                .address_stakes[index]
                .reward
                .add(reward);
            emit Extended(
                stakeholders[user_index].address_stakes[index].user,
                stakeholders[user_index].address_stakes[index].amount,
                stakeholders[user_index].address_stakes[index].since,
                stakeholders[user_index].address_stakes[index].reward,
                stakeholders[user_index].address_stakes[index].timePeriod,
                stakeholders[user_index].address_stakes[index].usedKeys
            );
            return ("Extended.");
        } else {
            return ("Not enough allowance left.");
        }
    }

    function _stakeLength(address _staker) external view returns (uint256) {
        StakingSummary memory summary = StakingSummary(
            stakeholders[stakes[_staker]].address_stakes
        );
        return summary.stakes.length;
    }

    function getAllStakes(address _staker)
        external
        view
        returns (StakingSummary memory)
    {
        StakingSummary memory summary = StakingSummary(
            stakeholders[stakes[_staker]].address_stakes
        );
        for (uint256 s = 0; s < summary.stakes.length; s += 1) {
            uint256 availableReward = calculateStakeReward(summary.stakes[s]);
            summary.stakes[s].reward = summary.stakes[s].reward.add(
                availableReward
            );
        }
        return summary;
    }

    function getSingleStake(address _staker, uint256 index)
        external
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        require(index <= maxPositions - 1, "Index out of range.");
        StakingSummary memory summary = StakingSummary(
            stakeholders[stakes[_staker]].address_stakes
        );
        require(summary.stakes.length > 0, "No active positions.");
        require(summary.stakes.length > index, "Index not valid.");

        for (uint256 s = 0; s < summary.stakes.length; s += 1) {
            uint256 availableReward = calculateStakeReward(summary.stakes[s]);
            summary.stakes[s].reward = summary.stakes[s].reward.add(
                availableReward
            );
        }
        return (
            summary.stakes[index].amount,
            summary.stakes[index].since,
            summary.stakes[index].totalReturn,
            summary.stakes[index].timePeriod,
            summary.stakes[index].reward,
            summary.stakes[index].usedKeys
        );
    }

    function _hasStake(address _staker, uint256 index)
        internal
        view
        returns (bool)
    {
        require(index <= maxPositions - 1, "Index out of range.");
        StakingSummary memory summary = StakingSummary(
            stakeholders[stakes[_staker]].address_stakes
        );
        if (summary.stakes.length > 0 && summary.stakes.length > index) {
            return true;
        }
        return false;
    }

    function canStake(address _staker) private view returns (bool result) {
        StakingSummary memory summary = StakingSummary(
            stakeholders[stakes[_staker]].address_stakes
        );
        if (summary.stakes.length >= maxPositions) {
            return false;
        }
        return true;
    }

    function setMaxPositions(uint256 _maxPositions) external onlyRole(ADMIN) {
        maxPositions = _maxPositions;
    }

    function setMinStakeValueToClosePosition(
        uint256 _MinStakeValueToClosePosition
    ) external onlyRole(ADMIN) {
        MinStakeValueToClosePosition = _MinStakeValueToClosePosition;
    }

    function setStakingAccount(address _StakingAccount)
        external
        onlyRole(ADMIN)
    {
        StakingAccount = _StakingAccount;
    }

    function setMoveFundsUponReceipt(bool _MoveFundsUponReceipt)
        external
        onlyRole(ADMIN)
    {
        MoveFundsUponReceipt = _MoveFundsUponReceipt;
    }

    function setMovePercentageBasisNumber(uint256 _MovePercentageBasisNumber)
        external
        onlyRole(ADMIN)
    {
        MovePercentageBasisNumber = _MovePercentageBasisNumber;
    }

    function setPartialWithdraw(bool _partialWithdraw)
        external
        onlyRole(ADMIN)
    {
        partialWithdraw = _partialWithdraw;
    }

    function setMovePercentageOfFundsUponReceipt(
        bool _MovePercentageOfFundsUponReceipt
    ) external onlyRole(ADMIN) {
        MovePercentageOfFundsUponReceipt = _MovePercentageOfFundsUponReceipt;
    }

    modifier onlyRole(bytes32 _role) {
        require(roles[_role][msg.sender], "Not authorized.");
        _;
    }

    function _grantRole(bytes32 _role, address _account) internal {
        roles[_role][_account] = true;
        emit GrantRole(_role, _account);
    }

    function grantRole(bytes32 _role, address _account)
        external
        onlyRole(ADMIN)
    {
        _grantRole(_role, _account);
    }

    function _revokeRole(bytes32 _role, address _account) internal {
        roles[_role][_account] = false;
        emit RevokeRole(_role, _account);
    }

    function revokeRole(bytes32 _role, address _account)
        external
        onlyRole(ADMIN)
    {
        _revokeRole(_role, _account);
    }

    function set_maxAllowancePerKey(uint256 __maxAllowancePerKey)
        external
        onlyRole(ADMIN)
    {
        _maxAllowancePerKey = __maxAllowancePerKey;
    }

    function setMinWithdraw(uint256 _minWithdraw) external onlyRole(ADMIN) {
        minWithdraw = _minWithdraw;
    }
}

File 9 of 11 : IClaim.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;

interface IClaim {
    function initClaim(address _payee, uint256 _amount) external payable;
}

File 10 of 11 : NFTContractFunctions.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;

interface NFTContractFunctions {
    function balanceOf(address owner) external view returns (uint256);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(address owner, address operator)
        external
        view
        returns (bool);

    function approve(address to, uint256 tokenId) external;
}

File 11 of 11 : burnFunctions.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;

interface burnFunctions {
    function burnKeys(uint256[] memory _keysToBeUsed, address _spender)
        external;
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 20000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address payable","name":"_newAdmin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"payee","type":"address"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"since","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timePeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usedKeys","type":"uint256"}],"name":"Extended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"GrantRole","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"payee","type":"address"}],"name":"LogDepositReceived","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":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"RevokeRole","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_plan","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timePeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usedKeys","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"uint256[]","name":"_keysToBeUsed","type":"uint256[]"},{"internalType":"address","name":"_spender","type":"address"}],"name":"_burnKeys","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"_extendStake","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"_stakeLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_name","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"addPackage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stake_index","type":"uint256"},{"internalType":"address payable","name":"_spender","type":"address"},{"internalType":"bool","name":"refund","type":"bool"}],"name":"admin_withdraw_close","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_package","type":"uint256"},{"internalType":"uint256[]","name":"_keysToBeUsed","type":"uint256[]"}],"name":"beginStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_payee","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"broadcastClaim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_keysToBeUsed","type":"uint256[]"},{"internalType":"address","name":"_spender","type":"address"}],"name":"burnKeys","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_package","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_numKeys","type":"uint256"}],"name":"exec_beginStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"getAllStakes","outputs":[{"components":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"since","type":"uint256"},{"internalType":"uint256","name":"totalReturn","type":"uint256"},{"internalType":"uint256","name":"timePeriod","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"usedKeys","type":"uint256"}],"internalType":"struct Stakeable.Stake[]","name":"stakes","type":"tuple[]"}],"internalType":"struct Stakeable.StakingSummary","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getSingleStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"},{"internalType":"address","name":"_account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_payee","type":"address"}],"name":"initClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_payee","type":"address"}],"name":"initPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"},{"internalType":"address","name":"_account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"roles","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"BurnContract","type":"address"}],"name":"setBurnContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"KeysContract","type":"address"}],"name":"setCheckKeysContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ClaimContract","type":"address"}],"name":"setClaimContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setDelegateBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPositions","type":"uint256"}],"name":"setMaxPositions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MinStakeValueToClosePosition","type":"uint256"}],"name":"setMinStakeValueToClosePosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minWithdraw","type":"uint256"}],"name":"setMinWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_MoveFundsUponReceipt","type":"bool"}],"name":"setMoveFundsUponReceipt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MovePercentageBasisNumber","type":"uint256"}],"name":"setMovePercentageBasisNumber","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_MovePercentageOfFundsUponReceipt","type":"bool"}],"name":"setMovePercentageOfFundsUponReceipt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_partialWithdraw","type":"bool"}],"name":"setPartialWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_StakingAccount","type":"address"}],"name":"setStakingAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"__maxAllowancePerKey","type":"uint256"}],"name":"set_maxAllowancePerKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxAllowancePerKey","type":"uint256"}],"name":"setmaxAllowancePerKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"all","type":"bool"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052674563918244f4000060028190556004805567016345785d8a00006005819055601e6006556007556008805461ffff60a81b191661010160a81b179055600d55600e805460ff191660011790553480156200005e57600080fd5b5060405162005e2b38038062005e2b8339810160408190526200008191620001be565b6001600081815560098054909201825552600c805460ff19169055620000a73362000109565b6040516420a226a4a760d91b6020820152620000e4906025015b60405160208183030381529060405280519060200120826200016360201b60201c565b604051634558454360e01b60208201526200010290602401620000c1565b50620001f0565b600c80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000828152600a602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551909184917f5a06360d65acf95e98445dc834f205063424c636e65418d928cdfabc33a953999190a35050565b600060208284031215620001d157600080fd5b81516001600160a01b0381168114620001e957600080fd5b9392505050565b615c2b80620002006000396000f3fe6080604052600436106102a45760003560e01c80638456cb591161016e578063b453a187116100cb578063ec5a82e41161007f578063f2fde38b11610064578063f2fde38b14610884578063f7b188a5146108a4578063f8fc08b9146108b957600080fd5b8063ec5a82e414610851578063eff350641461087157600080fd5b8063c80229c1116100b0578063c80229c1146107fe578063d0c4cab614610811578063d547741f1461083157600080fd5b8063b453a187146107be578063bb32fbb1146107de57600080fd5b8063a2e30f1511610122578063a865e8ce11610107578063a865e8ce1461075e578063a93e05231461077e578063b06113fe1461079e57600080fd5b8063a2e30f15146106bd578063a4ca8c7a1461073e57600080fd5b80638e699bc8116101535780638e699bc81461065057806399b1d9581461067d57806399d9af521461069d57600080fd5b80638456cb59146105eb5780638da5cb5b1461060057600080fd5b8063453875a01161021c57806368888dc3116101d0578063715018a6116101b5578063715018a61461059657806378174ec5146105ab57806381cdf766146105cb57600080fd5b806368888dc31461055657806369322c131461057657600080fd5b806350690fc01161020157806350690fc0146104c65780635c975abb146104e65780636721aa221461050a57600080fd5b8063453875a0146104935780634a30d3eb146104a657600080fd5b80631c8050c7116102735780632f2ff15d116102585780632f2ff15d1461043357806335aa134a146104535780633b2896651461047357600080fd5b80631c8050c7146103f1578063225891381461041357600080fd5b806304238994146102db57806312065fe014610311578063150b7a021461032e57806315914247146103a457600080fd5b366102d65760405133907f15382559391789f1865e10e9c8b51327a9cb0381eae89973ada229e7a78c08f390600090a2005b600080fd5b3480156102e757600080fd5b506102fb6102f636600461553b565b6108f4565b6040516103089190615558565b60405180910390f35b34801561031d57600080fd5b50475b604051908152602001610308565b34801561033a57600080fd5b506103736103493660046155fc565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610308565b3480156103b057600080fd5b506103c46103bf36600461569b565b610ab1565b604080519687526020870195909552938501929092526060840152608083015260a082015260c001610308565b3480156103fd57600080fd5b5061041161040c36600461553b565b610e20565b005b34801561041f57600080fd5b5061041161042e3660046156c7565b610f10565b34801561043f57600080fd5b5061041161044e3660046156c7565b6110f7565b34801561045f57600080fd5b5061041161046e3660046156f7565b6111ae565b34801561047f57600080fd5b5061041161048e36600461553b565b61125c565b6104116104a1366004615710565b611387565b3480156104b257600080fd5b506104116104c136600461553b565b61159f565b3480156104d257600080fd5b506104116104e1366004615823565b61168f565b3480156104f257600080fd5b50600c5460ff165b6040519015158152602001610308565b34801561051657600080fd5b50610411610525366004615878565b600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b34801561056257600080fd5b506104116105713660046156f7565b61178a565b34801561058257600080fd5b50610411610591366004615895565b611838565b3480156105a257600080fd5b50610411611900565b3480156105b757600080fd5b506104116105c6366004615823565b611914565b3480156105d757600080fd5b506104116105e636600461553b565b611b26565b3480156105f757600080fd5b50610411611c20565b34801561060c57600080fd5b50600c54610100900473ffffffffffffffffffffffffffffffffffffffff1660405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610308565b34801561065c57600080fd5b5061067061066b3660046156f7565b611cdb565b60405161030891906158b3565b34801561068957600080fd5b506104116106983660046156f7565b6124c1565b3480156106a957600080fd5b506104116106b8366004615878565b61256f565b3480156106c957600080fd5b506104116106d8366004615908565b60009485526013602090815260408087208151608081018352968752868301958652908601938452606086019283528054600181810183559188529190962094516004909102909401938455915193830193909355915160028201559051600390910155565b34801561074a57600080fd5b50610411610759366004615878565b612664565b34801561076a57600080fd5b506104116107793660046156f7565b612758565b34801561078a57600080fd5b506104116107993660046156c7565b612806565b3480156107aa57600080fd5b506104116107b9366004615878565b612953565b3480156107ca57600080fd5b506104116107d9366004615943565b612a46565b3480156107ea57600080fd5b506104116107f93660046156f7565b612b4f565b61041161080c36600461569b565b612bfd565b34801561081d57600080fd5b5061032061082c36600461553b565b612e44565b34801561083d57600080fd5b5061041161084c3660046156c7565b612f6c565b34801561085d57600080fd5b5061041161086c3660046156f7565b61301e565b61041161087f366004615985565b6130cc565b34801561089057600080fd5b5061041161089f36600461553b565b613141565b3480156108b057600080fd5b506104116131db565b3480156108c557600080fd5b506104fa6108d43660046156c7565b600a60209081526000928352604080842090915290825290205460ff1681565b604080516020810190915260608152604080516020808201835273ffffffffffffffffffffffffffffffffffffffff85166000908152600b90915291822054600980548392908110610948576109486159d5565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b82821015610a015760008481526020908190206040805160e08101825260078602909201805473ffffffffffffffffffffffffffffffffffffffff168352600180820154848601526002820154928401929092526003810154606084015260048101546080840152600581015460a08401526006015460c08301529083529092019101610979565b505050915250905060005b815151811015610aaa576000610a3e83600001518381518110610a3157610a316159d5565b6020026020010151613293565b9050610a748184600001518481518110610a5a57610a5a6159d5565b602002602001015160a001516132cf90919063ffffffff16565b8351805184908110610a8857610a886159d5565b602090810291909101015160a0015250610aa3600182615a33565b9050610a0c565b5092915050565b6000806000806000806001600454610ac99190615a4b565b871115610b1d5760405162461bcd60e51b815260206004820152601360248201527f496e646578206f7574206f662072616e67652e0000000000000000000000000060448201526064015b60405180910390fd5b604080516020808201835273ffffffffffffffffffffffffffffffffffffffff8b166000908152600b90915291822054600980548392908110610b6257610b626159d5565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b82821015610c1b5760008481526020908190206040805160e08101825260078602909201805473ffffffffffffffffffffffffffffffffffffffff168352600180820154848601526002820154928401929092526003810154606084015260048101546080840152600581015460a08401526006015460c08301529083529092019101610b93565b505050915250805151909150610c735760405162461bcd60e51b815260206004820152601460248201527f4e6f2061637469766520706f736974696f6e732e0000000000000000000000006044820152606401610b14565b8051518810610cc45760405162461bcd60e51b815260206004820152601060248201527f496e646578206e6f742076616c69642e000000000000000000000000000000006044820152606401610b14565b60005b815151811015610d3e576000610cec83600001518381518110610a3157610a316159d5565b9050610d088184600001518481518110610a5a57610a5a6159d5565b8351805184908110610d1c57610d1c6159d5565b602090810291909101015160a0015250610d37600182615a33565b9050610cc7565b508051805189908110610d5357610d536159d5565b60200260200101516020015181600001518981518110610d7557610d756159d5565b60200260200101516040015182600001518a81518110610d9757610d976159d5565b60200260200101516060015183600001518b81518110610db957610db96159d5565b60200260200101516080015184600001518c81518110610ddb57610ddb6159d5565b602002602001015160a0015185600001518d81518110610dfd57610dfd6159d5565b602002602001015160c00151965096509650965096509650509295509295509295565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16610ec85760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b50600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600260005403610f625760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b14565b6002600055610f6f6132e2565b6040517f434c41494d000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166110175760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b8247116110665760405162461bcd60e51b815260206004820152601360248201527f4e6f7420656e6f7567682062616c616e63652e000000000000000000000000006044820152606401610b14565b60405173ffffffffffffffffffffffffffffffffffffffff83169084156108fc029085906000818181858888f193505050501580156110a9573d6000803e3d6000fd5b5060405173ffffffffffffffffffffffffffffffffffffffff83169084907f6aa3eac93d079e5e100b1029be716caa33586c96aa4baac390669fb5c2a2121290600090a35050600160005550565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff1661119f5760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b6111a98383613335565b505050565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166112565760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b50600755565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166113045760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b50600e80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff9384168102919091179182905560118054919092049092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179055565b6002600054036113d95760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b14565b60026000556040517f4558454300000000000000000000000000000000000000000000000000000000602082015260240160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166114865760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b61148e6132e2565b6000611499866133bb565b60208101518151604083015160608401519394509192909190818b108015906114c25750808b11155b61150e5760405162461bcd60e51b815260206004820152601260248201527f56616c7565206e6f7420696e2072616e676500000000000000000000000000006044820152606401610b14565b600d5461151c9088906134ab565b611531606461152b8e886134ab565b906134b7565b111561157f5760405162461bcd60e51b815260206004820152601060248201527f4e6f7420656e6f756768204b6579732e000000000000000000000000000000006044820152606401610b14565b61158d8b85858b8d8c6134c3565b50506001600055505050505050505050565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166116475760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b50601080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6116976132e2565b600f5473ffffffffffffffffffffffffffffffffffffffff166116fc5760405162461bcd60e51b815260206004820152601760248201527f44656c656761746564204275726e206e6f74207365742e0000000000000000006044820152606401610b14565b6012546040517f50690fc000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906350690fc0906117549085908590600401615a62565b600060405180830381600087803b15801561176e57600080fd5b505af1158015611782573d6000803e3d6000fd5b505050505050565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166118325760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b50600455565b60026000540361188a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b14565b60026000556118976132e2565b6118a1338261370c565b6118ed5760405162461bcd60e51b815260206004820152601460248201527f4e6f2061637469766520706f736974696f6e732e0000000000000000000000006044820152606401610b14565b6118f7828261389e565b50506001600055565b611908614463565b61191260006144d0565b565b61191c6132e2565b61dead60005b8351811015611b20576011546040517fe985e9c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301529091169063e985e9c590604401602060405180830381865afa1580156119a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c59190615ac3565b1515600114611a3c5760405162461bcd60e51b815260206004820152603160248201527f4275726e4b6579733a20436f6e7472616374206973206e6f7420617070726f7660448201527f656420746f207370656e64204b6579732e0000000000000000000000000000006064820152608401610b14565b601154845173ffffffffffffffffffffffffffffffffffffffff909116906342842e0e9085908590889086908110611a7657611a766159d5565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401600060405180830381600087803b158015611af557600080fd5b505af1158015611b09573d6000803e3d6000fd5b505050508080611b1890615ae0565b915050611922565b50505050565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16611bce5760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b50600f805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316811790915560128054909216179055565b611c286132e2565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16611cd05760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b611cd861454e565b50565b336000908152600b602052604090205460609080611d3b5760405162461bcd60e51b815260206004820152601760248201527f41646472657373206e6f7420726567697374657265642e0000000000000000006044820152606401610b14565b6001600454611d4a9190615a4b565b831115611d995760405162461bcd60e51b815260206004820152601360248201527f496e646578206f7574206f662072616e67652e000000000000000000000000006044820152606401610b14565b600060098281548110611dae57611dae6159d5565b90600052602060002090600202016001018481548110611dd057611dd06159d5565b60009182526020918290206040805160e0810182526007909302909101805473ffffffffffffffffffffffffffffffffffffffff16835260018101549383018490526002810154918301919091526003810154606083015260048101546080830152600581015460a08301526006015460c08201529150611e935760405162461bcd60e51b815260206004820152601460248201527f4e6f2061637469766520706f736974696f6e732e0000000000000000000000006044820152606401610b14565b6000611e9e82613293565b905060008111611ef05760405162461bcd60e51b815260206004820152601160248201527f526577617264206e6f742072656164792e0000000000000000000000000000006044820152606401610b14565b611f4b60025460098581548110611f0957611f096159d5565b90600052602060002090600202016001018781548110611f2b57611f2b6159d5565b9060005260206000209060070201600601546134ab90919063ffffffff16565b612051611fa78360098781548110611f6557611f656159d5565b90600052602060002090600202016001018981548110611f8757611f876159d5565b9060005260206000209060070201600501546132cf90919063ffffffff16565b61204b606461152b60098981548110611fc257611fc26159d5565b90600052602060002090600202016001018b81548110611fe457611fe46159d5565b90600052602060002090600702016003015460098a81548110612009576120096159d5565b90600052602060002090600202016001018c8154811061202b5761202b6159d5565b9060005260206000209060070201600101546134ab90919063ffffffff16565b906132cf565b116124845760006120f76009858154811061206e5761206e6159d5565b90600052602060002090600202016001018781548110612090576120906159d5565b906000526020600020906007020160020154600986815481106120b5576120b56159d5565b906000526020600020906002020160010188815481106120d7576120d76159d5565b9060005260206000209060070201600401546145d390919063ffffffff16565b9050426009858154811061210d5761210d6159d5565b9060005260206000209060020201600101878154811061212f5761212f6159d5565b600091825260209091206002600790920201015561214d42826132cf565b60098581548110612160576121606159d5565b90600052602060002090600202016001018781548110612182576121826159d5565b9060005260206000209060070201600401819055506121d082600986815481106121ae576121ae6159d5565b90600052602060002090600202016001018881548110611f8757611f876159d5565b600985815481106121e3576121e36159d5565b90600052602060002090600202016001018781548110612205576122056159d5565b9060005260206000209060070201600501819055507fd0dbdf5a9c6f6230b05ec9279bf9c69ad874fceb6c427e3a79ad9d08951abe276009858154811061224e5761224e6159d5565b90600052602060002090600202016001018781548110612270576122706159d5565b60009182526020909120600790910201546009805473ffffffffffffffffffffffffffffffffffffffff90921691879081106122ae576122ae6159d5565b906000526020600020906002020160010188815481106122d0576122d06159d5565b906000526020600020906007020160010154600987815481106122f5576122f56159d5565b90600052602060002090600202016001018981548110612317576123176159d5565b9060005260206000209060070201600201546009888154811061233c5761233c6159d5565b90600052602060002090600202016001018a8154811061235e5761235e6159d5565b90600052602060002090600702016005015460098981548110612383576123836159d5565b90600052602060002090600202016001018b815481106123a5576123a56159d5565b90600052602060002090600702016004015460098a815481106123ca576123ca6159d5565b90600052602060002090600202016001018c815481106123ec576123ec6159d5565b6000918252602091829020600660079092020101546040805173ffffffffffffffffffffffffffffffffffffffff9098168852918701959095528501929092526060840152608083015260a082015260c00160405180910390a1505060408051808201909152600981527f457874656e6465642e00000000000000000000000000000000000000000000006020820152949350505050565b505060408051808201909152601a81527f4e6f7420656e6f75676820616c6c6f77616e6365206c6566742e00000000000060208201529392505050565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166125695760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b50600255565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166126175760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b5060088054911515760100000000000000000000000000000000000000000000027fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff1661270c5760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b50600880549115157501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166128005760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b50600555565b6002600054036128585760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b14565b60026000556040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166129055760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b60405173ffffffffffffffffffffffffffffffffffffffff83169084156108fc029085906000818181858888f19350505050158015612948573d6000803e3d6000fd5b505060016000555050565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166129fb5760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b506008805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16612aee5760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b612af8838561370c565b612b445760405162461bcd60e51b815260206004820152601260248201527f4e6f7468696e6720617661696c61626c652e00000000000000000000000000006044820152606401610b14565b611b208484846145df565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16612bf75760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b50600d55565b6040517f4558454300000000000000000000000000000000000000000000000000000000602082015260240160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16612ca55760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b600260005403612cf75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b14565b6002600055612d046132e2565b60105473ffffffffffffffffffffffffffffffffffffffff16612d695760405162461bcd60e51b815260206004820152601760248201527f436c61696d20436f6e7472616374206e6f74207365742e0000000000000000006044820152606401610b14565b6010546040517fcafd84b400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590529091169063cafd84b49034906044016000604051808303818588803b158015612dde57600080fd5b505af1158015612df2573d6000803e3d6000fd5b505060405173ffffffffffffffffffffffffffffffffffffffff871693508592507f6aa3eac93d079e5e100b1029be716caa33586c96aa4baac390669fb5c2a212129150600090a35050600160005550565b60008060405180602001604052806009600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481548110612ea457612ea46159d5565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b82821015612f5d5760008481526020908190206040805160e08101825260078602909201805473ffffffffffffffffffffffffffffffffffffffff168352600180820154848601526002820154928401929092526003810154606084015260048101546080840152600581015460a08401526006015460c08301529083529092019101612ed5565b50505091525051519392505050565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166130145760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b6111a98383614a00565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166130c65760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b50600655565b60026000540361311e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b14565b600260005561312b6132e2565b61313783838333614a83565b5050600160005550565b613149614463565b73ffffffffffffffffffffffffffffffffffffffff81166131d25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b14565b611cd8816144d0565b6131e3614cac565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff1661328b5760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b611cd8614cfe565b600081608001514211156132c7576132c1606461152b846060015185602001516134ab90919063ffffffff16565b92915050565b506000919050565b60006132db8284615a33565b9392505050565b600c5460ff16156119125760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610b14565b6000828152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905551909184917f5a06360d65acf95e98445dc834f205063424c636e65418d928cdfabc33a953999190a35050565b6133e66040518060800160405280600081526020016000815260200160008152602001600081525090565b6000828152601360205260409020546134415760405162461bcd60e51b815260206004820152600a60248201527f4e6f205061636b616765000000000000000000000000000000000000000000006044820152606401610b14565b60008281526013602052604081208054829061345f5761345f6159d5565b9060005260206000209060040201604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905080915050919050565b60006132db8284615b18565b60006132db8284615b55565b6134cc83614d55565b6135185760405162461bcd60e51b815260206004820152601360248201527f4d6178206f70656e20706f736974696f6e732e000000000000000000000000006044820152606401610b14565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600b60205260408120549083908290036135545761355185614e94565b91505b600184905561356384876132cf565b600355600980548390811061357a5761357a6159d5565b90600052602060002090600202016001016040518060e001604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200183815260200189815260200160035481526020016000815260200185815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015550508473ffffffffffffffffffffffffffffffffffffffff167fc16be9a586414a157dd46b4d023aa9997a025dd1cbbaa67ac0c1b8273a5eaf558984848b600354896040516136fa96959493929190958652602086019490945260408501929092526060840152608083015260a082015260c00190565b60405180910390a25050505050505050565b6000600160045461371d9190615a4b565b82111561376c5760405162461bcd60e51b815260206004820152601360248201527f496e646578206f7574206f662072616e67652e000000000000000000000000006044820152606401610b14565b604080516020808201835273ffffffffffffffffffffffffffffffffffffffff86166000908152600b909152918220546009805483929081106137b1576137b16159d5565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b8282101561386a5760008481526020908190206040805160e08101825260078602909201805473ffffffffffffffffffffffffffffffffffffffff168352600180820154848601526002820154928401929092526003810154606084015260048101546080840152600581015460a08401526006015460c083015290835290920191016137e2565b50505091525080515190915015801590613885575080515183105b156138945760019150506132c1565b5060009392505050565b336000908152600b602052604081205490816138fc5760405162461bcd60e51b815260206004820152601760248201527f41646472657373206e6f7420726567697374657265642e0000000000000000006044820152606401610b14565b600160045461390b9190615a4b565b83111561395a5760405162461bcd60e51b815260206004820152601360248201527f496e646578206f7574206f662072616e67652e000000000000000000000000006044820152606401610b14565b60006009838154811061396f5761396f6159d5565b90600052602060002090600202016001018481548110613991576139916159d5565b60009182526020918290206040805160e0810182526007909302909101805473ffffffffffffffffffffffffffffffffffffffff16835260018101549383018490526002810154918301919091526003810154606083015260048101546080830152600581015460a08301526006015460c08201529150613a545760405162461bcd60e51b815260206004820152601460248201527f4e6f2061637469766520706f736974696f6e732e0000000000000000000000006044820152606401610b14565b814711613aa35760405162461bcd60e51b815260206004820152601360248201527f4e6f7420656e6f7567682062616c616e63652e000000000000000000000000006044820152606401610b14565b8060800151421015613af75760405162461bcd60e51b815260206004820152601060248201527f4e6f74206d617475726564207965742e000000000000000000000000000000006044820152606401610b14565b6000613b10613b0583613293565b60a0840151906132cf565b905060008111613b625760405162461bcd60e51b815260206004820152601060248201527f436c61696d206e6f742072656164792e000000000000000000000000000000006044820152606401610b14565b6020820151600090613b7490836132cf565b905086613b845781935083613b89565b809350835b50600754841015613bdc5760405162461bcd60e51b815260206004820152601b60248201527f416d6f756e74206973206c657373207468616e206d696e696d756d00000000006044820152606401610b14565b6008547501000000000000000000000000000000000000000000900460ff168015613d005750613c3d60025460098781548110613c1b57613c1b6159d5565b90600052602060002090600202016001018881548110611f2b57611f2b6159d5565b613cfd613c798460098981548110613c5757613c576159d5565b90600052602060002090600202016001018a81548110611f8757611f876159d5565b61204b606461152b60098b81548110613c9457613c946159d5565b90600052602060002090600202016001018c81548110613cb657613cb66159d5565b90600052602060002090600702016003015460098c81548110613cdb57613cdb6159d5565b90600052602060002090600202016001018d8154811061202b5761202b6159d5565b11155b1561416e57600554613d618560098881548110613d1f57613d1f6159d5565b90600052602060002090600202016001018981548110613d4157613d416159d5565b9060005260206000209060070201600101546145d390919063ffffffff16565b1015613f5b57613dbd6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b925060098581548110613dd257613dd26159d5565b9060005260206000209060020201600101600160098781548110613df857613df86159d5565b906000526020600020906002020160010180549050613e179190615a4b565b81548110613e2757613e276159d5565b60009182526020918290206040805160e0810182526007909302909101805473ffffffffffffffffffffffffffffffffffffffff1683526001810154938301939093526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015460c0820152600980549194509086908110613eb457613eb46159d5565b9060005260206000209060020201600101805480613ed457613ed4615b90565b60008281526020812060077fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001810182905560028101829055600381018290556004810182905560058101829055600601559055614101565b613f948460098781548110613f7257613f726159d5565b90600052602060002090600202016001018881548110613d4157613d416159d5565b60098681548110613fa757613fa76159d5565b90600052602060002090600202016001018781548110613fc957613fc96159d5565b906000526020600020906007020160010181905550600061405f60098781548110613ff657613ff66159d5565b90600052602060002090600202016001018881548110614018576140186159d5565b9060005260206000209060070201600201546009888154811061403d5761403d6159d5565b906000526020600020906002020160010189815481106120d7576120d76159d5565b90504260098781548110614075576140756159d5565b90600052602060002090600202016001018881548110614097576140976159d5565b60009182526020909120600260079092020101556140b542826132cf565b600987815481106140c8576140c86159d5565b906000526020600020906002020160010188815481106140ea576140ea6159d5565b906000526020600020906007020160040181905550505b604051339085156108fc029086906000818181858888f1935050505015801561412e573d6000803e3d6000fd5b506040805185815242602082015233917f92ccf450a286a957af52509bc1c9939d1a6a481783e142e41e2499f0bb66ebc6910160405180910390a261445a565b60098581548110614181576141816159d5565b906000526020600020906002020160010186815481106141a3576141a36159d5565b60009182526020822060079091020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001810182905560028101829055600381018290556004810182905560058101829055600601556009805486908110614213576142136159d5565b9060005260206000209060020201600101600160098781548110614239576142396159d5565b9060005260206000209060020201600101805490506142589190615a4b565b81548110614268576142686159d5565b906000526020600020906007020160098681548110614289576142896159d5565b906000526020600020906002020160010187815481106142ab576142ab6159d5565b60009182526020909120825460079092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911781556001808301549082015560028083015490820155600380830154908201556004808301549082015560058083015490820155600691820154910155600980548690811061434e5761434e6159d5565b906000526020600020906002020160010180548061436e5761436e615b90565b60008281526020812060077fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020180547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560018101829055600281018290556003810182905560048101829055600581018290556006018190559155604051339186156108fc02918791818181858888f1935050505015801561441d573d6000803e3d6000fd5b506040805185815242602082015233917f92ccf450a286a957af52509bc1c9939d1a6a481783e142e41e2499f0bb66ebc691015b60405180910390a25b50505050505050565b600c5473ffffffffffffffffffffffffffffffffffffffff6101009091041633146119125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b14565b600c805473ffffffffffffffffffffffffffffffffffffffff8381166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff85161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6145566132e2565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586145a93390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b60006132db8284615a4b565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600b6020526040812054600980549192918390811061461c5761461c6159d5565b9060005260206000209060020201600101858154811061463e5761463e6159d5565b600091825260208083206040805160e0810182526007909402909101805473ffffffffffffffffffffffffffffffffffffffff1684526001810154928401929092526002820154908301526003810154606083015260048101546080830152600581015460a08301526006015460c082015291506146be613b0583613293565b905060006146d98284602001516132cf90919063ffffffff16565b9050600984815481106146ee576146ee6159d5565b90600052602060002090600202016001018781548110614710576147106159d5565b60009182526020822060079091020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001810182905560028101829055600381018290556004810182905560058101829055600601556009805485908110614780576147806159d5565b90600052602060002090600202016001016001600986815481106147a6576147a66159d5565b9060005260206000209060020201600101805490506147c59190615a4b565b815481106147d5576147d56159d5565b9060005260206000209060070201600985815481106147f6576147f66159d5565b90600052602060002090600202016001018881548110614818576148186159d5565b60009182526020909120825460079092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091178155600180830154908201556002808301549082015560038083015490820155600480830154908201556005808301549082015560069182015491015560098054859081106148bb576148bb6159d5565b90600052602060002090600202016001018054806148db576148db615b90565b60008281526020812060077fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001810182905560028101829055600381018290556004810182905560058101829055600601559055841561445a57804710156149b35760405162461bcd60e51b815260206004820152601360248201527f4e6f7420656e6f7567682062616c616e63652e000000000000000000000000006044820152606401610b14565b60405173ffffffffffffffffffffffffffffffffffffffff87169082156108fc029083906000818181858888f193505050501580156149f6573d6000803e3d6000fd5b5050505050505050565b6000828152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551909184917f76e6093c136cd7faa5a6d92b2b633f3b4595abd4a529b7a13917398355fea6949190a35050565b6000614a8e846133bb565b60208101518151604083015160608401519394509192909190818910801590614ab75750808911155b614b035760405162461bcd60e51b815260206004820152601860248201527f5374616b652076616c7565206e6f7420696e2072616e676500000000000000006044820152606401610b14565b883414614b525760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420616d6f756e742073656e742e0000000000000000000000006044820152606401610b14565b614b5c8787614f2f565b1515600114614bad5760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420616c6c204b657973206f776e656420627920616464726573732e00006044820152606401610b14565b6001614bb7615088565b1015614c055760405162461bcd60e51b815260206004820152601460248201527f416464726573732068617665206e6f204b65792e0000000000000000000000006044820152606401610b14565b600d548751614c13916134ab565b614c22606461152b8c886134ab565b1115614c705760405162461bcd60e51b815260206004820152601060248201527f4e6f7420656e6f756768204b6579732e000000000000000000000000000000006044820152606401610b14565b600e5460ff16614c8957614c848787611914565b614c93565b614c93878761168f565b614ca1898585898b5161518c565b505050505050505050565b600c5460ff166119125760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610b14565b614d06614cac565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336145a9565b60008060405180602001604052806009600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481548110614db557614db56159d5565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b82821015614e6e5760008481526020908190206040805160e08101825260078602909201805473ffffffffffffffffffffffffffffffffffffffff168352600180820154848601526002820154928401929092526003810154606084015260048101546080840152600581015460a08401526006015460c08301529083529092019101614de6565b50505091525060045481515191925011614e8b5750600092915050565b50600192915050565b60098054600190810180835560009283528291614eb091615a4b565b90508260098281548110614ec657614ec66159d5565b6000918252602080832060029290920290910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055949091168152600b90935260409092208290555090565b600e54600090610100900473ffffffffffffffffffffffffffffffffffffffff16614f9c5760405162461bcd60e51b815260206004820152601560248201527f4b657920436f6e7472616374206e6f74207365742e00000000000000000000006044820152606401610b14565b60005b835181101561507e57601154845173ffffffffffffffffffffffffffffffffffffffff808616921690636352211e90879085908110614fe057614fe06159d5565b60200260200101516040518263ffffffff1660e01b815260040161500691815260200190565b602060405180830381865afa158015615023573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150479190615bbf565b73ffffffffffffffffffffffffffffffffffffffff161461506c5760009150506132c1565b8061507681615ae0565b915050614f9f565b5060019392505050565b600e54600090610100900473ffffffffffffffffffffffffffffffffffffffff166150f55760405162461bcd60e51b815260206004820152601560248201527f4b657920436f6e7472616374206e6f74207365742e00000000000000000000006044820152606401610b14565b6011546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015615163573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151879190615bdc565b905090565b60085473ffffffffffffffffffffffffffffffffffffffff166151f15760405162461bcd60e51b815260206004820152601860248201527f5374616b696e67206163636f756e74206e6f74207365742e00000000000000006044820152606401610b14565b6151fa82614d55565b6152465760405162461bcd60e51b815260206004820152601360248201527f4d6178206f70656e20706f736974696f6e732e000000000000000000000000006044820152606401610b14565b60085474010000000000000000000000000000000000000000900460ff16156152b25760085460405173ffffffffffffffffffffffffffffffffffffffff9091169086156108fc029087906000818181858888f193505050501580156152b0573d6000803e3d6000fd5b505b600854760100000000000000000000000000000000000000000000900460ff16156153365760085460065473ffffffffffffffffffffffffffffffffffffffff909116906108fc9061530c9060649061152b908a906134ab565b6040518115909202916000818181858888f19350505050158015615334573d6000803e3d6000fd5b505b73ffffffffffffffffffffffffffffffffffffffff82166000908152600b60205260408120549042908290036153725761536f84614e94565b91505b42600181905561538290866132cf565b6003556009805483908110615399576153996159d5565b90600052602060002090600202016001016040518060e001604052808673ffffffffffffffffffffffffffffffffffffffff16815260200189815260200183815260200188815260200160035481526020016000815260200185815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015550508373ffffffffffffffffffffffffffffffffffffffff167fc16be9a586414a157dd46b4d023aa9997a025dd1cbbaa67ac0c1b8273a5eaf558884848a6003548960405161445196959493929190958652602086019490945260408501929092526060840152608083015260a082015260c00190565b73ffffffffffffffffffffffffffffffffffffffff81168114611cd857600080fd5b60006020828403121561554d57600080fd5b81356132db81615519565b60006020808352604080840185518384870152818151808452606093508388019150858301925060005b818110156155ee578351805173ffffffffffffffffffffffffffffffffffffffff1684528781015188850152868101518785015285810151868501526080808201519085015260a0808201519085015260c090810151908401529286019260e090920191600101615582565b509098975050505050505050565b60008060008060006080868803121561561457600080fd5b853561561f81615519565b9450602086013561562f81615519565b935060408601359250606086013567ffffffffffffffff8082111561565357600080fd5b818801915088601f83011261566757600080fd5b81358181111561567657600080fd5b89602082850101111561568857600080fd5b9699959850939650602001949392505050565b600080604083850312156156ae57600080fd5b82356156b981615519565b946020939093013593505050565b600080604083850312156156da57600080fd5b8235915060208301356156ec81615519565b809150509250929050565b60006020828403121561570957600080fd5b5035919050565b600080600080600060a0868803121561572857600080fd5b853594506020860135935060408601359250606086013561574881615519565b949793965091946080013592915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261579957600080fd5b8135602067ffffffffffffffff808311156157b6576157b6615759565b8260051b604051601f19603f830116810181811084821117156157db576157db615759565b6040529384528581018301938381019250878511156157f957600080fd5b83870191505b84821015615818578135835291830191908301906157ff565b979650505050505050565b6000806040838503121561583657600080fd5b823567ffffffffffffffff81111561584d57600080fd5b61585985828601615788565b92505060208301356156ec81615519565b8015158114611cd857600080fd5b60006020828403121561588a57600080fd5b81356132db8161586a565b600080604083850312156158a857600080fd5b82356156b98161586a565b600060208083528351808285015260005b818110156158e0578581018301518582016040015282016158c4565b818111156158f2576000604083870101525b50601f01601f1916929092016040019392505050565b600080600080600060a0868803121561592057600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60008060006060848603121561595857600080fd5b83359250602084013561596a81615519565b9150604084013561597a8161586a565b809150509250925092565b60008060006060848603121561599a57600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156159bf57600080fd5b6159cb86828701615788565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115615a4657615a46615a04565b500190565b600082821015615a5d57615a5d615a04565b500390565b604080825283519082018190526000906020906060840190828701845b82811015615a9b57815184529284019290840190600101615a7f565b50505073ffffffffffffffffffffffffffffffffffffffff9490941692019190915250919050565b600060208284031215615ad557600080fd5b81516132db8161586a565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615b1157615b11615a04565b5060010190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615b5057615b50615a04565b500290565b600082615b8b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600060208284031215615bd157600080fd5b81516132db81615519565b600060208284031215615bee57600080fd5b505191905056fea2646970667358221220737b8f82400d9d87c399d3ef12433e536f042466d433c0e4d183da6386b9a30c64736f6c634300080f00330000000000000000000000005c76eb054b1b06a725be1715fbed9560ce5dba13

Deployed Bytecode

0x6080604052600436106102a45760003560e01c80638456cb591161016e578063b453a187116100cb578063ec5a82e41161007f578063f2fde38b11610064578063f2fde38b14610884578063f7b188a5146108a4578063f8fc08b9146108b957600080fd5b8063ec5a82e414610851578063eff350641461087157600080fd5b8063c80229c1116100b0578063c80229c1146107fe578063d0c4cab614610811578063d547741f1461083157600080fd5b8063b453a187146107be578063bb32fbb1146107de57600080fd5b8063a2e30f1511610122578063a865e8ce11610107578063a865e8ce1461075e578063a93e05231461077e578063b06113fe1461079e57600080fd5b8063a2e30f15146106bd578063a4ca8c7a1461073e57600080fd5b80638e699bc8116101535780638e699bc81461065057806399b1d9581461067d57806399d9af521461069d57600080fd5b80638456cb59146105eb5780638da5cb5b1461060057600080fd5b8063453875a01161021c57806368888dc3116101d0578063715018a6116101b5578063715018a61461059657806378174ec5146105ab57806381cdf766146105cb57600080fd5b806368888dc31461055657806369322c131461057657600080fd5b806350690fc01161020157806350690fc0146104c65780635c975abb146104e65780636721aa221461050a57600080fd5b8063453875a0146104935780634a30d3eb146104a657600080fd5b80631c8050c7116102735780632f2ff15d116102585780632f2ff15d1461043357806335aa134a146104535780633b2896651461047357600080fd5b80631c8050c7146103f1578063225891381461041357600080fd5b806304238994146102db57806312065fe014610311578063150b7a021461032e57806315914247146103a457600080fd5b366102d65760405133907f15382559391789f1865e10e9c8b51327a9cb0381eae89973ada229e7a78c08f390600090a2005b600080fd5b3480156102e757600080fd5b506102fb6102f636600461553b565b6108f4565b6040516103089190615558565b60405180910390f35b34801561031d57600080fd5b50475b604051908152602001610308565b34801561033a57600080fd5b506103736103493660046155fc565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610308565b3480156103b057600080fd5b506103c46103bf36600461569b565b610ab1565b604080519687526020870195909552938501929092526060840152608083015260a082015260c001610308565b3480156103fd57600080fd5b5061041161040c36600461553b565b610e20565b005b34801561041f57600080fd5b5061041161042e3660046156c7565b610f10565b34801561043f57600080fd5b5061041161044e3660046156c7565b6110f7565b34801561045f57600080fd5b5061041161046e3660046156f7565b6111ae565b34801561047f57600080fd5b5061041161048e36600461553b565b61125c565b6104116104a1366004615710565b611387565b3480156104b257600080fd5b506104116104c136600461553b565b61159f565b3480156104d257600080fd5b506104116104e1366004615823565b61168f565b3480156104f257600080fd5b50600c5460ff165b6040519015158152602001610308565b34801561051657600080fd5b50610411610525366004615878565b600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b34801561056257600080fd5b506104116105713660046156f7565b61178a565b34801561058257600080fd5b50610411610591366004615895565b611838565b3480156105a257600080fd5b50610411611900565b3480156105b757600080fd5b506104116105c6366004615823565b611914565b3480156105d757600080fd5b506104116105e636600461553b565b611b26565b3480156105f757600080fd5b50610411611c20565b34801561060c57600080fd5b50600c54610100900473ffffffffffffffffffffffffffffffffffffffff1660405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610308565b34801561065c57600080fd5b5061067061066b3660046156f7565b611cdb565b60405161030891906158b3565b34801561068957600080fd5b506104116106983660046156f7565b6124c1565b3480156106a957600080fd5b506104116106b8366004615878565b61256f565b3480156106c957600080fd5b506104116106d8366004615908565b60009485526013602090815260408087208151608081018352968752868301958652908601938452606086019283528054600181810183559188529190962094516004909102909401938455915193830193909355915160028201559051600390910155565b34801561074a57600080fd5b50610411610759366004615878565b612664565b34801561076a57600080fd5b506104116107793660046156f7565b612758565b34801561078a57600080fd5b506104116107993660046156c7565b612806565b3480156107aa57600080fd5b506104116107b9366004615878565b612953565b3480156107ca57600080fd5b506104116107d9366004615943565b612a46565b3480156107ea57600080fd5b506104116107f93660046156f7565b612b4f565b61041161080c36600461569b565b612bfd565b34801561081d57600080fd5b5061032061082c36600461553b565b612e44565b34801561083d57600080fd5b5061041161084c3660046156c7565b612f6c565b34801561085d57600080fd5b5061041161086c3660046156f7565b61301e565b61041161087f366004615985565b6130cc565b34801561089057600080fd5b5061041161089f36600461553b565b613141565b3480156108b057600080fd5b506104116131db565b3480156108c557600080fd5b506104fa6108d43660046156c7565b600a60209081526000928352604080842090915290825290205460ff1681565b604080516020810190915260608152604080516020808201835273ffffffffffffffffffffffffffffffffffffffff85166000908152600b90915291822054600980548392908110610948576109486159d5565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b82821015610a015760008481526020908190206040805160e08101825260078602909201805473ffffffffffffffffffffffffffffffffffffffff168352600180820154848601526002820154928401929092526003810154606084015260048101546080840152600581015460a08401526006015460c08301529083529092019101610979565b505050915250905060005b815151811015610aaa576000610a3e83600001518381518110610a3157610a316159d5565b6020026020010151613293565b9050610a748184600001518481518110610a5a57610a5a6159d5565b602002602001015160a001516132cf90919063ffffffff16565b8351805184908110610a8857610a886159d5565b602090810291909101015160a0015250610aa3600182615a33565b9050610a0c565b5092915050565b6000806000806000806001600454610ac99190615a4b565b871115610b1d5760405162461bcd60e51b815260206004820152601360248201527f496e646578206f7574206f662072616e67652e0000000000000000000000000060448201526064015b60405180910390fd5b604080516020808201835273ffffffffffffffffffffffffffffffffffffffff8b166000908152600b90915291822054600980548392908110610b6257610b626159d5565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b82821015610c1b5760008481526020908190206040805160e08101825260078602909201805473ffffffffffffffffffffffffffffffffffffffff168352600180820154848601526002820154928401929092526003810154606084015260048101546080840152600581015460a08401526006015460c08301529083529092019101610b93565b505050915250805151909150610c735760405162461bcd60e51b815260206004820152601460248201527f4e6f2061637469766520706f736974696f6e732e0000000000000000000000006044820152606401610b14565b8051518810610cc45760405162461bcd60e51b815260206004820152601060248201527f496e646578206e6f742076616c69642e000000000000000000000000000000006044820152606401610b14565b60005b815151811015610d3e576000610cec83600001518381518110610a3157610a316159d5565b9050610d088184600001518481518110610a5a57610a5a6159d5565b8351805184908110610d1c57610d1c6159d5565b602090810291909101015160a0015250610d37600182615a33565b9050610cc7565b508051805189908110610d5357610d536159d5565b60200260200101516020015181600001518981518110610d7557610d756159d5565b60200260200101516040015182600001518a81518110610d9757610d976159d5565b60200260200101516060015183600001518b81518110610db957610db96159d5565b60200260200101516080015184600001518c81518110610ddb57610ddb6159d5565b602002602001015160a0015185600001518d81518110610dfd57610dfd6159d5565b602002602001015160c00151965096509650965096509650509295509295509295565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16610ec85760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b50600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600260005403610f625760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b14565b6002600055610f6f6132e2565b6040517f434c41494d000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166110175760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b8247116110665760405162461bcd60e51b815260206004820152601360248201527f4e6f7420656e6f7567682062616c616e63652e000000000000000000000000006044820152606401610b14565b60405173ffffffffffffffffffffffffffffffffffffffff83169084156108fc029085906000818181858888f193505050501580156110a9573d6000803e3d6000fd5b5060405173ffffffffffffffffffffffffffffffffffffffff83169084907f6aa3eac93d079e5e100b1029be716caa33586c96aa4baac390669fb5c2a2121290600090a35050600160005550565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff1661119f5760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b6111a98383613335565b505050565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166112565760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b50600755565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166113045760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b50600e80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff9384168102919091179182905560118054919092049092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179055565b6002600054036113d95760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b14565b60026000556040517f4558454300000000000000000000000000000000000000000000000000000000602082015260240160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166114865760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b61148e6132e2565b6000611499866133bb565b60208101518151604083015160608401519394509192909190818b108015906114c25750808b11155b61150e5760405162461bcd60e51b815260206004820152601260248201527f56616c7565206e6f7420696e2072616e676500000000000000000000000000006044820152606401610b14565b600d5461151c9088906134ab565b611531606461152b8e886134ab565b906134b7565b111561157f5760405162461bcd60e51b815260206004820152601060248201527f4e6f7420656e6f756768204b6579732e000000000000000000000000000000006044820152606401610b14565b61158d8b85858b8d8c6134c3565b50506001600055505050505050505050565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166116475760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b50601080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6116976132e2565b600f5473ffffffffffffffffffffffffffffffffffffffff166116fc5760405162461bcd60e51b815260206004820152601760248201527f44656c656761746564204275726e206e6f74207365742e0000000000000000006044820152606401610b14565b6012546040517f50690fc000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906350690fc0906117549085908590600401615a62565b600060405180830381600087803b15801561176e57600080fd5b505af1158015611782573d6000803e3d6000fd5b505050505050565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166118325760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b50600455565b60026000540361188a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b14565b60026000556118976132e2565b6118a1338261370c565b6118ed5760405162461bcd60e51b815260206004820152601460248201527f4e6f2061637469766520706f736974696f6e732e0000000000000000000000006044820152606401610b14565b6118f7828261389e565b50506001600055565b611908614463565b61191260006144d0565b565b61191c6132e2565b61dead60005b8351811015611b20576011546040517fe985e9c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301529091169063e985e9c590604401602060405180830381865afa1580156119a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c59190615ac3565b1515600114611a3c5760405162461bcd60e51b815260206004820152603160248201527f4275726e4b6579733a20436f6e7472616374206973206e6f7420617070726f7660448201527f656420746f207370656e64204b6579732e0000000000000000000000000000006064820152608401610b14565b601154845173ffffffffffffffffffffffffffffffffffffffff909116906342842e0e9085908590889086908110611a7657611a766159d5565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401600060405180830381600087803b158015611af557600080fd5b505af1158015611b09573d6000803e3d6000fd5b505050508080611b1890615ae0565b915050611922565b50505050565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16611bce5760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b50600f805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316811790915560128054909216179055565b611c286132e2565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16611cd05760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b611cd861454e565b50565b336000908152600b602052604090205460609080611d3b5760405162461bcd60e51b815260206004820152601760248201527f41646472657373206e6f7420726567697374657265642e0000000000000000006044820152606401610b14565b6001600454611d4a9190615a4b565b831115611d995760405162461bcd60e51b815260206004820152601360248201527f496e646578206f7574206f662072616e67652e000000000000000000000000006044820152606401610b14565b600060098281548110611dae57611dae6159d5565b90600052602060002090600202016001018481548110611dd057611dd06159d5565b60009182526020918290206040805160e0810182526007909302909101805473ffffffffffffffffffffffffffffffffffffffff16835260018101549383018490526002810154918301919091526003810154606083015260048101546080830152600581015460a08301526006015460c08201529150611e935760405162461bcd60e51b815260206004820152601460248201527f4e6f2061637469766520706f736974696f6e732e0000000000000000000000006044820152606401610b14565b6000611e9e82613293565b905060008111611ef05760405162461bcd60e51b815260206004820152601160248201527f526577617264206e6f742072656164792e0000000000000000000000000000006044820152606401610b14565b611f4b60025460098581548110611f0957611f096159d5565b90600052602060002090600202016001018781548110611f2b57611f2b6159d5565b9060005260206000209060070201600601546134ab90919063ffffffff16565b612051611fa78360098781548110611f6557611f656159d5565b90600052602060002090600202016001018981548110611f8757611f876159d5565b9060005260206000209060070201600501546132cf90919063ffffffff16565b61204b606461152b60098981548110611fc257611fc26159d5565b90600052602060002090600202016001018b81548110611fe457611fe46159d5565b90600052602060002090600702016003015460098a81548110612009576120096159d5565b90600052602060002090600202016001018c8154811061202b5761202b6159d5565b9060005260206000209060070201600101546134ab90919063ffffffff16565b906132cf565b116124845760006120f76009858154811061206e5761206e6159d5565b90600052602060002090600202016001018781548110612090576120906159d5565b906000526020600020906007020160020154600986815481106120b5576120b56159d5565b906000526020600020906002020160010188815481106120d7576120d76159d5565b9060005260206000209060070201600401546145d390919063ffffffff16565b9050426009858154811061210d5761210d6159d5565b9060005260206000209060020201600101878154811061212f5761212f6159d5565b600091825260209091206002600790920201015561214d42826132cf565b60098581548110612160576121606159d5565b90600052602060002090600202016001018781548110612182576121826159d5565b9060005260206000209060070201600401819055506121d082600986815481106121ae576121ae6159d5565b90600052602060002090600202016001018881548110611f8757611f876159d5565b600985815481106121e3576121e36159d5565b90600052602060002090600202016001018781548110612205576122056159d5565b9060005260206000209060070201600501819055507fd0dbdf5a9c6f6230b05ec9279bf9c69ad874fceb6c427e3a79ad9d08951abe276009858154811061224e5761224e6159d5565b90600052602060002090600202016001018781548110612270576122706159d5565b60009182526020909120600790910201546009805473ffffffffffffffffffffffffffffffffffffffff90921691879081106122ae576122ae6159d5565b906000526020600020906002020160010188815481106122d0576122d06159d5565b906000526020600020906007020160010154600987815481106122f5576122f56159d5565b90600052602060002090600202016001018981548110612317576123176159d5565b9060005260206000209060070201600201546009888154811061233c5761233c6159d5565b90600052602060002090600202016001018a8154811061235e5761235e6159d5565b90600052602060002090600702016005015460098981548110612383576123836159d5565b90600052602060002090600202016001018b815481106123a5576123a56159d5565b90600052602060002090600702016004015460098a815481106123ca576123ca6159d5565b90600052602060002090600202016001018c815481106123ec576123ec6159d5565b6000918252602091829020600660079092020101546040805173ffffffffffffffffffffffffffffffffffffffff9098168852918701959095528501929092526060840152608083015260a082015260c00160405180910390a1505060408051808201909152600981527f457874656e6465642e00000000000000000000000000000000000000000000006020820152949350505050565b505060408051808201909152601a81527f4e6f7420656e6f75676820616c6c6f77616e6365206c6566742e00000000000060208201529392505050565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166125695760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b50600255565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166126175760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b5060088054911515760100000000000000000000000000000000000000000000027fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff1661270c5760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b50600880549115157501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166128005760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b50600555565b6002600054036128585760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b14565b60026000556040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166129055760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b60405173ffffffffffffffffffffffffffffffffffffffff83169084156108fc029085906000818181858888f19350505050158015612948573d6000803e3d6000fd5b505060016000555050565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166129fb5760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b506008805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16612aee5760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b612af8838561370c565b612b445760405162461bcd60e51b815260206004820152601260248201527f4e6f7468696e6720617661696c61626c652e00000000000000000000000000006044820152606401610b14565b611b208484846145df565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16612bf75760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b50600d55565b6040517f4558454300000000000000000000000000000000000000000000000000000000602082015260240160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16612ca55760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b600260005403612cf75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b14565b6002600055612d046132e2565b60105473ffffffffffffffffffffffffffffffffffffffff16612d695760405162461bcd60e51b815260206004820152601760248201527f436c61696d20436f6e7472616374206e6f74207365742e0000000000000000006044820152606401610b14565b6010546040517fcafd84b400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590529091169063cafd84b49034906044016000604051808303818588803b158015612dde57600080fd5b505af1158015612df2573d6000803e3d6000fd5b505060405173ffffffffffffffffffffffffffffffffffffffff871693508592507f6aa3eac93d079e5e100b1029be716caa33586c96aa4baac390669fb5c2a212129150600090a35050600160005550565b60008060405180602001604052806009600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481548110612ea457612ea46159d5565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b82821015612f5d5760008481526020908190206040805160e08101825260078602909201805473ffffffffffffffffffffffffffffffffffffffff168352600180820154848601526002820154928401929092526003810154606084015260048101546080840152600581015460a08401526006015460c08301529083529092019101612ed5565b50505091525051519392505050565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166130145760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b6111a98383614a00565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166130c65760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b50600655565b60026000540361311e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b14565b600260005561312b6132e2565b61313783838333614a83565b5050600160005550565b613149614463565b73ffffffffffffffffffffffffffffffffffffffff81166131d25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b14565b611cd8816144d0565b6131e3614cac565b6040517f41444d494e000000000000000000000000000000000000000000000000000000602082015260250160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff1661328b5760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420617574686f72697a65642e00000000000000000000000000000000006044820152606401610b14565b611cd8614cfe565b600081608001514211156132c7576132c1606461152b846060015185602001516134ab90919063ffffffff16565b92915050565b506000919050565b60006132db8284615a33565b9392505050565b600c5460ff16156119125760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610b14565b6000828152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905551909184917f5a06360d65acf95e98445dc834f205063424c636e65418d928cdfabc33a953999190a35050565b6133e66040518060800160405280600081526020016000815260200160008152602001600081525090565b6000828152601360205260409020546134415760405162461bcd60e51b815260206004820152600a60248201527f4e6f205061636b616765000000000000000000000000000000000000000000006044820152606401610b14565b60008281526013602052604081208054829061345f5761345f6159d5565b9060005260206000209060040201604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905080915050919050565b60006132db8284615b18565b60006132db8284615b55565b6134cc83614d55565b6135185760405162461bcd60e51b815260206004820152601360248201527f4d6178206f70656e20706f736974696f6e732e000000000000000000000000006044820152606401610b14565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600b60205260408120549083908290036135545761355185614e94565b91505b600184905561356384876132cf565b600355600980548390811061357a5761357a6159d5565b90600052602060002090600202016001016040518060e001604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200183815260200189815260200160035481526020016000815260200185815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015550508473ffffffffffffffffffffffffffffffffffffffff167fc16be9a586414a157dd46b4d023aa9997a025dd1cbbaa67ac0c1b8273a5eaf558984848b600354896040516136fa96959493929190958652602086019490945260408501929092526060840152608083015260a082015260c00190565b60405180910390a25050505050505050565b6000600160045461371d9190615a4b565b82111561376c5760405162461bcd60e51b815260206004820152601360248201527f496e646578206f7574206f662072616e67652e000000000000000000000000006044820152606401610b14565b604080516020808201835273ffffffffffffffffffffffffffffffffffffffff86166000908152600b909152918220546009805483929081106137b1576137b16159d5565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b8282101561386a5760008481526020908190206040805160e08101825260078602909201805473ffffffffffffffffffffffffffffffffffffffff168352600180820154848601526002820154928401929092526003810154606084015260048101546080840152600581015460a08401526006015460c083015290835290920191016137e2565b50505091525080515190915015801590613885575080515183105b156138945760019150506132c1565b5060009392505050565b336000908152600b602052604081205490816138fc5760405162461bcd60e51b815260206004820152601760248201527f41646472657373206e6f7420726567697374657265642e0000000000000000006044820152606401610b14565b600160045461390b9190615a4b565b83111561395a5760405162461bcd60e51b815260206004820152601360248201527f496e646578206f7574206f662072616e67652e000000000000000000000000006044820152606401610b14565b60006009838154811061396f5761396f6159d5565b90600052602060002090600202016001018481548110613991576139916159d5565b60009182526020918290206040805160e0810182526007909302909101805473ffffffffffffffffffffffffffffffffffffffff16835260018101549383018490526002810154918301919091526003810154606083015260048101546080830152600581015460a08301526006015460c08201529150613a545760405162461bcd60e51b815260206004820152601460248201527f4e6f2061637469766520706f736974696f6e732e0000000000000000000000006044820152606401610b14565b814711613aa35760405162461bcd60e51b815260206004820152601360248201527f4e6f7420656e6f7567682062616c616e63652e000000000000000000000000006044820152606401610b14565b8060800151421015613af75760405162461bcd60e51b815260206004820152601060248201527f4e6f74206d617475726564207965742e000000000000000000000000000000006044820152606401610b14565b6000613b10613b0583613293565b60a0840151906132cf565b905060008111613b625760405162461bcd60e51b815260206004820152601060248201527f436c61696d206e6f742072656164792e000000000000000000000000000000006044820152606401610b14565b6020820151600090613b7490836132cf565b905086613b845781935083613b89565b809350835b50600754841015613bdc5760405162461bcd60e51b815260206004820152601b60248201527f416d6f756e74206973206c657373207468616e206d696e696d756d00000000006044820152606401610b14565b6008547501000000000000000000000000000000000000000000900460ff168015613d005750613c3d60025460098781548110613c1b57613c1b6159d5565b90600052602060002090600202016001018881548110611f2b57611f2b6159d5565b613cfd613c798460098981548110613c5757613c576159d5565b90600052602060002090600202016001018a81548110611f8757611f876159d5565b61204b606461152b60098b81548110613c9457613c946159d5565b90600052602060002090600202016001018c81548110613cb657613cb66159d5565b90600052602060002090600702016003015460098c81548110613cdb57613cdb6159d5565b90600052602060002090600202016001018d8154811061202b5761202b6159d5565b11155b1561416e57600554613d618560098881548110613d1f57613d1f6159d5565b90600052602060002090600202016001018981548110613d4157613d416159d5565b9060005260206000209060070201600101546145d390919063ffffffff16565b1015613f5b57613dbd6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b925060098581548110613dd257613dd26159d5565b9060005260206000209060020201600101600160098781548110613df857613df86159d5565b906000526020600020906002020160010180549050613e179190615a4b565b81548110613e2757613e276159d5565b60009182526020918290206040805160e0810182526007909302909101805473ffffffffffffffffffffffffffffffffffffffff1683526001810154938301939093526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015460c0820152600980549194509086908110613eb457613eb46159d5565b9060005260206000209060020201600101805480613ed457613ed4615b90565b60008281526020812060077fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001810182905560028101829055600381018290556004810182905560058101829055600601559055614101565b613f948460098781548110613f7257613f726159d5565b90600052602060002090600202016001018881548110613d4157613d416159d5565b60098681548110613fa757613fa76159d5565b90600052602060002090600202016001018781548110613fc957613fc96159d5565b906000526020600020906007020160010181905550600061405f60098781548110613ff657613ff66159d5565b90600052602060002090600202016001018881548110614018576140186159d5565b9060005260206000209060070201600201546009888154811061403d5761403d6159d5565b906000526020600020906002020160010189815481106120d7576120d76159d5565b90504260098781548110614075576140756159d5565b90600052602060002090600202016001018881548110614097576140976159d5565b60009182526020909120600260079092020101556140b542826132cf565b600987815481106140c8576140c86159d5565b906000526020600020906002020160010188815481106140ea576140ea6159d5565b906000526020600020906007020160040181905550505b604051339085156108fc029086906000818181858888f1935050505015801561412e573d6000803e3d6000fd5b506040805185815242602082015233917f92ccf450a286a957af52509bc1c9939d1a6a481783e142e41e2499f0bb66ebc6910160405180910390a261445a565b60098581548110614181576141816159d5565b906000526020600020906002020160010186815481106141a3576141a36159d5565b60009182526020822060079091020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001810182905560028101829055600381018290556004810182905560058101829055600601556009805486908110614213576142136159d5565b9060005260206000209060020201600101600160098781548110614239576142396159d5565b9060005260206000209060020201600101805490506142589190615a4b565b81548110614268576142686159d5565b906000526020600020906007020160098681548110614289576142896159d5565b906000526020600020906002020160010187815481106142ab576142ab6159d5565b60009182526020909120825460079092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911781556001808301549082015560028083015490820155600380830154908201556004808301549082015560058083015490820155600691820154910155600980548690811061434e5761434e6159d5565b906000526020600020906002020160010180548061436e5761436e615b90565b60008281526020812060077fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020180547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560018101829055600281018290556003810182905560048101829055600581018290556006018190559155604051339186156108fc02918791818181858888f1935050505015801561441d573d6000803e3d6000fd5b506040805185815242602082015233917f92ccf450a286a957af52509bc1c9939d1a6a481783e142e41e2499f0bb66ebc691015b60405180910390a25b50505050505050565b600c5473ffffffffffffffffffffffffffffffffffffffff6101009091041633146119125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b14565b600c805473ffffffffffffffffffffffffffffffffffffffff8381166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff85161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6145566132e2565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586145a93390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b60006132db8284615a4b565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600b6020526040812054600980549192918390811061461c5761461c6159d5565b9060005260206000209060020201600101858154811061463e5761463e6159d5565b600091825260208083206040805160e0810182526007909402909101805473ffffffffffffffffffffffffffffffffffffffff1684526001810154928401929092526002820154908301526003810154606083015260048101546080830152600581015460a08301526006015460c082015291506146be613b0583613293565b905060006146d98284602001516132cf90919063ffffffff16565b9050600984815481106146ee576146ee6159d5565b90600052602060002090600202016001018781548110614710576147106159d5565b60009182526020822060079091020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001810182905560028101829055600381018290556004810182905560058101829055600601556009805485908110614780576147806159d5565b90600052602060002090600202016001016001600986815481106147a6576147a66159d5565b9060005260206000209060020201600101805490506147c59190615a4b565b815481106147d5576147d56159d5565b9060005260206000209060070201600985815481106147f6576147f66159d5565b90600052602060002090600202016001018881548110614818576148186159d5565b60009182526020909120825460079092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091178155600180830154908201556002808301549082015560038083015490820155600480830154908201556005808301549082015560069182015491015560098054859081106148bb576148bb6159d5565b90600052602060002090600202016001018054806148db576148db615b90565b60008281526020812060077fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001810182905560028101829055600381018290556004810182905560058101829055600601559055841561445a57804710156149b35760405162461bcd60e51b815260206004820152601360248201527f4e6f7420656e6f7567682062616c616e63652e000000000000000000000000006044820152606401610b14565b60405173ffffffffffffffffffffffffffffffffffffffff87169082156108fc029083906000818181858888f193505050501580156149f6573d6000803e3d6000fd5b5050505050505050565b6000828152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551909184917f76e6093c136cd7faa5a6d92b2b633f3b4595abd4a529b7a13917398355fea6949190a35050565b6000614a8e846133bb565b60208101518151604083015160608401519394509192909190818910801590614ab75750808911155b614b035760405162461bcd60e51b815260206004820152601860248201527f5374616b652076616c7565206e6f7420696e2072616e676500000000000000006044820152606401610b14565b883414614b525760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420616d6f756e742073656e742e0000000000000000000000006044820152606401610b14565b614b5c8787614f2f565b1515600114614bad5760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420616c6c204b657973206f776e656420627920616464726573732e00006044820152606401610b14565b6001614bb7615088565b1015614c055760405162461bcd60e51b815260206004820152601460248201527f416464726573732068617665206e6f204b65792e0000000000000000000000006044820152606401610b14565b600d548751614c13916134ab565b614c22606461152b8c886134ab565b1115614c705760405162461bcd60e51b815260206004820152601060248201527f4e6f7420656e6f756768204b6579732e000000000000000000000000000000006044820152606401610b14565b600e5460ff16614c8957614c848787611914565b614c93565b614c93878761168f565b614ca1898585898b5161518c565b505050505050505050565b600c5460ff166119125760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610b14565b614d06614cac565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336145a9565b60008060405180602001604052806009600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481548110614db557614db56159d5565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b82821015614e6e5760008481526020908190206040805160e08101825260078602909201805473ffffffffffffffffffffffffffffffffffffffff168352600180820154848601526002820154928401929092526003810154606084015260048101546080840152600581015460a08401526006015460c08301529083529092019101614de6565b50505091525060045481515191925011614e8b5750600092915050565b50600192915050565b60098054600190810180835560009283528291614eb091615a4b565b90508260098281548110614ec657614ec66159d5565b6000918252602080832060029290920290910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055949091168152600b90935260409092208290555090565b600e54600090610100900473ffffffffffffffffffffffffffffffffffffffff16614f9c5760405162461bcd60e51b815260206004820152601560248201527f4b657920436f6e7472616374206e6f74207365742e00000000000000000000006044820152606401610b14565b60005b835181101561507e57601154845173ffffffffffffffffffffffffffffffffffffffff808616921690636352211e90879085908110614fe057614fe06159d5565b60200260200101516040518263ffffffff1660e01b815260040161500691815260200190565b602060405180830381865afa158015615023573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150479190615bbf565b73ffffffffffffffffffffffffffffffffffffffff161461506c5760009150506132c1565b8061507681615ae0565b915050614f9f565b5060019392505050565b600e54600090610100900473ffffffffffffffffffffffffffffffffffffffff166150f55760405162461bcd60e51b815260206004820152601560248201527f4b657920436f6e7472616374206e6f74207365742e00000000000000000000006044820152606401610b14565b6011546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015615163573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151879190615bdc565b905090565b60085473ffffffffffffffffffffffffffffffffffffffff166151f15760405162461bcd60e51b815260206004820152601860248201527f5374616b696e67206163636f756e74206e6f74207365742e00000000000000006044820152606401610b14565b6151fa82614d55565b6152465760405162461bcd60e51b815260206004820152601360248201527f4d6178206f70656e20706f736974696f6e732e000000000000000000000000006044820152606401610b14565b60085474010000000000000000000000000000000000000000900460ff16156152b25760085460405173ffffffffffffffffffffffffffffffffffffffff9091169086156108fc029087906000818181858888f193505050501580156152b0573d6000803e3d6000fd5b505b600854760100000000000000000000000000000000000000000000900460ff16156153365760085460065473ffffffffffffffffffffffffffffffffffffffff909116906108fc9061530c9060649061152b908a906134ab565b6040518115909202916000818181858888f19350505050158015615334573d6000803e3d6000fd5b505b73ffffffffffffffffffffffffffffffffffffffff82166000908152600b60205260408120549042908290036153725761536f84614e94565b91505b42600181905561538290866132cf565b6003556009805483908110615399576153996159d5565b90600052602060002090600202016001016040518060e001604052808673ffffffffffffffffffffffffffffffffffffffff16815260200189815260200183815260200188815260200160035481526020016000815260200185815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015550508373ffffffffffffffffffffffffffffffffffffffff167fc16be9a586414a157dd46b4d023aa9997a025dd1cbbaa67ac0c1b8273a5eaf558884848a6003548960405161445196959493929190958652602086019490945260408501929092526060840152608083015260a082015260c00190565b73ffffffffffffffffffffffffffffffffffffffff81168114611cd857600080fd5b60006020828403121561554d57600080fd5b81356132db81615519565b60006020808352604080840185518384870152818151808452606093508388019150858301925060005b818110156155ee578351805173ffffffffffffffffffffffffffffffffffffffff1684528781015188850152868101518785015285810151868501526080808201519085015260a0808201519085015260c090810151908401529286019260e090920191600101615582565b509098975050505050505050565b60008060008060006080868803121561561457600080fd5b853561561f81615519565b9450602086013561562f81615519565b935060408601359250606086013567ffffffffffffffff8082111561565357600080fd5b818801915088601f83011261566757600080fd5b81358181111561567657600080fd5b89602082850101111561568857600080fd5b9699959850939650602001949392505050565b600080604083850312156156ae57600080fd5b82356156b981615519565b946020939093013593505050565b600080604083850312156156da57600080fd5b8235915060208301356156ec81615519565b809150509250929050565b60006020828403121561570957600080fd5b5035919050565b600080600080600060a0868803121561572857600080fd5b853594506020860135935060408601359250606086013561574881615519565b949793965091946080013592915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261579957600080fd5b8135602067ffffffffffffffff808311156157b6576157b6615759565b8260051b604051601f19603f830116810181811084821117156157db576157db615759565b6040529384528581018301938381019250878511156157f957600080fd5b83870191505b84821015615818578135835291830191908301906157ff565b979650505050505050565b6000806040838503121561583657600080fd5b823567ffffffffffffffff81111561584d57600080fd5b61585985828601615788565b92505060208301356156ec81615519565b8015158114611cd857600080fd5b60006020828403121561588a57600080fd5b81356132db8161586a565b600080604083850312156158a857600080fd5b82356156b98161586a565b600060208083528351808285015260005b818110156158e0578581018301518582016040015282016158c4565b818111156158f2576000604083870101525b50601f01601f1916929092016040019392505050565b600080600080600060a0868803121561592057600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60008060006060848603121561595857600080fd5b83359250602084013561596a81615519565b9150604084013561597a8161586a565b809150509250925092565b60008060006060848603121561599a57600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156159bf57600080fd5b6159cb86828701615788565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115615a4657615a46615a04565b500190565b600082821015615a5d57615a5d615a04565b500390565b604080825283519082018190526000906020906060840190828701845b82811015615a9b57815184529284019290840190600101615a7f565b50505073ffffffffffffffffffffffffffffffffffffffff9490941692019190915250919050565b600060208284031215615ad557600080fd5b81516132db8161586a565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615b1157615b11615a04565b5060010190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615b5057615b50615a04565b500290565b600082615b8b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600060208284031215615bd157600080fd5b81516132db81615519565b600060208284031215615bee57600080fd5b505191905056fea2646970667358221220737b8f82400d9d87c399d3ef12433e536f042466d433c0e4d183da6386b9a30c64736f6c634300080f0033

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

0000000000000000000000005c76eb054b1b06a725be1715fbed9560ce5dba13

-----Decoded View---------------
Arg [0] : _newAdmin (address): 0x5C76Eb054B1b06A725be1715fbED9560cE5DbA13

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005c76eb054b1b06a725be1715fbed9560ce5dba13


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  ]
[ 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.