false
false
0

Contract Address Details

0x4A833B0f9F208fB76cf828Fa3B313B3fd8687257

Contract Name
RafflePool
Creator
0xe15eb9–72a15b at 0x27a31b–820b6d
Balance
0 FTN ( )
Tokens
Fetching tokens...
Transactions
8 Transactions
Transfers
0 Transfers
Gas Used
39,367,448
Last Balance Update
4264003
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.27+commit.40a35a09




EVM Version
paris




Verified at
2024-10-31T13:04:45.508948Z

Constructor Arguments

0x00000000000000000000000011bdee6ca594b5f83400ef6587562b3227d5df51000000000000000000000000000000000000000000000000000000000000008000000000000000000000000005a25b06b0234c0ac93f885c3799069c265326b70000000000000000000000003ae862039ab6e9caf34b5af3e244aee09d35eacf000000000000000000000000000000000000000000000000000000000000000d706f6f6c2875696e743235362900000000000000000000000000000000000000

Arg [0] (address) : 0x11bdee6ca594b5f83400ef6587562b3227d5df51
Arg [1] (string) : pool(uint256)
Arg [2] (address) : 0x05a25b06b0234c0ac93f885c3799069c265326b7
Arg [3] (address) : 0x3ae862039ab6e9caf34b5af3e244aee09d35eacf

              

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;
    uint256 public currentPayPosition;
    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":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}},"optimizer":{"runs":200,"enabled":false},"libraries":{},"evmVersion":"paris"}
              

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

