ETH Price: $2,344.99 (+1.05%)

Contract

0x2adA3f0beDaFfb5f3dFE0aEaC43AC34f893D02Ea
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

ContractCreator

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Summon Moloch132169062021-09-13 10:45:001646 days ago1631529900IN
0x2adA3f0b...f893D02Ea
0 ETH0.0018928247.32063895
Summon Moloch98926132020-04-17 22:27:052160 days ago1587162425IN
0x2adA3f0b...f893D02Ea
0 ETH0.017194053.96
Summon Moloch98516462020-04-11 14:53:402166 days ago1586616820IN
0x2adA3f0b...f893D02Ea
0 ETH0.013025793
Summon Moloch98303552020-04-08 8:09:272169 days ago1586333367IN
0x2adA3f0b...f893D02Ea
0 ETH0.021709665
Summon Moloch98301032020-04-08 7:15:552169 days ago1586330155IN
0x2adA3f0b...f893D02Ea
0 ETH0.008683862
Summon Moloch98210522020-04-06 21:59:342171 days ago1586210374IN
0x2adA3f0b...f893D02Ea
0 ETH0.008683862
Summon Moloch97054592020-03-20 0:55:212189 days ago1584665721IN
0x2adA3f0b...f893D02Ea
0 ETH0.021709665
Summon Moloch97041052020-03-19 19:53:542189 days ago1584647634IN
0x2adA3f0b...f893D02Ea
0 ETH0.021709665
Summon Moloch93846712020-01-30 16:42:552238 days ago1580402575IN
0x2adA3f0b...f893D02Ea
0 ETH0.013115793

Latest 8 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
-98926132020-04-17 22:27:052160 days ago1587162425
0x2adA3f0b...f893D02Ea
 Contract Creation0 ETH
-98516462020-04-11 14:53:402166 days ago1586616820
0x2adA3f0b...f893D02Ea
 Contract Creation0 ETH
-98303552020-04-08 8:09:272169 days ago1586333367
0x2adA3f0b...f893D02Ea
 Contract Creation0 ETH
-98301032020-04-08 7:15:552169 days ago1586330155
0x2adA3f0b...f893D02Ea
 Contract Creation0 ETH
-98210522020-04-06 21:59:342171 days ago1586210374
0x2adA3f0b...f893D02Ea
 Contract Creation0 ETH
-97054592020-03-20 0:55:212189 days ago1584665721
0x2adA3f0b...f893D02Ea
 Contract Creation0 ETH
-97041052020-03-19 19:53:542189 days ago1584647634
0x2adA3f0b...f893D02Ea
 Contract Creation0 ETH
-93846712020-01-30 16:42:552238 days ago1580402575
0x2adA3f0b...f893D02Ea
 Contract Creation0 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MolochSummoner

Compiler Version
v0.5.13+commit.5b0b510c

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2020-01-30
*/

pragma solidity ^0.5.3;

