ETH Price: $2,764.99 (-6.51%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Stake167770762023-03-07 14:40:47699 days ago1678200047IN
0x1c906685...4E9d44f4B
0 ETH0.0199234575
Stake167768822023-03-07 14:01:23699 days ago1678197683IN
0x1c906685...4E9d44f4B
0 ETH0.0203698575
Vote Withdraw Cr...167768172023-03-07 13:47:47699 days ago1678196867IN
0x1c906685...4E9d44f4B
0 ETH0.0057607226.30542275
Deposit167768102023-03-07 13:46:23699 days ago1678196783IN
0x1c906685...4E9d44f4B
24 ETH0.0344837275
Stake167317152023-03-01 5:32:35705 days ago1677648755IN
0x1c906685...4E9d44f4B
0 ETH0.0055587920.69560722
Vote Withdraw Cr...167317112023-03-01 5:31:47705 days ago1677648707IN
0x1c906685...4E9d44f4B
0 ETH0.002410717.17770996
Deposit167317042023-03-01 5:30:23705 days ago1677648623IN
0x1c906685...4E9d44f4B
4 ETH0.0052981419.93498483
Stake167290862023-02-28 20:39:59705 days ago1677616799IN
0x1c906685...4E9d44f4B
0 ETH0.0117089729.82637955
Vote Withdraw Cr...167290812023-02-28 20:38:59705 days ago1677616739IN
0x1c906685...4E9d44f4B
0 ETH0.0084845728.50749168
Deposit167290742023-02-28 20:37:35705 days ago1677616655IN
0x1c906685...4E9d44f4B
12 ETH0.0192242729.49570899
Stake167258192023-02-28 9:38:35706 days ago1677577115IN
0x1c906685...4E9d44f4B
0 ETH0.0062893323.41541276
Vote Withdraw Cr...167258142023-02-28 9:37:35706 days ago1677577055IN
0x1c906685...4E9d44f4B
0 ETH0.0028985520.65218312
Deposit167258062023-02-28 9:35:59706 days ago1677576959IN
0x1c906685...4E9d44f4B
4 ETH0.0063319123.82253295
Stake167205432023-02-27 15:52:59707 days ago1677513179IN
0x1c906685...4E9d44f4B
0 ETH0.009786829.60647086
Vote Withdraw Cr...167205342023-02-27 15:51:11707 days ago1677513071IN
0x1c906685...4E9d44f4B
0 ETH0.0063975129.21478644
Deposit167205262023-02-27 15:49:35707 days ago1677512975IN
0x1c906685...4E9d44f4B
8 ETH0.0148020632.4033198
Stake166217812023-02-13 19:00:11721 days ago1676314811IN
0x1c906685...4E9d44f4B
0 ETH0.0090273633.98268067
Vote Withdraw Cr...166217712023-02-13 18:58:11721 days ago1676314691IN
0x1c906685...4E9d44f4B
0 ETH0.004202229.94070529
Deposit166216782023-02-13 18:39:35721 days ago1676313575IN
0x1c906685...4E9d44f4B
4 ETH0.0091717434.50995872
Stake163117012023-01-01 11:44:59764 days ago1672573499IN
0x1c906685...4E9d44f4B
0 ETH0.0041051914.79078191
Vote Withdraw Cr...163116932023-01-01 11:43:23764 days ago1672573403IN
0x1c906685...4E9d44f4B
0 ETH0.0019408313.82842318
Deposit163116862023-01-01 11:41:59764 days ago1672573319IN
0x1c906685...4E9d44f4B
4 ETH0.0041077315.28408068
Stake158388622022-10-27 10:36:59830 days ago1666867019IN
0x1c906685...4E9d44f4B
0 ETH0.0036901813.8919732
Vote Withdraw Cr...158388572022-10-27 10:35:59830 days ago1666866959IN
0x1c906685...4E9d44f4B
0 ETH0.0016806711.97480304
Deposit158388482022-10-27 10:34:11830 days ago1666866851IN
0x1c906685...4E9d44f4B
4 ETH0.0038379614.27968278
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
167770762023-03-07 14:40:47699 days ago1678200047
0x1c906685...4E9d44f4B
20 ETH
167770762023-03-07 14:40:47699 days ago1678200047
0x1c906685...4E9d44f4B
20 ETH
167768822023-03-07 14:01:23699 days ago1678197683
0x1c906685...4E9d44f4B
20 ETH
167768822023-03-07 14:01:23699 days ago1678197683
0x1c906685...4E9d44f4B
20 ETH
167768102023-03-07 13:46:23699 days ago1678196783
0x1c906685...4E9d44f4B
12 ETH
167768102023-03-07 13:46:23699 days ago1678196783
0x1c906685...4E9d44f4B
12 ETH
167317152023-03-01 5:32:35705 days ago1677648755
0x1c906685...4E9d44f4B
28 ETH
167317152023-03-01 5:32:35705 days ago1677648755
0x1c906685...4E9d44f4B
28 ETH
167317042023-03-01 5:30:23705 days ago1677648623
0x1c906685...4E9d44f4B
4 ETH
167290862023-02-28 20:39:59705 days ago1677616799
0x1c906685...4E9d44f4B
28 ETH
167290862023-02-28 20:39:59705 days ago1677616799
0x1c906685...4E9d44f4B
28 ETH
167290862023-02-28 20:39:59705 days ago1677616799
0x1c906685...4E9d44f4B
28 ETH
167290862023-02-28 20:39:59705 days ago1677616799
0x1c906685...4E9d44f4B
84 ETH
167290742023-02-28 20:37:35705 days ago1677616655
0x1c906685...4E9d44f4B
4 ETH
167290742023-02-28 20:37:35705 days ago1677616655
0x1c906685...4E9d44f4B
4 ETH
167290742023-02-28 20:37:35705 days ago1677616655
0x1c906685...4E9d44f4B
4 ETH
167258192023-02-28 9:38:35706 days ago1677577115
0x1c906685...4E9d44f4B
28 ETH
167258192023-02-28 9:38:35706 days ago1677577115
0x1c906685...4E9d44f4B
28 ETH
167258062023-02-28 9:35:59706 days ago1677576959
0x1c906685...4E9d44f4B
4 ETH
167205432023-02-27 15:52:59707 days ago1677513179
0x1c906685...4E9d44f4B
28 ETH
167205432023-02-27 15:52:59707 days ago1677513179
0x1c906685...4E9d44f4B
28 ETH
167205432023-02-27 15:52:59707 days ago1677513179
0x1c906685...4E9d44f4B
56 ETH
167205262023-02-27 15:49:35707 days ago1677512975
0x1c906685...4E9d44f4B
4 ETH
167205262023-02-27 15:49:35707 days ago1677512975
0x1c906685...4E9d44f4B
4 ETH
166217812023-02-13 19:00:11721 days ago1676314811
0x1c906685...4E9d44f4B
28 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StafiLightNode

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 12 : StafiLightNode.sol
pragma solidity 0.7.6;
pragma abicoder v2;

// SPDX-License-Identifier: GPL-3.0-only

import "../StafiBase.sol";
import "../interfaces/node/IStafiLightNode.sol";
import "../interfaces/node/IStafiNodeManager.sol";
import "../interfaces/deposit/IStafiUserDeposit.sol";
import "../interfaces/eth/IDepositContract.sol";
import "../interfaces/settings/IStafiNetworkSettings.sol";
import "../interfaces/storage/IPubkeySetStorage.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
import "../interfaces/IStafiEtherWithdrawer.sol";
import "../interfaces/IStafiEther.sol";

contract StafiLightNode is StafiBase, IStafiLightNode, IStafiEtherWithdrawer {
    // Libs
    using SafeMath for uint256;

    event EtherDeposited(address indexed from, uint256 amount, uint256 time);
    event Deposited(address node, bytes pubkey, bytes validatorSignature, uint256 amount);
    event Staked(address node, bytes pubkey);
    event OffBoarded(address node, bytes pubkey);
    event SetPubkeyStatus(bytes pubkey, uint256 status);

    uint256 public constant PUBKEY_STATUS_UNINITIAL = 0;
    uint256 public constant PUBKEY_STATUS_INITIAL = 1;
    uint256 public constant PUBKEY_STATUS_MATCH = 2;
    uint256 public constant PUBKEY_STATUS_STAKING = 3;
    uint256 public constant PUBKEY_STATUS_UNMATCH = 4;
    uint256 public constant PUBKEY_STATUS_OFFBOARD = 5;
    uint256 public constant PUBKEY_STATUS_CANWITHDRAW = 6; // can withdraw node deposit amount after offboard
    uint256 public constant PUBKEY_STATUS_WITHDRAWED = 7;

    // Construct
    constructor(address _stafiStorageAddress) StafiBase(_stafiStorageAddress) {
        version = 1;
    }

    // Receive a ether withdrawal
    // Only accepts calls from the StafiEther contract
    function receiveEtherWithdrawal() override external payable onlyLatestContract("stafiLightNode", address(this)) onlyLatestContract("stafiEther", msg.sender) {}

    // Deposit ETH from deposit pool
    // Only accepts calls from the StafiUserDeposit contract
    function depositEth() override external payable onlyLatestContract("stafiUserDeposit", msg.sender) {
        // Emit ether deposited event
        emit EtherDeposited(msg.sender, msg.value, block.timestamp);
    }

    function EthDeposit() private view returns (IDepositContract) {
        return IDepositContract(getContractAddress("ethDeposit"));
    }

    function StafiNetworkSettings() private view returns (IStafiNetworkSettings) {
        return IStafiNetworkSettings(getContractAddress("stafiNetworkSettings"));
    }

    function PubkeySetStorage() public view returns (IPubkeySetStorage) {
        return IPubkeySetStorage(getContractAddress("pubkeySetStorage"));
    }

    // Get the number of pubkeys owned by a light node
    function getLightNodePubkeyCount(address _nodeAddress) override public view returns (uint256) {
        return PubkeySetStorage().getCount(keccak256(abi.encodePacked("lightNode.pubkeys.index", _nodeAddress)));
    }

    // Get a light node pubkey by index
    function getLightNodePubkeyAt(address _nodeAddress, uint256 _index) override public view returns (bytes memory) {
        return PubkeySetStorage().getItem(keccak256(abi.encodePacked("lightNode.pubkeys.index", _nodeAddress)), _index);
    }
    
    // Get a light node pubkey status
    function getLightNodePubkeyStatus(bytes calldata _validatorPubkey) override public view returns (uint256) {
        return getUint(keccak256(abi.encodePacked("lightNode.pubkey.status", _validatorPubkey)));
    }

    // Set a light node pubkey status
    function _setLightNodePubkeyStatus(bytes calldata _validatorPubkey, uint256 _status) private {
        setUint(keccak256(abi.encodePacked("lightNode.pubkey.status", _validatorPubkey)), _status);
        
        emit SetPubkeyStatus(_validatorPubkey, _status);
    }

    function setLightNodePubkeyStatus(bytes calldata _validatorPubkey, uint256 _status) public onlySuperUser {
        _setLightNodePubkeyStatus(_validatorPubkey, _status);
    }

    // Node deposits currently amount
    function getCurrentNodeDepositAmount() public view returns (uint256) {
        return getUint("settings.node.deposit.amount");
    }

    function getLightNodeDepositEnabled() public view returns (bool) {
        return getBoolS("settings.lightNode.deposit.enabled");
    }
    
    function getPubkeyVoted(bytes calldata _validatorPubkey, address user) public view returns (bool) {
        return getBool(keccak256(abi.encodePacked("lightNode.memberVotes.", _validatorPubkey, user)));
    }

    function setLightNodeDepositEnabled(bool _value) public onlySuperUser {
        setBoolS("settings.lightNode.deposit.enabled", _value);
    }

    function deposit(bytes[] calldata _validatorPubkeys, bytes[] calldata _validatorSignatures, bytes32[] calldata _depositDataRoots) override external payable onlyLatestContract("stafiLightNode", address(this)) {
        require(getLightNodeDepositEnabled(), "light node deposits are currently disabled");
        uint256 len = _validatorPubkeys.length;
        require(len == _validatorSignatures.length && len == _depositDataRoots.length, "params len err");
        require(msg.value == len.mul(getCurrentNodeDepositAmount()), "msg value not match");

        for (uint256 i = 0; i < len; i++) {
            _deposit(_validatorPubkeys[i], _validatorSignatures[i], _depositDataRoots[i]);
        }
    }

    function stake(bytes[] calldata _validatorPubkeys, bytes[] calldata _validatorSignatures, bytes32[] calldata _depositDataRoots) override external onlyLatestContract("stafiLightNode", address(this)) {
        require(_validatorPubkeys.length == _validatorSignatures.length && _validatorPubkeys.length == _depositDataRoots.length, "params len err");
        // Load contracts
        IStafiUserDeposit stafiUserDeposit = IStafiUserDeposit(getContractAddress("stafiUserDeposit"));
        stafiUserDeposit.withdrawExcessBalanceForLightNode(_validatorPubkeys.length.mul(uint256(32 ether).sub(getCurrentNodeDepositAmount())));

        for (uint256 i = 0; i < _validatorPubkeys.length; i++) {
            _stake(_validatorPubkeys[i], _validatorSignatures[i], _depositDataRoots[i]);
        }
    }

    function offBoard(bytes calldata _validatorPubkey) override external onlyLatestContract("stafiLightNode", address(this)) {
        setAndCheckNodePubkeyInOffBoard(_validatorPubkey);

        emit OffBoarded(msg.sender, _validatorPubkey);
    }

    function provideNodeDepositToken(bytes calldata _validatorPubkey) override external payable onlyLatestContract("stafiLightNode", address(this)) {
        require(msg.value == getCurrentNodeDepositAmount(), "msg value not match");
        // check status
        require(getLightNodePubkeyStatus(_validatorPubkey) == PUBKEY_STATUS_OFFBOARD, "pubkey status unmatch");
        
        IStafiEther stafiEther = IStafiEther(getContractAddress("stafiEther"));
        stafiEther.depositEther{value: msg.value}();

        // set pubkey status
        _setLightNodePubkeyStatus(_validatorPubkey, PUBKEY_STATUS_CANWITHDRAW);
    }
    
    function withdrawNodeDepositToken(bytes calldata _validatorPubkey) override external onlyLatestContract("stafiLightNode", address(this)) {
        // check status
        require(getLightNodePubkeyStatus(_validatorPubkey) == PUBKEY_STATUS_CANWITHDRAW, "pubkey status unmatch");
        // check owner
        require(PubkeySetStorage().getIndexOf(keccak256(abi.encodePacked("lightNode.pubkeys.index", msg.sender)), _validatorPubkey) >= 0, "not pubkey owner");

        IStafiEther stafiEther = IStafiEther(getContractAddress("stafiEther"));
        stafiEther.withdrawEther(getCurrentNodeDepositAmount());

        // set pubkey status
        _setLightNodePubkeyStatus(_validatorPubkey, PUBKEY_STATUS_WITHDRAWED);

        (bool success,) = (msg.sender).call{value: getCurrentNodeDepositAmount()}("");
        require(success, "transferr failed");
    }

    function _deposit(bytes calldata _validatorPubkey, bytes calldata _validatorSignature, bytes32 _depositDataRoot) private {
        setAndCheckNodePubkeyInDeposit(_validatorPubkey);
        // Send staking deposit to casper
        EthDeposit().deposit{value: getCurrentNodeDepositAmount()}(_validatorPubkey, StafiNetworkSettings().getWithdrawalCredentials(), _validatorSignature, _depositDataRoot);

        emit Deposited(msg.sender, _validatorPubkey, _validatorSignature, getCurrentNodeDepositAmount());
    }

    function _stake(bytes calldata _validatorPubkey, bytes calldata _validatorSignature, bytes32 _depositDataRoot) private {
        setAndCheckNodePubkeyInStake(_validatorPubkey);
        // Send staking deposit to casper
        EthDeposit().deposit{value: uint256(32 ether).sub(getCurrentNodeDepositAmount())}(_validatorPubkey, StafiNetworkSettings().getWithdrawalCredentials(), _validatorSignature, _depositDataRoot);

        emit Staked(msg.sender, _validatorPubkey);
    }

    // Set and check a node's validator pubkey
    function setAndCheckNodePubkeyInDeposit(bytes calldata _pubkey) private {
        // check pubkey of stakingpools
        require(getAddress(keccak256(abi.encodePacked("validator.stakingpool", _pubkey))) == address(0x0), "stakingpool pubkey exists");
        // check pubkey of superNodes
        require(getUint(keccak256(abi.encodePacked("superNode.pubkey.status", _pubkey))) == PUBKEY_STATUS_UNINITIAL, "super Node pubkey exists");

        // check status
        require(getLightNodePubkeyStatus(_pubkey) == PUBKEY_STATUS_UNINITIAL, "pubkey status unmatch");
        // set pubkey status
        _setLightNodePubkeyStatus(_pubkey, PUBKEY_STATUS_INITIAL);
        // add pubkey to set
        PubkeySetStorage().addItem(keccak256(abi.encodePacked("lightNode.pubkeys.index", msg.sender)), _pubkey);
    }
    
    // Set and check a node's validator pubkey
    function setAndCheckNodePubkeyInStake(bytes calldata _pubkey) private {
        // check status
        require(getLightNodePubkeyStatus(_pubkey) == PUBKEY_STATUS_MATCH, "pubkey status unmatch");
        // check owner
        require(PubkeySetStorage().getIndexOf(keccak256(abi.encodePacked("lightNode.pubkeys.index", msg.sender)), _pubkey) >= 0, "not pubkey owner");

        // set pubkey status
        _setLightNodePubkeyStatus(_pubkey, PUBKEY_STATUS_STAKING);
    }
    
    // Set and check a node's validator pubkey
    function setAndCheckNodePubkeyInOffBoard(bytes calldata _pubkey) private {
        // check status
        require(getLightNodePubkeyStatus(_pubkey) == PUBKEY_STATUS_MATCH, "pubkey status unmatch");
        // check owner
        require(PubkeySetStorage().getIndexOf(keccak256(abi.encodePacked("lightNode.pubkeys.index", msg.sender)), _pubkey) >= 0, "not pubkey owner");
        
        // set pubkey status
        _setLightNodePubkeyStatus(_pubkey, PUBKEY_STATUS_OFFBOARD);
    }

    // Only accepts calls from trusted (oracle) nodes
    function voteWithdrawCredentials(bytes[] calldata _pubkeys, bool[] calldata _matchs) override external onlyLatestContract("stafiLightNode", address(this)) onlyTrustedNode(msg.sender) {
        require(_pubkeys.length == _matchs.length, "params len err");
        for (uint256 i = 0; i < _pubkeys.length; i++) {
            _voteWithdrawCredentials(_pubkeys[i], _matchs[i]);
        }
    }
    function _voteWithdrawCredentials(bytes calldata _pubkey, bool _match) private {
        // Check & update node vote status
        require(!getBool(keccak256(abi.encodePacked("lightNode.memberVotes.", _pubkey, msg.sender))), "Member has already voted to withdrawCredentials");
        setBool(keccak256(abi.encodePacked("lightNode.memberVotes.", _pubkey, msg.sender)), true);
       
        // Increment votes count
        uint256 totalVotes = getUint(keccak256(abi.encodePacked("lightNode.totalVotes", _pubkey, _match)));
        totalVotes = totalVotes.add(1);
        setUint(keccak256(abi.encodePacked("lightNode.totalVotes", _pubkey, _match)), totalVotes);
       
        // Check count and set status
        uint256 calcBase = 1 ether;
        IStafiNodeManager stafiNodeManager = IStafiNodeManager(getContractAddress("stafiNodeManager"));
        if (getLightNodePubkeyStatus(_pubkey) == PUBKEY_STATUS_INITIAL &&  calcBase.mul(totalVotes) >= stafiNodeManager.getTrustedNodeCount().mul(StafiNetworkSettings().getNodeConsensusThreshold())) {
            _setLightNodePubkeyStatus(_pubkey, _match ? PUBKEY_STATUS_MATCH : PUBKEY_STATUS_UNMATCH);
        }
    }
}

File 2 of 12 : StafiBase.sol
pragma solidity 0.7.6;

// SPDX-License-Identifier: GPL-3.0-only

import "./interfaces/storage/IStafiStorage.sol";

abstract contract StafiBase {

    // Version of the contract
    uint8 public version;

    // The main storage contract where primary persistant storage is maintained
    IStafiStorage stafiStorage = IStafiStorage(0);


    /**
    * @dev Throws if called by any sender that doesn't match a network contract
    */
    modifier onlyLatestNetworkContract() {
        require(getBool(keccak256(abi.encodePacked("contract.exists", msg.sender))), "Invalid or outdated network contract");
        _;
    }


    /**
    * @dev Throws if called by any sender that doesn't match one of the supplied contract or is the latest version of that contract
    */
    modifier onlyLatestContract(string memory _contractName, address _contractAddress) {
        require(_contractAddress == getAddress(keccak256(abi.encodePacked("contract.address", _contractName))), "Invalid or outdated contract");
        _;
    }


    /**
    * @dev Throws if called by any sender that isn't a trusted node
    */
    modifier onlyTrustedNode(address _nodeAddress) {
        require(getBool(keccak256(abi.encodePacked("node.trusted", _nodeAddress))), "Invalid trusted node");
        _;
    }
    
    /**
    * @dev Throws if called by any sender that isn't a super node
    */
    modifier onlySuperNode(address _nodeAddress) {
        require(getBool(keccak256(abi.encodePacked("node.super", _nodeAddress))), "Invalid super node");
        _;
    }


    /**
    * @dev Throws if called by any sender that isn't a registered staking pool
    */
    modifier onlyRegisteredStakingPool(address _stakingPoolAddress) {
        require(getBool(keccak256(abi.encodePacked("stakingpool.exists", _stakingPoolAddress))), "Invalid staking pool");
        _;
    }


    /**
    * @dev Throws if called by any account other than the owner.
    */
    modifier onlyOwner() {
        require(roleHas("owner", msg.sender), "Account is not the owner");
        _;
    }


    /**
    * @dev Modifier to scope access to admins
    */
    modifier onlyAdmin() {
        require(roleHas("admin", msg.sender), "Account is not an admin");
        _;
    }


    /**
    * @dev Modifier to scope access to admins
    */
    modifier onlySuperUser() {
        require(roleHas("owner", msg.sender) || roleHas("admin", msg.sender), "Account is not a super user");
        _;
    }


    /**
    * @dev Reverts if the address doesn't have this role
    */
    modifier onlyRole(string memory _role) {
        require(roleHas(_role, msg.sender), "Account does not match the specified role");
        _;
    }


    /// @dev Set the main Storage address
    constructor(address _stafiStorageAddress) {
        // Update the contract address
        stafiStorage = IStafiStorage(_stafiStorageAddress);
    }


    /// @dev Get the address of a network contract by name
    function getContractAddress(string memory _contractName) internal view returns (address) {
        // Get the current contract address
        address contractAddress = getAddress(keccak256(abi.encodePacked("contract.address", _contractName)));
        // Check it
        require(contractAddress != address(0x0), "Contract not found");
        // Return
        return contractAddress;
    }


    /// @dev Get the name of a network contract by address
    function getContractName(address _contractAddress) internal view returns (string memory) {
        // Get the contract name
        string memory contractName = getString(keccak256(abi.encodePacked("contract.name", _contractAddress)));
        // Check it
        require(keccak256(abi.encodePacked(contractName)) != keccak256(abi.encodePacked("")), "Contract not found");
        // Return
        return contractName;
    }


    /// @dev Storage get methods
    function getAddress(bytes32 _key) internal view returns (address) { return stafiStorage.getAddress(_key); }
    function getUint(bytes32 _key) internal view returns (uint256) { return stafiStorage.getUint(_key); }
    function getString(bytes32 _key) internal view returns (string memory) { return stafiStorage.getString(_key); }
    function getBytes(bytes32 _key) internal view returns (bytes memory) { return stafiStorage.getBytes(_key); }
    function getBool(bytes32 _key) internal view returns (bool) { return stafiStorage.getBool(_key); }
    function getInt(bytes32 _key) internal view returns (int256) { return stafiStorage.getInt(_key); }
    function getBytes32(bytes32 _key) internal view returns (bytes32) { return stafiStorage.getBytes32(_key); }
    function getAddressS(string memory _key) internal view returns (address) { return stafiStorage.getAddress(keccak256(abi.encodePacked(_key))); }
    function getUintS(string memory _key) internal view returns (uint256) { return stafiStorage.getUint(keccak256(abi.encodePacked(_key))); }
    function getStringS(string memory _key) internal view returns (string memory) { return stafiStorage.getString(keccak256(abi.encodePacked(_key))); }
    function getBytesS(string memory _key) internal view returns (bytes memory) { return stafiStorage.getBytes(keccak256(abi.encodePacked(_key))); }
    function getBoolS(string memory _key) internal view returns (bool) { return stafiStorage.getBool(keccak256(abi.encodePacked(_key))); }
    function getIntS(string memory _key) internal view returns (int256) { return stafiStorage.getInt(keccak256(abi.encodePacked(_key))); }
    function getBytes32S(string memory _key) internal view returns (bytes32) { return stafiStorage.getBytes32(keccak256(abi.encodePacked(_key))); }

    /// @dev Storage set methods
    function setAddress(bytes32 _key, address _value) internal { stafiStorage.setAddress(_key, _value); }
    function setUint(bytes32 _key, uint256 _value) internal { stafiStorage.setUint(_key, _value); }
    function setString(bytes32 _key, string memory _value) internal { stafiStorage.setString(_key, _value); }
    function setBytes(bytes32 _key, bytes memory _value) internal { stafiStorage.setBytes(_key, _value); }
    function setBool(bytes32 _key, bool _value) internal { stafiStorage.setBool(_key, _value); }
    function setInt(bytes32 _key, int256 _value) internal { stafiStorage.setInt(_key, _value); }
    function setBytes32(bytes32 _key, bytes32 _value) internal { stafiStorage.setBytes32(_key, _value); }
    function setAddressS(string memory _key, address _value) internal { stafiStorage.setAddress(keccak256(abi.encodePacked(_key)), _value); }
    function setUintS(string memory _key, uint256 _value) internal { stafiStorage.setUint(keccak256(abi.encodePacked(_key)), _value); }
    function setStringS(string memory _key, string memory _value) internal { stafiStorage.setString(keccak256(abi.encodePacked(_key)), _value); }
    function setBytesS(string memory _key, bytes memory _value) internal { stafiStorage.setBytes(keccak256(abi.encodePacked(_key)), _value); }
    function setBoolS(string memory _key, bool _value) internal { stafiStorage.setBool(keccak256(abi.encodePacked(_key)), _value); }
    function setIntS(string memory _key, int256 _value) internal { stafiStorage.setInt(keccak256(abi.encodePacked(_key)), _value); }
    function setBytes32S(string memory _key, bytes32 _value) internal { stafiStorage.setBytes32(keccak256(abi.encodePacked(_key)), _value); }

    /// @dev Storage delete methods
    function deleteAddress(bytes32 _key) internal { stafiStorage.deleteAddress(_key); }
    function deleteUint(bytes32 _key) internal { stafiStorage.deleteUint(_key); }
    function deleteString(bytes32 _key) internal { stafiStorage.deleteString(_key); }
    function deleteBytes(bytes32 _key) internal { stafiStorage.deleteBytes(_key); }
    function deleteBool(bytes32 _key) internal { stafiStorage.deleteBool(_key); }
    function deleteInt(bytes32 _key) internal { stafiStorage.deleteInt(_key); }
    function deleteBytes32(bytes32 _key) internal { stafiStorage.deleteBytes32(_key); }
    function deleteAddressS(string memory _key) internal { stafiStorage.deleteAddress(keccak256(abi.encodePacked(_key))); }
    function deleteUintS(string memory _key) internal { stafiStorage.deleteUint(keccak256(abi.encodePacked(_key))); }
    function deleteStringS(string memory _key) internal { stafiStorage.deleteString(keccak256(abi.encodePacked(_key))); }
    function deleteBytesS(string memory _key) internal { stafiStorage.deleteBytes(keccak256(abi.encodePacked(_key))); }
    function deleteBoolS(string memory _key) internal { stafiStorage.deleteBool(keccak256(abi.encodePacked(_key))); }
    function deleteIntS(string memory _key) internal { stafiStorage.deleteInt(keccak256(abi.encodePacked(_key))); }
    function deleteBytes32S(string memory _key) internal { stafiStorage.deleteBytes32(keccak256(abi.encodePacked(_key))); }


    /**
    * @dev Check if an address has this role
    */
    function roleHas(string memory _role, address _address) internal view returns (bool) {
        return getBool(keccak256(abi.encodePacked("access.role", _role, _address)));
    }

}

File 3 of 12 : IStafiLightNode.sol
pragma solidity 0.7.6;
pragma abicoder v2;
// SPDX-License-Identifier: GPL-3.0-only

interface IStafiLightNode {
    function depositEth() external payable;
    function deposit(bytes[] calldata _validatorPubkeys, bytes[] calldata _validatorSignatures, bytes32[] calldata _depositDataRoots) external payable;
    function stake(bytes[] calldata _validatorPubkeys, bytes[] calldata _validatorSignatures, bytes32[] calldata _depositDataRoots) external;
    function offBoard(bytes calldata _validatorPubkey) external;
    function provideNodeDepositToken(bytes calldata _validatorPubkey) external payable;
    function withdrawNodeDepositToken(bytes calldata _validatorPubkey) external;
    function getLightNodePubkeyCount(address _nodeAddress) external view returns (uint256);
    function getLightNodePubkeyAt(address _nodeAddress, uint256 _index) external view returns (bytes memory);
    function getLightNodePubkeyStatus(bytes calldata _validatorPubkey) external view returns (uint256);
    function voteWithdrawCredentials(bytes[] calldata _pubkey, bool[] calldata _match) external;
}

File 4 of 12 : IStafiNodeManager.sol
pragma solidity 0.7.6;

// SPDX-License-Identifier: GPL-3.0-only

interface IStafiNodeManager {
    function getNodeCount() external view returns (uint256);
    function getNodeAt(uint256 _index) external view returns (address);
    function getTrustedNodeCount() external view returns (uint256);
    function getTrustedNodeAt(uint256 _index) external view returns (address);
    function getSuperNodeCount() external view returns (uint256);
    function getSuperNodeAt(uint256 _index) external view returns (address);
    function getNodeExists(address _nodeAddress) external view returns (bool);
    function getNodeTrusted(address _nodeAddress) external view returns (bool);
    function getSuperNodeExists(address _nodeAddress) external view returns (bool);
    function registerNode(address _nodeAddress) external;
    function setNodeTrusted(address _nodeAddress, bool _trusted) external;
    function setNodeSuper(address _nodeAddress, bool _super) external;
}

File 5 of 12 : IStafiUserDeposit.sol
pragma solidity 0.7.6;

// SPDX-License-Identifier: GPL-3.0-only

interface IStafiUserDeposit {
    function getBalance() external view returns (uint256);
    function getExcessBalance() external view returns (uint256);
    function deposit() external payable;
    function recycleDissolvedDeposit() external payable;
    function recycleWithdrawnDeposit() external payable;
    function recycleDistributorDeposit() external payable;
    function assignDeposits() external;
    function withdrawExcessBalance(uint256 _amount) external;
    function withdrawExcessBalanceForSuperNode(uint256 _amount) external;
    function withdrawExcessBalanceForLightNode(uint256 _amount) external;
}

File 6 of 12 : IDepositContract.sol
pragma solidity 0.7.6;

// SPDX-License-Identifier: GPL-3.0-only

interface IDepositContract {
    function deposit(bytes calldata _pubkey, bytes calldata _withdrawalCredentials, bytes calldata _signature, bytes32 _depositDataRoot) external payable;
}

File 7 of 12 : IStafiNetworkSettings.sol
pragma solidity 0.7.6;

// SPDX-License-Identifier: GPL-3.0-only

interface IStafiNetworkSettings {
    function getNodeConsensusThreshold() external view returns (uint256);
    function getSubmitBalancesEnabled() external view returns (bool);
    function getProcessWithdrawalsEnabled() external view returns (bool);
    function getNodeFee() external view returns (uint256);
    function getPlatformFee() external view returns (uint256);
    function getNodeRefundRatio() external view returns (uint256);
    function getNodeTrustedRefundRatio() external view returns (uint256);
    function getWithdrawalCredentials() external view returns (bytes memory);
    function getSuperNodePubkeyLimit() external view returns (uint256);
}

File 8 of 12 : IPubkeySetStorage.sol
pragma solidity 0.7.6;

// SPDX-License-Identifier: GPL-3.0-only

interface IPubkeySetStorage {
    function getCount(bytes32 _key) external view returns (uint256);
    function getItem(bytes32 _key, uint256 _index) external view returns (bytes memory);
    function getIndexOf(bytes32 _key, bytes calldata _value) external view returns (int256);
    function addItem(bytes32 _key, bytes memory _value) external;
    function removeItem(bytes32 _key, bytes calldata _value) external;
}

File 9 of 12 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

File 10 of 12 : IStafiEtherWithdrawer.sol
pragma solidity 0.7.6;

// SPDX-License-Identifier: GPL-3.0-only

interface IStafiEtherWithdrawer {
    function receiveEtherWithdrawal() external payable;
}

File 11 of 12 : IStafiEther.sol
pragma solidity 0.7.6;

// SPDX-License-Identifier: GPL-3.0-only

interface IStafiEther {
    function balanceOf(address _contractAddress) external view returns (uint256);
    function depositEther() external payable;
    function withdrawEther(uint256 _amount) external;
}

File 12 of 12 : IStafiStorage.sol
pragma solidity 0.7.6;

// SPDX-License-Identifier: GPL-3.0-only

interface IStafiStorage {

    // Getters
    function getAddress(bytes32 _key) external view returns (address);
    function getUint(bytes32 _key) external view returns (uint);
    function getString(bytes32 _key) external view returns (string memory);
    function getBytes(bytes32 _key) external view returns (bytes memory);
    function getBool(bytes32 _key) external view returns (bool);
    function getInt(bytes32 _key) external view returns (int);
    function getBytes32(bytes32 _key) external view returns (bytes32);

    // Setters
    function setAddress(bytes32 _key, address _value) external;
    function setUint(bytes32 _key, uint _value) external;
    function setString(bytes32 _key, string calldata _value) external;
    function setBytes(bytes32 _key, bytes calldata _value) external;
    function setBool(bytes32 _key, bool _value) external;
    function setInt(bytes32 _key, int _value) external;
    function setBytes32(bytes32 _key, bytes32 _value) external;

    // Deleters
    function deleteAddress(bytes32 _key) external;
    function deleteUint(bytes32 _key) external;
    function deleteString(bytes32 _key) external;
    function deleteBytes(bytes32 _key) external;
    function deleteBool(bytes32 _key) external;
    function deleteInt(bytes32 _key) external;
    function deleteBytes32(bytes32 _key) external;

}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_stafiStorageAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"node","type":"address"},{"indexed":false,"internalType":"bytes","name":"pubkey","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"validatorSignature","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"EtherDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"node","type":"address"},{"indexed":false,"internalType":"bytes","name":"pubkey","type":"bytes"}],"name":"OffBoarded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"pubkey","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"status","type":"uint256"}],"name":"SetPubkeyStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"node","type":"address"},{"indexed":false,"internalType":"bytes","name":"pubkey","type":"bytes"}],"name":"Staked","type":"event"},{"inputs":[],"name":"PUBKEY_STATUS_CANWITHDRAW","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBKEY_STATUS_INITIAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBKEY_STATUS_MATCH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBKEY_STATUS_OFFBOARD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBKEY_STATUS_STAKING","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBKEY_STATUS_UNINITIAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBKEY_STATUS_UNMATCH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBKEY_STATUS_WITHDRAWED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PubkeySetStorage","outputs":[{"internalType":"contract IPubkeySetStorage","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_validatorPubkeys","type":"bytes[]"},{"internalType":"bytes[]","name":"_validatorSignatures","type":"bytes[]"},{"internalType":"bytes32[]","name":"_depositDataRoots","type":"bytes32[]"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"depositEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getCurrentNodeDepositAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLightNodeDepositEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_nodeAddress","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getLightNodePubkeyAt","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_nodeAddress","type":"address"}],"name":"getLightNodePubkeyCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_validatorPubkey","type":"bytes"}],"name":"getLightNodePubkeyStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_validatorPubkey","type":"bytes"},{"internalType":"address","name":"user","type":"address"}],"name":"getPubkeyVoted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_validatorPubkey","type":"bytes"}],"name":"offBoard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_validatorPubkey","type":"bytes"}],"name":"provideNodeDepositToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"receiveEtherWithdrawal","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setLightNodeDepositEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_validatorPubkey","type":"bytes"},{"internalType":"uint256","name":"_status","type":"uint256"}],"name":"setLightNodePubkeyStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_validatorPubkeys","type":"bytes[]"},{"internalType":"bytes[]","name":"_validatorSignatures","type":"bytes[]"},{"internalType":"bytes32[]","name":"_depositDataRoots","type":"bytes32[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_pubkeys","type":"bytes[]"},{"internalType":"bool[]","name":"_matchs","type":"bool[]"}],"name":"voteWithdrawCredentials","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_validatorPubkey","type":"bytes"}],"name":"withdrawNodeDepositToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260008060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200005257600080fd5b5060405162004a5638038062004a568339818101604052810190620000789190620000f4565b8080600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060016000806101000a81548160ff021916908360ff160217905550506200016e565b600081519050620000ee8162000154565b92915050565b6000602082840312156200010757600080fd5b60006200011784828501620000dd565b91505092915050565b60006200012d8262000134565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6200015f8162000120565b81146200016b57600080fd5b50565b6148d8806200017e6000396000f3fe6080604052600436106101815760003560e01c806390d76417116100d1578063adf1d8d61161008a578063ca2b87af11610064578063ca2b87af14610522578063ccdf1d791461054b578063d46221f914610588578063eee1fa44146105a457610181565b8063adf1d8d614610491578063ae3e885a146104ba578063ba7fe814146104e557610181565b806390d76417146103815780639532e08a146103ac5780639630f63c146103d7578063a32cb34114610400578063a37212cb1461042b578063a4b4334b1461046857610181565b806340ce18a01161013e57806364f14dba1161011857806364f14dba146102d757806368d25fe81461030257806383f3f0861461032d57806384d9eb7c1461035857610181565b806340ce18a014610277578063439370b1146102a257806354fd4d50146102ac57610181565b806309ba5933146101865780630a019eaf146101b157806318582e28146101bb5780631e8bc826146101f85780633c4bc635146102235780633f25522d1461024c575b600080fd5b34801561019257600080fd5b5061019b6105c0565b6040516101a8919061450b565b60405180910390f35b6101b96105c5565b005b3480156101c757600080fd5b506101e260048036038101906101dd9190613a05565b6108bd565b6040516101ef919061428d565b60405180910390f35b34801561020457600080fd5b5061020d6108fb565b60405161021a919061450b565b60405180910390f35b34801561022f57600080fd5b5061024a600480360381019061024591906139c0565b610900565b005b34801561025857600080fd5b50610261610d3d565b60405161026e919061450b565b60405180910390f35b34801561028357600080fd5b5061028c610d42565b604051610299919061450b565b60405180910390f35b6102aa610d47565b005b3480156102b857600080fd5b506102c1610f14565b6040516102ce919061454f565b60405180910390f35b3480156102e357600080fd5b506102ec610f25565b6040516102f9919061450b565b60405180910390f35b34801561030e57600080fd5b50610317610f2a565b604051610324919061450b565b60405180910390f35b34801561033957600080fd5b50610342610f2f565b60405161034f919061450b565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a91906139c0565b610f5f565b005b34801561038d57600080fd5b50610396611123565b6040516103a391906143d0565b60405180910390f35b3480156103b857600080fd5b506103c1611168565b6040516103ce919061450b565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f99190613a5d565b61116d565b005b34801561040c57600080fd5b50610415611274565b604051610422919061428d565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d91906139c0565b61129c565b60405161045f919061450b565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a919061387e565b6112d7565b005b34801561049d57600080fd5b506104b860048036038101906104b39190613997565b6115e7565b005b3480156104c657600080fd5b506104cf611703565b6040516104dc919061450b565b60405180910390f35b3480156104f157600080fd5b5061050c60048036038101906105079190613842565b611708565b60405161051991906143ae565b60405180910390f35b34801561052e57600080fd5b50610549600480360381019061054491906138f3565b6117cf565b005b34801561055757600080fd5b50610572600480360381019061056d9190613819565b611b03565b60405161057f919061450b565b60405180910390f35b6105a2600480360381019061059d91906138f3565b611bc2565b005b6105be60048036038101906105b991906139c0565b611eb3565b005b600481565b6040518060400160405280600e81526020017f73746166694c696768744e6f64650000000000000000000000000000000000008152503061069e8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061065e578051825260208201915060208101905060208303925061063b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461073e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280600a81526020017f7374616669457468657200000000000000000000000000000000000000000000815250336108178260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106107d757805182526020820191506020810190506020830392506107b4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b50505050565b60006108f28484846040516020016108d7939291906140bc565b6040516020818303038152906040528051906020012061222d565b90509392505050565b600681565b6040518060400160405280600e81526020017f73746166694c696768744e6f6465000000000000000000000000000000000000815250306109d98260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106109995780518252602082019150602081019050602083039250610976565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6006610a85858561129c565b14610ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abc906144eb565b60405180910390fd5b6000610acf611123565b73ffffffffffffffffffffffffffffffffffffffff1663606aa8ca33604051602001610afb9190614170565b6040516020818303038152906040528051906020012087876040518463ffffffff1660e01b8152600401610b31939291906142c3565b60206040518083038186803b158015610b4957600080fd5b505afa158015610b5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b819190613af6565b1215610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb99061448b565b60405180910390fd5b6000610c026040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506122e3565b90508073ffffffffffffffffffffffffffffffffffffffff16633bed33ce610c28610f2f565b6040518263ffffffff1660e01b8152600401610c44919061450b565b600060405180830381600087803b158015610c5e57600080fd5b505af1158015610c72573d6000803e3d6000fd5b50505050610c8285856007612436565b60003373ffffffffffffffffffffffffffffffffffffffff16610ca3610f2f565b604051610caf906141ef565b60006040518083038185875af1925050503d8060008114610cec576040519150601f19603f3d011682016040523d82523d6000602084013e610cf1565b606091505b5050905080610d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2c9061446b565b60405180910390fd5b505050505050565b600081565b600381565b6040518060400160405280601081526020017f7374616669557365724465706f7369740000000000000000000000000000000081525033610e208260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310610de05780518252602082019150602081019050602083039250610dbd565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ec0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fef51b4c870b8b0100eae2072e91db01222a303072af3728e58c9d4d2da33127f3442604051610f08929190614526565b60405180910390a25050565b60008054906101000a900460ff1681565b600281565b600781565b6000610f5a7f73657474696e67732e6e6f64652e6465706f7369742e616d6f756e74000000006124a8565b905090565b6040518060400160405280600e81526020017f73746166694c696768744e6f6465000000000000000000000000000000000000815250306110388260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310610ff85780518252602082019150602081019050602083039250610fd5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6110e2848461255e565b7f9d5023d85497e8c264e3b053f8da9415f4db76eb5af3ecef3fe953fe9f98147033858560405161111593929190614204565b60405180910390a150505050565b60006111636040518060400160405280601081526020017f7075626b657953657453746f72616765000000000000000000000000000000008152506122e3565b905090565b600581565b6111ac6040518060400160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250336126b7565b806111f257506111f16040518060400160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250336126b7565b5b611264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b61126f838383612436565b505050565b600061129760405180606001604052806022815260200161488160229139612784565b905090565b60006112cf83836040516020016112b49291906141cb565b604051602081830303815290604052805190602001206124a8565b905092915050565b6040518060400160405280600e81526020017f73746166694c696768744e6f6465000000000000000000000000000000000000815250306113b08260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611370578051825260208201915060208101905060208303925061134d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b336114c18160405160200180807f6e6f64652e747275737465640000000000000000000000000000000000000000815250600c018273ffffffffffffffffffffffffffffffffffffffff1660601b81526014019150506040516020818303038152906040528051906020012061222d565b611533576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f496e76616c69642074727573746564206e6f646500000000000000000000000081525060200191505060405180910390fd5b84849050878790501461157b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611572906144ab565b60405180910390fd5b60005b878790508110156115dd576115d088888381811061159857fe5b90506020028101906115aa919061456a565b8888858181106115b657fe5b90506020020160208101906115cb9190613997565b6128ab565b808060010191505061157e565b5050505050505050565b6116266040518060400160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250336126b7565b8061166c575061166b6040518060400160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250336126b7565b5b6116de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b6117006040518060600160405280602281526020016148816022913982612b88565b50565b600181565b6060611712611123565b73ffffffffffffffffffffffffffffffffffffffff1663f3358a3a8460405160200161173e919061414a565b60405160208183030381529060405280519060200120846040518363ffffffff1660e01b81526004016117729291906142f5565b60006040518083038186803b15801561178a57600080fd5b505afa15801561179e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906117c79190613ab5565b905092915050565b6040518060400160405280600e81526020017f73746166694c696768744e6f6465000000000000000000000000000000000000815250306118a88260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106118685780518252602082019150602081019050602083039250611845565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b858590508888905014801561196257508383905088889050145b6119a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611998906144ab565b60405180910390fd5b60006119e16040518060400160405280601081526020017f7374616669557365724465706f736974000000000000000000000000000000008152506122e3565b90508073ffffffffffffffffffffffffffffffffffffffff1663cc88c3c8611a37611a25611a0d610f2f565b6801bc16d674ec800000612c9490919063ffffffff16565b8c8c9050612d1790919063ffffffff16565b6040518263ffffffff1660e01b8152600401611a53919061450b565b600060405180830381600087803b158015611a6d57600080fd5b505af1158015611a81573d6000803e3d6000fd5b5050505060005b89899050811015611af757611aea8a8a83818110611aa257fe5b9050602002810190611ab4919061456a565b8a8a85818110611ac057fe5b9050602002810190611ad2919061456a565b8a8a87818110611ade57fe5b90506020020135612d9d565b8080600101915050611a88565b50505050505050505050565b6000611b0d611123565b73ffffffffffffffffffffffffffffffffffffffff1663c9d6fee983604051602001611b39919061414a565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b8152600401611b6b91906142a8565b60206040518083038186803b158015611b8357600080fd5b505afa158015611b97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbb9190613b1f565b9050919050565b6040518060400160405280600e81526020017f73746166694c696768744e6f646500000000000000000000000000000000000081525030611c9b8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611c5b5780518252602082019150602081019050602083039250611c38565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b611d43611274565b611d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d799061440b565b60405180910390fd5b60008888905090508686905081148015611d9e57508484905081145b611ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd4906144ab565b60405180910390fd5b611df7611de8610f2f565b82612d1790919063ffffffff16565b3414611e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2f9061442b565b60405180910390fd5b60005b81811015611ea757611e9a8a8a83818110611e5257fe5b9050602002810190611e64919061456a565b8a8a85818110611e7057fe5b9050602002810190611e82919061456a565b8a8a87818110611e8e57fe5b90506020020135612f11565b8080600101915050611e3b565b50505050505050505050565b6040518060400160405280600e81526020017f73746166694c696768744e6f646500000000000000000000000000000000000081525030611f8c8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611f4c5780518252602082019150602081019050602083039250611f29565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461202c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b612034610f2f565b3414612075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206c9061442b565b60405180910390fd5b6005612081858561129c565b146120c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b8906144eb565b60405180910390fd5b60006121016040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506122e3565b90508073ffffffffffffffffffffffffffffffffffffffff166398ea5fca346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561214b57600080fd5b505af115801561215f573d6000803e3d6000fd5b505050505061217085856006612436565b5050505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166321f8a721836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156121eb57600080fd5b505afa1580156121ff573d6000803e3d6000fd5b505050506040513d602081101561221557600080fd5b81019080805190602001909291905050509050919050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156122a157600080fd5b505afa1580156122b5573d6000803e3d6000fd5b505050506040513d60208110156122cb57600080fd5b81019080805190602001909291905050509050919050565b6000806123888360405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106123485780518252602082019150602081019050602083039250612325565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561242d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e7472616374206e6f7420666f756e64000000000000000000000000000081525060200191505060405180910390fd5b80915050919050565b612468838360405160200161244c9291906141cb565b6040516020818303038152906040528051906020012082613077565b7fc581330a67ddadcf62d06e14db41c85bb45910369cedad649390e6dd2a9373c883838360405161249b9392919061437c565b60405180910390a1505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561251c57600080fd5b505afa158015612530573d6000803e3d6000fd5b505050506040513d602081101561254657600080fd5b81019080805190602001909291905050509050919050565b600261256a838361129c565b146125aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a1906144eb565b60405180910390fd5b60006125b4611123565b73ffffffffffffffffffffffffffffffffffffffff1663606aa8ca336040516020016125e09190614170565b6040516020818303038152906040528051906020012085856040518463ffffffff1660e01b8152600401612616939291906142c3565b60206040518083038186803b15801561262e57600080fd5b505afa158015612642573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126669190613af6565b12156126a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269e9061448b565b60405180910390fd5b6126b382826005612436565b5050565b600061277c838360405160200180807f6163636573732e726f6c65000000000000000000000000000000000000000000815250600b0183805190602001908083835b6020831061271c57805182526020820191506020810190506020830392506126f9565b6001836020036101000a0380198251168184511680821785525050505050509050018273ffffffffffffffffffffffffffffffffffffffff1660601b8152601401925050506040516020818303038152906040528051906020012061222d565b905092915050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040516020018082805190602001908083835b602083106127fa57805182526020820191506020810190506020830392506127d7565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561286957600080fd5b505afa15801561287d573d6000803e3d6000fd5b505050506040513d602081101561289357600080fd5b81019080805190602001909291905050509050919050565b6128de8383336040516020016128c3939291906140f1565b6040516020818303038152906040528051906020012061222d565b1561291e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129159061444b565b60405180910390fd5b612953838333604051602001612936939291906140f1565b604051602081830303815290604052805190602001206001613110565b600061298884848460405160200161296d93929190614196565b604051602081830303815290604052805190602001206124a8565b905061299e6001826131ab90919063ffffffff16565b90506129d48484846040516020016129b893929190614196565b6040516020818303038152906040528051906020012082613077565b6000670de0b6b3a764000090506000612a216040518060400160405280601081526020017f73746166694e6f64654d616e61676572000000000000000000000000000000008152506122e3565b90506001612a2f878761129c565b148015612b615750612b4b612a42613233565b73ffffffffffffffffffffffffffffffffffffffff16631f66e8ed6040518163ffffffff1660e01b815260040160206040518083038186803b158015612a8757600080fd5b505afa158015612a9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612abf9190613b1f565b8273ffffffffffffffffffffffffffffffffffffffff166366e3c0266040518163ffffffff1660e01b815260040160206040518083038186803b158015612b0557600080fd5b505afa158015612b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3d9190613b1f565b612d1790919063ffffffff16565b612b5e8484612d1790919063ffffffff16565b10155b15612b8057612b7f868686612b77576004612b7a565b60025b612436565b5b505050505050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663abfdcced836040516020018082805190602001908083835b60208310612bfd5780518252602082019150602081019050602083039250612bda565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b158015612c7857600080fd5b505af1158015612c8c573d6000803e3d6000fd5b505050505050565b600082821115612d0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b600080831415612d2a5760009050612d97565b6000828402905082848281612d3b57fe5b0414612d92576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806148606021913960400191505060405180910390fd5b809150505b92915050565b612da78585613278565b612daf6133d1565b73ffffffffffffffffffffffffffffffffffffffff166322895118612ded612dd5610f2f565b6801bc16d674ec800000612c9490919063ffffffff16565b8787612df7613233565b73ffffffffffffffffffffffffffffffffffffffff1663563967156040518163ffffffff1660e01b815260040160006040518083038186803b158015612e3c57600080fd5b505afa158015612e50573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612e799190613ab5565b8888886040518863ffffffff1660e01b8152600401612e9d9695949392919061431e565b6000604051808303818588803b158015612eb657600080fd5b505af1158015612eca573d6000803e3d6000fd5b50505050507fb384b282308c431ac3ea7756646550752d3f0dbfb418ef60bfeaf4edc9494815338686604051612f0293929190614204565b60405180910390a15050505050565b612f1b8585613416565b612f236133d1565b73ffffffffffffffffffffffffffffffffffffffff166322895118612f46610f2f565b8787612f50613233565b73ffffffffffffffffffffffffffffffffffffffff1663563967156040518163ffffffff1660e01b815260040160006040518083038186803b158015612f9557600080fd5b505afa158015612fa9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612fd29190613ab5565b8888886040518863ffffffff1660e01b8152600401612ff69695949392919061431e565b6000604051808303818588803b15801561300f57600080fd5b505af1158015613023573d6000803e3d6000fd5b50505050507f1fc33daf7f37b2e02f49dbee7b9707bddd7c8cef1f08deff23bff3d105e5aa723386868686613056610f2f565b60405161306896959493929190614236565b60405180910390a15050505050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a83836040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b1580156130f457600080fd5b505af1158015613108573d6000803e3d6000fd5b505050505050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663abfdcced83836040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b15801561318f57600080fd5b505af11580156131a3573d6000803e3d6000fd5b505050505050565b600080828401905083811015613229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006132736040518060400160405280601481526020017f73746166694e6574776f726b53657474696e67730000000000000000000000008152506122e3565b905090565b6002613284838361129c565b146132c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132bb906144eb565b60405180910390fd5b60006132ce611123565b73ffffffffffffffffffffffffffffffffffffffff1663606aa8ca336040516020016132fa9190614170565b6040516020818303038152906040528051906020012085856040518463ffffffff1660e01b8152600401613330939291906142c3565b60206040518083038186803b15801561334857600080fd5b505afa15801561335c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133809190613af6565b12156133c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b89061448b565b60405180910390fd5b6133cd82826003612436565b5050565b60006134116040518060400160405280600a81526020017f6574684465706f736974000000000000000000000000000000000000000000008152506122e3565b905090565b600073ffffffffffffffffffffffffffffffffffffffff1661345f8383604051602001613444929190614126565b60405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff16146134b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ac906144cb565b60405180910390fd5b60006134e883836040516020016134cd929190614098565b604051602081830303815290604052805190602001206124a8565b14613528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351f906143eb565b60405180910390fd5b6000613534838361129c565b14613574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161356b906144eb565b60405180910390fd5b61358082826001612436565b613588611123565b73ffffffffffffffffffffffffffffffffffffffff16637ef16264336040516020016135b49190614170565b6040516020818303038152906040528051906020012084846040518463ffffffff1660e01b81526004016135ea939291906142c3565b600060405180830381600087803b15801561360457600080fd5b505af1158015613618573d6000803e3d6000fd5b505050505050565b600061363361362e846145f2565b6145c1565b90508281526020810184848401111561364b57600080fd5b613656848285614749565b509392505050565b60008135905061366d81614803565b92915050565b60008083601f84011261368557600080fd5b8235905067ffffffffffffffff81111561369e57600080fd5b6020830191508360208202830111156136b657600080fd5b9250929050565b60008083601f8401126136cf57600080fd5b8235905067ffffffffffffffff8111156136e857600080fd5b60208301915083602082028301111561370057600080fd5b9250929050565b60008083601f84011261371957600080fd5b8235905067ffffffffffffffff81111561373257600080fd5b60208301915083602082028301111561374a57600080fd5b9250929050565b6000813590506137608161481a565b92915050565b60008083601f84011261377857600080fd5b8235905067ffffffffffffffff81111561379157600080fd5b6020830191508360018202830111156137a957600080fd5b9250929050565b600082601f8301126137c157600080fd5b81516137d1848260208601613620565b91505092915050565b6000815190506137e981614831565b92915050565b6000813590506137fe81614848565b92915050565b60008151905061381381614848565b92915050565b60006020828403121561382b57600080fd5b60006138398482850161365e565b91505092915050565b6000806040838503121561385557600080fd5b60006138638582860161365e565b9250506020613874858286016137ef565b9150509250929050565b6000806000806040858703121561389457600080fd5b600085013567ffffffffffffffff8111156138ae57600080fd5b6138ba87828801613707565b9450945050602085013567ffffffffffffffff8111156138d957600080fd5b6138e587828801613673565b925092505092959194509250565b6000806000806000806060878903121561390c57600080fd5b600087013567ffffffffffffffff81111561392657600080fd5b61393289828a01613707565b9650965050602087013567ffffffffffffffff81111561395157600080fd5b61395d89828a01613707565b9450945050604087013567ffffffffffffffff81111561397c57600080fd5b61398889828a016136bd565b92509250509295509295509295565b6000602082840312156139a957600080fd5b60006139b784828501613751565b91505092915050565b600080602083850312156139d357600080fd5b600083013567ffffffffffffffff8111156139ed57600080fd5b6139f985828601613766565b92509250509250929050565b600080600060408486031215613a1a57600080fd5b600084013567ffffffffffffffff811115613a3457600080fd5b613a4086828701613766565b93509350506020613a538682870161365e565b9150509250925092565b600080600060408486031215613a7257600080fd5b600084013567ffffffffffffffff811115613a8c57600080fd5b613a9886828701613766565b93509350506020613aab868287016137ef565b9150509250925092565b600060208284031215613ac757600080fd5b600082015167ffffffffffffffff811115613ae157600080fd5b613aed848285016137b0565b91505092915050565b600060208284031215613b0857600080fd5b6000613b16848285016137da565b91505092915050565b600060208284031215613b3157600080fd5b6000613b3f84828501613804565b91505092915050565b613b51816146e0565b82525050565b613b68613b6382614677565b61478e565b82525050565b613b7f613b7a82614665565b61477c565b82525050565b613b8e81614689565b82525050565b613ba5613ba082614689565b6147a0565b82525050565b613bb481614695565b82525050565b6000613bc6838561462d565b9350613bd383858461473a565b613bdc836147d8565b840190509392505050565b6000613bf3838561463e565b9350613c0083858461473a565b82840190509392505050565b6000613c1782614622565b613c21818561462d565b9350613c31818560208601614749565b613c3a816147d8565b840191505092915050565b613c4e816146f2565b82525050565b6000613c6160178361465a565b91507f73757065724e6f64652e7075626b65792e7374617475730000000000000000006000830152601782019050919050565b6000613ca1601883614649565b91507f7375706572204e6f6465207075626b65792065786973747300000000000000006000830152602082019050919050565b6000613ce1602a83614649565b91507f6c69676874206e6f6465206465706f73697473206172652063757272656e746c60008301527f792064697361626c6564000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d47601383614649565b91507f6d73672076616c7565206e6f74206d61746368000000000000000000000000006000830152602082019050919050565b6000613d8760168361465a565b91507f6c696768744e6f64652e6d656d626572566f7465732e000000000000000000006000830152601682019050919050565b6000613dc760158361465a565b91507f76616c696461746f722e7374616b696e67706f6f6c00000000000000000000006000830152601582019050919050565b6000613e0760178361465a565b91507f6c696768744e6f64652e7075626b6579732e696e6465780000000000000000006000830152601782019050919050565b6000613e4760148361465a565b91507f6c696768744e6f64652e746f74616c566f7465730000000000000000000000006000830152601482019050919050565b6000613e87602f83614649565b91507f4d656d6265722068617320616c726561647920766f74656420746f207769746860008301527f6472617743726564656e7469616c7300000000000000000000000000000000006020830152604082019050919050565b6000613eed601083614649565b91507f7472616e7366657272206661696c6564000000000000000000000000000000006000830152602082019050919050565b6000613f2d60178361465a565b91507f6c696768744e6f64652e7075626b65792e7374617475730000000000000000006000830152601782019050919050565b6000613f6d601083614649565b91507f6e6f74207075626b6579206f776e6572000000000000000000000000000000006000830152602082019050919050565b6000613fad60008361463e565b9150600082019050919050565b6000613fc7600e83614649565b91507f706172616d73206c656e206572720000000000000000000000000000000000006000830152602082019050919050565b6000614007601983614649565b91507f7374616b696e67706f6f6c207075626b657920657869737473000000000000006000830152602082019050919050565b6000614047601583614649565b91507f7075626b65792073746174757320756e6d6174636800000000000000000000006000830152602082019050919050565b614083816146c9565b82525050565b614092816146d3565b82525050565b60006140a382613c54565b91506140b0828486613be7565b91508190509392505050565b60006140c782613d7a565b91506140d4828587613be7565b91506140e08284613b6e565b601482019150819050949350505050565b60006140fc82613d7a565b9150614109828587613be7565b91506141158284613b57565b601482019150819050949350505050565b600061413182613dba565b915061413e828486613be7565b91508190509392505050565b600061415582613dfa565b91506141618284613b6e565b60148201915081905092915050565b600061417b82613dfa565b91506141878284613b57565b60148201915081905092915050565b60006141a182613e3a565b91506141ae828587613be7565b91506141ba8284613b94565b600182019150819050949350505050565b60006141d682613f20565b91506141e3828486613be7565b91508190509392505050565b60006141fa82613fa0565b9150819050919050565b60006040820190506142196000830186613b48565b818103602083015261422c818486613bba565b9050949350505050565b600060808201905061424b6000830189613b48565b818103602083015261425e818789613bba565b90508181036040830152614273818587613bba565b9050614282606083018461407a565b979650505050505050565b60006020820190506142a26000830184613b85565b92915050565b60006020820190506142bd6000830184613bab565b92915050565b60006040820190506142d86000830186613bab565b81810360208301526142eb818486613bba565b9050949350505050565b600060408201905061430a6000830185613bab565b614317602083018461407a565b9392505050565b6000608082019050818103600083015261433981888a613bba565b9050818103602083015261434d8187613c0c565b90508181036040830152614362818587613bba565b90506143716060830184613bab565b979650505050505050565b60006040820190508181036000830152614397818587613bba565b90506143a6602083018461407a565b949350505050565b600060208201905081810360008301526143c88184613c0c565b905092915050565b60006020820190506143e56000830184613c45565b92915050565b6000602082019050818103600083015261440481613c94565b9050919050565b6000602082019050818103600083015261442481613cd4565b9050919050565b6000602082019050818103600083015261444481613d3a565b9050919050565b6000602082019050818103600083015261446481613e7a565b9050919050565b6000602082019050818103600083015261448481613ee0565b9050919050565b600060208201905081810360008301526144a481613f60565b9050919050565b600060208201905081810360008301526144c481613fba565b9050919050565b600060208201905081810360008301526144e481613ffa565b9050919050565b600060208201905081810360008301526145048161403a565b9050919050565b6000602082019050614520600083018461407a565b92915050565b600060408201905061453b600083018561407a565b614548602083018461407a565b9392505050565b60006020820190506145646000830184614089565b92915050565b6000808335600160200384360303811261458357600080fd5b80840192508235915067ffffffffffffffff8211156145a157600080fd5b6020830192506001820236038313156145b957600080fd5b509250929050565b6000604051905081810181811067ffffffffffffffff821117156145e8576145e76147d6565b5b8060405250919050565b600067ffffffffffffffff82111561460d5761460c6147d6565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614670826146a9565b9050919050565b6000614682826146a9565b9050919050565b60008115159050919050565b6000819050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006146eb82614716565b9050919050565b60006146fd82614704565b9050919050565b600061470f826146a9565b9050919050565b600061472182614728565b9050919050565b6000614733826146a9565b9050919050565b82818337600083830152505050565b60005b8381101561476757808201518184015260208101905061474c565b83811115614776576000848401525b50505050565b6000614787826147b2565b9050919050565b6000614799826147b2565b9050919050565b60006147ab826147c4565b9050919050565b60006147bd826147f6565b9050919050565b60006147cf826147e9565b9050919050565bfe5b6000601f19601f8301169050919050565b60008160f81b9050919050565b60008160601b9050919050565b61480c81614665565b811461481757600080fd5b50565b61482381614689565b811461482e57600080fd5b50565b61483a8161469f565b811461484557600080fd5b50565b614851816146c9565b811461485c57600080fd5b5056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7773657474696e67732e6c696768744e6f64652e6465706f7369742e656e61626c6564a26469706673582212209cb38c21ef04ab54d46868a3f1e309783e708907fd12050b15ff8375a37ab1d664736f6c634300070600330000000000000000000000006c2f7b6110a37b3b0fbdd811876be368df02e8b0

Deployed Bytecode

0x6080604052600436106101815760003560e01c806390d76417116100d1578063adf1d8d61161008a578063ca2b87af11610064578063ca2b87af14610522578063ccdf1d791461054b578063d46221f914610588578063eee1fa44146105a457610181565b8063adf1d8d614610491578063ae3e885a146104ba578063ba7fe814146104e557610181565b806390d76417146103815780639532e08a146103ac5780639630f63c146103d7578063a32cb34114610400578063a37212cb1461042b578063a4b4334b1461046857610181565b806340ce18a01161013e57806364f14dba1161011857806364f14dba146102d757806368d25fe81461030257806383f3f0861461032d57806384d9eb7c1461035857610181565b806340ce18a014610277578063439370b1146102a257806354fd4d50146102ac57610181565b806309ba5933146101865780630a019eaf146101b157806318582e28146101bb5780631e8bc826146101f85780633c4bc635146102235780633f25522d1461024c575b600080fd5b34801561019257600080fd5b5061019b6105c0565b6040516101a8919061450b565b60405180910390f35b6101b96105c5565b005b3480156101c757600080fd5b506101e260048036038101906101dd9190613a05565b6108bd565b6040516101ef919061428d565b60405180910390f35b34801561020457600080fd5b5061020d6108fb565b60405161021a919061450b565b60405180910390f35b34801561022f57600080fd5b5061024a600480360381019061024591906139c0565b610900565b005b34801561025857600080fd5b50610261610d3d565b60405161026e919061450b565b60405180910390f35b34801561028357600080fd5b5061028c610d42565b604051610299919061450b565b60405180910390f35b6102aa610d47565b005b3480156102b857600080fd5b506102c1610f14565b6040516102ce919061454f565b60405180910390f35b3480156102e357600080fd5b506102ec610f25565b6040516102f9919061450b565b60405180910390f35b34801561030e57600080fd5b50610317610f2a565b604051610324919061450b565b60405180910390f35b34801561033957600080fd5b50610342610f2f565b60405161034f919061450b565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a91906139c0565b610f5f565b005b34801561038d57600080fd5b50610396611123565b6040516103a391906143d0565b60405180910390f35b3480156103b857600080fd5b506103c1611168565b6040516103ce919061450b565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f99190613a5d565b61116d565b005b34801561040c57600080fd5b50610415611274565b604051610422919061428d565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d91906139c0565b61129c565b60405161045f919061450b565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a919061387e565b6112d7565b005b34801561049d57600080fd5b506104b860048036038101906104b39190613997565b6115e7565b005b3480156104c657600080fd5b506104cf611703565b6040516104dc919061450b565b60405180910390f35b3480156104f157600080fd5b5061050c60048036038101906105079190613842565b611708565b60405161051991906143ae565b60405180910390f35b34801561052e57600080fd5b50610549600480360381019061054491906138f3565b6117cf565b005b34801561055757600080fd5b50610572600480360381019061056d9190613819565b611b03565b60405161057f919061450b565b60405180910390f35b6105a2600480360381019061059d91906138f3565b611bc2565b005b6105be60048036038101906105b991906139c0565b611eb3565b005b600481565b6040518060400160405280600e81526020017f73746166694c696768744e6f64650000000000000000000000000000000000008152503061069e8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061065e578051825260208201915060208101905060208303925061063b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461073e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280600a81526020017f7374616669457468657200000000000000000000000000000000000000000000815250336108178260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106107d757805182526020820191506020810190506020830392506107b4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b50505050565b60006108f28484846040516020016108d7939291906140bc565b6040516020818303038152906040528051906020012061222d565b90509392505050565b600681565b6040518060400160405280600e81526020017f73746166694c696768744e6f6465000000000000000000000000000000000000815250306109d98260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106109995780518252602082019150602081019050602083039250610976565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6006610a85858561129c565b14610ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abc906144eb565b60405180910390fd5b6000610acf611123565b73ffffffffffffffffffffffffffffffffffffffff1663606aa8ca33604051602001610afb9190614170565b6040516020818303038152906040528051906020012087876040518463ffffffff1660e01b8152600401610b31939291906142c3565b60206040518083038186803b158015610b4957600080fd5b505afa158015610b5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b819190613af6565b1215610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb99061448b565b60405180910390fd5b6000610c026040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506122e3565b90508073ffffffffffffffffffffffffffffffffffffffff16633bed33ce610c28610f2f565b6040518263ffffffff1660e01b8152600401610c44919061450b565b600060405180830381600087803b158015610c5e57600080fd5b505af1158015610c72573d6000803e3d6000fd5b50505050610c8285856007612436565b60003373ffffffffffffffffffffffffffffffffffffffff16610ca3610f2f565b604051610caf906141ef565b60006040518083038185875af1925050503d8060008114610cec576040519150601f19603f3d011682016040523d82523d6000602084013e610cf1565b606091505b5050905080610d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2c9061446b565b60405180910390fd5b505050505050565b600081565b600381565b6040518060400160405280601081526020017f7374616669557365724465706f7369740000000000000000000000000000000081525033610e208260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310610de05780518252602082019150602081019050602083039250610dbd565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ec0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fef51b4c870b8b0100eae2072e91db01222a303072af3728e58c9d4d2da33127f3442604051610f08929190614526565b60405180910390a25050565b60008054906101000a900460ff1681565b600281565b600781565b6000610f5a7f73657474696e67732e6e6f64652e6465706f7369742e616d6f756e74000000006124a8565b905090565b6040518060400160405280600e81526020017f73746166694c696768744e6f6465000000000000000000000000000000000000815250306110388260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310610ff85780518252602082019150602081019050602083039250610fd5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6110e2848461255e565b7f9d5023d85497e8c264e3b053f8da9415f4db76eb5af3ecef3fe953fe9f98147033858560405161111593929190614204565b60405180910390a150505050565b60006111636040518060400160405280601081526020017f7075626b657953657453746f72616765000000000000000000000000000000008152506122e3565b905090565b600581565b6111ac6040518060400160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250336126b7565b806111f257506111f16040518060400160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250336126b7565b5b611264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b61126f838383612436565b505050565b600061129760405180606001604052806022815260200161488160229139612784565b905090565b60006112cf83836040516020016112b49291906141cb565b604051602081830303815290604052805190602001206124a8565b905092915050565b6040518060400160405280600e81526020017f73746166694c696768744e6f6465000000000000000000000000000000000000815250306113b08260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611370578051825260208201915060208101905060208303925061134d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b336114c18160405160200180807f6e6f64652e747275737465640000000000000000000000000000000000000000815250600c018273ffffffffffffffffffffffffffffffffffffffff1660601b81526014019150506040516020818303038152906040528051906020012061222d565b611533576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f496e76616c69642074727573746564206e6f646500000000000000000000000081525060200191505060405180910390fd5b84849050878790501461157b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611572906144ab565b60405180910390fd5b60005b878790508110156115dd576115d088888381811061159857fe5b90506020028101906115aa919061456a565b8888858181106115b657fe5b90506020020160208101906115cb9190613997565b6128ab565b808060010191505061157e565b5050505050505050565b6116266040518060400160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250336126b7565b8061166c575061166b6040518060400160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250336126b7565b5b6116de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b6117006040518060600160405280602281526020016148816022913982612b88565b50565b600181565b6060611712611123565b73ffffffffffffffffffffffffffffffffffffffff1663f3358a3a8460405160200161173e919061414a565b60405160208183030381529060405280519060200120846040518363ffffffff1660e01b81526004016117729291906142f5565b60006040518083038186803b15801561178a57600080fd5b505afa15801561179e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906117c79190613ab5565b905092915050565b6040518060400160405280600e81526020017f73746166694c696768744e6f6465000000000000000000000000000000000000815250306118a88260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106118685780518252602082019150602081019050602083039250611845565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b858590508888905014801561196257508383905088889050145b6119a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611998906144ab565b60405180910390fd5b60006119e16040518060400160405280601081526020017f7374616669557365724465706f736974000000000000000000000000000000008152506122e3565b90508073ffffffffffffffffffffffffffffffffffffffff1663cc88c3c8611a37611a25611a0d610f2f565b6801bc16d674ec800000612c9490919063ffffffff16565b8c8c9050612d1790919063ffffffff16565b6040518263ffffffff1660e01b8152600401611a53919061450b565b600060405180830381600087803b158015611a6d57600080fd5b505af1158015611a81573d6000803e3d6000fd5b5050505060005b89899050811015611af757611aea8a8a83818110611aa257fe5b9050602002810190611ab4919061456a565b8a8a85818110611ac057fe5b9050602002810190611ad2919061456a565b8a8a87818110611ade57fe5b90506020020135612d9d565b8080600101915050611a88565b50505050505050505050565b6000611b0d611123565b73ffffffffffffffffffffffffffffffffffffffff1663c9d6fee983604051602001611b39919061414a565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b8152600401611b6b91906142a8565b60206040518083038186803b158015611b8357600080fd5b505afa158015611b97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbb9190613b1f565b9050919050565b6040518060400160405280600e81526020017f73746166694c696768744e6f646500000000000000000000000000000000000081525030611c9b8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611c5b5780518252602082019150602081019050602083039250611c38565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b611d43611274565b611d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d799061440b565b60405180910390fd5b60008888905090508686905081148015611d9e57508484905081145b611ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd4906144ab565b60405180910390fd5b611df7611de8610f2f565b82612d1790919063ffffffff16565b3414611e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2f9061442b565b60405180910390fd5b60005b81811015611ea757611e9a8a8a83818110611e5257fe5b9050602002810190611e64919061456a565b8a8a85818110611e7057fe5b9050602002810190611e82919061456a565b8a8a87818110611e8e57fe5b90506020020135612f11565b8080600101915050611e3b565b50505050505050505050565b6040518060400160405280600e81526020017f73746166694c696768744e6f646500000000000000000000000000000000000081525030611f8c8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611f4c5780518252602082019150602081019050602083039250611f29565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461202c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b612034610f2f565b3414612075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206c9061442b565b60405180910390fd5b6005612081858561129c565b146120c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b8906144eb565b60405180910390fd5b60006121016040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506122e3565b90508073ffffffffffffffffffffffffffffffffffffffff166398ea5fca346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561214b57600080fd5b505af115801561215f573d6000803e3d6000fd5b505050505061217085856006612436565b5050505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166321f8a721836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156121eb57600080fd5b505afa1580156121ff573d6000803e3d6000fd5b505050506040513d602081101561221557600080fd5b81019080805190602001909291905050509050919050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156122a157600080fd5b505afa1580156122b5573d6000803e3d6000fd5b505050506040513d60208110156122cb57600080fd5b81019080805190602001909291905050509050919050565b6000806123888360405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106123485780518252602082019150602081019050602083039250612325565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120612177565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561242d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e7472616374206e6f7420666f756e64000000000000000000000000000081525060200191505060405180910390fd5b80915050919050565b612468838360405160200161244c9291906141cb565b6040516020818303038152906040528051906020012082613077565b7fc581330a67ddadcf62d06e14db41c85bb45910369cedad649390e6dd2a9373c883838360405161249b9392919061437c565b60405180910390a1505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561251c57600080fd5b505afa158015612530573d6000803e3d6000fd5b505050506040513d602081101561254657600080fd5b81019080805190602001909291905050509050919050565b600261256a838361129c565b146125aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a1906144eb565b60405180910390fd5b60006125b4611123565b73ffffffffffffffffffffffffffffffffffffffff1663606aa8ca336040516020016125e09190614170565b6040516020818303038152906040528051906020012085856040518463ffffffff1660e01b8152600401612616939291906142c3565b60206040518083038186803b15801561262e57600080fd5b505afa158015612642573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126669190613af6565b12156126a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269e9061448b565b60405180910390fd5b6126b382826005612436565b5050565b600061277c838360405160200180807f6163636573732e726f6c65000000000000000000000000000000000000000000815250600b0183805190602001908083835b6020831061271c57805182526020820191506020810190506020830392506126f9565b6001836020036101000a0380198251168184511680821785525050505050509050018273ffffffffffffffffffffffffffffffffffffffff1660601b8152601401925050506040516020818303038152906040528051906020012061222d565b905092915050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040516020018082805190602001908083835b602083106127fa57805182526020820191506020810190506020830392506127d7565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561286957600080fd5b505afa15801561287d573d6000803e3d6000fd5b505050506040513d602081101561289357600080fd5b81019080805190602001909291905050509050919050565b6128de8383336040516020016128c3939291906140f1565b6040516020818303038152906040528051906020012061222d565b1561291e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129159061444b565b60405180910390fd5b612953838333604051602001612936939291906140f1565b604051602081830303815290604052805190602001206001613110565b600061298884848460405160200161296d93929190614196565b604051602081830303815290604052805190602001206124a8565b905061299e6001826131ab90919063ffffffff16565b90506129d48484846040516020016129b893929190614196565b6040516020818303038152906040528051906020012082613077565b6000670de0b6b3a764000090506000612a216040518060400160405280601081526020017f73746166694e6f64654d616e61676572000000000000000000000000000000008152506122e3565b90506001612a2f878761129c565b148015612b615750612b4b612a42613233565b73ffffffffffffffffffffffffffffffffffffffff16631f66e8ed6040518163ffffffff1660e01b815260040160206040518083038186803b158015612a8757600080fd5b505afa158015612a9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612abf9190613b1f565b8273ffffffffffffffffffffffffffffffffffffffff166366e3c0266040518163ffffffff1660e01b815260040160206040518083038186803b158015612b0557600080fd5b505afa158015612b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3d9190613b1f565b612d1790919063ffffffff16565b612b5e8484612d1790919063ffffffff16565b10155b15612b8057612b7f868686612b77576004612b7a565b60025b612436565b5b505050505050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663abfdcced836040516020018082805190602001908083835b60208310612bfd5780518252602082019150602081019050602083039250612bda565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b158015612c7857600080fd5b505af1158015612c8c573d6000803e3d6000fd5b505050505050565b600082821115612d0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b600080831415612d2a5760009050612d97565b6000828402905082848281612d3b57fe5b0414612d92576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806148606021913960400191505060405180910390fd5b809150505b92915050565b612da78585613278565b612daf6133d1565b73ffffffffffffffffffffffffffffffffffffffff166322895118612ded612dd5610f2f565b6801bc16d674ec800000612c9490919063ffffffff16565b8787612df7613233565b73ffffffffffffffffffffffffffffffffffffffff1663563967156040518163ffffffff1660e01b815260040160006040518083038186803b158015612e3c57600080fd5b505afa158015612e50573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612e799190613ab5565b8888886040518863ffffffff1660e01b8152600401612e9d9695949392919061431e565b6000604051808303818588803b158015612eb657600080fd5b505af1158015612eca573d6000803e3d6000fd5b50505050507fb384b282308c431ac3ea7756646550752d3f0dbfb418ef60bfeaf4edc9494815338686604051612f0293929190614204565b60405180910390a15050505050565b612f1b8585613416565b612f236133d1565b73ffffffffffffffffffffffffffffffffffffffff166322895118612f46610f2f565b8787612f50613233565b73ffffffffffffffffffffffffffffffffffffffff1663563967156040518163ffffffff1660e01b815260040160006040518083038186803b158015612f9557600080fd5b505afa158015612fa9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612fd29190613ab5565b8888886040518863ffffffff1660e01b8152600401612ff69695949392919061431e565b6000604051808303818588803b15801561300f57600080fd5b505af1158015613023573d6000803e3d6000fd5b50505050507f1fc33daf7f37b2e02f49dbee7b9707bddd7c8cef1f08deff23bff3d105e5aa723386868686613056610f2f565b60405161306896959493929190614236565b60405180910390a15050505050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a83836040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b1580156130f457600080fd5b505af1158015613108573d6000803e3d6000fd5b505050505050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663abfdcced83836040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b15801561318f57600080fd5b505af11580156131a3573d6000803e3d6000fd5b505050505050565b600080828401905083811015613229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006132736040518060400160405280601481526020017f73746166694e6574776f726b53657474696e67730000000000000000000000008152506122e3565b905090565b6002613284838361129c565b146132c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132bb906144eb565b60405180910390fd5b60006132ce611123565b73ffffffffffffffffffffffffffffffffffffffff1663606aa8ca336040516020016132fa9190614170565b6040516020818303038152906040528051906020012085856040518463ffffffff1660e01b8152600401613330939291906142c3565b60206040518083038186803b15801561334857600080fd5b505afa15801561335c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133809190613af6565b12156133c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b89061448b565b60405180910390fd5b6133cd82826003612436565b5050565b60006134116040518060400160405280600a81526020017f6574684465706f736974000000000000000000000000000000000000000000008152506122e3565b905090565b600073ffffffffffffffffffffffffffffffffffffffff1661345f8383604051602001613444929190614126565b60405160208183030381529060405280519060200120612177565b73ffffffffffffffffffffffffffffffffffffffff16146134b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ac906144cb565b60405180910390fd5b60006134e883836040516020016134cd929190614098565b604051602081830303815290604052805190602001206124a8565b14613528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351f906143eb565b60405180910390fd5b6000613534838361129c565b14613574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161356b906144eb565b60405180910390fd5b61358082826001612436565b613588611123565b73ffffffffffffffffffffffffffffffffffffffff16637ef16264336040516020016135b49190614170565b6040516020818303038152906040528051906020012084846040518463ffffffff1660e01b81526004016135ea939291906142c3565b600060405180830381600087803b15801561360457600080fd5b505af1158015613618573d6000803e3d6000fd5b505050505050565b600061363361362e846145f2565b6145c1565b90508281526020810184848401111561364b57600080fd5b613656848285614749565b509392505050565b60008135905061366d81614803565b92915050565b60008083601f84011261368557600080fd5b8235905067ffffffffffffffff81111561369e57600080fd5b6020830191508360208202830111156136b657600080fd5b9250929050565b60008083601f8401126136cf57600080fd5b8235905067ffffffffffffffff8111156136e857600080fd5b60208301915083602082028301111561370057600080fd5b9250929050565b60008083601f84011261371957600080fd5b8235905067ffffffffffffffff81111561373257600080fd5b60208301915083602082028301111561374a57600080fd5b9250929050565b6000813590506137608161481a565b92915050565b60008083601f84011261377857600080fd5b8235905067ffffffffffffffff81111561379157600080fd5b6020830191508360018202830111156137a957600080fd5b9250929050565b600082601f8301126137c157600080fd5b81516137d1848260208601613620565b91505092915050565b6000815190506137e981614831565b92915050565b6000813590506137fe81614848565b92915050565b60008151905061381381614848565b92915050565b60006020828403121561382b57600080fd5b60006138398482850161365e565b91505092915050565b6000806040838503121561385557600080fd5b60006138638582860161365e565b9250506020613874858286016137ef565b9150509250929050565b6000806000806040858703121561389457600080fd5b600085013567ffffffffffffffff8111156138ae57600080fd5b6138ba87828801613707565b9450945050602085013567ffffffffffffffff8111156138d957600080fd5b6138e587828801613673565b925092505092959194509250565b6000806000806000806060878903121561390c57600080fd5b600087013567ffffffffffffffff81111561392657600080fd5b61393289828a01613707565b9650965050602087013567ffffffffffffffff81111561395157600080fd5b61395d89828a01613707565b9450945050604087013567ffffffffffffffff81111561397c57600080fd5b61398889828a016136bd565b92509250509295509295509295565b6000602082840312156139a957600080fd5b60006139b784828501613751565b91505092915050565b600080602083850312156139d357600080fd5b600083013567ffffffffffffffff8111156139ed57600080fd5b6139f985828601613766565b92509250509250929050565b600080600060408486031215613a1a57600080fd5b600084013567ffffffffffffffff811115613a3457600080fd5b613a4086828701613766565b93509350506020613a538682870161365e565b9150509250925092565b600080600060408486031215613a7257600080fd5b600084013567ffffffffffffffff811115613a8c57600080fd5b613a9886828701613766565b93509350506020613aab868287016137ef565b9150509250925092565b600060208284031215613ac757600080fd5b600082015167ffffffffffffffff811115613ae157600080fd5b613aed848285016137b0565b91505092915050565b600060208284031215613b0857600080fd5b6000613b16848285016137da565b91505092915050565b600060208284031215613b3157600080fd5b6000613b3f84828501613804565b91505092915050565b613b51816146e0565b82525050565b613b68613b6382614677565b61478e565b82525050565b613b7f613b7a82614665565b61477c565b82525050565b613b8e81614689565b82525050565b613ba5613ba082614689565b6147a0565b82525050565b613bb481614695565b82525050565b6000613bc6838561462d565b9350613bd383858461473a565b613bdc836147d8565b840190509392505050565b6000613bf3838561463e565b9350613c0083858461473a565b82840190509392505050565b6000613c1782614622565b613c21818561462d565b9350613c31818560208601614749565b613c3a816147d8565b840191505092915050565b613c4e816146f2565b82525050565b6000613c6160178361465a565b91507f73757065724e6f64652e7075626b65792e7374617475730000000000000000006000830152601782019050919050565b6000613ca1601883614649565b91507f7375706572204e6f6465207075626b65792065786973747300000000000000006000830152602082019050919050565b6000613ce1602a83614649565b91507f6c69676874206e6f6465206465706f73697473206172652063757272656e746c60008301527f792064697361626c6564000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d47601383614649565b91507f6d73672076616c7565206e6f74206d61746368000000000000000000000000006000830152602082019050919050565b6000613d8760168361465a565b91507f6c696768744e6f64652e6d656d626572566f7465732e000000000000000000006000830152601682019050919050565b6000613dc760158361465a565b91507f76616c696461746f722e7374616b696e67706f6f6c00000000000000000000006000830152601582019050919050565b6000613e0760178361465a565b91507f6c696768744e6f64652e7075626b6579732e696e6465780000000000000000006000830152601782019050919050565b6000613e4760148361465a565b91507f6c696768744e6f64652e746f74616c566f7465730000000000000000000000006000830152601482019050919050565b6000613e87602f83614649565b91507f4d656d6265722068617320616c726561647920766f74656420746f207769746860008301527f6472617743726564656e7469616c7300000000000000000000000000000000006020830152604082019050919050565b6000613eed601083614649565b91507f7472616e7366657272206661696c6564000000000000000000000000000000006000830152602082019050919050565b6000613f2d60178361465a565b91507f6c696768744e6f64652e7075626b65792e7374617475730000000000000000006000830152601782019050919050565b6000613f6d601083614649565b91507f6e6f74207075626b6579206f776e6572000000000000000000000000000000006000830152602082019050919050565b6000613fad60008361463e565b9150600082019050919050565b6000613fc7600e83614649565b91507f706172616d73206c656e206572720000000000000000000000000000000000006000830152602082019050919050565b6000614007601983614649565b91507f7374616b696e67706f6f6c207075626b657920657869737473000000000000006000830152602082019050919050565b6000614047601583614649565b91507f7075626b65792073746174757320756e6d6174636800000000000000000000006000830152602082019050919050565b614083816146c9565b82525050565b614092816146d3565b82525050565b60006140a382613c54565b91506140b0828486613be7565b91508190509392505050565b60006140c782613d7a565b91506140d4828587613be7565b91506140e08284613b6e565b601482019150819050949350505050565b60006140fc82613d7a565b9150614109828587613be7565b91506141158284613b57565b601482019150819050949350505050565b600061413182613dba565b915061413e828486613be7565b91508190509392505050565b600061415582613dfa565b91506141618284613b6e565b60148201915081905092915050565b600061417b82613dfa565b91506141878284613b57565b60148201915081905092915050565b60006141a182613e3a565b91506141ae828587613be7565b91506141ba8284613b94565b600182019150819050949350505050565b60006141d682613f20565b91506141e3828486613be7565b91508190509392505050565b60006141fa82613fa0565b9150819050919050565b60006040820190506142196000830186613b48565b818103602083015261422c818486613bba565b9050949350505050565b600060808201905061424b6000830189613b48565b818103602083015261425e818789613bba565b90508181036040830152614273818587613bba565b9050614282606083018461407a565b979650505050505050565b60006020820190506142a26000830184613b85565b92915050565b60006020820190506142bd6000830184613bab565b92915050565b60006040820190506142d86000830186613bab565b81810360208301526142eb818486613bba565b9050949350505050565b600060408201905061430a6000830185613bab565b614317602083018461407a565b9392505050565b6000608082019050818103600083015261433981888a613bba565b9050818103602083015261434d8187613c0c565b90508181036040830152614362818587613bba565b90506143716060830184613bab565b979650505050505050565b60006040820190508181036000830152614397818587613bba565b90506143a6602083018461407a565b949350505050565b600060208201905081810360008301526143c88184613c0c565b905092915050565b60006020820190506143e56000830184613c45565b92915050565b6000602082019050818103600083015261440481613c94565b9050919050565b6000602082019050818103600083015261442481613cd4565b9050919050565b6000602082019050818103600083015261444481613d3a565b9050919050565b6000602082019050818103600083015261446481613e7a565b9050919050565b6000602082019050818103600083015261448481613ee0565b9050919050565b600060208201905081810360008301526144a481613f60565b9050919050565b600060208201905081810360008301526144c481613fba565b9050919050565b600060208201905081810360008301526144e481613ffa565b9050919050565b600060208201905081810360008301526145048161403a565b9050919050565b6000602082019050614520600083018461407a565b92915050565b600060408201905061453b600083018561407a565b614548602083018461407a565b9392505050565b60006020820190506145646000830184614089565b92915050565b6000808335600160200384360303811261458357600080fd5b80840192508235915067ffffffffffffffff8211156145a157600080fd5b6020830192506001820236038313156145b957600080fd5b509250929050565b6000604051905081810181811067ffffffffffffffff821117156145e8576145e76147d6565b5b8060405250919050565b600067ffffffffffffffff82111561460d5761460c6147d6565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614670826146a9565b9050919050565b6000614682826146a9565b9050919050565b60008115159050919050565b6000819050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006146eb82614716565b9050919050565b60006146fd82614704565b9050919050565b600061470f826146a9565b9050919050565b600061472182614728565b9050919050565b6000614733826146a9565b9050919050565b82818337600083830152505050565b60005b8381101561476757808201518184015260208101905061474c565b83811115614776576000848401525b50505050565b6000614787826147b2565b9050919050565b6000614799826147b2565b9050919050565b60006147ab826147c4565b9050919050565b60006147bd826147f6565b9050919050565b60006147cf826147e9565b9050919050565bfe5b6000601f19601f8301169050919050565b60008160f81b9050919050565b60008160601b9050919050565b61480c81614665565b811461481757600080fd5b50565b61482381614689565b811461482e57600080fd5b50565b61483a8161469f565b811461484557600080fd5b50565b614851816146c9565b811461485c57600080fd5b5056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7773657474696e67732e6c696768744e6f64652e6465706f7369742e656e61626c6564a26469706673582212209cb38c21ef04ab54d46868a3f1e309783e708907fd12050b15ff8375a37ab1d664736f6c63430007060033

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

0000000000000000000000006c2f7b6110a37b3b0fbdd811876be368df02e8b0

-----Decoded View---------------
Arg [0] : _stafiStorageAddress (address): 0x6c2f7b6110a37b3B0fbdd811876be368df02E8B0

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000006c2f7b6110a37b3b0fbdd811876be368df02e8b0


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.