0x608060405234801561001057600080fd5b50604051612e50380380612e5083398181016040528101906100329190610538565b61004e61004361029960201b60201c565b6102a160201b60201c565b83600160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508280519060200120600160000160146101000a81548163ffffffff021916908360e01c021790555081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b600060405160240161019f919061060d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610209919061066f565b6000604051808303816000865af19150503d8060008114610246576040519150601f19603f3d011682016040523d82523d6000602084013e61024b565b606091505b505090508061028f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028690610709565b60405180910390fd5b5050505050610729565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103a482610379565b9050919050565b6103b481610399565b81146103bf57600080fd5b50565b6000815190506103d1816103ab565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61042a826103e1565b810181811067ffffffffffffffff82111715610449576104486103f2565b5b80604052505050565b600061045c610365565b90506104688282610421565b919050565b600067ffffffffffffffff821115610488576104876103f2565b5b610491826103e1565b9050602081019050919050565b60005b838110156104bc5780820151818401526020810190506104a1565b60008484015250505050565b60006104db6104d68461046d565b610452565b9050828152602081018484840111156104f7576104f66103dc565b5b61050284828561049e565b509392505050565b600082601f83011261051f5761051e6103d7565b5b815161052f8482602086016104c8565b91505092915050565b600080600080608085870312156105525761055161036f565b5b6000610560878288016103c2565b945050602085015167ffffffffffffffff81111561058157610580610374565b5b61058d8782880161050a565b935050604061059e878288016103c2565b92505060606105af878288016103c2565b91505092959194509250565b6000819050919050565b600060ff82169050919050565b6000819050919050565b60006105f76105f26105ed846105bb565b6105d2565b6105c5565b9050919050565b610607816105dc565b82525050565b600060208201905061062260008301846105fe565b92915050565b600081519050919050565b600081905092915050565b600061064982610628565b6106538185610633565b935061066381856020860161049e565b80840191505092915050565b600061067b828461063e565b915081905092915050565b600082825260208201905092915050565b7f526166666c65506f6f6c3a20496e76616c696420706f6f6c206164647265737360008201527f206f722073656c6563746f720000000000000000000000000000000000000000602082015250565b60006106f3602c83610686565b91506106fe82610697565b604082019050919050565b60006020820190508181036000830152610722816106e6565b9050919050565b612718806107386000396000f3fe6080604052600436106101025760003560e01c80638da5cb5b11610095578063cc5ee36511610064578063cc5ee36514610313578063d605787b1461033e578063e557bb4e14610369578063f2c9ecd8146103a6578063f2fde38b146103bd57610103565b80638da5cb5b14610259578063a980e79f14610284578063bc23f848146102ad578063c7634a79146102d657610103565b806351cff8d9116100d157806351cff8d9146101b05780635b8d02d7146101d95780636386c1c714610204578063715018a61461024257610103565b806308d62b03146101055780630cff68271461012e57806316f0115b146101595780633b0e84de1461018557610103565b5b005b34801561011157600080fd5b5061012c60048036038101906101279190611749565b6103e6565b005b34801561013a57600080fd5b50610143610582565b6040516101509190611785565b60405180910390f35b34801561016557600080fd5b5061016e610588565b60405161017c92919061181c565b60405180910390f35b34801561019157600080fd5b5061019a6105c7565b6040516101a79190611903565b60405180910390f35b3480156101bc57600080fd5b506101d760048036038101906101d29190611951565b61061f565b005b3480156101e557600080fd5b506101ee610671565b6040516101fb91906119dd565b60405180910390f35b34801561021057600080fd5b5061022b60048036038101906102269190611951565b610697565b6040516102399291906119f8565b60405180910390f35b34801561024e57600080fd5b506102576109bb565b005b34801561026557600080fd5b5061026e6109cf565b60405161027b9190611a21565b60405180910390f35b34801561029057600080fd5b506102ab60048036038101906102a69190611749565b6109f8565b005b3480156102b957600080fd5b506102d460048036038101906102cf9190611749565b610efa565b005b3480156102e257600080fd5b506102fd60048036038101906102f89190611749565b610f06565b60405161030a9190611a57565b60405180910390f35b34801561031f57600080fd5b50610328610f26565b6040516103359190611785565b60405180910390f35b34801561034a57600080fd5b50610353610f2c565b6040516103609190611a93565b60405180910390f35b34801561037557600080fd5b50610390600480360381019061038b9190611749565b610f52565b60405161039d9190611785565b60405180910390f35b3480156103b257600080fd5b506103bb610f76565b005b3480156103c957600080fd5b506103e460048036038101906103df9190611951565b611002565b005b80600003610429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042090611b31565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639c2d2d8e6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610498573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906104c19190611d28565b9050600081600183516104d49190611da0565b815181106104e5576104e4611dd4565b5b602002602001015160200151905080836006546105029190611e03565b1115610543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053a90611e83565b60405180910390fd5b60005b8381101561057c57610559600654611085565b60066000815461056890611ea3565b919050819055508080600101915050610546565b50505050565b60055481565b60018060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460e01b905082565b6060600280548060200260200160405190810160405280929190818152602001828054801561061557602002820191906000526020600020905b815481526020019060010190808311610601575b5050505050905090565b610627611541565b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561066d573d6000803e3d6000fd5b5050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060005b6002805490508110156109b457600080600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b8460405160240161070d9190611785565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516107779190611f5c565b600060405180830381855afa9150503d80600081146107b2576040519150601f19603f3d011682016040523d82523d6000602084013e6107b7565b606091505b5091509150816107fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f390611fe5565b60405180910390fd5b6000610807826115bf565b90508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036109a4576108446116de565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639c2d2d8e6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156108b3573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108dc9190611d28565b905060005b81518110156109a0578181815181106108fd576108fc611dd4565b5b602002602001015192506002878154811061091b5761091a611dd4565b5b906000526020600020015483600001511115801561095a57506002878154811061094857610947611dd4565b5b90600052602060002001548360200151115b15610993576002878154811061097357610972611dd4565b5b9060005260206000200154836040015198509850505050505050506109b6565b80806001019150506108e1565b5050505b505050808060010191505061069d565b505b915091565b6109c3611541565b6109cd6000611612565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610a00611541565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639c2d2d8e6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610a6f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610a989190611d28565b90508051600003610ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad590612077565b60405180910390fd5b60008160018351610aef9190611da0565b81518110610b0057610aff611dd4565b5b60200260200101516020015190506005548103610b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b49906120e3565b60405180910390fd5b82600003610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c90611b31565b60405180910390fd5b80600184600554610ba69190611e03565b610bb09190611da0565b10610bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be790611e83565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc2a88c36040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c859190612103565b9050600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d8a4676f846040518263ffffffff1660e01b8152600401610ce59190611785565b600060405180830381865afa158015610d02573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d2b919061221f565b9150915081610d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d66906122c7565b60405180910390fd5b600081600081518110610d8557610d84611dd4565b5b602002602001015160001b9050600060055490508760056000828254610dab9190611e03565b9250508190555060006002905060008290505b600554811015610eee5781828054905090806001815401808255809150506001900390600052602060002001600090919091909150556000600182610e039190611e03565b8560001c610e119190612316565b90506000838281548110610e2857610e27611dd4565b5b906000526020600020015490508360018580549050610e479190611da0565b81548110610e5857610e57611dd4565b5b9060005260206000200154848381548110610e7657610e75611dd4565b5b9060005260206000200181905550808460018680549050610e979190611da0565b81548110610ea857610ea7611dd4565b5b906000526020600020018190555085604051602001610ec79190612372565b60405160208183030381529060405280519060200120955050508080600101915050610dbe565b50505050505050505050565b610f0381611085565b50565b60036020528060005260406000206000915054906101000a900460ff1681565b60065481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60028181548110610f6257600080fd5b906000526020600020016000915090505481565b610f7e611541565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e0c862896040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610fe857600080fd5b505af1158015610ffc573d6000803e3d6000fd5b50505050565b61100a611541565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611079576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611070906123ff565b60405180910390fd5b61108281611612565b50565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639c2d2d8e6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156110f4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061111d9190611d28565b9050600081600183516111309190611da0565b8151811061114157611140611dd4565b5b60200260200101516020015190506005548114611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a9061246b565b60405180910390fd5b60065481116111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce906124d7565b60405180910390fd5b6003600084815260200190815260200160002060009054906101000a900460ff161561120457505061153e565b600080600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b866040516024016112679190611785565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516112d19190611f5c565b6000604051808303816000865af19150503d806000811461130e576040519150601f19603f3d011682016040523d82523d6000602084013e611313565b606091505b509150915081611358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134f90612543565b60405180910390fd5b6000611363826115bf565b905061136d6116de565b60005b86518110156115365786818151811061138c5761138b611dd4565b5b60200260200101519150600288815481106113aa576113a9611dd4565b5b90600052602060002001548260000151111580156113e957508160200151600289815481106113dc576113db611dd4565b5b9060005260206000200154105b15611529576001600360008a815260200190815260200160002060006101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff16826040015160405161144290612589565b60006040518083038185875af1925050503d806000811461147f576040519150601f19603f3d011682016040523d82523d6000602084013e611484565b606091505b505080955050846114ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c1906125ea565b60405180910390fd5b878373ffffffffffffffffffffffffffffffffffffffff167f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a84604001516040516115159190611785565b60405180910390a35050505050505061153e565b8080600101915050611370565b505050505050505b50565b6115496116d6565b73ffffffffffffffffffffffffffffffffffffffff166115676109cf565b73ffffffffffffffffffffffffffffffffffffffff16146115bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b490612656565b60405180910390fd5b565b6000601482511015611606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fd906126c2565b60405180910390fd5b60208201519050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b60405180606001604052806000815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61172681611713565b811461173157600080fd5b50565b6000813590506117438161171d565b92915050565b60006020828403121561175f5761175e611709565b5b600061176d84828501611734565b91505092915050565b61177f81611713565b82525050565b600060208201905061179a6000830184611776565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117cb826117a0565b9050919050565b6117db816117c0565b82525050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611816816117e1565b82525050565b600060408201905061183160008301856117d2565b61183e602083018461180d565b9392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61187a81611713565b82525050565b600061188c8383611871565b60208301905092915050565b6000602082019050919050565b60006118b082611845565b6118ba8185611850565b93506118c583611861565b8060005b838110156118f65781516118dd8882611880565b97506118e883611898565b9250506001810190506118c9565b5085935050505092915050565b6000602082019050818103600083015261191d81846118a5565b905092915050565b61192e816117c0565b811461193957600080fd5b50565b60008135905061194b81611925565b92915050565b60006020828403121561196757611966611709565b5b60006119758482850161193c565b91505092915050565b6000819050919050565b60006119a361199e611999846117a0565b61197e565b6117a0565b9050919050565b60006119b582611988565b9050919050565b60006119c7826119aa565b9050919050565b6119d7816119bc565b82525050565b60006020820190506119f260008301846119ce565b92915050565b6000604082019050611a0d6000830185611776565b611a1a6020830184611776565b9392505050565b6000602082019050611a3660008301846117d2565b92915050565b60008115159050919050565b611a5181611a3c565b82525050565b6000602082019050611a6c6000830184611a48565b92915050565b6000611a7d826119aa565b9050919050565b611a8d81611a72565b82525050565b6000602082019050611aa86000830184611a84565b92915050565b600082825260208201905092915050565b7f526166666c65506f6f6c3a20436f756e74206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000611b1b602883611aae565b9150611b2682611abf565b604082019050919050565b60006020820190508181036000830152611b4a81611b0e565b9050919050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611b9f82611b56565b810181811067ffffffffffffffff82111715611bbe57611bbd611b67565b5b80604052505050565b6000611bd16116ff565b9050611bdd8282611b96565b919050565b600067ffffffffffffffff821115611bfd57611bfc611b67565b5b602082029050602081019050919050565b600080fd5b600080fd5b600081519050611c278161171d565b92915050565b600060608284031215611c4357611c42611c13565b5b611c4d6060611bc7565b90506000611c5d84828501611c18565b6000830152506020611c7184828501611c18565b6020830152506040611c8584828501611c18565b60408301525092915050565b6000611ca4611c9f84611be2565b611bc7565b90508083825260208201905060608402830185811115611cc757611cc6611c0e565b5b835b81811015611cf05780611cdc8882611c2d565b845260208401935050606081019050611cc9565b5050509392505050565b600082601f830112611d0f57611d0e611b51565b5b8151611d1f848260208601611c91565b91505092915050565b600060208284031215611d3e57611d3d611709565b5b600082015167ffffffffffffffff811115611d5c57611d5b61170e565b5b611d6884828501611cfa565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611dab82611713565b9150611db683611713565b9250828203905081811115611dce57611dcd611d71565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000611e0e82611713565b9150611e1983611713565b9250828201905080821115611e3157611e30611d71565b5b92915050565b7f526166666c65506f6f6c3a204f7574206f6620696e6465780000000000000000600082015250565b6000611e6d601883611aae565b9150611e7882611e37565b602082019050919050565b60006020820190508181036000830152611e9c81611e60565b9050919050565b6000611eae82611713565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ee057611edf611d71565b5b600182019050919050565b600081519050919050565b600081905092915050565b60005b83811015611f1f578082015181840152602081019050611f04565b60008484015250505050565b6000611f3682611eeb565b611f408185611ef6565b9350611f50818560208601611f01565b80840191505092915050565b6000611f688284611f2b565b915081905092915050565b7f526166666c65506f6f6c3a2063616e6e6f74206765742075736572206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000611fcf602383611aae565b9150611fda82611f73565b604082019050919050565b60006020820190508181036000830152611ffe81611fc2565b9050919050565b7f526166666c65506f6f6c3a205061796f757420737472756374757265206e6f7460008201527f2073657400000000000000000000000000000000000000000000000000000000602082015250565b6000612061602483611aae565b915061206c82612005565b604082019050919050565b6000602082019050818103600083015261209081612054565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c20616c726561647920726166666c6564600082015250565b60006120cd602083611aae565b91506120d882612097565b602082019050919050565b600060208201905081810360008301526120fc816120c0565b9050919050565b60006020828403121561211957612118611709565b5b600061212784828501611c18565b91505092915050565b61213981611a3c565b811461214457600080fd5b50565b60008151905061215681612130565b92915050565b600067ffffffffffffffff82111561217757612176611b67565b5b602082029050602081019050919050565b600061219b6121968461215c565b611bc7565b905080838252602082019050602084028301858111156121be576121bd611c0e565b5b835b818110156121e757806121d38882611c18565b8452602084019350506020810190506121c0565b5050509392505050565b600082601f83011261220657612205611b51565b5b8151612216848260208601612188565b91505092915050565b6000806040838503121561223657612235611709565b5b600061224485828601612147565b925050602083015167ffffffffffffffff8111156122655761226461170e565b5b612271858286016121f1565b9150509250929050565b7f526166666c65506f6f6c3a207761697420666f722066756c66696c6c6d656e74600082015250565b60006122b1602083611aae565b91506122bc8261227b565b602082019050919050565b600060208201905081810360008301526122e0816122a4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061232182611713565b915061232c83611713565b92508261233c5761233b6122e7565b5b828206905092915050565b6000819050919050565b6000819050919050565b61236c61236782612347565b612351565b82525050565b600061237e828461235b565b60208201915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006123e9602683611aae565b91506123f48261238d565b604082019050919050565b60006020820190508181036000830152612418816123dc565b9050919050565b7f526166666c65506f6f6c3a20526166666c65206e6f7420656e64656400000000600082015250565b6000612455601c83611aae565b91506124608261241f565b602082019050919050565b6000602082019050818103600083015261248481612448565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c20616c72656164792070616964000000600082015250565b60006124c1601d83611aae565b91506124cc8261248b565b602082019050919050565b600060208201905081810360008301526124f0816124b4565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c2063616c6c206661696c656400000000600082015250565b600061252d601c83611aae565b9150612538826124f7565b602082019050919050565b6000602082019050818103600083015261255c81612520565b9050919050565b50565b6000612573600083611ef6565b915061257e82612563565b600082019050919050565b600061259482612566565b9150819050919050565b7f526166666c65506f6f6c3a207472616e73666572206661696c65640000000000600082015250565b60006125d4601b83611aae565b91506125df8261259e565b602082019050919050565b60006020820190508181036000830152612603816125c7565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612640602083611aae565b915061264b8261260a565b602082019050919050565b6000602082019050818103600083015261266f81612633565b9050919050565b7f526166666c65506f6f6c3a20496e76616c696420616464726573732064617461600082015250565b60006126ac602083611aae565b91506126b782612676565b602082019050919050565b600060208201905081810360008301526126db8161269f565b905091905056fea2646970667358221220aa6751343cf40c4614869ea3faec8f842e64c7ec864361650c238f669837528c64736f6c634300081b003300000000000000000000000011bdee6ca594b5f83400ef6587562b3227d5df51000000000000000000000000000000000000000000000000000000000000008000000000000000000000000005a25b06b0234c0ac93f885c3799069c265326b70000000000000000000000003ae862039ab6e9caf34b5af3e244aee09d35eacf000000000000000000000000000000000000000000000000000000000000000d706f6f6c2875696e743235362900000000000000000000000000000000000000

