false
false
0
Note: Ocean testnet will soon stop being supported, it is being replaced by Horizon testnet. You will be redirected to the new testnet scanner when its live.

Contract Address Details

0x9b4d4C3683FAfC13216263d0da3901A6Ba248a42

Contract Name
RafflePool
Creator
0x09642e–cfda59 at 0x3dabad–6eda37
Balance
0 FTN ( )
Tokens
Fetching tokens...
Transactions
1 Transactions
Transfers
0 Transfers
Gas Used
288,283
Last Balance Update
1462824
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
RafflePool




Optimization enabled
false
Compiler version
v0.8.19+commit.7dd6d404




EVM Version
default




Verified at
2024-05-23T14:19:21.152557Z

Constructor Arguments

0000000000000000000000009829d6ac67e49e0b95af2859fff153021515181500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000c4f39d412cf0ed130eb23e19e0d41d2a6a616a7000000000000000000000000a2b72bd377b30cdc67697cc3822ab5b88cd4e6d2000000000000000000000000000000000000000000000000000000000000000e706f6f6c312875696e7432353629000000000000000000000000000000000000

Arg [0] (address) : 0x9829d6ac67e49e0b95af2859fff1530215151815
Arg [1] (string) : pool1(uint256)
Arg [2] (address) : 0x0c4f39d412cf0ed130eb23e19e0d41d2a6a616a7
Arg [3] (address) : 0xa2b72bd377b30cdc67697cc3822ab5b88cd4e6d2

              

contracts/RafflePool.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

import "@openzeppelin/contracts/access/Ownable.sol";
import "./RNG/interfaces/IRNG.sol";
import "./IPayoutStrategy.sol";

contract RafflePool is Ownable {

    struct Pool {
        address poolAddress;
        bytes4 selector;
    }

    Pool public pool;
    uint256[] public places;
    mapping(uint256 => bool) public paidTable;
    IPayoutStrategy public payoutAddress;

    uint256 public currentRafflePosition = 0;
    uint256 public currentPayPosition = 0;
    IRNG public rng;

    event Claimed(address indexed user, uint256 indexed index, uint256 amount);

    receive() external payable {}
    fallback() external payable {}

    constructor(address poolAddress_, string memory functionPrototype_, address rng_, address payout_) {

        pool.poolAddress = poolAddress_;
        pool.selector = bytes4(keccak256(bytes(functionPrototype_)));
        rng = IRNG(rng_);
        payoutAddress = IPayoutStrategy(payout_);

        (bool success, ) = pool.poolAddress.call(abi.encodeWithSelector(pool.selector, 0));
        require(success, "RafflePool: Invalid pool address or selector");
    }

    function getUserInfo(address user) external view returns(uint256 place, uint256 amount) {
        for (uint256 i = 0; i < places.length; i++) {
            (bool success, bytes memory data) = pool.poolAddress.staticcall(abi.encodeWithSelector(pool.selector, i));
            require(success, "RafflePool: cannot get user address");
            address user_ = _bytesToAddress(data);
            if (user == user_) {
                IPayoutStrategy.Payout memory payout;
                IPayoutStrategy.Payout[] memory payoutStructure = payoutAddress.getPayoutStructure();
                for (uint256 j = 0; j < payoutStructure.length; j++) {
                    payout = payoutStructure[j];
                    if (payout.from <= places[i] && payout.to > places[i]) {
                        return (places[i], payout.amount);
                    }
                }
            }
        }
    }

    function getNumber() external onlyOwner() {
        rng.requestRandomWords();
    }

    function rafflePool(uint256 count_) external onlyOwner() {

        IPayoutStrategy.Payout[] memory payoutStructure = payoutAddress.getPayoutStructure();
        require(0 != payoutStructure.length, "RafflePool: Payout structure not set");

        uint256 pl = payoutStructure[payoutStructure.length - 1].to;
        require(pl != currentRafflePosition, "RafflePool: Pool already raffled");
        require(0 != count_, "RafflePool: Count must be greater than 0");
        require(currentRafflePosition + count_ - 1 < pl, "RafflePool: Out of index");

        uint256 lastRequestId = rng.lastRequestId();
        (bool fulfilled, uint256[] memory numbers) = rng.getRequestStatus(lastRequestId);
        require(fulfilled, "RafflePool: wait for fulfillment");
        bytes32 hash = bytes32(numbers[0]);
        uint256 from = currentRafflePosition;
        currentRafflePosition += count_;

        uint256[] storage places_ = places;
        for (uint256 i = from; i < currentRafflePosition; i++) {

            places_.push(places_.length);
            uint256 n = uint256(hash) % (i + 1);
            uint256 t = places_[n];
            places_[n] = places_[places_.length - 1];
            places_[places_.length - 1] = t;
            hash = keccak256(abi.encodePacked(hash));
        }
    }

    function payWithIndex(uint256 userIndex_) external {
        _pay(userIndex_);
    }

    function payWithCount(uint256 count_) external {

        require(0 != count_, "RafflePool: Count must be greater than 0");
        IPayoutStrategy.Payout[] memory payoutStructure = payoutAddress.getPayoutStructure();
        uint256 pl = payoutStructure[payoutStructure.length - 1].to;
        require(currentPayPosition + count_ <= pl, "RafflePool: Out of index");

        for (uint256 i = 0; i < count_; i++) {
            _pay(currentPayPosition);
            ++currentPayPosition;
        }
    }

    function getPlaces() external view returns (uint256[] memory) {
        return places;
    }

    function withdraw(address _recipient) public onlyOwner() {
        payable(_recipient).transfer(address(this).balance);
    }

    /// Helper member functions

    function _pay(uint256 index_) private {
        
        IPayoutStrategy.Payout[] memory payoutStructure = payoutAddress.getPayoutStructure();
        uint256 pl = payoutStructure[payoutStructure.length - 1].to;
        require(pl == currentRafflePosition,  "RafflePool: Raffle not ended");
        require(pl > currentPayPosition, "RafflePool: Pool already paid");

        if (paidTable[index_]) {
            return;
        }
        (bool success, bytes memory data) = pool.poolAddress.call(abi.encodeWithSelector(pool.selector, index_));
        require(success, "RafflePool: Pool call failed");
        address ua = _bytesToAddress(data);

        IPayoutStrategy.Payout memory payout;
        for (uint256 i = 0; i < payoutStructure.length; i++) {
            payout = payoutStructure[i];
            if (payout.from <= places[index_] && places[index_] < payout.to) {
                paidTable[index_] = true;
                (success,) = payable(ua).call{ value: payout.amount }("");
                require(success, "RafflePool: transfer failed");
                emit Claimed(ua, index_, payout.amount);
                return;
            }
        }
    }

    function _bytesToAddress(bytes memory data) private pure returns (address addr) {
        require(data.length >= 20, "RafflePool: Invalid address data");
        assembly {
            addr := mload(add(data, 0x20))
        }
    }
}
        