contract Moloch {
    using SafeMath for uint256;

    /***************
    GLOBAL CONSTANTS
    ***************/
    uint256 public periodDuration; // default = 17280 = 4.8 hours in seconds (5 periods per day)
    uint256 public votingPeriodLength; // default = 35 periods (7 days)
    uint256 public gracePeriodLength; // default = 35 periods (7 days)
    uint256 public abortWindow; // default = 5 periods (1 day)
    uint256 public proposalDeposit; // default = 10 ETH (~$1,000 worth of ETH at contract deployment)
    uint256 public dilutionBound; // default = 3 - maximum multiplier a YES voter will be obligated to pay in case of mass ragequit
    uint256 public processingReward; // default = 0.1 - amount of ETH to give to whoever processes a proposal
    uint256 public summoningTime; // needed to determine the current period
    string public summoningStamp; // string stamp recording details of Moloch Summoning 

    IERC20 public approvedToken; // approved token contract reference; default = wETH
    GuildBank public guildBank; // guild bank contract reference

    // HARD-CODED LIMITS
    // These numbers are quite arbitrary; they are small enough to avoid overflows when doing calculations
    // with periods or shares, yet big enough to not limit reasonable use cases.
    uint256 constant MAX_VOTING_PERIOD_LENGTH = 10**18; // maximum length of voting period
    uint256 constant MAX_GRACE_PERIOD_LENGTH = 10**18; // maximum length of grace period
    uint256 constant MAX_DILUTION_BOUND = 10**18; // maximum dilution bound
    uint256 constant MAX_NUMBER_OF_SHARES = 10**18; // maximum number of shares that can be minted

    /***************
    EVENTS
    ***************/
    event SubmitProposal(uint256 proposalIndex, address indexed delegateKey, address indexed memberAddress, address indexed applicant, uint256 tokenTribute, uint256 sharesRequested);
    event SubmitVote(uint256 indexed proposalIndex, address indexed delegateKey, address indexed memberAddress, uint8 uintVote);
    event ProcessProposal(uint256 indexed proposalIndex, address indexed applicant, address indexed memberAddress, uint256 tokenTribute, uint256 sharesRequested, bool didPass);
    event Ragequit(address indexed memberAddress, uint256 sharesToBurn);
    event Abort(uint256 indexed proposalIndex, address applicantAddress);
    event UpdateDelegateKey(address indexed memberAddress, address newDelegateKey);
    event SummonComplete(address indexed summoner, uint256 shares);

    /******************
    INTERNAL ACCOUNTING
    ******************/
    uint256 public totalShares = 0; // total shares across all members
    uint256 public totalSharesRequested = 0; // total shares that have been requested in unprocessed proposals

    enum Vote {
        Null, // default value, counted as abstention
        Yes,
        No
    }

    struct Member {
        address delegateKey; // the key responsible for submitting proposals and voting - defaults to member address unless updated
        uint256 shares; // the # of shares assigned to this member
        bool exists; // always true once a member has been created
        uint256 highestIndexYesVote; // highest proposal index # on which the member voted YES
    }

    struct Proposal {
        address proposer; // the member who submitted the proposal
        address applicant; // the applicant who wishes to become a member - this key will be used for withdrawals
        uint256 sharesRequested; // the # of shares the applicant is requesting
        uint256 startingPeriod; // the period in which voting can start for this proposal
        uint256 yesVotes; // the total number of YES votes for this proposal
        uint256 noVotes; // the total number of NO votes for this proposal
        bool processed; // true only if the proposal has been processed
        bool didPass; // true only if the proposal passed
        bool aborted; // true only if applicant calls "abort" fn before end of voting period
        uint256 tokenTribute; // amount of tokens offered as tribute
        string details; // proposal details - could be IPFS hash, plaintext, or JSON
        uint256 maxTotalSharesAtYesVote; // the maximum # of total shares encountered at a yes vote on this proposal
        mapping (address => Vote) votesByMember; // the votes on this proposal by each member
    }

    mapping (address => Member) public members;
    mapping (address => address) public memberAddressByDelegateKey;
    Proposal[] public proposalQueue;

    /********
    MODIFIERS
    ********/
    modifier onlyMember {
        require(members[msg.sender].shares > 0, "Moloch::onlyMember - not a member");
        _;
    }

    modifier onlyDelegate {
        require(members[memberAddressByDelegateKey[msg.sender]].shares > 0, "Moloch::onlyDelegate - not a delegate");
        _;
    }

    /********
    FUNCTIONS
    ********/
    constructor(
        address summoner,
        address _approvedToken,
        uint256 _periodDuration,
        uint256 _votingPeriodLength,
        uint256 _gracePeriodLength,
        uint256 _abortWindow,
        uint256 _proposalDeposit,
        uint256 _dilutionBound,
        uint256 _processingReward,
        string memory _summoningStamp
    ) public {
        require(summoner != address(0), "Moloch::constructor - summoner cannot be 0");
        require(_approvedToken != address(0), "Moloch::constructor - _approvedToken cannot be 0");
        require(_periodDuration > 0, "Moloch::constructor - _periodDuration cannot be 0");
        require(_votingPeriodLength > 0, "Moloch::constructor - _votingPeriodLength cannot be 0");
        require(_votingPeriodLength <= MAX_VOTING_PERIOD_LENGTH, "Moloch::constructor - _votingPeriodLength exceeds limit");
        require(_gracePeriodLength <= MAX_GRACE_PERIOD_LENGTH, "Moloch::constructor - _gracePeriodLength exceeds limit");
        require(_abortWindow > 0, "Moloch::constructor - _abortWindow cannot be 0");
        require(_abortWindow <= _votingPeriodLength, "Moloch::constructor - _abortWindow must be smaller than or equal to _votingPeriodLength");
        require(_dilutionBound > 0, "Moloch::constructor - _dilutionBound cannot be 0");
        require(_dilutionBound <= MAX_DILUTION_BOUND, "Moloch::constructor - _dilutionBound exceeds limit");
        require(_proposalDeposit >= _processingReward, "Moloch::constructor - _proposalDeposit cannot be smaller than _processingReward");

        approvedToken = IERC20(_approvedToken);

        guildBank = new GuildBank(_approvedToken);

        periodDuration = _periodDuration;
        votingPeriodLength = _votingPeriodLength;
        gracePeriodLength = _gracePeriodLength;
        abortWindow = _abortWindow;
        proposalDeposit = _proposalDeposit;
        dilutionBound = _dilutionBound;
        processingReward = _processingReward;
        summoningStamp = _summoningStamp;

        summoningTime = now;

        members[summoner] = Member(summoner, 1, true, 0);
        memberAddressByDelegateKey[summoner] = summoner;
        totalShares = 1;

        emit SummonComplete(summoner, 1);
    }

    /*****************
    PROPOSAL FUNCTIONS
    *****************/
    function submitProposal(
        address applicant,
        uint256 tokenTribute,
        uint256 sharesRequested,
        string memory details
    )
        public
        onlyDelegate
    {
        require(applicant != address(0), "Moloch::submitProposal - applicant cannot be 0");

        // Make sure we won't run into overflows when doing calculations with shares.
        // Note that totalShares + totalSharesRequested + sharesRequested is an upper bound
        // on the number of shares that can exist until this proposal has been processed.
        require(totalShares.add(totalSharesRequested).add(sharesRequested) <= MAX_NUMBER_OF_SHARES, "Moloch::submitProposal - too many shares requested");

        totalSharesRequested = totalSharesRequested.add(sharesRequested);

        address memberAddress = memberAddressByDelegateKey[msg.sender];

        // collect proposal deposit from proposer and store it in the Moloch until the proposal is processed
        require(approvedToken.transferFrom(msg.sender, address(this), proposalDeposit), "Moloch::submitProposal - proposal deposit token transfer failed");

        // collect tribute from applicant and store it in the Moloch until the proposal is processed
        require(approvedToken.transferFrom(applicant, address(this), tokenTribute), "Moloch::submitProposal - tribute token transfer failed");

        // compute startingPeriod for proposal
        uint256 startingPeriod = max(
            getCurrentPeriod(),
            proposalQueue.length == 0 ? 0 : proposalQueue[proposalQueue.length.sub(1)].startingPeriod
        ).add(1);

        // create proposal ...
        Proposal memory proposal = Proposal({
            proposer: memberAddress,
            applicant: applicant,
            sharesRequested: sharesRequested,
            startingPeriod: startingPeriod,
            yesVotes: 0,
            noVotes: 0,
            processed: false,
            didPass: false,
            aborted: false,
            tokenTribute: tokenTribute,
            details: details,
            maxTotalSharesAtYesVote: 0
        });

        // ... and append it to the queue
        proposalQueue.push(proposal);

        uint256 proposalIndex = proposalQueue.length.sub(1);
        emit SubmitProposal(proposalIndex, msg.sender, memberAddress, applicant, tokenTribute, sharesRequested);
    }

    function submitVote(uint256 proposalIndex, uint8 uintVote) public onlyDelegate {
        address memberAddress = memberAddressByDelegateKey[msg.sender];
        Member storage member = members[memberAddress];

        require(proposalIndex < proposalQueue.length, "Moloch::submitVote - proposal does not exist");
        Proposal storage proposal = proposalQueue[proposalIndex];

        require(uintVote < 3, "Moloch::submitVote - uintVote must be less than 3");
        Vote vote = Vote(uintVote);

        require(getCurrentPeriod() >= proposal.startingPeriod, "Moloch::submitVote - voting period has not started");
        require(!hasVotingPeriodExpired(proposal.startingPeriod), "Moloch::submitVote - proposal voting period has expired");
        require(proposal.votesByMember[memberAddress] == Vote.Null, "Moloch::submitVote - member has already voted on this proposal");
        require(vote == Vote.Yes || vote == Vote.No, "Moloch::submitVote - vote must be either Yes or No");
        require(!proposal.aborted, "Moloch::submitVote - proposal has been aborted");

        // store vote
        proposal.votesByMember[memberAddress] = vote;

        // count vote
        if (vote == Vote.Yes) {
            proposal.yesVotes = proposal.yesVotes.add(member.shares);

            // set highest index (latest) yes vote - must be processed for member to ragequit
            if (proposalIndex > member.highestIndexYesVote) {
                member.highestIndexYesVote = proposalIndex;
            }

            // set maximum of total shares encountered at a yes vote - used to bound dilution for yes voters
            if (totalShares > proposal.maxTotalSharesAtYesVote) {
                proposal.maxTotalSharesAtYesVote = totalShares;
            }

        } else if (vote == Vote.No) {
            proposal.noVotes = proposal.noVotes.add(member.shares);
        }

        emit SubmitVote(proposalIndex, msg.sender, memberAddress, uintVote);
    }

    function processProposal(uint256 proposalIndex) public {
        require(proposalIndex < proposalQueue.length, "Moloch::processProposal - proposal does not exist");
        Proposal storage proposal = proposalQueue[proposalIndex];

        require(getCurrentPeriod() >= proposal.startingPeriod.add(votingPeriodLength).add(gracePeriodLength), "Moloch::processProposal - proposal is not ready to be processed");
        require(proposal.processed == false, "Moloch::processProposal - proposal has already been processed");
        require(proposalIndex == 0 || proposalQueue[proposalIndex.sub(1)].processed, "Moloch::processProposal - previous proposal must be processed");

        proposal.processed = true;
        totalSharesRequested = totalSharesRequested.sub(proposal.sharesRequested);

        bool didPass = proposal.yesVotes > proposal.noVotes;

        // Make the proposal fail if the dilutionBound is exceeded
        if (totalShares.mul(dilutionBound) < proposal.maxTotalSharesAtYesVote) {
            didPass = false;
        }

        // PROPOSAL PASSED
        if (didPass && !proposal.aborted) {

            proposal.didPass = true;

            // if the applicant is already a member, add to their existing shares
            if (members[proposal.applicant].exists) {
                members[proposal.applicant].shares = members[proposal.applicant].shares.add(proposal.sharesRequested);

            // the applicant is a new member, create a new record for them
            } else {
                // if the applicant address is already taken by a member's delegateKey, reset it to their member address
                if (members[memberAddressByDelegateKey[proposal.applicant]].exists) {
                    address memberToOverride = memberAddressByDelegateKey[proposal.applicant];
                    memberAddressByDelegateKey[memberToOverride] = memberToOverride;
                    members[memberToOverride].delegateKey = memberToOverride;
                }

                // use applicant address as delegateKey by default
                members[proposal.applicant] = Member(proposal.applicant, proposal.sharesRequested, true, 0);
                memberAddressByDelegateKey[proposal.applicant] = proposal.applicant;
            }

            // mint new shares
            totalShares = totalShares.add(proposal.sharesRequested);

            // transfer tokens to guild bank
            require(
                approvedToken.transfer(address(guildBank), proposal.tokenTribute),
                "Moloch::processProposal - token transfer to guild bank failed"
            );

        // PROPOSAL FAILED OR ABORTED
        } else {
            // return all tokens to the applicant
            require(
                approvedToken.transfer(proposal.applicant, proposal.tokenTribute),
                "Moloch::processProposal - failing vote token transfer failed"
            );
        }

        // send msg.sender the processingReward
        require(
            approvedToken.transfer(msg.sender, processingReward),
            "Moloch::processProposal - failed to send processing reward to msg.sender"
        );

        // return deposit to proposer (subtract processing reward)
        require(
            approvedToken.transfer(proposal.proposer, proposalDeposit.sub(processingReward)),
            "Moloch::processProposal - failed to return proposal deposit to proposer"
        );

        emit ProcessProposal(
            proposalIndex,
            proposal.applicant,
            proposal.proposer,
            proposal.tokenTribute,
            proposal.sharesRequested,
            didPass
        );
    }

    function ragequit(uint256 sharesToBurn) public onlyMember {
        uint256 initialTotalShares = totalShares;

        Member storage member = members[msg.sender];

        require(member.shares >= sharesToBurn, "Moloch::ragequit - insufficient shares");

        require(canRagequit(member.highestIndexYesVote), "Moloch::ragequit - cant ragequit until highest index proposal member voted YES on is processed");

        // burn shares
        member.shares = member.shares.sub(sharesToBurn);
        totalShares = totalShares.sub(sharesToBurn);

        // instruct guildBank to transfer fair share of tokens to the ragequitter
        require(
            guildBank.withdraw(msg.sender, sharesToBurn, initialTotalShares),
            "Moloch::ragequit - withdrawal of tokens from guildBank failed"
        );

        emit Ragequit(msg.sender, sharesToBurn);
    }

    function abort(uint256 proposalIndex) public {
        require(proposalIndex < proposalQueue.length, "Moloch::abort - proposal does not exist");
        Proposal storage proposal = proposalQueue[proposalIndex];

        require(msg.sender == proposal.applicant, "Moloch::abort - msg.sender must be applicant");
        require(getCurrentPeriod() < proposal.startingPeriod.add(abortWindow), "Moloch::abort - abort window must not have passed");
        require(!proposal.aborted, "Moloch::abort - proposal must not have already been aborted");

        uint256 tokensToAbort = proposal.tokenTribute;
        proposal.tokenTribute = 0;
        proposal.aborted = true;

        // return all tokens to the applicant
        require(
            approvedToken.transfer(proposal.applicant, tokensToAbort),
            "Moloch::processProposal - failed to return tribute to applicant"
        );

        emit Abort(proposalIndex, msg.sender);
    }

    function updateDelegateKey(address newDelegateKey) public onlyMember {
        require(newDelegateKey != address(0), "Moloch::updateDelegateKey - newDelegateKey cannot be 0");

        // skip checks if member is setting the delegate key to their member address
        if (newDelegateKey != msg.sender) {
            require(!members[newDelegateKey].exists, "Moloch::updateDelegateKey - cant overwrite existing members");
            require(!members[memberAddressByDelegateKey[newDelegateKey]].exists, "Moloch::updateDelegateKey - cant overwrite existing delegate keys");
        }

        Member storage member = members[msg.sender];
        memberAddressByDelegateKey[member.delegateKey] = address(0);
        memberAddressByDelegateKey[newDelegateKey] = msg.sender;
        member.delegateKey = newDelegateKey;

        emit UpdateDelegateKey(msg.sender, newDelegateKey);
    }

    /***************
    GETTER FUNCTIONS
    ***************/
    function max(uint256 x, uint256 y) internal pure returns (uint256) {
        return x >= y ? x : y;
    }

    function getCurrentPeriod() public view returns (uint256) {
        return now.sub(summoningTime).div(periodDuration);
    }

    function getProposalQueueLength() public view returns (uint256) {
        return proposalQueue.length;
    }

    // can only ragequit if the latest proposal you voted YES on has been processed
    function canRagequit(uint256 highestIndexYesVote) public view returns (bool) {
        require(highestIndexYesVote < proposalQueue.length, "Moloch::canRagequit - proposal does not exist");
        return proposalQueue[highestIndexYesVote].processed;
    }

    function hasVotingPeriodExpired(uint256 startingPeriod) public view returns (bool) {
        return getCurrentPeriod() >= startingPeriod.add(votingPeriodLength);
    }

    function getMemberProposalVote(address memberAddress, uint256 proposalIndex) public view returns (Vote) {
        require(members[memberAddress].exists, "Moloch::getMemberProposalVote - member doesn't exist");
        require(proposalIndex < proposalQueue.length, "Moloch::getMemberProposalVote - proposal doesn't exist");
        return proposalQueue[proposalIndex].votesByMember[memberAddress];
    }
}