Deployed ByteCode

0x6080604052600436106101025760003560e01c80638da5cb5b11610095578063cc5ee36511610064578063cc5ee36514610313578063d605787b1461033e578063e557bb4e14610369578063f2c9ecd8146103a6578063f2fde38b146103bd57610103565b80638da5cb5b14610259578063a980e79f14610284578063bc23f848146102ad578063c7634a79146102d657610103565b806351cff8d9116100d157806351cff8d9146101b05780635b8d02d7146101d95780636386c1c714610204578063715018a61461024257610103565b806308d62b03146101055780630cff68271461012e57806316f0115b146101595780633b0e84de1461018557610103565b5b005b34801561011157600080fd5b5061012c60048036038101906101279190611749565b6103e6565b005b34801561013a57600080fd5b50610143610582565b6040516101509190611785565b60405180910390f35b34801561016557600080fd5b5061016e610588565b60405161017c92919061181c565b60405180910390f35b34801561019157600080fd5b5061019a6105c7565b6040516101a79190611903565b60405180910390f35b3480156101bc57600080fd5b506101d760048036038101906101d29190611951565b61061f565b005b3480156101e557600080fd5b506101ee610671565b6040516101fb91906119dd565b60405180910390f35b34801561021057600080fd5b5061022b60048036038101906102269190611951565b610697565b6040516102399291906119f8565b60405180910390f35b34801561024e57600080fd5b506102576109bb565b005b34801561026557600080fd5b5061026e6109cf565b60405161027b9190611a21565b60405180910390f35b34801561029057600080fd5b506102ab60048036038101906102a69190611749565b6109f8565b005b3480156102b957600080fd5b506102d460048036038101906102cf9190611749565b610efa565b005b3480156102e257600080fd5b506102fd60048036038101906102f89190611749565b610f06565b60405161030a9190611a57565b60405180910390f35b34801561031f57600080fd5b50610328610f26565b6040516103359190611785565b60405180910390f35b34801561034a57600080fd5b50610353610f2c565b6040516103609190611a93565b60405180910390f35b34801561037557600080fd5b50610390600480360381019061038b9190611749565b610f52565b60405161039d9190611785565b60405180910390f35b3480156103b257600080fd5b506103bb610f76565b005b3480156103c957600080fd5b506103e460048036038101906103df9190611951565b611002565b005b80600003610429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042090611b31565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639c2d2d8e6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610498573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906104c19190611d28565b9050600081600183516104d49190611da0565b815181106104e5576104e4611dd4565b5b602002602001015160200151905080836006546105029190611e03565b1115610543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053a90611e83565b60405180910390fd5b60005b8381101561057c57610559600654611085565b60066000815461056890611ea3565b919050819055508080600101915050610546565b50505050565b60055481565b60018060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460e01b905082565b6060600280548060200260200160405190810160405280929190818152602001828054801561061557602002820191906000526020600020905b815481526020019060010190808311610601575b5050505050905090565b610627611541565b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561066d573d6000803e3d6000fd5b5050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060005b6002805490508110156109b457600080600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b8460405160240161070d9190611785565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516107779190611f5c565b600060405180830381855afa9150503d80600081146107b2576040519150601f19603f3d011682016040523d82523d6000602084013e6107b7565b606091505b5091509150816107fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f390611fe5565b60405180910390fd5b6000610807826115bf565b90508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036109a4576108446116de565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639c2d2d8e6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156108b3573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108dc9190611d28565b905060005b81518110156109a0578181815181106108fd576108fc611dd4565b5b602002602001015192506002878154811061091b5761091a611dd4565b5b906000526020600020015483600001511115801561095a57506002878154811061094857610947611dd4565b5b90600052602060002001548360200151115b15610993576002878154811061097357610972611dd4565b5b9060005260206000200154836040015198509850505050505050506109b6565b80806001019150506108e1565b5050505b505050808060010191505061069d565b505b915091565b6109c3611541565b6109cd6000611612565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610a00611541565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639c2d2d8e6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610a6f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610a989190611d28565b90508051600003610ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad590612077565b60405180910390fd5b60008160018351610aef9190611da0565b81518110610b0057610aff611dd4565b5b60200260200101516020015190506005548103610b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b49906120e3565b60405180910390fd5b82600003610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c90611b31565b60405180910390fd5b80600184600554610ba69190611e03565b610bb09190611da0565b10610bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be790611e83565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc2a88c36040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c859190612103565b9050600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d8a4676f846040518263ffffffff1660e01b8152600401610ce59190611785565b600060405180830381865afa158015610d02573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d2b919061221f565b9150915081610d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d66906122c7565b60405180910390fd5b600081600081518110610d8557610d84611dd4565b5b602002602001015160001b9050600060055490508760056000828254610dab9190611e03565b9250508190555060006002905060008290505b600554811015610eee5781828054905090806001815401808255809150506001900390600052602060002001600090919091909150556000600182610e039190611e03565b8560001c610e119190612316565b90506000838281548110610e2857610e27611dd4565b5b906000526020600020015490508360018580549050610e479190611da0565b81548110610e5857610e57611dd4565b5b9060005260206000200154848381548110610e7657610e75611dd4565b5b9060005260206000200181905550808460018680549050610e979190611da0565b81548110610ea857610ea7611dd4565b5b906000526020600020018190555085604051602001610ec79190612372565b60405160208183030381529060405280519060200120955050508080600101915050610dbe565b50505050505050505050565b610f0381611085565b50565b60036020528060005260406000206000915054906101000a900460ff1681565b60065481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60028181548110610f6257600080fd5b906000526020600020016000915090505481565b610f7e611541565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e0c862896040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610fe857600080fd5b505af1158015610ffc573d6000803e3d6000fd5b50505050565b61100a611541565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611079576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611070906123ff565b60405180910390fd5b61108281611612565b50565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639c2d2d8e6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156110f4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061111d9190611d28565b9050600081600183516111309190611da0565b8151811061114157611140611dd4565b5b60200260200101516020015190506005548114611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a9061246b565b60405180910390fd5b60065481116111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce906124d7565b60405180910390fd5b6003600084815260200190815260200160002060009054906101000a900460ff161561120457505061153e565b600080600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b866040516024016112679190611785565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516112d19190611f5c565b6000604051808303816000865af19150503d806000811461130e576040519150601f19603f3d011682016040523d82523d6000602084013e611313565b606091505b509150915081611358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134f90612543565b60405180910390fd5b6000611363826115bf565b905061136d6116de565b60005b86518110156115365786818151811061138c5761138b611dd4565b5b60200260200101519150600288815481106113aa576113a9611dd4565b5b90600052602060002001548260000151111580156113e957508160200151600289815481106113dc576113db611dd4565b5b9060005260206000200154105b15611529576001600360008a815260200190815260200160002060006101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff16826040015160405161144290612589565b60006040518083038185875af1925050503d806000811461147f576040519150601f19603f3d011682016040523d82523d6000602084013e611484565b606091505b505080955050846114ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c1906125ea565b60405180910390fd5b878373ffffffffffffffffffffffffffffffffffffffff167f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a84604001516040516115159190611785565b60405180910390a35050505050505061153e565b8080600101915050611370565b505050505050505b50565b6115496116d6565b73ffffffffffffffffffffffffffffffffffffffff166115676109cf565b73ffffffffffffffffffffffffffffffffffffffff16146115bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b490612656565b60405180910390fd5b565b6000601482511015611606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fd906126c2565b60405180910390fd5b60208201519050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b60405180606001604052806000815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61172681611713565b811461173157600080fd5b50565b6000813590506117438161171d565b92915050565b60006020828403121561175f5761175e611709565b5b600061176d84828501611734565b91505092915050565b61177f81611713565b82525050565b600060208201905061179a6000830184611776565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117cb826117a0565b9050919050565b6117db816117c0565b82525050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611816816117e1565b82525050565b600060408201905061183160008301856117d2565b61183e602083018461180d565b9392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61187a81611713565b82525050565b600061188c8383611871565b60208301905092915050565b6000602082019050919050565b60006118b082611845565b6118ba8185611850565b93506118c583611861565b8060005b838110156118f65781516118dd8882611880565b97506118e883611898565b9250506001810190506118c9565b5085935050505092915050565b6000602082019050818103600083015261191d81846118a5565b905092915050565b61192e816117c0565b811461193957600080fd5b50565b60008135905061194b81611925565b92915050565b60006020828403121561196757611966611709565b5b60006119758482850161193c565b91505092915050565b6000819050919050565b60006119a361199e611999846117a0565b61197e565b6117a0565b9050919050565b60006119b582611988565b9050919050565b60006119c7826119aa565b9050919050565b6119d7816119bc565b82525050565b60006020820190506119f260008301846119ce565b92915050565b6000604082019050611a0d6000830185611776565b611a1a6020830184611776565b9392505050565b6000602082019050611a3660008301846117d2565b92915050565b60008115159050919050565b611a5181611a3c565b82525050565b6000602082019050611a6c6000830184611a48565b92915050565b6000611a7d826119aa565b9050919050565b611a8d81611a72565b82525050565b6000602082019050611aa86000830184611a84565b92915050565b600082825260208201905092915050565b7f526166666c65506f6f6c3a20436f756e74206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000611b1b602883611aae565b9150611b2682611abf565b604082019050919050565b60006020820190508181036000830152611b4a81611b0e565b9050919050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611b9f82611b56565b810181811067ffffffffffffffff82111715611bbe57611bbd611b67565b5b80604052505050565b6000611bd16116ff565b9050611bdd8282611b96565b919050565b600067ffffffffffffffff821115611bfd57611bfc611b67565b5b602082029050602081019050919050565b600080fd5b600080fd5b600081519050611c278161171d565b92915050565b600060608284031215611c4357611c42611c13565b5b611c4d6060611bc7565b90506000611c5d84828501611c18565b6000830152506020611c7184828501611c18565b6020830152506040611c8584828501611c18565b60408301525092915050565b6000611ca4611c9f84611be2565b611bc7565b90508083825260208201905060608402830185811115611cc757611cc6611c0e565b5b835b81811015611cf05780611cdc8882611c2d565b845260208401935050606081019050611cc9565b5050509392505050565b600082601f830112611d0f57611d0e611b51565b5b8151611d1f848260208601611c91565b91505092915050565b600060208284031215611d3e57611d3d611709565b5b600082015167ffffffffffffffff811115611d5c57611d5b61170e565b5b611d6884828501611cfa565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611dab82611713565b9150611db683611713565b9250828203905081811115611dce57611dcd611d71565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000611e0e82611713565b9150611e1983611713565b9250828201905080821115611e3157611e30611d71565b5b92915050565b7f526166666c65506f6f6c3a204f7574206f6620696e6465780000000000000000600082015250565b6000611e6d601883611aae565b9150611e7882611e37565b602082019050919050565b60006020820190508181036000830152611e9c81611e60565b9050919050565b6000611eae82611713565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ee057611edf611d71565b5b600182019050919050565b600081519050919050565b600081905092915050565b60005b83811015611f1f578082015181840152602081019050611f04565b60008484015250505050565b6000611f3682611eeb565b611f408185611ef6565b9350611f50818560208601611f01565b80840191505092915050565b6000611f688284611f2b565b915081905092915050565b7f526166666c65506f6f6c3a2063616e6e6f74206765742075736572206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000611fcf602383611aae565b9150611fda82611f73565b604082019050919050565b60006020820190508181036000830152611ffe81611fc2565b9050919050565b7f526166666c65506f6f6c3a205061796f757420737472756374757265206e6f7460008201527f2073657400000000000000000000000000000000000000000000000000000000602082015250565b6000612061602483611aae565b915061206c82612005565b604082019050919050565b6000602082019050818103600083015261209081612054565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c20616c726561647920726166666c6564600082015250565b60006120cd602083611aae565b91506120d882612097565b602082019050919050565b600060208201905081810360008301526120fc816120c0565b9050919050565b60006020828403121561211957612118611709565b5b600061212784828501611c18565b91505092915050565b61213981611a3c565b811461214457600080fd5b50565b60008151905061215681612130565b92915050565b600067ffffffffffffffff82111561217757612176611b67565b5b602082029050602081019050919050565b600061219b6121968461215c565b611bc7565b905080838252602082019050602084028301858111156121be576121bd611c0e565b5b835b818110156121e757806121d38882611c18565b8452602084019350506020810190506121c0565b5050509392505050565b600082601f83011261220657612205611b51565b5b8151612216848260208601612188565b91505092915050565b6000806040838503121561223657612235611709565b5b600061224485828601612147565b925050602083015167ffffffffffffffff8111156122655761226461170e565b5b612271858286016121f1565b9150509250929050565b7f526166666c65506f6f6c3a207761697420666f722066756c66696c6c6d656e74600082015250565b60006122b1602083611aae565b91506122bc8261227b565b602082019050919050565b600060208201905081810360008301526122e0816122a4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061232182611713565b915061232c83611713565b92508261233c5761233b6122e7565b5b828206905092915050565b6000819050919050565b6000819050919050565b61236c61236782612347565b612351565b82525050565b600061237e828461235b565b60208201915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006123e9602683611aae565b91506123f48261238d565b604082019050919050565b60006020820190508181036000830152612418816123dc565b9050919050565b7f526166666c65506f6f6c3a20526166666c65206e6f7420656e64656400000000600082015250565b6000612455601c83611aae565b91506124608261241f565b602082019050919050565b6000602082019050818103600083015261248481612448565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c20616c72656164792070616964000000600082015250565b60006124c1601d83611aae565b91506124cc8261248b565b602082019050919050565b600060208201905081810360008301526124f0816124b4565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c2063616c6c206661696c656400000000600082015250565b600061252d601c83611aae565b9150612538826124f7565b602082019050919050565b6000602082019050818103600083015261255c81612520565b9050919050565b50565b6000612573600083611ef6565b915061257e82612563565b600082019050919050565b600061259482612566565b9150819050919050565b7f526166666c65506f6f6c3a207472616e73666572206661696c65640000000000600082015250565b60006125d4601b83611aae565b91506125df8261259e565b602082019050919050565b60006020820190508181036000830152612603816125c7565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612640602083611aae565b915061264b8261260a565b602082019050919050565b6000602082019050818103600083015261266f81612633565b9050919050565b7f526166666c65506f6f6c3a20496e76616c696420616464726573732064617461600082015250565b60006126ac602083611aae565b91506126b782612676565b602082019050919050565b600060208201905081810360008301526126db8161269f565b905091905056fea2646970667358221220aa6751343cf40c4614869ea3faec8f842e64c7ec864361650c238f669837528c64736f6c634300081b0033