@openzeppelin/contracts/access/Ownable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

@openzeppelin/contracts/utils/Context.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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

contracts/IPayoutStrategy.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

interface IPayoutStrategy {

    struct Payout {
        uint256 from;
        uint256 to;
        uint256 amount;
    }
    
    function setPayoutStructure(uint256[] calldata) external;
    function getPayoutStructure() external view returns (Payout[] memory);
}
          

contracts/RNG/interfaces/IRNG.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IRNG {

    function lastRequestId() external returns(uint256);
    function requestRandomWords() external;
    function getRequestStatus(uint256) external view returns (bool, uint256[] memory);
}
          

Compiler Settings

{"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":200,"enabled":false},"libraries":{}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"poolAddress_","internalType":"address"},{"type":"string","name":"functionPrototype_","internalType":"string"},{"type":"address","name":"rng_","internalType":"address"},{"type":"address","name":"payout_","internalType":"address"}]},{"type":"event","name":"Claimed","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"index","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"fallback","stateMutability":"payable"},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"currentPayPosition","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"currentRafflePosition","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"getNumber","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"getPlaces","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"place","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"}],"name":"getUserInfo","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"paidTable","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"payWithCount","inputs":[{"type":"uint256","name":"count_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"payWithIndex","inputs":[{"type":"uint256","name":"userIndex_","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IPayoutStrategy"}],"name":"payoutAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"places","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"poolAddress","internalType":"address"},{"type":"bytes4","name":"selector","internalType":"bytes4"}],"name":"pool","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rafflePool","inputs":[{"type":"uint256","name":"count_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IRNG"}],"name":"rng","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"address","name":"_recipient","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

0x6080604052600060055560006006553480156200001b57600080fd5b5060405162002edd38038062002edd83398181016040528101906200004191906200057a565b6200006162000055620002b660201b60201c565b620002be60201b60201c565b83600160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508280519060200120600160000160146101000a81548163ffffffff021916908360e01c021790555081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b6000604051602401620001b4919062000665565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051620002209190620006cf565b6000604051808303816000865af19150503d80600081146200025f576040519150601f19603f3d011682016040523d82523d6000602084013e62000264565b606091505b5050905080620002ab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002a2906200076f565b60405180910390fd5b505050505062000791565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003c38262000396565b9050919050565b620003d581620003b6565b8114620003e157600080fd5b50565b600081519050620003f581620003ca565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004508262000405565b810181811067ffffffffffffffff8211171562000472576200047162000416565b5b80604052505050565b60006200048762000382565b905062000495828262000445565b919050565b600067ffffffffffffffff821115620004b857620004b762000416565b5b620004c38262000405565b9050602081019050919050565b60005b83811015620004f0578082015181840152602081019050620004d3565b60008484015250505050565b6000620005136200050d846200049a565b6200047b565b90508281526020810184848401111562000532576200053162000400565b5b6200053f848285620004d0565b509392505050565b600082601f8301126200055f576200055e620003fb565b5b815162000571848260208601620004fc565b91505092915050565b600080600080608085870312156200059757620005966200038c565b5b6000620005a787828801620003e4565b945050602085015167ffffffffffffffff811115620005cb57620005ca62000391565b5b620005d98782880162000547565b9350506040620005ec87828801620003e4565b9250506060620005ff87828801620003e4565b91505092959194509250565b6000819050919050565b600060ff82169050919050565b6000819050919050565b60006200064d6200064762000641846200060b565b62000622565b62000615565b9050919050565b6200065f816200062c565b82525050565b60006020820190506200067c600083018462000654565b92915050565b600081519050919050565b600081905092915050565b6000620006a58262000682565b620006b181856200068d565b9350620006c3818560208601620004d0565b80840191505092915050565b6000620006dd828462000698565b915081905092915050565b600082825260208201905092915050565b7f526166666c65506f6f6c3a20496e76616c696420706f6f6c206164647265737360008201527f206f722073656c6563746f720000000000000000000000000000000000000000602082015250565b600062000757602c83620006e8565b91506200076482620006f9565b604082019050919050565b600060208201905081810360008301526200078a8162000748565b9050919050565b61273c80620007a16000396000f3fe6080604052600436106101025760003560e01c80638da5cb5b11610095578063cc5ee36511610064578063cc5ee36514610319578063d605787b14610344578063e557bb4e1461036f578063f2c9ecd8146103ac578063f2fde38b146103c357610109565b80638da5cb5b1461025f578063a980e79f1461028a578063bc23f848146102b3578063c7634a79146102dc57610109565b806351cff8d9116100d157806351cff8d9146101b65780635b8d02d7146101df5780636386c1c71461020a578063715018a61461024857610109565b806308d62b031461010b5780630cff68271461013457806316f0115b1461015f5780633b0e84de1461018b57610109565b3661010957005b005b34801561011757600080fd5b50610132600480360381019061012d919061176d565b6103ec565b005b34801561014057600080fd5b5061014961058e565b60405161015691906117a9565b60405180910390f35b34801561016b57600080fd5b50610174610594565b604051610182929190611840565b60405180910390f35b34801561019757600080fd5b506101a06105d3565b6040516101ad9190611927565b60405180910390f35b3480156101c257600080fd5b506101dd60048036038101906101d89190611975565b61062b565b005b3480156101eb57600080fd5b506101f461067d565b6040516102019190611a01565b60405180910390f35b34801561021657600080fd5b50610231600480360381019061022c9190611975565b6106a3565b60405161023f929190611a1c565b60405180910390f35b34801561025457600080fd5b5061025d6109d3565b005b34801561026b57600080fd5b506102746109e7565b6040516102819190611a45565b60405180910390f35b34801561029657600080fd5b506102b160048036038101906102ac919061176d565b610a10565b005b3480156102bf57600080fd5b506102da60048036038101906102d5919061176d565b610f18565b005b3480156102e857600080fd5b5061030360048036038101906102fe919061176d565b610f24565b6040516103109190611a7b565b60405180910390f35b34801561032557600080fd5b5061032e610f44565b60405161033b91906117a9565b60405180910390f35b34801561035057600080fd5b50610359610f4a565b6040516103669190611ab7565b60405180910390f35b34801561037b57600080fd5b506103966004803603810190610391919061176d565b610f70565b6040516103a391906117a9565b60405180910390f35b3480156103b857600080fd5b506103c1610f94565b005b3480156103cf57600080fd5b506103ea60048036038101906103e59190611975565b611020565b005b8060000361042f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042690611b55565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639c2d2d8e6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561049e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906104c79190611d4c565b9050600081600183516104da9190611dc4565b815181106104eb576104ea611df8565b5b602002602001015160200151905080836006546105089190611e27565b1115610549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054090611ea7565b60405180910390fd5b60005b838110156105885761055f6006546110a3565b60066000815461056e90611ec7565b91905081905550808061058090611ec7565b91505061054c565b50505050565b60055481565b60018060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460e01b905082565b6060600280548060200260200160405190810160405280929190818152602001828054801561062157602002820191906000526020600020905b81548152602001906001019080831161060d575b5050505050905090565b610633611565565b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610679573d6000803e3d6000fd5b5050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060005b6002805490508110156109cc57600080600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b8460405160240161071991906117a9565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516107839190611f80565b600060405180830381855afa9150503d80600081146107be576040519150601f19603f3d011682016040523d82523d6000602084013e6107c3565b606091505b509150915081610808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ff90612009565b60405180910390fd5b6000610813826115e3565b90508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036109b657610850611702565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639c2d2d8e6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156108bf573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108e89190611d4c565b905060005b81518110156109b25781818151811061090957610908611df8565b5b602002602001015192506002878154811061092757610926611df8565b5b906000526020600020015483600001511115801561096657506002878154811061095457610953611df8565b5b90600052602060002001548360200151115b1561099f576002878154811061097f5761097e611df8565b5b9060005260206000200154836040015198509850505050505050506109ce565b80806109aa90611ec7565b9150506108ed565b5050505b50505080806109c490611ec7565b9150506106a9565b505b915091565b6109db611565565b6109e56000611636565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610a18611565565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639c2d2d8e6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610a87573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ab09190611d4c565b90508051600003610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed9061209b565b60405180910390fd5b60008160018351610b079190611dc4565b81518110610b1857610b17611df8565b5b60200260200101516020015190506005548103610b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6190612107565b60405180910390fd5b82600003610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490611b55565b60405180910390fd5b80600184600554610bbe9190611e27565b610bc89190611dc4565b10610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff90611ea7565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc2a88c36040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610c79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9d9190612127565b9050600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d8a4676f846040518263ffffffff1660e01b8152600401610cfd91906117a9565b600060405180830381865afa158015610d1a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d439190612243565b9150915081610d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7e906122eb565b60405180910390fd5b600081600081518110610d9d57610d9c611df8565b5b602002602001015160001b9050600060055490508760056000828254610dc39190611e27565b9250508190555060006002905060008290505b600554811015610f0c5781828054905090806001815401808255809150506001900390600052602060002001600090919091909150556000600182610e1b9190611e27565b8560001c610e29919061233a565b90506000838281548110610e4057610e3f611df8565b5b906000526020600020015490508360018580549050610e5f9190611dc4565b81548110610e7057610e6f611df8565b5b9060005260206000200154848381548110610e8e57610e8d611df8565b5b9060005260206000200181905550808460018680549050610eaf9190611dc4565b81548110610ec057610ebf611df8565b5b906000526020600020018190555085604051602001610edf9190612396565b60405160208183030381529060405280519060200120955050508080610f0490611ec7565b915050610dd6565b50505050505050505050565b610f21816110a3565b50565b60036020528060005260406000206000915054906101000a900460ff1681565b60065481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60028181548110610f8057600080fd5b906000526020600020016000915090505481565b610f9c611565565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e0c862896040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561100657600080fd5b505af115801561101a573d6000803e3d6000fd5b50505050565b611028611565565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108e90612423565b60405180910390fd5b6110a081611636565b50565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639c2d2d8e6040518163ffffffff1660e01b8152600401600060405180830381865afa158015611112573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061113b9190611d4c565b90506000816001835161114e9190611dc4565b8151811061115f5761115e611df8565b5b602002602001015160200151905060055481146111b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a89061248f565b60405180910390fd5b60065481116111f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ec906124fb565b60405180910390fd5b6003600084815260200190815260200160002060009054906101000a900460ff1615611222575050611562565b600080600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b8660405160240161128591906117a9565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516112ef9190611f80565b6000604051808303816000865af19150503d806000811461132c576040519150601f19603f3d011682016040523d82523d6000602084013e611331565b606091505b509150915081611376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136d90612567565b60405180910390fd5b6000611381826115e3565b905061138b611702565b60005b865181101561155a578681815181106113aa576113a9611df8565b5b60200260200101519150600288815481106113c8576113c7611df8565b5b906000526020600020015482600001511115801561140757508160200151600289815481106113fa576113f9611df8565b5b9060005260206000200154105b15611547576001600360008a815260200190815260200160002060006101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff168260400151604051611460906125ad565b60006040518083038185875af1925050503d806000811461149d576040519150601f19603f3d011682016040523d82523d6000602084013e6114a2565b606091505b505080955050846114e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114df9061260e565b60405180910390fd5b878373ffffffffffffffffffffffffffffffffffffffff167f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a846040015160405161153391906117a9565b60405180910390a350505050505050611562565b808061155290611ec7565b91505061138e565b505050505050505b50565b61156d6116fa565b73ffffffffffffffffffffffffffffffffffffffff1661158b6109e7565b73ffffffffffffffffffffffffffffffffffffffff16146115e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d89061267a565b60405180910390fd5b565b600060148251101561162a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611621906126e6565b60405180910390fd5b60208201519050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b60405180606001604052806000815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61174a81611737565b811461175557600080fd5b50565b60008135905061176781611741565b92915050565b6000602082840312156117835761178261172d565b5b600061179184828501611758565b91505092915050565b6117a381611737565b82525050565b60006020820190506117be600083018461179a565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117ef826117c4565b9050919050565b6117ff816117e4565b82525050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61183a81611805565b82525050565b600060408201905061185560008301856117f6565b6118626020830184611831565b9392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61189e81611737565b82525050565b60006118b08383611895565b60208301905092915050565b6000602082019050919050565b60006118d482611869565b6118de8185611874565b93506118e983611885565b8060005b8381101561191a57815161190188826118a4565b975061190c836118bc565b9250506001810190506118ed565b5085935050505092915050565b6000602082019050818103600083015261194181846118c9565b905092915050565b611952816117e4565b811461195d57600080fd5b50565b60008135905061196f81611949565b92915050565b60006020828403121561198b5761198a61172d565b5b600061199984828501611960565b91505092915050565b6000819050919050565b60006119c76119c26119bd846117c4565b6119a2565b6117c4565b9050919050565b60006119d9826119ac565b9050919050565b60006119eb826119ce565b9050919050565b6119fb816119e0565b82525050565b6000602082019050611a1660008301846119f2565b92915050565b6000604082019050611a31600083018561179a565b611a3e602083018461179a565b9392505050565b6000602082019050611a5a60008301846117f6565b92915050565b60008115159050919050565b611a7581611a60565b82525050565b6000602082019050611a906000830184611a6c565b92915050565b6000611aa1826119ce565b9050919050565b611ab181611a96565b82525050565b6000602082019050611acc6000830184611aa8565b92915050565b600082825260208201905092915050565b7f526166666c65506f6f6c3a20436f756e74206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000611b3f602883611ad2565b9150611b4a82611ae3565b604082019050919050565b60006020820190508181036000830152611b6e81611b32565b9050919050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611bc382611b7a565b810181811067ffffffffffffffff82111715611be257611be1611b8b565b5b80604052505050565b6000611bf5611723565b9050611c018282611bba565b919050565b600067ffffffffffffffff821115611c2157611c20611b8b565b5b602082029050602081019050919050565b600080fd5b600080fd5b600081519050611c4b81611741565b92915050565b600060608284031215611c6757611c66611c37565b5b611c716060611beb565b90506000611c8184828501611c3c565b6000830152506020611c9584828501611c3c565b6020830152506040611ca984828501611c3c565b60408301525092915050565b6000611cc8611cc384611c06565b611beb565b90508083825260208201905060608402830185811115611ceb57611cea611c32565b5b835b81811015611d145780611d008882611c51565b845260208401935050606081019050611ced565b5050509392505050565b600082601f830112611d3357611d32611b75565b5b8151611d43848260208601611cb5565b91505092915050565b600060208284031215611d6257611d6161172d565b5b600082015167ffffffffffffffff811115611d8057611d7f611732565b5b611d8c84828501611d1e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611dcf82611737565b9150611dda83611737565b9250828203905081811115611df257611df1611d95565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000611e3282611737565b9150611e3d83611737565b9250828201905080821115611e5557611e54611d95565b5b92915050565b7f526166666c65506f6f6c3a204f7574206f6620696e6465780000000000000000600082015250565b6000611e91601883611ad2565b9150611e9c82611e5b565b602082019050919050565b60006020820190508181036000830152611ec081611e84565b9050919050565b6000611ed282611737565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611f0457611f03611d95565b5b600182019050919050565b600081519050919050565b600081905092915050565b60005b83811015611f43578082015181840152602081019050611f28565b60008484015250505050565b6000611f5a82611f0f565b611f648185611f1a565b9350611f74818560208601611f25565b80840191505092915050565b6000611f8c8284611f4f565b915081905092915050565b7f526166666c65506f6f6c3a2063616e6e6f74206765742075736572206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000611ff3602383611ad2565b9150611ffe82611f97565b604082019050919050565b6000602082019050818103600083015261202281611fe6565b9050919050565b7f526166666c65506f6f6c3a205061796f757420737472756374757265206e6f7460008201527f2073657400000000000000000000000000000000000000000000000000000000602082015250565b6000612085602483611ad2565b915061209082612029565b604082019050919050565b600060208201905081810360008301526120b481612078565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c20616c726561647920726166666c6564600082015250565b60006120f1602083611ad2565b91506120fc826120bb565b602082019050919050565b60006020820190508181036000830152612120816120e4565b9050919050565b60006020828403121561213d5761213c61172d565b5b600061214b84828501611c3c565b91505092915050565b61215d81611a60565b811461216857600080fd5b50565b60008151905061217a81612154565b92915050565b600067ffffffffffffffff82111561219b5761219a611b8b565b5b602082029050602081019050919050565b60006121bf6121ba84612180565b611beb565b905080838252602082019050602084028301858111156121e2576121e1611c32565b5b835b8181101561220b57806121f78882611c3c565b8452602084019350506020810190506121e4565b5050509392505050565b600082601f83011261222a57612229611b75565b5b815161223a8482602086016121ac565b91505092915050565b6000806040838503121561225a5761225961172d565b5b60006122688582860161216b565b925050602083015167ffffffffffffffff81111561228957612288611732565b5b61229585828601612215565b9150509250929050565b7f526166666c65506f6f6c3a207761697420666f722066756c66696c6c6d656e74600082015250565b60006122d5602083611ad2565b91506122e08261229f565b602082019050919050565b60006020820190508181036000830152612304816122c8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061234582611737565b915061235083611737565b9250826123605761235f61230b565b5b828206905092915050565b6000819050919050565b6000819050919050565b61239061238b8261236b565b612375565b82525050565b60006123a2828461237f565b60208201915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061240d602683611ad2565b9150612418826123b1565b604082019050919050565b6000602082019050818103600083015261243c81612400565b9050919050565b7f526166666c65506f6f6c3a20526166666c65206e6f7420656e64656400000000600082015250565b6000612479601c83611ad2565b915061248482612443565b602082019050919050565b600060208201905081810360008301526124a88161246c565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c20616c72656164792070616964000000600082015250565b60006124e5601d83611ad2565b91506124f0826124af565b602082019050919050565b60006020820190508181036000830152612514816124d8565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c2063616c6c206661696c656400000000600082015250565b6000612551601c83611ad2565b915061255c8261251b565b602082019050919050565b6000602082019050818103600083015261258081612544565b9050919050565b50565b6000612597600083611f1a565b91506125a282612587565b600082019050919050565b60006125b88261258a565b9150819050919050565b7f526166666c65506f6f6c3a207472616e73666572206661696c65640000000000600082015250565b60006125f8601b83611ad2565b9150612603826125c2565b602082019050919050565b60006020820190508181036000830152612627816125eb565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612664602083611ad2565b915061266f8261262e565b602082019050919050565b6000602082019050818103600083015261269381612657565b9050919050565b7f526166666c65506f6f6c3a20496e76616c696420616464726573732064617461600082015250565b60006126d0602083611ad2565b91506126db8261269a565b602082019050919050565b600060208201905081810360008301526126ff816126c3565b905091905056fea26469706673582212204a335e1583608abdac2f169108446c7cd3fbf474a2b7d39bf21ca9554eae14e064736f6c634300081300330000000000000000000000009829d6ac67e49e0b95af2859fff153021515181500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000c4f39d412cf0ed130eb23e19e0d41d2a6a616a7000000000000000000000000a2b72bd377b30cdc67697cc3822ab5b88cd4e6d2000000000000000000000000000000000000000000000000000000000000000e706f6f6c312875696e7432353629000000000000000000000000000000000000

Deployed ByteCode

0x6080604052600436106101025760003560e01c80638da5cb5b11610095578063cc5ee36511610064578063cc5ee36514610319578063d605787b14610344578063e557bb4e1461036f578063f2c9ecd8146103ac578063f2fde38b146103c357610109565b80638da5cb5b1461025f578063a980e79f1461028a578063bc23f848146102b3578063c7634a79146102dc57610109565b806351cff8d9116100d157806351cff8d9146101b65780635b8d02d7146101df5780636386c1c71461020a578063715018a61461024857610109565b806308d62b031461010b5780630cff68271461013457806316f0115b1461015f5780633b0e84de1461018b57610109565b3661010957005b005b34801561011757600080fd5b50610132600480360381019061012d919061176d565b6103ec565b005b34801561014057600080fd5b5061014961058e565b60405161015691906117a9565b60405180910390f35b34801561016b57600080fd5b50610174610594565b604051610182929190611840565b60405180910390f35b34801561019757600080fd5b506101a06105d3565b6040516101ad9190611927565b60405180910390f35b3480156101c257600080fd5b506101dd60048036038101906101d89190611975565b61062b565b005b3480156101eb57600080fd5b506101f461067d565b6040516102019190611a01565b60405180910390f35b34801561021657600080fd5b50610231600480360381019061022c9190611975565b6106a3565b60405161023f929190611a1c565b60405180910390f35b34801561025457600080fd5b5061025d6109d3565b005b34801561026b57600080fd5b506102746109e7565b6040516102819190611a45565b60405180910390f35b34801561029657600080fd5b506102b160048036038101906102ac919061176d565b610a10565b005b3480156102bf57600080fd5b506102da60048036038101906102d5919061176d565b610f18565b005b3480156102e857600080fd5b5061030360048036038101906102fe919061176d565b610f24565b6040516103109190611a7b565b60405180910390f35b34801561032557600080fd5b5061032e610f44565b60405161033b91906117a9565b60405180910390f35b34801561035057600080fd5b50610359610f4a565b6040516103669190611ab7565b60405180910390f35b34801561037b57600080fd5b506103966004803603810190610391919061176d565b610f70565b6040516103a391906117a9565b60405180910390f35b3480156103b857600080fd5b506103c1610f94565b005b3480156103cf57600080fd5b506103ea60048036038101906103e59190611975565b611020565b005b8060000361042f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042690611b55565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639c2d2d8e6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561049e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906104c79190611d4c565b9050600081600183516104da9190611dc4565b815181106104eb576104ea611df8565b5b602002602001015160200151905080836006546105089190611e27565b1115610549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054090611ea7565b60405180910390fd5b60005b838110156105885761055f6006546110a3565b60066000815461056e90611ec7565b91905081905550808061058090611ec7565b91505061054c565b50505050565b60055481565b60018060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460e01b905082565b6060600280548060200260200160405190810160405280929190818152602001828054801561062157602002820191906000526020600020905b81548152602001906001019080831161060d575b5050505050905090565b610633611565565b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610679573d6000803e3d6000fd5b5050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060005b6002805490508110156109cc57600080600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b8460405160240161071991906117a9565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516107839190611f80565b600060405180830381855afa9150503d80600081146107be576040519150601f19603f3d011682016040523d82523d6000602084013e6107c3565b606091505b509150915081610808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ff90612009565b60405180910390fd5b6000610813826115e3565b90508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036109b657610850611702565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639c2d2d8e6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156108bf573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108e89190611d4c565b905060005b81518110156109b25781818151811061090957610908611df8565b5b602002602001015192506002878154811061092757610926611df8565b5b906000526020600020015483600001511115801561096657506002878154811061095457610953611df8565b5b90600052602060002001548360200151115b1561099f576002878154811061097f5761097e611df8565b5b9060005260206000200154836040015198509850505050505050506109ce565b80806109aa90611ec7565b9150506108ed565b5050505b50505080806109c490611ec7565b9150506106a9565b505b915091565b6109db611565565b6109e56000611636565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610a18611565565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639c2d2d8e6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610a87573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ab09190611d4c565b90508051600003610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed9061209b565b60405180910390fd5b60008160018351610b079190611dc4565b81518110610b1857610b17611df8565b5b60200260200101516020015190506005548103610b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6190612107565b60405180910390fd5b82600003610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490611b55565b60405180910390fd5b80600184600554610bbe9190611e27565b610bc89190611dc4565b10610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff90611ea7565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc2a88c36040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610c79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9d9190612127565b9050600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d8a4676f846040518263ffffffff1660e01b8152600401610cfd91906117a9565b600060405180830381865afa158015610d1a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d439190612243565b9150915081610d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7e906122eb565b60405180910390fd5b600081600081518110610d9d57610d9c611df8565b5b602002602001015160001b9050600060055490508760056000828254610dc39190611e27565b9250508190555060006002905060008290505b600554811015610f0c5781828054905090806001815401808255809150506001900390600052602060002001600090919091909150556000600182610e1b9190611e27565b8560001c610e29919061233a565b90506000838281548110610e4057610e3f611df8565b5b906000526020600020015490508360018580549050610e5f9190611dc4565b81548110610e7057610e6f611df8565b5b9060005260206000200154848381548110610e8e57610e8d611df8565b5b9060005260206000200181905550808460018680549050610eaf9190611dc4565b81548110610ec057610ebf611df8565b5b906000526020600020018190555085604051602001610edf9190612396565b60405160208183030381529060405280519060200120955050508080610f0490611ec7565b915050610dd6565b50505050505050505050565b610f21816110a3565b50565b60036020528060005260406000206000915054906101000a900460ff1681565b60065481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60028181548110610f8057600080fd5b906000526020600020016000915090505481565b610f9c611565565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e0c862896040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561100657600080fd5b505af115801561101a573d6000803e3d6000fd5b50505050565b611028611565565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108e90612423565b60405180910390fd5b6110a081611636565b50565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639c2d2d8e6040518163ffffffff1660e01b8152600401600060405180830381865afa158015611112573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061113b9190611d4c565b90506000816001835161114e9190611dc4565b8151811061115f5761115e611df8565b5b602002602001015160200151905060055481146111b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a89061248f565b60405180910390fd5b60065481116111f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ec906124fb565b60405180910390fd5b6003600084815260200190815260200160002060009054906101000a900460ff1615611222575050611562565b600080600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b8660405160240161128591906117a9565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516112ef9190611f80565b6000604051808303816000865af19150503d806000811461132c576040519150601f19603f3d011682016040523d82523d6000602084013e611331565b606091505b509150915081611376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136d90612567565b60405180910390fd5b6000611381826115e3565b905061138b611702565b60005b865181101561155a578681815181106113aa576113a9611df8565b5b60200260200101519150600288815481106113c8576113c7611df8565b5b906000526020600020015482600001511115801561140757508160200151600289815481106113fa576113f9611df8565b5b9060005260206000200154105b15611547576001600360008a815260200190815260200160002060006101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff168260400151604051611460906125ad565b60006040518083038185875af1925050503d806000811461149d576040519150601f19603f3d011682016040523d82523d6000602084013e6114a2565b606091505b505080955050846114e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114df9061260e565b60405180910390fd5b878373ffffffffffffffffffffffffffffffffffffffff167f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a846040015160405161153391906117a9565b60405180910390a350505050505050611562565b808061155290611ec7565b91505061138e565b505050505050505b50565b61156d6116fa565b73ffffffffffffffffffffffffffffffffffffffff1661158b6109e7565b73ffffffffffffffffffffffffffffffffffffffff16146115e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d89061267a565b60405180910390fd5b565b600060148251101561162a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611621906126e6565b60405180910390fd5b60208201519050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b60405180606001604052806000815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61174a81611737565b811461175557600080fd5b50565b60008135905061176781611741565b92915050565b6000602082840312156117835761178261172d565b5b600061179184828501611758565b91505092915050565b6117a381611737565b82525050565b60006020820190506117be600083018461179a565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117ef826117c4565b9050919050565b6117ff816117e4565b82525050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61183a81611805565b82525050565b600060408201905061185560008301856117f6565b6118626020830184611831565b9392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61189e81611737565b82525050565b60006118b08383611895565b60208301905092915050565b6000602082019050919050565b60006118d482611869565b6118de8185611874565b93506118e983611885565b8060005b8381101561191a57815161190188826118a4565b975061190c836118bc565b9250506001810190506118ed565b5085935050505092915050565b6000602082019050818103600083015261194181846118c9565b905092915050565b611952816117e4565b811461195d57600080fd5b50565b60008135905061196f81611949565b92915050565b60006020828403121561198b5761198a61172d565b5b600061199984828501611960565b91505092915050565b6000819050919050565b60006119c76119c26119bd846117c4565b6119a2565b6117c4565b9050919050565b60006119d9826119ac565b9050919050565b60006119eb826119ce565b9050919050565b6119fb816119e0565b82525050565b6000602082019050611a1660008301846119f2565b92915050565b6000604082019050611a31600083018561179a565b611a3e602083018461179a565b9392505050565b6000602082019050611a5a60008301846117f6565b92915050565b60008115159050919050565b611a7581611a60565b82525050565b6000602082019050611a906000830184611a6c565b92915050565b6000611aa1826119ce565b9050919050565b611ab181611a96565b82525050565b6000602082019050611acc6000830184611aa8565b92915050565b600082825260208201905092915050565b7f526166666c65506f6f6c3a20436f756e74206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000611b3f602883611ad2565b9150611b4a82611ae3565b604082019050919050565b60006020820190508181036000830152611b6e81611b32565b9050919050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611bc382611b7a565b810181811067ffffffffffffffff82111715611be257611be1611b8b565b5b80604052505050565b6000611bf5611723565b9050611c018282611bba565b919050565b600067ffffffffffffffff821115611c2157611c20611b8b565b5b602082029050602081019050919050565b600080fd5b600080fd5b600081519050611c4b81611741565b92915050565b600060608284031215611c6757611c66611c37565b5b611c716060611beb565b90506000611c8184828501611c3c565b6000830152506020611c9584828501611c3c565b6020830152506040611ca984828501611c3c565b60408301525092915050565b6000611cc8611cc384611c06565b611beb565b90508083825260208201905060608402830185811115611ceb57611cea611c32565b5b835b81811015611d145780611d008882611c51565b845260208401935050606081019050611ced565b5050509392505050565b600082601f830112611d3357611d32611b75565b5b8151611d43848260208601611cb5565b91505092915050565b600060208284031215611d6257611d6161172d565b5b600082015167ffffffffffffffff811115611d8057611d7f611732565b5b611d8c84828501611d1e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611dcf82611737565b9150611dda83611737565b9250828203905081811115611df257611df1611d95565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000611e3282611737565b9150611e3d83611737565b9250828201905080821115611e5557611e54611d95565b5b92915050565b7f526166666c65506f6f6c3a204f7574206f6620696e6465780000000000000000600082015250565b6000611e91601883611ad2565b9150611e9c82611e5b565b602082019050919050565b60006020820190508181036000830152611ec081611e84565b9050919050565b6000611ed282611737565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611f0457611f03611d95565b5b600182019050919050565b600081519050919050565b600081905092915050565b60005b83811015611f43578082015181840152602081019050611f28565b60008484015250505050565b6000611f5a82611f0f565b611f648185611f1a565b9350611f74818560208601611f25565b80840191505092915050565b6000611f8c8284611f4f565b915081905092915050565b7f526166666c65506f6f6c3a2063616e6e6f74206765742075736572206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000611ff3602383611ad2565b9150611ffe82611f97565b604082019050919050565b6000602082019050818103600083015261202281611fe6565b9050919050565b7f526166666c65506f6f6c3a205061796f757420737472756374757265206e6f7460008201527f2073657400000000000000000000000000000000000000000000000000000000602082015250565b6000612085602483611ad2565b915061209082612029565b604082019050919050565b600060208201905081810360008301526120b481612078565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c20616c726561647920726166666c6564600082015250565b60006120f1602083611ad2565b91506120fc826120bb565b602082019050919050565b60006020820190508181036000830152612120816120e4565b9050919050565b60006020828403121561213d5761213c61172d565b5b600061214b84828501611c3c565b91505092915050565b61215d81611a60565b811461216857600080fd5b50565b60008151905061217a81612154565b92915050565b600067ffffffffffffffff82111561219b5761219a611b8b565b5b602082029050602081019050919050565b60006121bf6121ba84612180565b611beb565b905080838252602082019050602084028301858111156121e2576121e1611c32565b5b835b8181101561220b57806121f78882611c3c565b8452602084019350506020810190506121e4565b5050509392505050565b600082601f83011261222a57612229611b75565b5b815161223a8482602086016121ac565b91505092915050565b6000806040838503121561225a5761225961172d565b5b60006122688582860161216b565b925050602083015167ffffffffffffffff81111561228957612288611732565b5b61229585828601612215565b9150509250929050565b7f526166666c65506f6f6c3a207761697420666f722066756c66696c6c6d656e74600082015250565b60006122d5602083611ad2565b91506122e08261229f565b602082019050919050565b60006020820190508181036000830152612304816122c8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061234582611737565b915061235083611737565b9250826123605761235f61230b565b5b828206905092915050565b6000819050919050565b6000819050919050565b61239061238b8261236b565b612375565b82525050565b60006123a2828461237f565b60208201915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061240d602683611ad2565b9150612418826123b1565b604082019050919050565b6000602082019050818103600083015261243c81612400565b9050919050565b7f526166666c65506f6f6c3a20526166666c65206e6f7420656e64656400000000600082015250565b6000612479601c83611ad2565b915061248482612443565b602082019050919050565b600060208201905081810360008301526124a88161246c565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c20616c72656164792070616964000000600082015250565b60006124e5601d83611ad2565b91506124f0826124af565b602082019050919050565b60006020820190508181036000830152612514816124d8565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c2063616c6c206661696c656400000000600082015250565b6000612551601c83611ad2565b915061255c8261251b565b602082019050919050565b6000602082019050818103600083015261258081612544565b9050919050565b50565b6000612597600083611f1a565b91506125a282612587565b600082019050919050565b60006125b88261258a565b9150819050919050565b7f526166666c65506f6f6c3a207472616e73666572206661696c65640000000000600082015250565b60006125f8601b83611ad2565b9150612603826125c2565b602082019050919050565b60006020820190508181036000830152612627816125eb565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612664602083611ad2565b915061266f8261262e565b602082019050919050565b6000602082019050818103600083015261269381612657565b9050919050565b7f526166666c65506f6f6c3a20496e76616c696420616464726573732064617461600082015250565b60006126d0602083611ad2565b91506126db8261269a565b602082019050919050565b600060208201905081810360008301526126ff816126c3565b905091905056fea26469706673582212204a335e1583608abdac2f169108446c7cd3fbf474a2b7d39bf21ca9554eae14e064736f6c63430008130033