interface IERC20 {
    function transfer(address to, uint256 value) external returns (bool);

    function approve(address spender, uint256 value) external returns (bool);

    function transferFrom(address from, address to, uint256 value) external returns (bool);

    function totalSupply() external view returns (uint256);

    function balanceOf(address who) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract Ownable {
    address private _owner;

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

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

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

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

    /**
     * @return true if `msg.sender` is the owner of the contract.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    /**
     * @dev Allows the current owner to relinquish control of the contract.
     * @notice Renouncing to ownership will leave the contract without an owner.
     * It will not be possible to call the functions with the `onlyOwner`
     * modifier anymore.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

contract GuildBank is Ownable {
    using SafeMath for uint256;

    IERC20 public approvedToken; // approved token contract reference

    event Withdrawal(address indexed receiver, uint256 amount);

    constructor(address approvedTokenAddress) public {
        approvedToken = IERC20(approvedTokenAddress);
    }

    function withdraw(address receiver, uint256 shares, uint256 totalShares) public onlyOwner returns (bool) {
        uint256 amount = approvedToken.balanceOf(address(this)).mul(shares).div(totalShares);
        emit Withdrawal(receiver, amount);
        return approvedToken.transfer(receiver, amount);
    }
}

library SafeMath {
    /**
     * @dev Multiplies two unsigned integers, reverts on overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
     * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Adds two unsigned integers, reverts on overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    /**
     * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
     * reverts when dividing by zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}

contract MolochSummoner {
    
    Moloch private M;
    
    address[] public Molochs;
    
    event Summoned(address indexed M, address indexed summoner);
    
    function summonMoloch(
        address summoner,
        address _approvedToken,
        uint256 _periodDuration,
        uint256 _votingPeriodLength,
        uint256 _gracePeriodLength,
        uint256 _abortWindow,
        uint256 _proposalDeposit,
        uint256 _dilutionBound,
        uint256 _processingReward,
        string memory _summoningStamp) public {
       
        M = new Moloch(
            summoner,
            _approvedToken,
            _periodDuration,
            _votingPeriodLength,
            _gracePeriodLength,
            _abortWindow,
            _proposalDeposit,
            _dilutionBound,
            _processingReward,
            _summoningStamp);
        
        Molochs.push(address(M));
        
        emit Summoned(address(M), summoner);
    }
    
    function getMolochCount() public view returns (uint256 MolochCount) {
        return Molochs.length;
    }
}

Contract Security Audit

Contract ABI

API
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"M","type":"address"},{"indexed":true,"internalType":"address","name":"summoner","type":"address"}],"name":"Summoned","type":"event"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"Molochs","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMolochCount","outputs":[{"internalType":"uint256","name":"MolochCount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"summoner","type":"address"},{"internalType":"address","name":"_approvedToken","type":"address"},{"internalType":"uint256","name":"_periodDuration","type":"uint256"},{"internalType":"uint256","name":"_votingPeriodLength","type":"uint256"},{"internalType":"uint256","name":"_gracePeriodLength","type":"uint256"},{"internalType":"uint256","name":"_abortWindow","type":"uint256"},{"internalType":"uint256","name":"_proposalDeposit","type":"uint256"},{"internalType":"uint256","name":"_dilutionBound","type":"uint256"},{"internalType":"uint256","name":"_processingReward","type":"uint256"},{"internalType":"string","name":"_summoningStamp","type":"string"}],"name":"summonMoloch","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50615d3e806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80630fe204bd1461004657806381fc595914610064578063f0aa7651146100d2575b600080fd5b61004e610214565b6040518082815260200191505060405180910390f35b6100906004803603602081101561007a57600080fd5b8101908080359060200190929190505050610221565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61021260048036036101408110156100e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561018c57600080fd5b82018360208201111561019e57600080fd5b803590602001918460018302840111640100000000831117156101c057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061025d565b005b6000600180549050905090565b6001818154811061022e57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b89898989898989898989604051610273906104e3565b808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200189815260200188815260200187815260200186815260200185815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561033e578082015181840152602081019050610323565b50505050905090810190601f16801561036b5780820380516001836020036101000a031916815260200191505b509b505050505050505050505050604051809103906000f080158015610395573d6000803e3d6000fd5b506000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508973ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f5d117058594e38d35f98a79b5e9cbcd9fa0597fad786e2826bc4f290a0f5d4a760405160405180910390a350505050505050505050565b61581880620004f28339019056fe60806040526000600b556000600c553480156200001b57600080fd5b50604051620058183803806200581883398181016040526101408110156200004257600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080516040519392919084640100000000821115620000bd57600080fd5b83820191506020820185811115620000d457600080fd5b8251866001820283011164010000000082111715620000f257600080fd5b8083526020830192505050908051906020019080838360005b83811015620001285780820151818401526020810190506200010b565b50505050905090810190601f168015620001565780820380516001836020036101000a031916815260200191505b50604052505050600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff161415620001e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180620055e3602a913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156200026d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180620057b86030913960400191505060405180910390fd5b60008811620002c8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180620057876031913960400191505060405180910390fd5b6000871162000323576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526035815260200180620057526035913960400191505060405180910390fd5b670de0b6b3a764000087111562000386576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806200560d6037913960400191505060405180910390fd5b670de0b6b3a7640000861115620003e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806200571c6036913960400191505060405180910390fd5b6000851162000444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180620055b5602e913960400191505060405180910390fd5b868511156200049f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526057815260200180620056c56057913960600191505060405180910390fd5b60008311620004fa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180620057e86030913960400191505060405180910390fd5b670de0b6b3a76400008311156200055d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180620056936032913960400191505060405180910390fd5b81841015620005b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604f81526020018062005644604f913960600191505060405180910390fd5b88600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886040516200060890620008cb565b808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f0801580156200065b573d6000803e3d6000fd5b50600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550876000819055508660018190555085600281905550846003819055508360048190555082600581905550816006819055508060089080519060200190620006e5929190620008d9565b504260078190555060405180608001604052808b73ffffffffffffffffffffffffffffffffffffffff168152602001600181526020016001151581526020016000815250600d60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020160006101000a81548160ff0219169083151502179055506060820151816003015590505089600e60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b819055508973ffffffffffffffffffffffffffffffffffffffff167f03995a801b13c36325306deef859ef977ce61c6e15a794281bf969d20482522760016040518082815260200191505060405180910390a25050505050505050505062000988565b61089d8062004d1883390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200091c57805160ff19168380011785556200094d565b828001600101855582156200094d579182015b828111156200094c5782518255916020019190600101906200092f565b5b5090506200095c919062000960565b5090565b6200098591905b808211156200098157600081600090555060010162000967565b5090565b90565b61438080620009986000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c80637d5b6c72116100f9578063a3dc380011610097578063b470aade11610071578063b470aade146108d6578063bab46259146108f4578063e50701f41461093e578063e63bc62d1461096c576101a9565b8063a3dc380014610828578063a42afd291461086e578063afe5475f146108b8576101a9565b80638b15a605116100d35780638b15a6051461069a5780639425a476146106b8578063962006c3146106fe57806399653fbe146107ed576101a9565b80637d5b6c72146106305780638340bbce1461064e5780638436593f1461066c576101a9565b80633a98ef39116101665780635dec26b4116101405780635dec26b41461055357806363858f2d146105d65780637896ddaf146105f4578063797daf7014610612576101a9565b80633a98ef39146103595780633b214a7414610377578063402c1794146104cf576101a9565b806303e32fa1146101ae578063044a0ca8146101cc578063086146d21461023c57806308ae4b0c1461025a5780631a396a4a146102f75780632582bf2a14610315575b600080fd5b6101b661099a565b6040518082815260200191505060405180910390f35b610218600480360360408110156101e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506109a0565b6040518082600281111561022857fe5b60ff16815260200191505060405180910390f35b610244610b15565b6040518082815260200191505060405180910390f35b61029c6004803603602081101561027057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b45565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018315151515815260200182815260200194505050505060405180910390f35b6102ff610ba2565b6040518082815260200191505060405180910390f35b6103576004803603602081101561032b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ba8565b005b6103616110cd565b6040518082815260200191505060405180910390f35b6103a36004803603602081101561038d57600080fd5b81019080803590602001909291905050506110d3565b604051808d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018b81526020018a815260200189815260200188815260200187151515158152602001861515151581526020018515151515815260200184815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561048957808201518184015260208101905061046e565b50505050905090810190601f1680156104b65780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390f35b610511600480360360208110156104e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061123f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61055b611272565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561059b578082015181840152602081019050610580565b50505050905090810190601f1680156105c85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6105de611310565b6040518082815260200191505060405180910390f35b6105fc611316565b6040518082815260200191505060405180910390f35b61061a61131c565b6040518082815260200191505060405180910390f35b610638611329565b6040518082815260200191505060405180910390f35b61065661132f565b6040518082815260200191505060405180910390f35b6106986004803603602081101561068257600080fd5b8101908080359060200190929190505050611335565b005b6106a26116a7565b6040518082815260200191505060405180910390f35b6106e4600480360360208110156106ce57600080fd5b81019080803590602001909291905050506116ad565b604051808215151515815260200191505060405180910390f35b6107eb6004803603608081101561071457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561076557600080fd5b82018360208201111561077757600080fd5b8035906020019184600183028401116401000000008311171561079957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506116d5565b005b6108266004803603604081101561080357600080fd5b8101908080359060200190929190803560ff169060200190929190505050611f6f565b005b6108546004803603602081101561083e57600080fd5b8101908080359060200190929190505050612606565b604051808215151515815260200191505060405180910390f35b610876612698565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108c06126be565b6040518082815260200191505060405180910390f35b6108de6126c4565b6040518082815260200191505060405180910390f35b6108fc6126ca565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61096a6004803603602081101561095457600080fd5b81019080803590602001909291905050506126f0565b005b6109986004803603602081101561098257600080fd5b8101908080359060200190929190505050612ae9565b005b60065481565b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900460ff16610a47576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806140216034913960400191505060405180910390fd5b600f805490508210610aa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180613de86036913960400191505060405180910390fd5b600f8281548110610ab157fe5b90600052602060002090600b0201600a0160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000610b40600054610b32600754426139e190919063ffffffff16565b613a0190919063ffffffff16565b905090565b600d6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff16908060030154905084565b600c5481565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015411610c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613cc46021913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806142776036913960400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ea857600d60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900460ff1615610da2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180613c89603b913960400191505060405180910390fd5b600d6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900460ff1615610ea7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604181526020018061414c6041913960600191505060405180910390fd5b5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600e60008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff167fde7b64a369e10562cc2e71f0f1f944eaf144b75fead6ecb51fac9c4dd693488583604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a25050565b600b5481565b600f81815481106110e057fe5b90600052602060002090600b02016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040154908060050154908060060160009054906101000a900460ff16908060060160019054906101000a900460ff16908060060160029054906101000a900460ff1690806007015490806008018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561122f5780601f106112045761010080835404028352916020019161122f565b820191906000526020600020905b81548152906001019060200180831161121257829003601f168201915b505050505090806009015490508c565b600e6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60088054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113085780601f106112dd57610100808354040283529160200191611308565b820191906000526020600020905b8154815290600101906020018083116112eb57829003601f168201915b505050505081565b60025481565b60035481565b6000600f80549050905090565b60075481565b60015481565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154116113d0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613cc46021913960400191505060405180910390fd5b6000600b5490506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600101541015611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061422a6026913960400191505060405180910390fd5b6114848160030154612606565b6114d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252605e815260200180613f5a605e913960600191505060405180910390fd5b6114f08382600101546139e190919063ffffffff16565b816001018190555061150d83600b546139e190919063ffffffff16565b600b81905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b5c5f6723385856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019350505050602060405180830381600087803b1580156115c457600080fd5b505af11580156115d8573d6000803e3d6000fd5b505050506040513d60208110156115ee57600080fd5b8101908080519060200190929190505050611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180613ce5603d913960400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f667cb7a1818eacd2e3a421e734429ba9c4c7dec85e578e098b6d72cd2bfbf2f6846040518082815260200191505060405180910390a2505050565b60045481565b60006116c460015483613a2790919063ffffffff16565b6116cc610b15565b10159050919050565b6000600d6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154116117cf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613d226025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613e81602e913960400191505060405180910390fd5b670de0b6b3a764000061188783611879600c54600b54613a2790919063ffffffff16565b613a2790919063ffffffff16565b11156118de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140946032913960400191505060405180910390fd5b6118f382600c54613a2790919063ffffffff16565b600c819055506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33306004546040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611a3c57600080fd5b505af1158015611a50573d6000803e3d6000fd5b505050506040513d6020811015611a6657600080fd5b8101908080519060200190929190505050611acc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180613bd3603f913960400191505060405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8630876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611ba957600080fd5b505af1158015611bbd573d6000803e3d6000fd5b505050506040513d6020811015611bd357600080fd5b8101908080519060200190929190505050611c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180613d476036913960400191505060405180910390fd5b6000611caa6001611c9c611c4b610b15565b6000600f8054905014611c9457600f611c736001600f805490506139e190919063ffffffff16565b81548110611c7d57fe5b90600052602060002090600b020160030154611c97565b60005b613a46565b613a2790919063ffffffff16565b9050611cb4613a9a565b6040518061018001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff168152602001868152602001838152602001600081526020016000815260200160001515815260200160001515815260200160001515815260200187815260200185815260200160008152509050600f819080600181540180825580915050906001820390600052602060002090600b02016000909192909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a81548160ff02191690831515021790555060e08201518160060160016101000a81548160ff0219169083151502179055506101008201518160060160026101000a81548160ff0219169083151502179055506101208201518160070155610140820151816008019080519060200190611ead929190613b2d565b5061016082015181600901555050506000611ed76001600f805490506139e190919063ffffffff16565b90508773ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2d105ebbc222c190059b3979356e13469f6a29a350add74ac3bf4f22f16301d6848b8b60405180848152602001838152602001828152602001935050505060405180910390a45050505050505050565b6000600d6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015411612069576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613d226025913960400191505060405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600f80549050841061216d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613fb8602c913960400191505060405180910390fd5b6000600f858154811061217c57fe5b90600052602060002090600b0201905060038460ff16106121e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806142ad6031913960400191505060405180910390fd5b60008460ff1660028111156121f957fe5b90508160030154612208610b15565b101561225f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061418d6032913960400191505060405180910390fd5b61226c82600301546116ad565b156122c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180613edc6037913960400191505060405180910390fd5b600060028111156122cf57fe5b82600a0160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16600281111561232957fe5b1461237f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e81526020018061410e603e913960400191505060405180910390fd5b6001600281111561238c57fe5b81600281111561239857fe5b14806123b957506002808111156123ab57fe5b8160028111156123b757fe5b145b61240e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180613e1e6032913960400191505060405180910390fd5b8160060160029054906101000a900460ff1615612476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806141bf602e913960400191505060405180910390fd5b8082600a0160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360028111156124d357fe5b0217905550600160028111156124e557fe5b8160028111156124f157fe5b141561254f5761251283600101548360040154613a2790919063ffffffff16565b82600401819055508260030154861115612530578583600301819055505b8160090154600b54111561254a57600b5482600901819055505b612592565b60028081111561255b57fe5b81600281111561256757fe5b14156125915761258883600101548360050154613a2790919063ffffffff16565b82600501819055505b5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16877f29bf0061f2faa9daa482f061b116195432d435536d8af4ae6b3c5dd78223679b88604051808260ff1660ff16815260200191505060405180910390a4505050505050565b6000600f805490508210612665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180613eaf602d913960400191505060405180910390fd5b600f828154811061267257fe5b90600052602060002090600b020160060160009054906101000a900460ff169050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b60005481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f80549050811061274d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806142506027913960400191505060405180910390fd5b6000600f828154811061275c57fe5b90600052602060002090600b020190508060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613dbc602c913960400191505060405180910390fd5b61282d6003548260030154613a2790919063ffffffff16565b612835610b15565b1061288b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180613e506031913960400191505060405180910390fd5b8060060160029054906101000a900460ff16156128f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180613c4e603b913960400191505060405180910390fd5b6000816007015490506000826007018190555060018260060160026101000a81548160ff021916908315150217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156129f057600080fd5b505af1158015612a04573d6000803e3d6000fd5b505050506040513d6020811015612a1a57600080fd5b8101908080519060200190929190505050612a80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180614055603f913960400191505060405180910390fd5b827fa749dd3df92cae4d106b3eadf60c0dffd3698de09c67ce58ce6f5d02eb82131333604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a2505050565b600f805490508110612b46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603181526020018061431b6031913960400191505060405180910390fd5b6000600f8281548110612b5557fe5b90600052602060002090600b02019050612b92600254612b846001548460030154613a2790919063ffffffff16565b613a2790919063ffffffff16565b612b9a610b15565b1015612bf1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180613d7d603f913960400191505060405180910390fd5b600015158160060160009054906101000a900460ff16151514612c5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806142de603d913960400191505060405180910390fd5b6000821480612ca95750600f612c7f6001846139e190919063ffffffff16565b81548110612c8957fe5b90600052602060002090600b020160060160009054906101000a900460ff165b612cfe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180613fe4603d913960400191505060405180910390fd5b60018160060160006101000a81548160ff021916908315150217905550612d348160020154600c546139e190919063ffffffff16565b600c819055506000816005015482600401541190508160090154612d65600554600b54613a6090919063ffffffff16565b1015612d7057600090505b808015612d8c57508160060160029054906101000a900460ff16155b156135025760018260060160016101000a81548160ff021916908315150217905550600d60008360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900460ff1615612f1357612ea48260020154600d60008560010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154613a2790919063ffffffff16565b600d60008460010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061337f565b600d6000600e60008560010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900460ff1615613174576000600e60008460010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b60405180608001604052808360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836002015481526020016001151581526020016000815250600d60008460010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020160006101000a81548160ff021916908315150217905550606082015181600301559050508160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600e60008460010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6133988260020154600b54613a2790919063ffffffff16565b600b81905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684600701546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561346d57600080fd5b505af1158015613481573d6000803e3d6000fd5b505050506040513d602081101561349757600080fd5b81019080805190602001909291905050506134fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806141ed603d913960400191505060405180910390fd5b613664565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684600701546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156135d357600080fd5b505af11580156135e7573d6000803e3d6000fd5b505050506040513d60208110156135fd57600080fd5b8101908080519060200190929190505050613663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180613c12603c913960400191505060405180910390fd5b5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb336006546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561370f57600080fd5b505af1158015613723573d6000803e3d6000fd5b505050506040513d602081101561373957600080fd5b810190808051906020019092919050505061379f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260488152602001806140c66048913960600191505060405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166138196006546004546139e190919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561388257600080fd5b505af1158015613896573d6000803e3d6000fd5b505050506040513d60208110156138ac57600080fd5b8101908080519060200190929190505050613912576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526047815260200180613f136047913960600191505060405180910390fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16847f3f6fc303a82367bb4947244ba21c569a5ed2e870610f1a693366142309d7cbea85600701548660020154866040518084815260200183815260200182151515158152602001935050505060405180910390a4505050565b6000828211156139f057600080fd5b600082840390508091505092915050565b6000808211613a0f57600080fd5b6000828481613a1a57fe5b0490508091505092915050565b600080828401905083811015613a3c57600080fd5b8091505092915050565b600081831015613a565781613a58565b825b905092915050565b600080831415613a735760009050613a94565b6000828402905082848281613a8457fe5b0414613a8f57600080fd5b809150505b92915050565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581526020016000151581526020016000815260200160608152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613b6e57805160ff1916838001178555613b9c565b82800160010185558215613b9c579182015b82811115613b9b578251825591602001919060010190613b80565b5b509050613ba99190613bad565b5090565b613bcf91905b80821115613bcb576000816000905550600101613bb3565b5090565b9056fe4d6f6c6f63683a3a7375626d697450726f706f73616c202d2070726f706f73616c206465706f73697420746f6b656e207472616e73666572206661696c65644d6f6c6f63683a3a70726f6365737350726f706f73616c202d206661696c696e6720766f746520746f6b656e207472616e73666572206661696c65644d6f6c6f63683a3a61626f7274202d2070726f706f73616c206d757374206e6f74206861766520616c7265616479206265656e2061626f727465644d6f6c6f63683a3a75706461746544656c65676174654b6579202d2063616e74206f7665727772697465206578697374696e67206d656d626572734d6f6c6f63683a3a6f6e6c794d656d626572202d206e6f742061206d656d6265724d6f6c6f63683a3a7261676571756974202d207769746864726177616c206f6620746f6b656e732066726f6d206775696c6442616e6b206661696c65644d6f6c6f63683a3a6f6e6c7944656c6567617465202d206e6f7420612064656c65676174654d6f6c6f63683a3a7375626d697450726f706f73616c202d207472696275746520746f6b656e207472616e73666572206661696c65644d6f6c6f63683a3a70726f6365737350726f706f73616c202d2070726f706f73616c206973206e6f7420726561647920746f2062652070726f6365737365644d6f6c6f63683a3a61626f7274202d206d73672e73656e646572206d757374206265206170706c6963616e744d6f6c6f63683a3a6765744d656d62657250726f706f73616c566f7465202d2070726f706f73616c20646f65736e27742065786973744d6f6c6f63683a3a7375626d6974566f7465202d20766f7465206d7573742062652065697468657220596573206f72204e6f4d6f6c6f63683a3a61626f7274202d2061626f72742077696e646f77206d757374206e6f742068617665207061737365644d6f6c6f63683a3a7375626d697450726f706f73616c202d206170706c6963616e742063616e6e6f7420626520304d6f6c6f63683a3a63616e5261676571756974202d2070726f706f73616c20646f6573206e6f742065786973744d6f6c6f63683a3a7375626d6974566f7465202d2070726f706f73616c20766f74696e6720706572696f642068617320657870697265644d6f6c6f63683a3a70726f6365737350726f706f73616c202d206661696c656420746f2072657475726e2070726f706f73616c206465706f73697420746f2070726f706f7365724d6f6c6f63683a3a7261676571756974202d2063616e7420726167657175697420756e74696c206869676865737420696e6465782070726f706f73616c206d656d62657220766f74656420594553206f6e2069732070726f6365737365644d6f6c6f63683a3a7375626d6974566f7465202d2070726f706f73616c20646f6573206e6f742065786973744d6f6c6f63683a3a70726f6365737350726f706f73616c202d2070726576696f75732070726f706f73616c206d7573742062652070726f6365737365644d6f6c6f63683a3a6765744d656d62657250726f706f73616c566f7465202d206d656d62657220646f65736e27742065786973744d6f6c6f63683a3a70726f6365737350726f706f73616c202d206661696c656420746f2072657475726e207472696275746520746f206170706c6963616e744d6f6c6f63683a3a7375626d697450726f706f73616c202d20746f6f206d616e7920736861726573207265717565737465644d6f6c6f63683a3a70726f6365737350726f706f73616c202d206661696c656420746f2073656e642070726f63657373696e672072657761726420746f206d73672e73656e6465724d6f6c6f63683a3a7375626d6974566f7465202d206d656d6265722068617320616c726561647920766f746564206f6e20746869732070726f706f73616c4d6f6c6f63683a3a75706461746544656c65676174654b6579202d2063616e74206f7665727772697465206578697374696e672064656c6567617465206b6579734d6f6c6f63683a3a7375626d6974566f7465202d20766f74696e6720706572696f6420686173206e6f7420737461727465644d6f6c6f63683a3a7375626d6974566f7465202d2070726f706f73616c20686173206265656e2061626f727465644d6f6c6f63683a3a70726f6365737350726f706f73616c202d20746f6b656e207472616e7366657220746f206775696c642062616e6b206661696c65644d6f6c6f63683a3a7261676571756974202d20696e73756666696369656e74207368617265734d6f6c6f63683a3a61626f7274202d2070726f706f73616c20646f6573206e6f742065786973744d6f6c6f63683a3a75706461746544656c65676174654b6579202d206e657744656c65676174654b65792063616e6e6f7420626520304d6f6c6f63683a3a7375626d6974566f7465202d2075696e74566f7465206d757374206265206c657373207468616e20334d6f6c6f63683a3a70726f6365737350726f706f73616c202d2070726f706f73616c2068617320616c7265616479206265656e2070726f6365737365644d6f6c6f63683a3a70726f6365737350726f706f73616c202d2070726f706f73616c20646f6573206e6f74206578697374a265627a7a7231582003f63d1858fde3ff0009189deaca78f29c566fbec4c2ffdb19b4b615ecdd355864736f6c634300050d0032608060405234801561001057600080fd5b5060405161089d38038061089d8339818101604052602081101561003357600080fd5b8101908080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505061074c806101516000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c8063715018a6146100675780638da5cb5b146100715780638f32d59b146100bb578063b5c5f672146100dd578063bab462591461014d578063f2fde38b14610197575b600080fd5b61006f6101db565b005b6100796102ab565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100c36102d4565b604051808215151515815260200191505060405180910390f35b610133600480360360608110156100f357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919050505061032b565b604051808215151515815260200191505060405180910390f35b61015561057c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101d9600480360360208110156101ad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506105a2565b005b6101e36102d4565b6101ec57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b60006103356102d4565b61033e57600080fd5b600061043e8361043086600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156103e757600080fd5b505afa1580156103fb573d6000803e3d6000fd5b505050506040513d602081101561041157600080fd5b81019080805190602001909291905050506105bf90919063ffffffff16565b6105f990919063ffffffff16565b90508473ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a2600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561053757600080fd5b505af115801561054b573d6000803e3d6000fd5b505050506040513d602081101561056157600080fd5b81019080805190602001909291905050509150509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6105aa6102d4565b6105b357600080fd5b6105bc8161061f565b50565b6000808314156105d257600090506105f3565b60008284029050828482816105e357fe5b04146105ee57600080fd5b809150505b92915050565b600080821161060757600080fd5b600082848161061257fe5b0490508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561065957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505056fea265627a7a723158204de1d837959f8d6815c9abcccf9c825b8d232184a35233b4c37a70f3426e9c8164736f6c634300050d00324d6f6c6f63683a3a636f6e7374727563746f72202d205f61626f727457696e646f772063616e6e6f7420626520304d6f6c6f63683a3a636f6e7374727563746f72202d2073756d6d6f6e65722063616e6e6f7420626520304d6f6c6f63683a3a636f6e7374727563746f72202d205f766f74696e67506572696f644c656e6774682065786365656473206c696d69744d6f6c6f63683a3a636f6e7374727563746f72202d205f70726f706f73616c4465706f7369742063616e6e6f7420626520736d616c6c6572207468616e205f70726f63657373696e675265776172644d6f6c6f63683a3a636f6e7374727563746f72202d205f64696c7574696f6e426f756e642065786365656473206c696d69744d6f6c6f63683a3a636f6e7374727563746f72202d205f61626f727457696e646f77206d75737420626520736d616c6c6572207468616e206f7220657175616c20746f205f766f74696e67506572696f644c656e6774684d6f6c6f63683a3a636f6e7374727563746f72202d205f6772616365506572696f644c656e6774682065786365656473206c696d69744d6f6c6f63683a3a636f6e7374727563746f72202d205f766f74696e67506572696f644c656e6774682063616e6e6f7420626520304d6f6c6f63683a3a636f6e7374727563746f72202d205f706572696f644475726174696f6e2063616e6e6f7420626520304d6f6c6f63683a3a636f6e7374727563746f72202d205f617070726f766564546f6b656e2063616e6e6f7420626520304d6f6c6f63683a3a636f6e7374727563746f72202d205f64696c7574696f6e426f756e642063616e6e6f742062652030a265627a7a7231582074a8fbf40e945e24136e1e4e6de1c81ff6da168ce56615a59119f0ce24dd47d064736f6c634300050d0032

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100415760003560e01c80630fe204bd1461004657806381fc595914610064578063f0aa7651146100d2575b600080fd5b61004e610214565b6040518082815260200191505060405180910390f35b6100906004803603602081101561007a57600080fd5b8101908080359060200190929190505050610221565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61021260048036036101408110156100e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561018c57600080fd5b82018360208201111561019e57600080fd5b803590602001918460018302840111640100000000831117156101c057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061025d565b005b6000600180549050905090565b6001818154811061022e57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b89898989898989898989604051610273906104e3565b808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200189815260200188815260200187815260200186815260200185815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561033e578082015181840152602081019050610323565b50505050905090810190601f16801561036b5780820380516001836020036101000a031916815260200191505b509b505050505050505050505050604051809103906000f080158015610395573d6000803e3d6000fd5b506000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508973ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f5d117058594e38d35f98a79b5e9cbcd9fa0597fad786e2826bc4f290a0f5d4a760405160405180910390a350505050505050505050565b61581880620004f28339019056fe60806040526000600b556000600c553480156200001b57600080fd5b50604051620058183803806200581883398181016040526101408110156200004257600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080516040519392919084640100000000821115620000bd57600080fd5b83820191506020820185811115620000d457600080fd5b8251866001820283011164010000000082111715620000f257600080fd5b8083526020830192505050908051906020019080838360005b83811015620001285780820151818401526020810190506200010b565b50505050905090810190601f168015620001565780820380516001836020036101000a031916815260200191505b50604052505050600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff161415620001e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180620055e3602a913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156200026d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180620057b86030913960400191505060405180910390fd5b60008811620002c8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180620057876031913960400191505060405180910390fd5b6000871162000323576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526035815260200180620057526035913960400191505060405180910390fd5b670de0b6b3a764000087111562000386576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806200560d6037913960400191505060405180910390fd5b670de0b6b3a7640000861115620003e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806200571c6036913960400191505060405180910390fd5b6000851162000444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180620055b5602e913960400191505060405180910390fd5b868511156200049f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526057815260200180620056c56057913960600191505060405180910390fd5b60008311620004fa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180620057e86030913960400191505060405180910390fd5b670de0b6b3a76400008311156200055d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180620056936032913960400191505060405180910390fd5b81841015620005b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604f81526020018062005644604f913960600191505060405180910390fd5b88600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886040516200060890620008cb565b808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f0801580156200065b573d6000803e3d6000fd5b50600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550876000819055508660018190555085600281905550846003819055508360048190555082600581905550816006819055508060089080519060200190620006e5929190620008d9565b504260078190555060405180608001604052808b73ffffffffffffffffffffffffffffffffffffffff168152602001600181526020016001151581526020016000815250600d60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020160006101000a81548160ff0219169083151502179055506060820151816003015590505089600e60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b819055508973ffffffffffffffffffffffffffffffffffffffff167f03995a801b13c36325306deef859ef977ce61c6e15a794281bf969d20482522760016040518082815260200191505060405180910390a25050505050505050505062000988565b61089d8062004d1883390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200091c57805160ff19168380011785556200094d565b828001600101855582156200094d579182015b828111156200094c5782518255916020019190600101906200092f565b5b5090506200095c919062000960565b5090565b6200098591905b808211156200098157600081600090555060010162000967565b5090565b90565b61438080620009986000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c80637d5b6c72116100f9578063a3dc380011610097578063b470aade11610071578063b470aade146108d6578063bab46259146108f4578063e50701f41461093e578063e63bc62d1461096c576101a9565b8063a3dc380014610828578063a42afd291461086e578063afe5475f146108b8576101a9565b80638b15a605116100d35780638b15a6051461069a5780639425a476146106b8578063962006c3146106fe57806399653fbe146107ed576101a9565b80637d5b6c72146106305780638340bbce1461064e5780638436593f1461066c576101a9565b80633a98ef39116101665780635dec26b4116101405780635dec26b41461055357806363858f2d146105d65780637896ddaf146105f4578063797daf7014610612576101a9565b80633a98ef39146103595780633b214a7414610377578063402c1794146104cf576101a9565b806303e32fa1146101ae578063044a0ca8146101cc578063086146d21461023c57806308ae4b0c1461025a5780631a396a4a146102f75780632582bf2a14610315575b600080fd5b6101b661099a565b6040518082815260200191505060405180910390f35b610218600480360360408110156101e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506109a0565b6040518082600281111561022857fe5b60ff16815260200191505060405180910390f35b610244610b15565b6040518082815260200191505060405180910390f35b61029c6004803603602081101561027057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b45565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018315151515815260200182815260200194505050505060405180910390f35b6102ff610ba2565b6040518082815260200191505060405180910390f35b6103576004803603602081101561032b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ba8565b005b6103616110cd565b6040518082815260200191505060405180910390f35b6103a36004803603602081101561038d57600080fd5b81019080803590602001909291905050506110d3565b604051808d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018b81526020018a815260200189815260200188815260200187151515158152602001861515151581526020018515151515815260200184815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561048957808201518184015260208101905061046e565b50505050905090810190601f1680156104b65780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390f35b610511600480360360208110156104e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061123f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61055b611272565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561059b578082015181840152602081019050610580565b50505050905090810190601f1680156105c85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6105de611310565b6040518082815260200191505060405180910390f35b6105fc611316565b6040518082815260200191505060405180910390f35b61061a61131c565b6040518082815260200191505060405180910390f35b610638611329565b6040518082815260200191505060405180910390f35b61065661132f565b6040518082815260200191505060405180910390f35b6106986004803603602081101561068257600080fd5b8101908080359060200190929190505050611335565b005b6106a26116a7565b6040518082815260200191505060405180910390f35b6106e4600480360360208110156106ce57600080fd5b81019080803590602001909291905050506116ad565b604051808215151515815260200191505060405180910390f35b6107eb6004803603608081101561071457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561076557600080fd5b82018360208201111561077757600080fd5b8035906020019184600183028401116401000000008311171561079957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506116d5565b005b6108266004803603604081101561080357600080fd5b8101908080359060200190929190803560ff169060200190929190505050611f6f565b005b6108546004803603602081101561083e57600080fd5b8101908080359060200190929190505050612606565b604051808215151515815260200191505060405180910390f35b610876612698565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108c06126be565b6040518082815260200191505060405180910390f35b6108de6126c4565b6040518082815260200191505060405180910390f35b6108fc6126ca565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61096a6004803603602081101561095457600080fd5b81019080803590602001909291905050506126f0565b005b6109986004803603602081101561098257600080fd5b8101908080359060200190929190505050612ae9565b005b60065481565b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900460ff16610a47576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806140216034913960400191505060405180910390fd5b600f805490508210610aa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180613de86036913960400191505060405180910390fd5b600f8281548110610ab157fe5b90600052602060002090600b0201600a0160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000610b40600054610b32600754426139e190919063ffffffff16565b613a0190919063ffffffff16565b905090565b600d6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff16908060030154905084565b600c5481565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015411610c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613cc46021913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806142776036913960400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ea857600d60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900460ff1615610da2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180613c89603b913960400191505060405180910390fd5b600d6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900460ff1615610ea7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604181526020018061414c6041913960600191505060405180910390fd5b5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600e60008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff167fde7b64a369e10562cc2e71f0f1f944eaf144b75fead6ecb51fac9c4dd693488583604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a25050565b600b5481565b600f81815481106110e057fe5b90600052602060002090600b02016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040154908060050154908060060160009054906101000a900460ff16908060060160019054906101000a900460ff16908060060160029054906101000a900460ff1690806007015490806008018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561122f5780601f106112045761010080835404028352916020019161122f565b820191906000526020600020905b81548152906001019060200180831161121257829003601f168201915b505050505090806009015490508c565b600e6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60088054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113085780601f106112dd57610100808354040283529160200191611308565b820191906000526020600020905b8154815290600101906020018083116112eb57829003601f168201915b505050505081565b60025481565b60035481565b6000600f80549050905090565b60075481565b60015481565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154116113d0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613cc46021913960400191505060405180910390fd5b6000600b5490506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600101541015611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061422a6026913960400191505060405180910390fd5b6114848160030154612606565b6114d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252605e815260200180613f5a605e913960600191505060405180910390fd5b6114f08382600101546139e190919063ffffffff16565b816001018190555061150d83600b546139e190919063ffffffff16565b600b81905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b5c5f6723385856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019350505050602060405180830381600087803b1580156115c457600080fd5b505af11580156115d8573d6000803e3d6000fd5b505050506040513d60208110156115ee57600080fd5b8101908080519060200190929190505050611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180613ce5603d913960400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f667cb7a1818eacd2e3a421e734429ba9c4c7dec85e578e098b6d72cd2bfbf2f6846040518082815260200191505060405180910390a2505050565b60045481565b60006116c460015483613a2790919063ffffffff16565b6116cc610b15565b10159050919050565b6000600d6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154116117cf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613d226025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613e81602e913960400191505060405180910390fd5b670de0b6b3a764000061188783611879600c54600b54613a2790919063ffffffff16565b613a2790919063ffffffff16565b11156118de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140946032913960400191505060405180910390fd5b6118f382600c54613a2790919063ffffffff16565b600c819055506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33306004546040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611a3c57600080fd5b505af1158015611a50573d6000803e3d6000fd5b505050506040513d6020811015611a6657600080fd5b8101908080519060200190929190505050611acc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180613bd3603f913960400191505060405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8630876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611ba957600080fd5b505af1158015611bbd573d6000803e3d6000fd5b505050506040513d6020811015611bd357600080fd5b8101908080519060200190929190505050611c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180613d476036913960400191505060405180910390fd5b6000611caa6001611c9c611c4b610b15565b6000600f8054905014611c9457600f611c736001600f805490506139e190919063ffffffff16565b81548110611c7d57fe5b90600052602060002090600b020160030154611c97565b60005b613a46565b613a2790919063ffffffff16565b9050611cb4613a9a565b6040518061018001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff168152602001868152602001838152602001600081526020016000815260200160001515815260200160001515815260200160001515815260200187815260200185815260200160008152509050600f819080600181540180825580915050906001820390600052602060002090600b02016000909192909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a81548160ff02191690831515021790555060e08201518160060160016101000a81548160ff0219169083151502179055506101008201518160060160026101000a81548160ff0219169083151502179055506101208201518160070155610140820151816008019080519060200190611ead929190613b2d565b5061016082015181600901555050506000611ed76001600f805490506139e190919063ffffffff16565b90508773ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2d105ebbc222c190059b3979356e13469f6a29a350add74ac3bf4f22f16301d6848b8b60405180848152602001838152602001828152602001935050505060405180910390a45050505050505050565b6000600d6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015411612069576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613d226025913960400191505060405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600f80549050841061216d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613fb8602c913960400191505060405180910390fd5b6000600f858154811061217c57fe5b90600052602060002090600b0201905060038460ff16106121e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806142ad6031913960400191505060405180910390fd5b60008460ff1660028111156121f957fe5b90508160030154612208610b15565b101561225f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061418d6032913960400191505060405180910390fd5b61226c82600301546116ad565b156122c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180613edc6037913960400191505060405180910390fd5b600060028111156122cf57fe5b82600a0160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16600281111561232957fe5b1461237f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e81526020018061410e603e913960400191505060405180910390fd5b6001600281111561238c57fe5b81600281111561239857fe5b14806123b957506002808111156123ab57fe5b8160028111156123b757fe5b145b61240e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180613e1e6032913960400191505060405180910390fd5b8160060160029054906101000a900460ff1615612476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806141bf602e913960400191505060405180910390fd5b8082600a0160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360028111156124d357fe5b0217905550600160028111156124e557fe5b8160028111156124f157fe5b141561254f5761251283600101548360040154613a2790919063ffffffff16565b82600401819055508260030154861115612530578583600301819055505b8160090154600b54111561254a57600b5482600901819055505b612592565b60028081111561255b57fe5b81600281111561256757fe5b14156125915761258883600101548360050154613a2790919063ffffffff16565b82600501819055505b5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16877f29bf0061f2faa9daa482f061b116195432d435536d8af4ae6b3c5dd78223679b88604051808260ff1660ff16815260200191505060405180910390a4505050505050565b6000600f805490508210612665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180613eaf602d913960400191505060405180910390fd5b600f828154811061267257fe5b90600052602060002090600b020160060160009054906101000a900460ff169050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b60005481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f80549050811061274d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806142506027913960400191505060405180910390fd5b6000600f828154811061275c57fe5b90600052602060002090600b020190508060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613dbc602c913960400191505060405180910390fd5b61282d6003548260030154613a2790919063ffffffff16565b612835610b15565b1061288b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180613e506031913960400191505060405180910390fd5b8060060160029054906101000a900460ff16156128f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180613c4e603b913960400191505060405180910390fd5b6000816007015490506000826007018190555060018260060160026101000a81548160ff021916908315150217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156129f057600080fd5b505af1158015612a04573d6000803e3d6000fd5b505050506040513d6020811015612a1a57600080fd5b8101908080519060200190929190505050612a80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180614055603f913960400191505060405180910390fd5b827fa749dd3df92cae4d106b3eadf60c0dffd3698de09c67ce58ce6f5d02eb82131333604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a2505050565b600f805490508110612b46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603181526020018061431b6031913960400191505060405180910390fd5b6000600f8281548110612b5557fe5b90600052602060002090600b02019050612b92600254612b846001548460030154613a2790919063ffffffff16565b613a2790919063ffffffff16565b612b9a610b15565b1015612bf1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180613d7d603f913960400191505060405180910390fd5b600015158160060160009054906101000a900460ff16151514612c5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806142de603d913960400191505060405180910390fd5b6000821480612ca95750600f612c7f6001846139e190919063ffffffff16565b81548110612c8957fe5b90600052602060002090600b020160060160009054906101000a900460ff165b612cfe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180613fe4603d913960400191505060405180910390fd5b60018160060160006101000a81548160ff021916908315150217905550612d348160020154600c546139e190919063ffffffff16565b600c819055506000816005015482600401541190508160090154612d65600554600b54613a6090919063ffffffff16565b1015612d7057600090505b808015612d8c57508160060160029054906101000a900460ff16155b156135025760018260060160016101000a81548160ff021916908315150217905550600d60008360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900460ff1615612f1357612ea48260020154600d60008560010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154613a2790919063ffffffff16565b600d60008460010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061337f565b600d6000600e60008560010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900460ff1615613174576000600e60008460010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b60405180608001604052808360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836002015481526020016001151581526020016000815250600d60008460010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020160006101000a81548160ff021916908315150217905550606082015181600301559050508160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600e60008460010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6133988260020154600b54613a2790919063ffffffff16565b600b81905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684600701546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561346d57600080fd5b505af1158015613481573d6000803e3d6000fd5b505050506040513d602081101561349757600080fd5b81019080805190602001909291905050506134fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806141ed603d913960400191505060405180910390fd5b613664565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684600701546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156135d357600080fd5b505af11580156135e7573d6000803e3d6000fd5b505050506040513d60208110156135fd57600080fd5b8101908080519060200190929190505050613663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180613c12603c913960400191505060405180910390fd5b5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb336006546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561370f57600080fd5b505af1158015613723573d6000803e3d6000fd5b505050506040513d602081101561373957600080fd5b810190808051906020019092919050505061379f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260488152602001806140c66048913960600191505060405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166138196006546004546139e190919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561388257600080fd5b505af1158015613896573d6000803e3d6000fd5b505050506040513d60208110156138ac57600080fd5b8101908080519060200190929190505050613912576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526047815260200180613f136047913960600191505060405180910390fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16847f3f6fc303a82367bb4947244ba21c569a5ed2e870610f1a693366142309d7cbea85600701548660020154866040518084815260200183815260200182151515158152602001935050505060405180910390a4505050565b6000828211156139f057600080fd5b600082840390508091505092915050565b6000808211613a0f57600080fd5b6000828481613a1a57fe5b0490508091505092915050565b600080828401905083811015613a3c57600080fd5b8091505092915050565b600081831015613a565781613a58565b825b905092915050565b600080831415613a735760009050613a94565b6000828402905082848281613a8457fe5b0414613a8f57600080fd5b809150505b92915050565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581526020016000151581526020016000815260200160608152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613b6e57805160ff1916838001178555613b9c565b82800160010185558215613b9c579182015b82811115613b9b578251825591602001919060010190613b80565b5b509050613ba99190613bad565b5090565b613bcf91905b80821115613bcb576000816000905550600101613bb3565b5090565b9056fe4d6f6c6f63683a3a7375626d697450726f706f73616c202d2070726f706f73616c206465706f73697420746f6b656e207472616e73666572206661696c65644d6f6c6f63683a3a70726f6365737350726f706f73616c202d206661696c696e6720766f746520746f6b656e207472616e73666572206661696c65644d6f6c6f63683a3a61626f7274202d2070726f706f73616c206d757374206e6f74206861766520616c7265616479206265656e2061626f727465644d6f6c6f63683a3a75706461746544656c65676174654b6579202d2063616e74206f7665727772697465206578697374696e67206d656d626572734d6f6c6f63683a3a6f6e6c794d656d626572202d206e6f742061206d656d6265724d6f6c6f63683a3a7261676571756974202d207769746864726177616c206f6620746f6b656e732066726f6d206775696c6442616e6b206661696c65644d6f6c6f63683a3a6f6e6c7944656c6567617465202d206e6f7420612064656c65676174654d6f6c6f63683a3a7375626d697450726f706f73616c202d207472696275746520746f6b656e207472616e73666572206661696c65644d6f6c6f63683a3a70726f6365737350726f706f73616c202d2070726f706f73616c206973206e6f7420726561647920746f2062652070726f6365737365644d6f6c6f63683a3a61626f7274202d206d73672e73656e646572206d757374206265206170706c6963616e744d6f6c6f63683a3a6765744d656d62657250726f706f73616c566f7465202d2070726f706f73616c20646f65736e27742065786973744d6f6c6f63683a3a7375626d6974566f7465202d20766f7465206d7573742062652065697468657220596573206f72204e6f4d6f6c6f63683a3a61626f7274202d2061626f72742077696e646f77206d757374206e6f742068617665207061737365644d6f6c6f63683a3a7375626d697450726f706f73616c202d206170706c6963616e742063616e6e6f7420626520304d6f6c6f63683a3a63616e5261676571756974202d2070726f706f73616c20646f6573206e6f742065786973744d6f6c6f63683a3a7375626d6974566f7465202d2070726f706f73616c20766f74696e6720706572696f642068617320657870697265644d6f6c6f63683a3a70726f6365737350726f706f73616c202d206661696c656420746f2072657475726e2070726f706f73616c206465706f73697420746f2070726f706f7365724d6f6c6f63683a3a7261676571756974202d2063616e7420726167657175697420756e74696c206869676865737420696e6465782070726f706f73616c206d656d62657220766f74656420594553206f6e2069732070726f6365737365644d6f6c6f63683a3a7375626d6974566f7465202d2070726f706f73616c20646f6573206e6f742065786973744d6f6c6f63683a3a70726f6365737350726f706f73616c202d2070726576696f75732070726f706f73616c206d7573742062652070726f6365737365644d6f6c6f63683a3a6765744d656d62657250726f706f73616c566f7465202d206d656d62657220646f65736e27742065786973744d6f6c6f63683a3a70726f6365737350726f706f73616c202d206661696c656420746f2072657475726e207472696275746520746f206170706c6963616e744d6f6c6f63683a3a7375626d697450726f706f73616c202d20746f6f206d616e7920736861726573207265717565737465644d6f6c6f63683a3a70726f6365737350726f706f73616c202d206661696c656420746f2073656e642070726f63657373696e672072657761726420746f206d73672e73656e6465724d6f6c6f63683a3a7375626d6974566f7465202d206d656d6265722068617320616c726561647920766f746564206f6e20746869732070726f706f73616c4d6f6c6f63683a3a75706461746544656c65676174654b6579202d2063616e74206f7665727772697465206578697374696e672064656c6567617465206b6579734d6f6c6f63683a3a7375626d6974566f7465202d20766f74696e6720706572696f6420686173206e6f7420737461727465644d6f6c6f63683a3a7375626d6974566f7465202d2070726f706f73616c20686173206265656e2061626f727465644d6f6c6f63683a3a70726f6365737350726f706f73616c202d20746f6b656e207472616e7366657220746f206775696c642062616e6b206661696c65644d6f6c6f63683a3a7261676571756974202d20696e73756666696369656e74207368617265734d6f6c6f63683a3a61626f7274202d2070726f706f73616c20646f6573206e6f742065786973744d6f6c6f63683a3a75706461746544656c65676174654b6579202d206e657744656c65676174654b65792063616e6e6f7420626520304d6f6c6f63683a3a7375626d6974566f7465202d2075696e74566f7465206d757374206265206c657373207468616e20334d6f6c6f63683a3a70726f6365737350726f706f73616c202d2070726f706f73616c2068617320616c7265616479206265656e2070726f6365737365644d6f6c6f63683a3a70726f6365737350726f706f73616c202d2070726f706f73616c20646f6573206e6f74206578697374a265627a7a7231582003f63d1858fde3ff0009189deaca78f29c566fbec4c2ffdb19b4b615ecdd355864736f6c634300050d0032608060405234801561001057600080fd5b5060405161089d38038061089d8339818101604052602081101561003357600080fd5b8101908080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505061074c806101516000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c8063715018a6146100675780638da5cb5b146100715780638f32d59b146100bb578063b5c5f672146100dd578063bab462591461014d578063f2fde38b14610197575b600080fd5b61006f6101db565b005b6100796102ab565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100c36102d4565b604051808215151515815260200191505060405180910390f35b610133600480360360608110156100f357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919050505061032b565b604051808215151515815260200191505060405180910390f35b61015561057c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101d9600480360360208110156101ad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506105a2565b005b6101e36102d4565b6101ec57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b60006103356102d4565b61033e57600080fd5b600061043e8361043086600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156103e757600080fd5b505afa1580156103fb573d6000803e3d6000fd5b505050506040513d602081101561041157600080fd5b81019080805190602001909291905050506105bf90919063ffffffff16565b6105f990919063ffffffff16565b90508473ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a2600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561053757600080fd5b505af115801561054b573d6000803e3d6000fd5b505050506040513d602081101561056157600080fd5b81019080805190602001909291905050509150509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6105aa6102d4565b6105b357600080fd5b6105bc8161061f565b50565b6000808314156105d257600090506105f3565b60008284029050828482816105e357fe5b04146105ee57600080fd5b809150505b92915050565b600080821161060757600080fd5b600082848161061257fe5b0490508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561065957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505056fea265627a7a723158204de1d837959f8d6815c9abcccf9c825b8d232184a35233b4c37a70f3426e9c8164736f6c634300050d00324d6f6c6f63683a3a636f6e7374727563746f72202d205f61626f727457696e646f772063616e6e6f7420626520304d6f6c6f63683a3a636f6e7374727563746f72202d2073756d6d6f6e65722063616e6e6f7420626520304d6f6c6f63683a3a636f6e7374727563746f72202d205f766f74696e67506572696f644c656e6774682065786365656473206c696d69744d6f6c6f63683a3a636f6e7374727563746f72202d205f70726f706f73616c4465706f7369742063616e6e6f7420626520736d616c6c6572207468616e205f70726f63657373696e675265776172644d6f6c6f63683a3a636f6e7374727563746f72202d205f64696c7574696f6e426f756e642065786365656473206c696d69744d6f6c6f63683a3a636f6e7374727563746f72202d205f61626f727457696e646f77206d75737420626520736d616c6c6572207468616e206f7220657175616c20746f205f766f74696e67506572696f644c656e6774684d6f6c6f63683a3a636f6e7374727563746f72202d205f6772616365506572696f644c656e6774682065786365656473206c696d69744d6f6c6f63683a3a636f6e7374727563746f72202d205f766f74696e67506572696f644c656e6774682063616e6e6f7420626520304d6f6c6f63683a3a636f6e7374727563746f72202d205f706572696f644475726174696f6e2063616e6e6f7420626520304d6f6c6f63683a3a636f6e7374727563746f72202d205f617070726f766564546f6b656e2063616e6e6f7420626520304d6f6c6f63683a3a636f6e7374727563746f72202d205f64696c7574696f6e426f756e642063616e6e6f742062652030a265627a7a7231582074a8fbf40e945e24136e1e4e6de1c81ff6da168ce56615a59119f0ce24dd47d064736f6c634300050d0032

Deployed Bytecode Sourcemap

24735:1114:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24735:1114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25738:108;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24801:24;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24801:24:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24910:816;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;24910:816:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;24910:816:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;24910:816:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;24910:816:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;24910:816:0;;;;;;;;;;;;;;;:::i;:::-;;25738:108;25785:19;25824:7;:14;;;;25817:21;;25738:108;:::o;24801:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24910:816::-;25333:8;25356:14;25385:15;25415:19;25449:18;25482:12;25509:16;25540:14;25569:17;25601:15;25308:309;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;25308:309:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25308:309:0;25304:1;;:313;;;;;;;;;;;;;;;;;;25638:7;25659:1;;;;;;;;;;;25638:24;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;25638:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25709:8;25688:30;;25705:1;;;;;;;;;;;25688:30;;;;;;;;;;;;24910:816;;;;;;;;;;:::o;24735:1114::-;;;;;;;;:::o

Swarm Source

bzzr://74a8fbf40e945e24136e1e4e6de1c81ff6da168ce56615a59119f0ce24dd47d0

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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