ETH Price: $1,674.94 (-0.27%)
Gas: 6 Gwei
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Sponsored

Transaction Hash
Method
Block
From
To
Value
Log Election139309722022-01-03 6:42:30636 days 12 hrs ago1641192150IN
Synthetix: Spartan Council Dilution
0 ETH0.53093571105.42282711
Log Election139309722022-01-03 6:42:30636 days 12 hrs ago1641192150IN
Synthetix: Spartan Council Dilution
0 ETH0.51860672105.42282711
Log Election139309712022-01-03 6:42:18636 days 12 hrs ago1641192138IN
Synthetix: Spartan Council Dilution
0 ETH0.5298139100.6436059
Log Proposal139182382022-01-01 7:42:55638 days 11 hrs ago1641022975IN
Synthetix: Spartan Council Dilution
0 ETH0.011727849.01270454
Log Proposal138784962021-12-26 4:00:46644 days 15 hrs ago1640491246IN
Synthetix: Spartan Council Dilution
0 ETH0.0152256463.6308187
Log Proposal138596952021-12-23 5:58:58647 days 13 hrs ago1640239138IN
Synthetix: Spartan Council Dilution
0 ETH0.0119640550
Dilute138556492021-12-22 14:53:19648 days 4 hrs ago1640184799IN
Synthetix: Spartan Council Dilution
0 ETH0.0150613654.93780072
Log Proposal138469712021-12-21 6:36:17649 days 12 hrs ago1640068577IN
Synthetix: Spartan Council Dilution
0 ETH0.0112288646.92753082
Log Proposal138080072021-12-15 6:06:06655 days 13 hrs ago1639548366IN
Synthetix: Spartan Council Dilution
0 ETH0.0140735958.8161692
Log Proposal138061512021-12-14 23:08:13655 days 20 hrs ago1639523293IN
Synthetix: Spartan Council Dilution
0 ETH0.0178495674.5966614
Log Proposal138057072021-12-14 21:26:54655 days 21 hrs ago1639517214IN
Synthetix: Spartan Council Dilution
0 ETH0.0220061291.96770275
Log Proposal137997162021-12-13 22:55:58656 days 20 hrs ago1639436158IN
Synthetix: Spartan Council Dilution
0 ETH0.02538061106.07034933
Log Proposal137996902021-12-13 22:48:24656 days 20 hrs ago1639435704IN
Synthetix: Spartan Council Dilution
0 ETH0.0171518971.68097497
Log Proposal137728262021-12-09 19:19:51660 days 23 hrs ago1639077591IN
Synthetix: Spartan Council Dilution
0 ETH0.0205986386.08556153
Log Proposal137636032021-12-08 7:48:53662 days 11 hrs ago1638949733IN
Synthetix: Spartan Council Dilution
0 ETH0.0147535461.65781608
Log Proposal137323122021-12-03 7:36:23667 days 11 hrs ago1638516983IN
Synthetix: Spartan Council Dilution
0 ETH0.0161602867.53687054
Log Proposal137177072021-11-30 23:26:57669 days 19 hrs ago1638314817IN
Synthetix: Spartan Council Dilution
0 ETH0.0233893397.74838036
Log Proposal137177072021-11-30 23:26:57669 days 19 hrs ago1638314817IN
Synthetix: Spartan Council Dilution
0 ETH0.0233893397.74838036
Log Proposal136826442021-11-25 9:21:52675 days 9 hrs ago1637832112IN
Synthetix: Spartan Council Dilution
0 ETH0.0254804106.48736908
Log Proposal136826342021-11-25 9:18:55675 days 9 hrs ago1637831935IN
Synthetix: Spartan Council Dilution
0 ETH0.02425714101.37515279
Log Proposal136733942021-11-23 22:12:07676 days 21 hrs ago1637705527IN
Synthetix: Spartan Council Dilution
0 ETH0.02758582115.28630909
Log Proposal136727722021-11-23 19:48:07676 days 23 hrs ago1637696887IN
Synthetix: Spartan Council Dilution
0 ETH0.02481016103.68629408
Log Proposal136694212021-11-23 7:09:03677 days 12 hrs ago1637651343IN
Synthetix: Spartan Council Dilution
0 ETH0.0243959101.95505548
Log Proposal136660352021-11-22 18:21:48678 days 55 mins ago1637605308IN
Synthetix: Spartan Council Dilution
0 ETH0.0229851296.05912405
Log Proposal136346282021-11-17 18:39:55683 days 37 mins ago1637174395IN
Synthetix: Spartan Council Dilution
0 ETH0.03799892158.80460212
View all transactions

Advanced mode:
Parent Txn Hash Block From To Value
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CouncilDilution

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 1 : CouncilDilution.sol
// File contracts/Owned.sol

pragma solidity ^0.5.16;

// https://docs.synthetix.io/contracts/source/contracts/owned
contract Owned {
    address public owner;
    address public nominatedOwner;

    constructor(address _owner) public {
        require(_owner != address(0), "Owner address cannot be 0");
        owner = _owner;
        emit OwnerChanged(address(0), _owner);
    }

    function nominateNewOwner(address _owner) external onlyOwner {
        nominatedOwner = _owner;
        emit OwnerNominated(_owner);
    }

    function acceptOwnership() external {
        require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership");
        emit OwnerChanged(owner, nominatedOwner);
        owner = nominatedOwner;
        nominatedOwner = address(0);
    }

    modifier onlyOwner {
        _onlyOwner();
        _;
    }

    function _onlyOwner() private view {
        require(msg.sender == owner, "Only the contract owner may perform this action");
    }

    event OwnerNominated(address newOwner);
    event OwnerChanged(address oldOwner, address newOwner);
}

// File @openzeppelin/contracts/math/[email protected]

pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File contracts/SafeDecimalMath.sol

pragma solidity ^0.5.16;

// Libraries

// https://docs.synthetix.io/contracts/source/libraries/safedecimalmath
library SafeDecimalMath {
    using SafeMath for uint;

    /* Number of decimal places in the representations. */
    uint8 public constant decimals = 18;
    uint8 public constant highPrecisionDecimals = 27;

    /* The number representing 1.0. */
    uint public constant UNIT = 10**uint(decimals);

    /* The number representing 1.0 for higher fidelity numbers. */
    uint public constant PRECISE_UNIT = 10**uint(highPrecisionDecimals);
    uint private constant UNIT_TO_HIGH_PRECISION_CONVERSION_FACTOR = 10**uint(highPrecisionDecimals - decimals);

    /**
     * @return Provides an interface to UNIT.
     */
    function unit() external pure returns (uint) {
        return UNIT;
    }

    /**
     * @return Provides an interface to PRECISE_UNIT.
     */
    function preciseUnit() external pure returns (uint) {
        return PRECISE_UNIT;
    }

    /**
     * @return The result of multiplying x and y, interpreting the operands as fixed-point
     * decimals.
     *
     * @dev A unit factor is divided out after the product of x and y is evaluated,
     * so that product must be less than 2**256. As this is an integer division,
     * the internal division always rounds down. This helps save on gas. Rounding
     * is more expensive on gas.
     */
    function multiplyDecimal(uint x, uint y) internal pure returns (uint) {
        /* Divide by UNIT to remove the extra factor introduced by the product. */
        return x.mul(y) / UNIT;
    }

    /**
     * @return The result of safely multiplying x and y, interpreting the operands
     * as fixed-point decimals of the specified precision unit.
     *
     * @dev The operands should be in the form of a the specified unit factor which will be
     * divided out after the product of x and y is evaluated, so that product must be
     * less than 2**256.
     *
     * Unlike multiplyDecimal, this function rounds the result to the nearest increment.
     * Rounding is useful when you need to retain fidelity for small decimal numbers
     * (eg. small fractions or percentages).
     */
    function _multiplyDecimalRound(
        uint x,
        uint y,
        uint precisionUnit
    ) private pure returns (uint) {
        /* Divide by UNIT to remove the extra factor introduced by the product. */
        uint quotientTimesTen = x.mul(y) / (precisionUnit / 10);

        if (quotientTimesTen % 10 >= 5) {
            quotientTimesTen += 10;
        }

        return quotientTimesTen / 10;
    }

    /**
     * @return The result of safely multiplying x and y, interpreting the operands
     * as fixed-point decimals of a precise unit.
     *
     * @dev The operands should be in the precise unit factor which will be
     * divided out after the product of x and y is evaluated, so that product must be
     * less than 2**256.
     *
     * Unlike multiplyDecimal, this function rounds the result to the nearest increment.
     * Rounding is useful when you need to retain fidelity for small decimal numbers
     * (eg. small fractions or percentages).
     */
    function multiplyDecimalRoundPrecise(uint x, uint y) internal pure returns (uint) {
        return _multiplyDecimalRound(x, y, PRECISE_UNIT);
    }

    /**
     * @return The result of safely multiplying x and y, interpreting the operands
     * as fixed-point decimals of a standard unit.
     *
     * @dev The operands should be in the standard unit factor which will be
     * divided out after the product of x and y is evaluated, so that product must be
     * less than 2**256.
     *
     * Unlike multiplyDecimal, this function rounds the result to the nearest increment.
     * Rounding is useful when you need to retain fidelity for small decimal numbers
     * (eg. small fractions or percentages).
     */
    function multiplyDecimalRound(uint x, uint y) internal pure returns (uint) {
        return _multiplyDecimalRound(x, y, UNIT);
    }

    /**
     * @return The result of safely dividing x and y. The return value is a high
     * precision decimal.
     *
     * @dev y is divided after the product of x and the standard precision unit
     * is evaluated, so the product of x and UNIT must be less than 2**256. As
     * this is an integer division, the result is always rounded down.
     * This helps save on gas. Rounding is more expensive on gas.
     */
    function divideDecimal(uint x, uint y) internal pure returns (uint) {
        /* Reintroduce the UNIT factor that will be divided out by y. */
        return x.mul(UNIT).div(y);
    }

    /**
     * @return The result of safely dividing x and y. The return value is as a rounded
     * decimal in the precision unit specified in the parameter.
     *
     * @dev y is divided after the product of x and the specified precision unit
     * is evaluated, so the product of x and the specified precision unit must
     * be less than 2**256. The result is rounded to the nearest increment.
     */
    function _divideDecimalRound(
        uint x,
        uint y,
        uint precisionUnit
    ) private pure returns (uint) {
        uint resultTimesTen = x.mul(precisionUnit * 10).div(y);

        if (resultTimesTen % 10 >= 5) {
            resultTimesTen += 10;
        }

        return resultTimesTen / 10;
    }

    /**
     * @return The result of safely dividing x and y. The return value is as a rounded
     * standard precision decimal.
     *
     * @dev y is divided after the product of x and the standard precision unit
     * is evaluated, so the product of x and the standard precision unit must
     * be less than 2**256. The result is rounded to the nearest increment.
     */
    function divideDecimalRound(uint x, uint y) internal pure returns (uint) {
        return _divideDecimalRound(x, y, UNIT);
    }

    /**
     * @return The result of safely dividing x and y. The return value is as a rounded
     * high precision decimal.
     *
     * @dev y is divided after the product of x and the high precision unit
     * is evaluated, so the product of x and the high precision unit must
     * be less than 2**256. The result is rounded to the nearest increment.
     */
    function divideDecimalRoundPrecise(uint x, uint y) internal pure returns (uint) {
        return _divideDecimalRound(x, y, PRECISE_UNIT);
    }

    /**
     * @dev Convert a standard decimal representation to a high precision one.
     */
    function decimalToPreciseDecimal(uint i) internal pure returns (uint) {
        return i.mul(UNIT_TO_HIGH_PRECISION_CONVERSION_FACTOR);
    }

    /**
     * @dev Convert a high precision decimal to a standard decimal representation.
     */
    function preciseDecimalToDecimal(uint i) internal pure returns (uint) {
        uint quotientTimesTen = i / (UNIT_TO_HIGH_PRECISION_CONVERSION_FACTOR / 10);

        if (quotientTimesTen % 10 >= 5) {
            quotientTimesTen += 10;
        }

        return quotientTimesTen / 10;
    }
}

// File contracts/CouncilDilution.sol

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.5.16;

pragma experimental ABIEncoderV2;

/**
@title A contract that allows for the dilution of Spartan Council voting weights
@author @andytcf
 */
contract CouncilDilution is Owned {
    using SafeDecimalMath for uint;

    /* SCCP configurable values */

    // @notice How many seats on the Spartan Council
    uint public numOfSeats;

    // @notice The length of a proposal (SCCP/SIP) voting period
    uint public proposalPeriod;

    /* Global variables */

    // @notice The ipfs hash of the latest Spartan Council election proposal
    string public latestElectionHash;

    struct ElectionLog {
        // @notice The ipfs hash of a particular Spartan Council election proposal
        string electionHash;
        // @notice A mapping of the votes allocated to each of the Spartan Council members
        mapping(address => uint) votesForMember;
        // @notice A mapping to check whether an address was an elected Council member in this election
        mapping(address => bool) councilMembers;
        // @notice The timestamp which the election log was stored
        uint created;
    }

    struct ProposalLog {
        // @notice The ipfs hash of a particular SCCP/SIP proposal
        string proposalHash;
        // @notice The election hash of the current epoch when the proposal was made
        string electionHash;
        //  @notice The timestamp which the voting period begins
        uint start;
        // @notice The timestamp which the voting period of the proposal ends
        uint end;
        // @notice A boolean value to check whether a proposal log exists
        bool exist;
    }

    struct DilutionReceipt {
        // @notice The ipfs hash of the proposal which the dilution happened on
        string proposalHash;
        // @notice The address of the council member diluted
        address memberDiluted;
        // @notice The total amount in which the council member was diluted by
        uint totalDilutionValue;
        // @notice A list of dilutors
        address[] dilutors;
        // @notice A mapping to show the value of dilution per dilutor
        mapping(address => uint) voterDilutions;
        // @notice A flag value to check whether a dilution exist
        bool exist;
    }

    // @notice Given a election hash, return the ElectionLog struct associated
    mapping(string => ElectionLog) public electionHashToLog;

    // @notice Given a voter address and a council member address, return the delegated vote weight for the most recent Spartan Council election
    mapping(address => mapping(address => uint)) public latestDelegatedVoteWeight;

    // @notice Given a council member address, return the total delegated vote weight for the most recent Spartan Council election
    mapping(address => uint) public latestVotingWeight;

    // @notice Given a propoal hash and a voting address, find out the member the user has voted for
    mapping(string => mapping(address => address)) public electionMemberVotedFor;

    // @notice Given a proposal hash and a voting address, find if a member has diluted
    mapping(string => mapping(address => bool)) public hasAddressDilutedForProposal;

    // @notice Given a proposal hash (SCCP/SIP), return the ProposalLog struct associated
    mapping(string => ProposalLog) public proposalHashToLog;

    // @notice Given a proposal hash and a council member, return the DilutionReceipt if it exists
    mapping(string => mapping(address => DilutionReceipt)) public proposalHashToMemberDilution;

    /* Events */

    // @notice An event emitted when a new ElectionLog is created
    event ElectionLogged(
        string electionHash,
        address[] nominatedCouncilMembers,
        address[] voters,
        address[] nomineesVotedFor,
        uint[] assignedVoteWeights
    );

    // @notice An event emitted when a new ProposalLog is created
    event ProposalLogged(string proposalHash, string electionHash, uint start, uint end);

    // @notice An event emitted when a new DilutionReceipt is created
    event DilutionCreated(
        string proposalHash,
        address memberDiluted,
        uint totalDilutionValueBefore,
        uint totalDilutionValueAfter
    );

    // @notice An event emitted when a DilutionReceipt is modified
    event DilutionModified(
        string proposalHash,
        address memberDiluted,
        uint totalDilutionValueBefore,
        uint totalDilutionValueAfter
    );

    // @notice An event emitted when the number of council seats is modified
    event SeatsModified(uint previousNumberOfSeats, uint newNumberOfSeats);

    // @notice An event emitted when the proposal period is modified
    event ProposalPeriodModified(uint previousProposalPeriod, uint newProposalPeriod);

    /* */

    // @notice Initialises the contract with a X number of council seats and a proposal period of 3 days
    constructor(uint _numOfSeats) public Owned(msg.sender) {
        numOfSeats = _numOfSeats;
        proposalPeriod = 3 days;
    }

    /* Mutative Functions */

    /**
    @notice A function to create a new ElectionLog, this is called to record the result of a Spartan Council election
    @param electionHash The ipfs hash of the Spartan Council election proposal to log
    @param nominatedCouncilMembers The array of the successful Spartan Council nominees addresses, must be the same length as the numOfSeats
    @param voters An ordered array of all the voter's addresses corresponding to `nomineesVotedFor`, `assignedVoteWeights`
    @param nomineesVotedFor An ordered array of all the nominee address that received votes corresponding to `voters`, `assignedVoteWeights`
    @param assignedVoteWeights An ordered array of the voting weights corresponding to `voters`, `nomineesVotedFor`
    @return electionHash
     */
    function logElection(
        string memory electionHash,
        address[] memory nominatedCouncilMembers,
        address[] memory voters,
        address[] memory nomineesVotedFor,
        uint[] memory assignedVoteWeights
    ) public onlyOwner() returns (string memory) {
        require(bytes(electionHash).length > 0, "empty election hash provided");
        require(voters.length > 0, "empty voters array provided");
        require(nomineesVotedFor.length > 0, "empty nomineesVotedFor array provided");
        require(assignedVoteWeights.length > 0, "empty assignedVoteWeights array provided");
        require(nominatedCouncilMembers.length == numOfSeats, "invalid number of council members");

        ElectionLog memory newElectionLog = ElectionLog(electionHash, now);

        electionHashToLog[electionHash] = newElectionLog;

        // store the voting history for calculating the allocated voting weights
        for (uint i = 0; i < voters.length; i++) {
            latestDelegatedVoteWeight[voters[i]][nomineesVotedFor[i]] = assignedVoteWeights[i];
            latestVotingWeight[nomineesVotedFor[i]] = latestVotingWeight[nomineesVotedFor[i]] + assignedVoteWeights[i];
            electionMemberVotedFor[electionHash][voters[i]] = nomineesVotedFor[i];
        }

        // store the total weight of each successful council member
        for (uint j = 0; j < nominatedCouncilMembers.length; j++) {
            electionHashToLog[electionHash].votesForMember[nominatedCouncilMembers[j]] = latestVotingWeight[
                nominatedCouncilMembers[j]
            ];
            electionHashToLog[electionHash].councilMembers[nominatedCouncilMembers[j]] = true;
        }

        latestElectionHash = electionHash;

        emit ElectionLogged(electionHash, nominatedCouncilMembers, voters, nomineesVotedFor, assignedVoteWeights);

        return electionHash;
    }

    /**
    @notice A function to created a new ProposalLog, this is called to record SCCP/SIPS created and allow for dilution to occur per proposal.
    @param proposalHash the ipfs hash of the proposal to be logged
    @return proposalHash
     */
    function logProposal(string memory proposalHash) public returns (string memory) {
        require(!proposalHashToLog[proposalHash].exist, "proposal hash is not unique");
        require(bytes(proposalHash).length > 0, "proposal hash must not be empty");

        uint start = now;

        uint end = start + proposalPeriod;

        ProposalLog memory newProposalLog = ProposalLog(proposalHash, latestElectionHash, start, end, true);

        proposalHashToLog[proposalHash] = newProposalLog;

        emit ProposalLogged(proposalHash, latestElectionHash, start, end);

        return proposalHash;
    }

    /**
    @notice  A function to dilute a council member's voting weight for a particular proposal
    @param proposalHash the ipfs hash of the proposal to be logged
    @param memberToDilute the address of the member to dilute
     */
    function dilute(string memory proposalHash, address memberToDilute) public {
        require(memberToDilute != address(0), "member to dilute must be a valid address");
        require(
            electionHashToLog[latestElectionHash].councilMembers[memberToDilute],
            "member to dilute must be a nominated council member"
        );
        require(proposalHashToLog[proposalHash].exist, "proposal does not exist");
        require(
            latestDelegatedVoteWeight[msg.sender][memberToDilute] > 0,
            "sender has not delegated voting weight for member"
        );
        require(now < proposalHashToLog[proposalHash].end, "dilution can only occur within the proposal voting period");
        require(hasAddressDilutedForProposal[proposalHash][msg.sender] == false, "sender has already diluted");

        if (proposalHashToMemberDilution[proposalHash][memberToDilute].exist) {
            DilutionReceipt storage receipt = proposalHashToMemberDilution[proposalHash][memberToDilute];

            uint originalTotalDilutionValue = receipt.totalDilutionValue;

            receipt.dilutors.push(msg.sender);
            receipt.voterDilutions[msg.sender] = latestDelegatedVoteWeight[msg.sender][memberToDilute];
            receipt.totalDilutionValue = receipt.totalDilutionValue + latestDelegatedVoteWeight[msg.sender][memberToDilute];

            hasAddressDilutedForProposal[proposalHash][msg.sender] = true;

            emit DilutionCreated(
                proposalHash,
                receipt.memberDiluted,
                originalTotalDilutionValue,
                receipt.totalDilutionValue
            );
        } else {
            address[] memory dilutors;
            DilutionReceipt memory newDilutionReceipt = DilutionReceipt(proposalHash, memberToDilute, 0, dilutors, true);

            proposalHashToMemberDilution[proposalHash][memberToDilute] = newDilutionReceipt;

            uint originalTotalDilutionValue = proposalHashToMemberDilution[proposalHash][memberToDilute].totalDilutionValue;

            proposalHashToMemberDilution[proposalHash][memberToDilute].dilutors.push(msg.sender);

            proposalHashToMemberDilution[proposalHash][memberToDilute].voterDilutions[
                msg.sender
            ] = latestDelegatedVoteWeight[msg.sender][memberToDilute];

            proposalHashToMemberDilution[proposalHash][memberToDilute].totalDilutionValue = latestDelegatedVoteWeight[
                msg.sender
            ][memberToDilute];

            hasAddressDilutedForProposal[proposalHash][msg.sender] = true;

            emit DilutionCreated(
                proposalHash,
                memberToDilute,
                originalTotalDilutionValue,
                proposalHashToMemberDilution[proposalHash][memberToDilute].totalDilutionValue
            );
        }
    }

    /**
    @notice  A function that allows a voter to undo a dilution
    @param proposalHash the ipfs hash of the proposal to be logged
    @param memberToUndilute the address of the member to undilute
     */
    function invalidateDilution(string memory proposalHash, address memberToUndilute) public {
        require(memberToUndilute != address(0), "member to undilute must be a valid address");
        require(proposalHashToLog[proposalHash].exist, "proposal does not exist");
        require(
            proposalHashToMemberDilution[proposalHash][memberToUndilute].exist,
            "dilution receipt does not exist for this member and proposal hash"
        );
        require(
            proposalHashToMemberDilution[proposalHash][memberToUndilute].voterDilutions[msg.sender] > 0 &&
                hasAddressDilutedForProposal[proposalHash][msg.sender] == true,
            "voter has no dilution weight"
        );
        require(now < proposalHashToLog[proposalHash].end, "undo dilution can only occur within the proposal voting period");

        address caller = msg.sender;

        DilutionReceipt storage receipt = proposalHashToMemberDilution[proposalHash][memberToUndilute];

        uint originalTotalDilutionValue = receipt.totalDilutionValue;

        uint voterDilutionValue = receipt.voterDilutions[msg.sender];

        hasAddressDilutedForProposal[proposalHash][msg.sender] = false;

        for (uint i = 0; i < receipt.dilutors.length; i++) {
            if (receipt.dilutors[i] == caller) {
                receipt.dilutors[i] = receipt.dilutors[receipt.dilutors.length - 1];
                break;
            }
        }

        receipt.dilutors.pop();

        receipt.voterDilutions[msg.sender] = 0;
        receipt.totalDilutionValue = receipt.totalDilutionValue - voterDilutionValue;

        emit DilutionModified(proposalHash, receipt.memberDiluted, originalTotalDilutionValue, receipt.totalDilutionValue);
    }

    /* Views */

    /**
    @notice   A view function that checks which proposalHashes exist on the contract and return them
    @param proposalHashes a array of hashes to check validity against
    @return a array with elements either empty or with the valid proposal hash
     */
    function getValidProposals(string[] memory proposalHashes) public view returns (string[] memory) {
        string[] memory validHashes = new string[](proposalHashes.length);

        for (uint i = 0; i < proposalHashes.length; i++) {
            string memory proposalHash = proposalHashes[i];
            if (proposalHashToLog[proposalHash].exist) {
                validHashes[i] = (proposalHashToLog[proposalHash].proposalHash);
            }
        }

        return validHashes;
    }

    /**
    @notice A view function that calculates the council member voting weight for a proposal after any dilution penalties
    @param proposalHash the ipfs hash of the proposal to check dilution against
    @param councilMember the council member to check diluted weight for 
    @return the calculated diluted ratio (1e18)
     */
    function getDilutedWeightForProposal(string memory proposalHash, address councilMember) public view returns (uint) {
        require(proposalHashToLog[proposalHash].exist, "proposal does not exist");

        string memory electionHash = proposalHashToLog[proposalHash].electionHash;

        require(electionHashToLog[electionHash].councilMembers[councilMember], "address must be a nominated council member");

        uint originalWeight = electionHashToLog[electionHash].votesForMember[councilMember];
        uint penaltyValue = proposalHashToMemberDilution[proposalHash][councilMember].totalDilutionValue;

        return (originalWeight - penaltyValue).divideDecimal(originalWeight);
    }

    /**
    @notice A view helper function to get the dilutors for a particular DilutionReceipt
    @param proposalHash the ipfs hash of the proposal to get the dilution receipt for
    @param memberDiluted the council member to get the dilution array for
    @return a list of the voters addresses who have diluted this member for this proposal
     */
    function getDilutorsForDilutionReceipt(string memory proposalHash, address memberDiluted)
        public
        view
        returns (address[] memory)
    {
        return proposalHashToMemberDilution[proposalHash][memberDiluted].dilutors;
    }

    /**
    @notice A view helper function to get the weighting of a voter's dilution for a DilutionReceipt
    @param proposalHash the ipfs hash of the proposal to get the dilution receipt for
    @param memberDiluted the council member to check dilution weighting against
    @param voter the voter address to get the dilution weighting for
    @return the dilution weight of the voter, for a specific proposal and council member
     */
    function getVoterDilutionWeightingForDilutionReceipt(
        string memory proposalHash,
        address memberDiluted,
        address voter
    ) public view returns (uint) {
        return proposalHashToMemberDilution[proposalHash][memberDiluted].voterDilutions[voter];
    }

    /* Restricted Functions */

    /**
    @notice A function that can only be called by the OWNER that changes the number of seats on the Spartan Council
    @param _numOfSeats the number of seats to set the numOfSeats to
     */
    function modifySeats(uint _numOfSeats) public onlyOwner() {
        require(_numOfSeats > 0, "number of seats must be greater than zero");
        uint oldNumOfSeats = numOfSeats;
        numOfSeats = _numOfSeats;

        emit SeatsModified(oldNumOfSeats, numOfSeats);
    }

    /**
    @notice A function that can only be called by the owner that changes the proposal voting period length
    @param _proposalPeriod the proposal perod in seconds, to set the proposalPeriod variable to
     */
    function modifyProposalPeriod(uint _proposalPeriod) public onlyOwner() {
        uint oldProposalPeriod = proposalPeriod;
        proposalPeriod = _proposalPeriod;

        emit ProposalPeriodModified(oldProposalPeriod, proposalPeriod);
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_numOfSeats","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"proposalHash","type":"string"},{"indexed":false,"internalType":"address","name":"memberDiluted","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalDilutionValueBefore","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalDilutionValueAfter","type":"uint256"}],"name":"DilutionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"proposalHash","type":"string"},{"indexed":false,"internalType":"address","name":"memberDiluted","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalDilutionValueBefore","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalDilutionValueAfter","type":"uint256"}],"name":"DilutionModified","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"electionHash","type":"string"},{"indexed":false,"internalType":"address[]","name":"nominatedCouncilMembers","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"voters","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"nomineesVotedFor","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"assignedVoteWeights","type":"uint256[]"}],"name":"ElectionLogged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"proposalHash","type":"string"},{"indexed":false,"internalType":"string","name":"electionHash","type":"string"},{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"}],"name":"ProposalLogged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousProposalPeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newProposalPeriod","type":"uint256"}],"name":"ProposalPeriodModified","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousNumberOfSeats","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newNumberOfSeats","type":"uint256"}],"name":"SeatsModified","type":"event"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"proposalHash","type":"string"},{"internalType":"address","name":"memberToDilute","type":"address"}],"name":"dilute","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"electionHashToLog","outputs":[{"internalType":"string","name":"electionHash","type":"string"},{"internalType":"uint256","name":"created","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"address","name":"","type":"address"}],"name":"electionMemberVotedFor","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"proposalHash","type":"string"},{"internalType":"address","name":"councilMember","type":"address"}],"name":"getDilutedWeightForProposal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"proposalHash","type":"string"},{"internalType":"address","name":"memberDiluted","type":"address"}],"name":"getDilutorsForDilutionReceipt","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string[]","name":"proposalHashes","type":"string[]"}],"name":"getValidProposals","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"proposalHash","type":"string"},{"internalType":"address","name":"memberDiluted","type":"address"},{"internalType":"address","name":"voter","type":"address"}],"name":"getVoterDilutionWeightingForDilutionReceipt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"address","name":"","type":"address"}],"name":"hasAddressDilutedForProposal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"proposalHash","type":"string"},{"internalType":"address","name":"memberToUndilute","type":"address"}],"name":"invalidateDilution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"latestDelegatedVoteWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"latestElectionHash","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"latestVotingWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"electionHash","type":"string"},{"internalType":"address[]","name":"nominatedCouncilMembers","type":"address[]"},{"internalType":"address[]","name":"voters","type":"address[]"},{"internalType":"address[]","name":"nomineesVotedFor","type":"address[]"},{"internalType":"uint256[]","name":"assignedVoteWeights","type":"uint256[]"}],"name":"logElection","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"proposalHash","type":"string"}],"name":"logProposal","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_proposalPeriod","type":"uint256"}],"name":"modifyProposalPeriod","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_numOfSeats","type":"uint256"}],"name":"modifySeats","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numOfSeats","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"proposalHashToLog","outputs":[{"internalType":"string","name":"proposalHash","type":"string"},{"internalType":"string","name":"electionHash","type":"string"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"bool","name":"exist","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"address","name":"","type":"address"}],"name":"proposalHashToMemberDilution","outputs":[{"internalType":"string","name":"proposalHash","type":"string"},{"internalType":"address","name":"memberDiluted","type":"address"},{"internalType":"uint256","name":"totalDilutionValue","type":"uint256"},{"internalType":"bool","name":"exist","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"proposalPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040516200502138038062005021833981810160405262000037919081019062000157565b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620000ab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000a29062000214565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c6000826040516200011f929190620001e7565b60405180910390a150806002819055506203f48060038190555050620002db565b6000815190506200015181620002c1565b92915050565b6000602082840312156200016a57600080fd5b60006200017a8482850162000140565b91505092915050565b6200018e8162000285565b82525050565b6200019f8162000247565b82525050565b6000620001b460198362000236565b91507f4f776e657220616464726573732063616e6e6f742062652030000000000000006000830152602082019050919050565b6000604082019050620001fe600083018562000183565b6200020d602083018462000194565b9392505050565b600060208201905081810360008301526200022f81620001a5565b9050919050565b600082825260208201905092915050565b600062000254826200025b565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620002928262000299565b9050919050565b6000620002a682620002ad565b9050919050565b6000620002ba826200025b565b9050919050565b620002cc816200027b565b8114620002d857600080fd5b50565b614d3680620002eb6000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c806379ba5097116100c3578063b71860f71161007c578063b71860f714610406578063bd5ebdd614610436578063d030dd2414610454578063d564bc8614610484578063f5a9a63a146104a0578063fded1505146104d157610158565b806379ba5097146103325780637f3aa6c81461033c5780638849891d146103585780638da5cb5b146103885780639eb269f7146103a6578063a736cc11146103d657610158565b80632c103c79116101155780632c103c791461024357806343d2d8b714610261578063526577ff1461027d57806353a47bb7146102b0578063624f3abe146102ce578063761409a6146102fe57610158565b80631627540c1461015d5780631dc0ffbc146101795780632816ee6a146101a957806328389be2146101d9578063283f4172146102095780632a36aef214610225575b600080fd5b61017760048036036101729190810190613537565b610501565b005b610193600480360361018e919081019061365f565b610584565b6040516101a091906149e6565b60405180910390f35b6101c360048036036101be9190810190613537565b610843565b6040516101d091906149e6565b60405180910390f35b6101f360048036036101ee9190810190613560565b61085b565b60405161020091906149e6565b60405180910390f35b610223600480360361021e919081019061385d565b610880565b005b61022d6108d5565b60405161023a91906149e6565b60405180910390f35b61024b6108db565b60405161025891906149e6565b60405180910390f35b61027b6004803603610276919081019061365f565b6108e1565b005b61029760048036036102929190810190613809565b610f7f565b6040516102a79493929190614649565b60405180910390f35b6102b8611097565b6040516102c5919061444d565b60405180910390f35b6102e860048036036102e3919081019061361e565b6110bd565b6040516102f59190614512565b60405180910390f35b610318600480360361031391908101906135dd565b611327565b604051610329959493929190614695565b60405180910390f35b61033a6114b0565b005b6103566004803603610351919081019061385d565b611662565b005b610372600480360361036d919081019061371a565b6116fa565b60405161037f9190614512565b60405180910390f35b610390611ce8565b60405161039d919061444d565b60405180910390f35b6103c060048036036103bb9190810190613809565b611d0d565b6040516103cd919061444d565b60405180910390f35b6103f060048036036103eb9190810190613809565b611d65565b6040516103fd91906144d5565b60405180910390f35b610420600480360361041b919081019061365f565b611daa565b60405161042d9190614491565b60405180910390f35b61043e611e97565b60405161044b91906144f0565b60405180910390f35b61046e600480360361046991908101906136b3565b611f35565b60405161047b91906149e6565b60405180910390f35b61049e6004803603610499919081019061365f565b611fdc565b005b6104ba60048036036104b591908101906135dd565b612c33565b6040516104c89291906146f6565b60405180910390f35b6104eb60048036036104e6919081019061359c565b612d05565b6040516104f891906144b3565b60405180910390f35b610509612e85565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2281604051610579919061444d565b60405180910390a150565b6000600a83604051610596919061441f565b908152602001604051809103902060040160009054906101000a900460ff166105f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105eb90614826565b60405180910390fd5b6060600a84604051610606919061441f565b90815260200160405180910390206001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106ab5780601f10610680576101008083540402835291602001916106ab565b820191906000526020600020905b81548152906001019060200180831161068e57829003601f168201915b505050505090506005816040516106c2919061441f565b908152602001604051809103902060020160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661075d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075490614926565b60405180910390fd5b600060058260405161076f919061441f565b908152602001604051809103902060010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600b866040516107d2919061441f565b908152602001604051809103902060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154905061083882828403612f1690919063ffffffff16565b935050505092915050565b60076020528060005260406000206000915090505481565b6006602052816000526040600020602052806000526040600020600091509150505481565b610888612e85565b60006003549050816003819055507f4b8caef4830afa7b696a5c84ec0b624a0cbb7615afbe0da7f78336ed10167647816003546040516108c9929190614a01565b60405180910390a15050565b60025481565b60035481565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610951576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610948906149a6565b60405180910390fd5b600a82604051610961919061441f565b908152602001604051809103902060040160009054906101000a900460ff166109bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b690614826565b60405180910390fd5b600b826040516109cf919061441f565b908152602001604051809103902060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160009054906101000a900460ff16610a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a61906148c6565b60405180910390fd5b6000600b83604051610a7c919061441f565b908152602001604051809103902060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118015610b81575060011515600983604051610b24919061441f565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b610bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb7906148a6565b60405180910390fd5b600a82604051610bd0919061441f565b9081526020016040518091039020600301544210610c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1a90614946565b60405180910390fd5b60003390506000600b84604051610c3a919061441f565b908152602001604051809103902060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160020154905060008260040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600987604051610ce8919061441f565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060008090505b8360030180549050811015610e79578473ffffffffffffffffffffffffffffffffffffffff16846003018281548110610d8557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e6c5783600301600185600301805490500381548110610de557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846003018281548110610e1f57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e79565b8080600101915050610d50565b5082600301805480610e8757fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055905560008360040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508083600201540383600201819055507f4aa0494fe4184fdf0e4444f08ecf6a62a958f61523ab9b03635674a5345772f8868460010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848660020154604051610f6f9493929190614534565b60405180910390a1505050505050565b600b8280516020810182018051848252602083016020850120818352809550505050505060205280600052604060002060009150915050806000018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561104e5780601f106110235761010080835404028352916020019161104e565b820191906000526020600020905b81548152906001019060200180831161103157829003601f168201915b5050505050908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060050160009054906101000a900460ff16905084565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600a826040516110cf919061441f565b908152602001604051809103902060040160009054906101000a900460ff161561112e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611125906148e6565b60405180910390fd5b6000825111611172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116990614726565b60405180910390fd5b6000429050600060035482019050611188613067565b6040518060a0016040528086815260200160048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561122f5780601f106112045761010080835404028352916020019161122f565b820191906000526020600020905b81548152906001019060200180831161121257829003601f168201915b5050505050815260200184815260200183815260200160011515815250905080600a8660405161125f919061441f565b90815260200160405180910390206000820151816000019080519060200190611289929190613098565b5060208201518160010190805190602001906112a6929190613098565b50604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083151502179055509050507fd47fe0a856b7afa634ae1195e8e24dea267362b36bf6bd3bcbb72ee3a64df964856004858560405161131494939291906145f6565b60405180910390a1849350505050919050565b600a81805160208101820180518482526020830160208501208183528095505050505050600091509050806000018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113e95780601f106113be576101008083540402835291602001916113e9565b820191906000526020600020905b8154815290600101906020018083116113cc57829003601f168201915b505050505090806001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114875780601f1061145c57610100808354040283529160200191611487565b820191906000526020600020905b81548152906001019060200180831161146a57829003601f168201915b5050505050908060020154908060030154908060040160009054906101000a900460ff16905085565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611540576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153790614746565b60405180910390fd5b7fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516115b4929190614468565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61166a612e85565b600081116116ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a4906147e6565b60405180910390fd5b60006002549050816002819055507ff19f525adce024b62e1f0a6dc5a1cd7f2942a3b12bd99d3142d7656277ed2bef816002546040516116ee929190614a01565b60405180910390a15050565b6060611704612e85565b6000865111611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173f90614766565b60405180910390fd5b600084511161178c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178390614986565b60405180910390fd5b60008351116117d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c7906147a6565b60405180910390fd5b6000825111611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b90614786565b60405180910390fd5b600254855114611859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185090614846565b60405180910390fd5b611861613118565b604051806040016040528088815260200142815250905080600588604051611889919061441f565b908152602001604051809103902060008201518160000190805190602001906118b3929190613098565b506020820151816003015590505060008090505b8551811015611b15578381815181106118dc57fe5b6020026020010151600660008884815181106118f457fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087848151811061194457fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083818151811061199657fe5b6020026020010151600760008784815181106119ae57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540160076000878481518110611a0257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550848181518110611a5457fe5b6020026020010151600889604051611a6c919061441f565b90815260200160405180910390206000888481518110611a8857fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080806001019150506118c7565b5060008090505b8651811015611c845760076000888381518110611b3557fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600589604051611b88919061441f565b90815260200160405180910390206001016000898481518110611ba757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600589604051611bff919061441f565b90815260200160405180910390206002016000898481518110611c1e57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050611b1c565b508660049080519060200190611c9b929190613132565b507fa3703394e5f162a1d0ed6d6e1dcfa1f871d1900ff2b7b8195d1483989f1486a88787878787604051611cd3959493929190614580565b60405180910390a18691505095945050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6008828051602081018201805184825260208301602085012081835280955050505050506020528060005260406000206000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6009828051602081018201805184825260208301602085012081835280955050505050506020528060005260406000206000915091509054906101000a900460ff1681565b6060600b83604051611dbc919061441f565b908152602001604051809103902060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301805480602002602001604051908101604052809291908181526020018280548015611e8a57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611e40575b5050505050905092915050565b60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f2d5780601f10611f0257610100808354040283529160200191611f2d565b820191906000526020600020905b815481529060010190602001808311611f1057829003601f168201915b505050505081565b6000600b84604051611f47919061441f565b908152602001604051809103902060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561204c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204390614806565b60405180910390fd5b6005600460405161205d9190614436565b908152602001604051809103902060020160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166120f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ef906149c6565b60405180910390fd5b600a82604051612108919061441f565b908152602001604051809103902060040160009054906101000a900460ff16612166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215d90614826565b60405180910390fd5b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411612225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221c906147c6565b60405180910390fd5b600a82604051612235919061441f565b9081526020016040518091039020600301544210612288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227f90614906565b60405180910390fd5b6000151560098360405161229c919061441f565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232e90614966565b60405180910390fd5b600b82604051612347919061441f565b908152602001604051809103902060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160009054906101000a900460ff16156126a5576000600b836040516123ba919061441f565b908152602001604051809103902060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600201549050816003013390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548260040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826002015401826002018190555060016009856040516125d7919061441f565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f6f053211788fd6640229ec58c60c916876198ae9f9b5023a1f77dfcd607cfe7d848360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168385600201546040516126969493929190614534565b60405180910390a15050612c2f565b60606126af6131b2565b6040518060a001604052808581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200183815260200160011515815250905080600b85604051612703919061441f565b908152602001604051809103902060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001908051906020019061276a929190613098565b5060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030190805190602001906127d89291906131f9565b5060808201518160050160006101000a81548160ff0219169083151502179055509050506000600b8560405161280e919061441f565b908152602001604051809103902060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549050600b8560405161286f919061441f565b908152602001604051809103902060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003013390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b866040516129ae919061441f565b908152602001604051809103902060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b86604051612aca919061441f565b908152602001604051809103902060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506001600986604051612b2e919061441f565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f6f053211788fd6640229ec58c60c916876198ae9f9b5023a1f77dfcd607cfe7d858583600b89604051612bc4919061441f565b908152602001604051809103902060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154604051612c239493929190614534565b60405180910390a15050505b5050565b600581805160208101820180518482526020830160208501208183528095505050505050600091509050806000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612cf55780601f10612cca57610100808354040283529160200191612cf5565b820191906000526020600020905b815481529060010190602001808311612cd857829003601f168201915b5050505050908060030154905082565b6060808251604051908082528060200260200182016040528015612d3d57816020015b6060815260200190600190039081612d285790505b50905060008090505b8351811015612e7b576060848281518110612d5d57fe5b60200260200101519050600a81604051612d77919061441f565b908152602001604051809103902060040160009054906101000a900460ff1615612e6d57600a81604051612dab919061441f565b90815260200160405180910390206000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612e505780601f10612e2557610100808354040283529160200191612e50565b820191906000526020600020905b815481529060010190602001808311612e3357829003601f168201915b5050505050838381518110612e6157fe5b60200260200101819052505b508080600101915050612d46565b5080915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0b90614866565b60405180910390fd5b565b6000612f4482612f36601260ff16600a0a86612f4c90919063ffffffff16565b612fbc90919063ffffffff16565b905092915050565b600080831415612f5f5760009050612fb6565b6000828402905082848281612f7057fe5b0414612fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa890614886565b60405180910390fd5b809150505b92915050565b6000612ffe83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613006565b905092915050565b6000808311829061304d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130449190614512565b60405180910390fd5b50600083858161305957fe5b049050809150509392505050565b6040518060a00160405280606081526020016060815260200160008152602001600081526020016000151581525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106130d957805160ff1916838001178555613107565b82800160010185558215613107579182015b828111156131065782518255916020019190600101906130eb565b5b5090506131149190613283565b5090565b604051806040016040528060608152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061317357805160ff19168380011785556131a1565b828001600101855582156131a1579182015b828111156131a0578251825591602001919060010190613185565b5b5090506131ae9190613283565b5090565b6040518060a0016040528060608152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081526020016000151581525090565b828054828255906000526020600020908101928215613272579160200282015b828111156132715782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613219565b5b50905061327f91906132a8565b5090565b6132a591905b808211156132a1576000816000905550600101613289565b5090565b90565b6132e891905b808211156132e457600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055506001016132ae565b5090565b90565b6000813590506132fa81614cc5565b92915050565b600082601f83011261331157600080fd5b813561332461331f82614a57565b614a2a565b9150818183526020840193506020810190508385602084028201111561334957600080fd5b60005b83811015613379578161335f88826132eb565b84526020840193506020830192505060018101905061334c565b5050505092915050565b600082601f83011261339457600080fd5b81356133a76133a282614a7f565b614a2a565b9150818183526020840193506020810190508360005b838110156133ed57813586016133d3888261347a565b8452602084019350602083019250506001810190506133bd565b5050505092915050565b600082601f83011261340857600080fd5b813561341b61341682614aa7565b614a2a565b9150818183526020840193506020810190508385602084028201111561344057600080fd5b60005b8381101561347057816134568882613522565b845260208401935060208301925050600181019050613443565b5050505092915050565b600082601f83011261348b57600080fd5b813561349e61349982614acf565b614a2a565b915080825260208301602083018583830111156134ba57600080fd5b6134c5838284614c72565b50505092915050565b600082601f8301126134df57600080fd5b81356134f26134ed82614afb565b614a2a565b9150808252602083016020830185838301111561350e57600080fd5b613519838284614c72565b50505092915050565b60008135905061353181614cdc565b92915050565b60006020828403121561354957600080fd5b6000613557848285016132eb565b91505092915050565b6000806040838503121561357357600080fd5b6000613581858286016132eb565b9250506020613592858286016132eb565b9150509250929050565b6000602082840312156135ae57600080fd5b600082013567ffffffffffffffff8111156135c857600080fd5b6135d484828501613383565b91505092915050565b6000602082840312156135ef57600080fd5b600082013567ffffffffffffffff81111561360957600080fd5b6136158482850161347a565b91505092915050565b60006020828403121561363057600080fd5b600082013567ffffffffffffffff81111561364a57600080fd5b613656848285016134ce565b91505092915050565b6000806040838503121561367257600080fd5b600083013567ffffffffffffffff81111561368c57600080fd5b613698858286016134ce565b92505060206136a9858286016132eb565b9150509250929050565b6000806000606084860312156136c857600080fd5b600084013567ffffffffffffffff8111156136e257600080fd5b6136ee868287016134ce565b93505060206136ff868287016132eb565b9250506040613710868287016132eb565b9150509250925092565b600080600080600060a0868803121561373257600080fd5b600086013567ffffffffffffffff81111561374c57600080fd5b613758888289016134ce565b955050602086013567ffffffffffffffff81111561377557600080fd5b61378188828901613300565b945050604086013567ffffffffffffffff81111561379e57600080fd5b6137aa88828901613300565b935050606086013567ffffffffffffffff8111156137c757600080fd5b6137d388828901613300565b925050608086013567ffffffffffffffff8111156137f057600080fd5b6137fc888289016133f7565b9150509295509295909350565b6000806040838503121561381c57600080fd5b600083013567ffffffffffffffff81111561383657600080fd5b6138428582860161347a565b9250506020613853858286016132eb565b9150509250929050565b60006020828403121561386f57600080fd5b600061387d84828501613522565b91505092915050565b600061389283836138ca565b60208301905092915050565b60006138aa8383613a92565b905092915050565b60006138be8383614401565b60208301905092915050565b6138d381614c2a565b82525050565b6138e281614c2a565b82525050565b60006138f382614b6c565b6138fd8185614bca565b935061390883614b27565b8060005b838110156139395781516139208882613886565b975061392b83614ba3565b92505060018101905061390c565b5085935050505092915050565b600061395182614b77565b61395b8185614bdb565b93508360208202850161396d85614b37565b8060005b858110156139a9578484038952815161398a858261389e565b945061399583614bb0565b925060208a01995050600181019050613971565b50829750879550505050505092915050565b60006139c682614b82565b6139d08185614bec565b93506139db83614b47565b8060005b83811015613a0c5781516139f388826138b2565b97506139fe83614bbd565b9250506001810190506139df565b5085935050505092915050565b613a2281614c3c565b82525050565b6000613a3382614b98565b613a3d8185614c0e565b9350613a4d818560208601614c81565b613a5681614cb4565b840191505092915050565b6000613a6c82614b98565b613a768185614c1f565b9350613a86818560208601614c81565b80840191505092915050565b6000613a9d82614b8d565b613aa78185614bfd565b9350613ab7818560208601614c81565b613ac081614cb4565b840191505092915050565b6000613ad682614b8d565b613ae08185614c0e565b9350613af0818560208601614c81565b613af981614cb4565b840191505092915050565b600081546001811660008114613b215760018114613b4757613b8b565b607f6002830416613b328187614c0e565b955060ff198316865260208601935050613b8b565b60028204613b558187614c0e565b9550613b6085614b57565b60005b82811015613b8257815481890152600182019150602081019050613b63565b80880195505050505b505092915050565b600081546001811660008114613bb05760018114613bd557613c19565b607f6002830416613bc18187614c1f565b955060ff1983168652808601935050613c19565b60028204613be38187614c1f565b9550613bee85614b57565b60005b82811015613c1057815481890152600182019150602081019050613bf1565b82880195505050505b505092915050565b6000613c2e601f83614c0e565b91507f70726f706f73616c2068617368206d757374206e6f7420626520656d707479006000830152602082019050919050565b6000613c6e603583614c0e565b91507f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560008301527f2063616e20616363657074206f776e65727368697000000000000000000000006020830152604082019050919050565b6000613cd4601c83614c0e565b91507f656d70747920656c656374696f6e20686173682070726f7669646564000000006000830152602082019050919050565b6000613d14602883614c0e565b91507f656d7074792061737369676e6564566f7465576569676874732061727261792060008301527f70726f76696465640000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d7a602583614c0e565b91507f656d707479206e6f6d696e656573566f746564466f722061727261792070726f60008301527f76696465640000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613de0603183614c0e565b91507f73656e64657220686173206e6f742064656c65676174656420766f74696e672060008301527f77656967687420666f72206d656d6265720000000000000000000000000000006020830152604082019050919050565b6000613e46602983614c0e565b91507f6e756d626572206f66207365617473206d75737420626520677265617465722060008301527f7468616e207a65726f00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613eac602883614c0e565b91507f6d656d62657220746f2064696c757465206d75737420626520612076616c696460008301527f20616464726573730000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f12601783614c0e565b91507f70726f706f73616c20646f6573206e6f742065786973740000000000000000006000830152602082019050919050565b6000613f52602183614c0e565b91507f696e76616c6964206e756d626572206f6620636f756e63696c206d656d62657260008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fb8602f83614c0e565b91507f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660008301527f6f726d207468697320616374696f6e00000000000000000000000000000000006020830152604082019050919050565b600061401e602183614c0e565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614084601c83614c0e565b91507f766f74657220686173206e6f2064696c7574696f6e20776569676874000000006000830152602082019050919050565b60006140c4604183614c0e565b91507f64696c7574696f6e207265636569707420646f6573206e6f742065786973742060008301527f666f722074686973206d656d62657220616e642070726f706f73616c2068617360208301527f68000000000000000000000000000000000000000000000000000000000000006040830152606082019050919050565b6000614150601b83614c0e565b91507f70726f706f73616c2068617368206973206e6f7420756e6971756500000000006000830152602082019050919050565b6000614190603983614c0e565b91507f64696c7574696f6e2063616e206f6e6c79206f636375722077697468696e207460008301527f68652070726f706f73616c20766f74696e6720706572696f64000000000000006020830152604082019050919050565b60006141f6602a83614c0e565b91507f61646472657373206d7573742062652061206e6f6d696e6174656420636f756e60008301527f63696c206d656d626572000000000000000000000000000000000000000000006020830152604082019050919050565b600061425c603e83614c0e565b91507f756e646f2064696c7574696f6e2063616e206f6e6c79206f636375722077697460008301527f68696e207468652070726f706f73616c20766f74696e6720706572696f6400006020830152604082019050919050565b60006142c2601a83614c0e565b91507f73656e6465722068617320616c72656164792064696c757465640000000000006000830152602082019050919050565b6000614302601b83614c0e565b91507f656d70747920766f746572732061727261792070726f766964656400000000006000830152602082019050919050565b6000614342602a83614c0e565b91507f6d656d62657220746f20756e64696c757465206d75737420626520612076616c60008301527f69642061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006143a8603383614c0e565b91507f6d656d62657220746f2064696c757465206d7573742062652061206e6f6d696e60008301527f6174656420636f756e63696c206d656d626572000000000000000000000000006020830152604082019050919050565b61440a81614c68565b82525050565b61441981614c68565b82525050565b600061442b8284613a61565b915081905092915050565b60006144428284613b93565b915081905092915050565b600060208201905061446260008301846138d9565b92915050565b600060408201905061447d60008301856138d9565b61448a60208301846138d9565b9392505050565b600060208201905081810360008301526144ab81846138e8565b905092915050565b600060208201905081810360008301526144cd8184613946565b905092915050565b60006020820190506144ea6000830184613a19565b92915050565b6000602082019050818103600083015261450a8184613acb565b905092915050565b6000602082019050818103600083015261452c8184613a28565b905092915050565b6000608082019050818103600083015261454e8187613a28565b905061455d60208301866138d9565b61456a6040830185614410565b6145776060830184614410565b95945050505050565b600060a082019050818103600083015261459a8188613a28565b905081810360208301526145ae81876138e8565b905081810360408301526145c281866138e8565b905081810360608301526145d681856138e8565b905081810360808301526145ea81846139bb565b90509695505050505050565b600060808201905081810360008301526146108187613a28565b905081810360208301526146248186613b04565b90506146336040830185614410565b6146406060830184614410565b95945050505050565b600060808201905081810360008301526146638187613acb565b905061467260208301866138d9565b61467f6040830185614410565b61468c6060830184613a19565b95945050505050565b600060a08201905081810360008301526146af8188613acb565b905081810360208301526146c38187613acb565b90506146d26040830186614410565b6146df6060830185614410565b6146ec6080830184613a19565b9695505050505050565b600060408201905081810360008301526147108185613acb565b905061471f6020830184614410565b9392505050565b6000602082019050818103600083015261473f81613c21565b9050919050565b6000602082019050818103600083015261475f81613c61565b9050919050565b6000602082019050818103600083015261477f81613cc7565b9050919050565b6000602082019050818103600083015261479f81613d07565b9050919050565b600060208201905081810360008301526147bf81613d6d565b9050919050565b600060208201905081810360008301526147df81613dd3565b9050919050565b600060208201905081810360008301526147ff81613e39565b9050919050565b6000602082019050818103600083015261481f81613e9f565b9050919050565b6000602082019050818103600083015261483f81613f05565b9050919050565b6000602082019050818103600083015261485f81613f45565b9050919050565b6000602082019050818103600083015261487f81613fab565b9050919050565b6000602082019050818103600083015261489f81614011565b9050919050565b600060208201905081810360008301526148bf81614077565b9050919050565b600060208201905081810360008301526148df816140b7565b9050919050565b600060208201905081810360008301526148ff81614143565b9050919050565b6000602082019050818103600083015261491f81614183565b9050919050565b6000602082019050818103600083015261493f816141e9565b9050919050565b6000602082019050818103600083015261495f8161424f565b9050919050565b6000602082019050818103600083015261497f816142b5565b9050919050565b6000602082019050818103600083015261499f816142f5565b9050919050565b600060208201905081810360008301526149bf81614335565b9050919050565b600060208201905081810360008301526149df8161439b565b9050919050565b60006020820190506149fb6000830184614410565b92915050565b6000604082019050614a166000830185614410565b614a236020830184614410565b9392505050565b6000604051905081810181811067ffffffffffffffff82111715614a4d57600080fd5b8060405250919050565b600067ffffffffffffffff821115614a6e57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115614a9657600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115614abe57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115614ae657600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614b1257600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c3582614c48565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c9f578082015181840152602081019050614c84565b83811115614cae576000848401525b50505050565b6000601f19601f8301169050919050565b614cce81614c2a565b8114614cd957600080fd5b50565b614ce581614c68565b8114614cf057600080fd5b5056fea365627a7a723158202e239d6c62eaaf53aa36b7903c266879c69a3998576b22246d76c31e8481b99a6c6578706572696d656e74616cf564736f6c634300051000400000000000000000000000000000000000000000000000000000000000000008

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101585760003560e01c806379ba5097116100c3578063b71860f71161007c578063b71860f714610406578063bd5ebdd614610436578063d030dd2414610454578063d564bc8614610484578063f5a9a63a146104a0578063fded1505146104d157610158565b806379ba5097146103325780637f3aa6c81461033c5780638849891d146103585780638da5cb5b146103885780639eb269f7146103a6578063a736cc11146103d657610158565b80632c103c79116101155780632c103c791461024357806343d2d8b714610261578063526577ff1461027d57806353a47bb7146102b0578063624f3abe146102ce578063761409a6146102fe57610158565b80631627540c1461015d5780631dc0ffbc146101795780632816ee6a146101a957806328389be2146101d9578063283f4172146102095780632a36aef214610225575b600080fd5b61017760048036036101729190810190613537565b610501565b005b610193600480360361018e919081019061365f565b610584565b6040516101a091906149e6565b60405180910390f35b6101c360048036036101be9190810190613537565b610843565b6040516101d091906149e6565b60405180910390f35b6101f360048036036101ee9190810190613560565b61085b565b60405161020091906149e6565b60405180910390f35b610223600480360361021e919081019061385d565b610880565b005b61022d6108d5565b60405161023a91906149e6565b60405180910390f35b61024b6108db565b60405161025891906149e6565b60405180910390f35b61027b6004803603610276919081019061365f565b6108e1565b005b61029760048036036102929190810190613809565b610f7f565b6040516102a79493929190614649565b60405180910390f35b6102b8611097565b6040516102c5919061444d565b60405180910390f35b6102e860048036036102e3919081019061361e565b6110bd565b6040516102f59190614512565b60405180910390f35b610318600480360361031391908101906135dd565b611327565b604051610329959493929190614695565b60405180910390f35b61033a6114b0565b005b6103566004803603610351919081019061385d565b611662565b005b610372600480360361036d919081019061371a565b6116fa565b60405161037f9190614512565b60405180910390f35b610390611ce8565b60405161039d919061444d565b60405180910390f35b6103c060048036036103bb9190810190613809565b611d0d565b6040516103cd919061444d565b60405180910390f35b6103f060048036036103eb9190810190613809565b611d65565b6040516103fd91906144d5565b60405180910390f35b610420600480360361041b919081019061365f565b611daa565b60405161042d9190614491565b60405180910390f35b61043e611e97565b60405161044b91906144f0565b60405180910390f35b61046e600480360361046991908101906136b3565b611f35565b60405161047b91906149e6565b60405180910390f35b61049e6004803603610499919081019061365f565b611fdc565b005b6104ba60048036036104b591908101906135dd565b612c33565b6040516104c89291906146f6565b60405180910390f35b6104eb60048036036104e6919081019061359c565b612d05565b6040516104f891906144b3565b60405180910390f35b610509612e85565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2281604051610579919061444d565b60405180910390a150565b6000600a83604051610596919061441f565b908152602001604051809103902060040160009054906101000a900460ff166105f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105eb90614826565b60405180910390fd5b6060600a84604051610606919061441f565b90815260200160405180910390206001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106ab5780601f10610680576101008083540402835291602001916106ab565b820191906000526020600020905b81548152906001019060200180831161068e57829003601f168201915b505050505090506005816040516106c2919061441f565b908152602001604051809103902060020160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661075d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075490614926565b60405180910390fd5b600060058260405161076f919061441f565b908152602001604051809103902060010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600b866040516107d2919061441f565b908152602001604051809103902060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154905061083882828403612f1690919063ffffffff16565b935050505092915050565b60076020528060005260406000206000915090505481565b6006602052816000526040600020602052806000526040600020600091509150505481565b610888612e85565b60006003549050816003819055507f4b8caef4830afa7b696a5c84ec0b624a0cbb7615afbe0da7f78336ed10167647816003546040516108c9929190614a01565b60405180910390a15050565b60025481565b60035481565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610951576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610948906149a6565b60405180910390fd5b600a82604051610961919061441f565b908152602001604051809103902060040160009054906101000a900460ff166109bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b690614826565b60405180910390fd5b600b826040516109cf919061441f565b908152602001604051809103902060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160009054906101000a900460ff16610a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a61906148c6565b60405180910390fd5b6000600b83604051610a7c919061441f565b908152602001604051809103902060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118015610b81575060011515600983604051610b24919061441f565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b610bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb7906148a6565b60405180910390fd5b600a82604051610bd0919061441f565b9081526020016040518091039020600301544210610c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1a90614946565b60405180910390fd5b60003390506000600b84604051610c3a919061441f565b908152602001604051809103902060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160020154905060008260040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600987604051610ce8919061441f565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060008090505b8360030180549050811015610e79578473ffffffffffffffffffffffffffffffffffffffff16846003018281548110610d8557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e6c5783600301600185600301805490500381548110610de557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846003018281548110610e1f57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e79565b8080600101915050610d50565b5082600301805480610e8757fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055905560008360040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508083600201540383600201819055507f4aa0494fe4184fdf0e4444f08ecf6a62a958f61523ab9b03635674a5345772f8868460010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848660020154604051610f6f9493929190614534565b60405180910390a1505050505050565b600b8280516020810182018051848252602083016020850120818352809550505050505060205280600052604060002060009150915050806000018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561104e5780601f106110235761010080835404028352916020019161104e565b820191906000526020600020905b81548152906001019060200180831161103157829003601f168201915b5050505050908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060050160009054906101000a900460ff16905084565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600a826040516110cf919061441f565b908152602001604051809103902060040160009054906101000a900460ff161561112e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611125906148e6565b60405180910390fd5b6000825111611172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116990614726565b60405180910390fd5b6000429050600060035482019050611188613067565b6040518060a0016040528086815260200160048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561122f5780601f106112045761010080835404028352916020019161122f565b820191906000526020600020905b81548152906001019060200180831161121257829003601f168201915b5050505050815260200184815260200183815260200160011515815250905080600a8660405161125f919061441f565b90815260200160405180910390206000820151816000019080519060200190611289929190613098565b5060208201518160010190805190602001906112a6929190613098565b50604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083151502179055509050507fd47fe0a856b7afa634ae1195e8e24dea267362b36bf6bd3bcbb72ee3a64df964856004858560405161131494939291906145f6565b60405180910390a1849350505050919050565b600a81805160208101820180518482526020830160208501208183528095505050505050600091509050806000018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113e95780601f106113be576101008083540402835291602001916113e9565b820191906000526020600020905b8154815290600101906020018083116113cc57829003601f168201915b505050505090806001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114875780601f1061145c57610100808354040283529160200191611487565b820191906000526020600020905b81548152906001019060200180831161146a57829003601f168201915b5050505050908060020154908060030154908060040160009054906101000a900460ff16905085565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611540576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153790614746565b60405180910390fd5b7fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516115b4929190614468565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61166a612e85565b600081116116ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a4906147e6565b60405180910390fd5b60006002549050816002819055507ff19f525adce024b62e1f0a6dc5a1cd7f2942a3b12bd99d3142d7656277ed2bef816002546040516116ee929190614a01565b60405180910390a15050565b6060611704612e85565b6000865111611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173f90614766565b60405180910390fd5b600084511161178c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178390614986565b60405180910390fd5b60008351116117d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c7906147a6565b60405180910390fd5b6000825111611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b90614786565b60405180910390fd5b600254855114611859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185090614846565b60405180910390fd5b611861613118565b604051806040016040528088815260200142815250905080600588604051611889919061441f565b908152602001604051809103902060008201518160000190805190602001906118b3929190613098565b506020820151816003015590505060008090505b8551811015611b15578381815181106118dc57fe5b6020026020010151600660008884815181106118f457fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087848151811061194457fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083818151811061199657fe5b6020026020010151600760008784815181106119ae57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540160076000878481518110611a0257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550848181518110611a5457fe5b6020026020010151600889604051611a6c919061441f565b90815260200160405180910390206000888481518110611a8857fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080806001019150506118c7565b5060008090505b8651811015611c845760076000888381518110611b3557fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600589604051611b88919061441f565b90815260200160405180910390206001016000898481518110611ba757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600589604051611bff919061441f565b90815260200160405180910390206002016000898481518110611c1e57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050611b1c565b508660049080519060200190611c9b929190613132565b507fa3703394e5f162a1d0ed6d6e1dcfa1f871d1900ff2b7b8195d1483989f1486a88787878787604051611cd3959493929190614580565b60405180910390a18691505095945050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6008828051602081018201805184825260208301602085012081835280955050505050506020528060005260406000206000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6009828051602081018201805184825260208301602085012081835280955050505050506020528060005260406000206000915091509054906101000a900460ff1681565b6060600b83604051611dbc919061441f565b908152602001604051809103902060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301805480602002602001604051908101604052809291908181526020018280548015611e8a57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611e40575b5050505050905092915050565b60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f2d5780601f10611f0257610100808354040283529160200191611f2d565b820191906000526020600020905b815481529060010190602001808311611f1057829003601f168201915b505050505081565b6000600b84604051611f47919061441f565b908152602001604051809103902060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561204c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204390614806565b60405180910390fd5b6005600460405161205d9190614436565b908152602001604051809103902060020160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166120f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ef906149c6565b60405180910390fd5b600a82604051612108919061441f565b908152602001604051809103902060040160009054906101000a900460ff16612166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215d90614826565b60405180910390fd5b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411612225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221c906147c6565b60405180910390fd5b600a82604051612235919061441f565b9081526020016040518091039020600301544210612288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227f90614906565b60405180910390fd5b6000151560098360405161229c919061441f565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232e90614966565b60405180910390fd5b600b82604051612347919061441f565b908152602001604051809103902060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160009054906101000a900460ff16156126a5576000600b836040516123ba919061441f565b908152602001604051809103902060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600201549050816003013390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548260040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826002015401826002018190555060016009856040516125d7919061441f565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f6f053211788fd6640229ec58c60c916876198ae9f9b5023a1f77dfcd607cfe7d848360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168385600201546040516126969493929190614534565b60405180910390a15050612c2f565b60606126af6131b2565b6040518060a001604052808581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200183815260200160011515815250905080600b85604051612703919061441f565b908152602001604051809103902060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001908051906020019061276a929190613098565b5060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030190805190602001906127d89291906131f9565b5060808201518160050160006101000a81548160ff0219169083151502179055509050506000600b8560405161280e919061441f565b908152602001604051809103902060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549050600b8560405161286f919061441f565b908152602001604051809103902060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003013390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b866040516129ae919061441f565b908152602001604051809103902060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b86604051612aca919061441f565b908152602001604051809103902060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506001600986604051612b2e919061441f565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f6f053211788fd6640229ec58c60c916876198ae9f9b5023a1f77dfcd607cfe7d858583600b89604051612bc4919061441f565b908152602001604051809103902060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154604051612c239493929190614534565b60405180910390a15050505b5050565b600581805160208101820180518482526020830160208501208183528095505050505050600091509050806000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612cf55780601f10612cca57610100808354040283529160200191612cf5565b820191906000526020600020905b815481529060010190602001808311612cd857829003601f168201915b5050505050908060030154905082565b6060808251604051908082528060200260200182016040528015612d3d57816020015b6060815260200190600190039081612d285790505b50905060008090505b8351811015612e7b576060848281518110612d5d57fe5b60200260200101519050600a81604051612d77919061441f565b908152602001604051809103902060040160009054906101000a900460ff1615612e6d57600a81604051612dab919061441f565b90815260200160405180910390206000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612e505780601f10612e2557610100808354040283529160200191612e50565b820191906000526020600020905b815481529060010190602001808311612e3357829003601f168201915b5050505050838381518110612e6157fe5b60200260200101819052505b508080600101915050612d46565b5080915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0b90614866565b60405180910390fd5b565b6000612f4482612f36601260ff16600a0a86612f4c90919063ffffffff16565b612fbc90919063ffffffff16565b905092915050565b600080831415612f5f5760009050612fb6565b6000828402905082848281612f7057fe5b0414612fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa890614886565b60405180910390fd5b809150505b92915050565b6000612ffe83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613006565b905092915050565b6000808311829061304d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130449190614512565b60405180910390fd5b50600083858161305957fe5b049050809150509392505050565b6040518060a00160405280606081526020016060815260200160008152602001600081526020016000151581525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106130d957805160ff1916838001178555613107565b82800160010185558215613107579182015b828111156131065782518255916020019190600101906130eb565b5b5090506131149190613283565b5090565b604051806040016040528060608152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061317357805160ff19168380011785556131a1565b828001600101855582156131a1579182015b828111156131a0578251825591602001919060010190613185565b5b5090506131ae9190613283565b5090565b6040518060a0016040528060608152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081526020016000151581525090565b828054828255906000526020600020908101928215613272579160200282015b828111156132715782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613219565b5b50905061327f91906132a8565b5090565b6132a591905b808211156132a1576000816000905550600101613289565b5090565b90565b6132e891905b808211156132e457600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055506001016132ae565b5090565b90565b6000813590506132fa81614cc5565b92915050565b600082601f83011261331157600080fd5b813561332461331f82614a57565b614a2a565b9150818183526020840193506020810190508385602084028201111561334957600080fd5b60005b83811015613379578161335f88826132eb565b84526020840193506020830192505060018101905061334c565b5050505092915050565b600082601f83011261339457600080fd5b81356133a76133a282614a7f565b614a2a565b9150818183526020840193506020810190508360005b838110156133ed57813586016133d3888261347a565b8452602084019350602083019250506001810190506133bd565b5050505092915050565b600082601f83011261340857600080fd5b813561341b61341682614aa7565b614a2a565b9150818183526020840193506020810190508385602084028201111561344057600080fd5b60005b8381101561347057816134568882613522565b845260208401935060208301925050600181019050613443565b5050505092915050565b600082601f83011261348b57600080fd5b813561349e61349982614acf565b614a2a565b915080825260208301602083018583830111156134ba57600080fd5b6134c5838284614c72565b50505092915050565b600082601f8301126134df57600080fd5b81356134f26134ed82614afb565b614a2a565b9150808252602083016020830185838301111561350e57600080fd5b613519838284614c72565b50505092915050565b60008135905061353181614cdc565b92915050565b60006020828403121561354957600080fd5b6000613557848285016132eb565b91505092915050565b6000806040838503121561357357600080fd5b6000613581858286016132eb565b9250506020613592858286016132eb565b9150509250929050565b6000602082840312156135ae57600080fd5b600082013567ffffffffffffffff8111156135c857600080fd5b6135d484828501613383565b91505092915050565b6000602082840312156135ef57600080fd5b600082013567ffffffffffffffff81111561360957600080fd5b6136158482850161347a565b91505092915050565b60006020828403121561363057600080fd5b600082013567ffffffffffffffff81111561364a57600080fd5b613656848285016134ce565b91505092915050565b6000806040838503121561367257600080fd5b600083013567ffffffffffffffff81111561368c57600080fd5b613698858286016134ce565b92505060206136a9858286016132eb565b9150509250929050565b6000806000606084860312156136c857600080fd5b600084013567ffffffffffffffff8111156136e257600080fd5b6136ee868287016134ce565b93505060206136ff868287016132eb565b9250506040613710868287016132eb565b9150509250925092565b600080600080600060a0868803121561373257600080fd5b600086013567ffffffffffffffff81111561374c57600080fd5b613758888289016134ce565b955050602086013567ffffffffffffffff81111561377557600080fd5b61378188828901613300565b945050604086013567ffffffffffffffff81111561379e57600080fd5b6137aa88828901613300565b935050606086013567ffffffffffffffff8111156137c757600080fd5b6137d388828901613300565b925050608086013567ffffffffffffffff8111156137f057600080fd5b6137fc888289016133f7565b9150509295509295909350565b6000806040838503121561381c57600080fd5b600083013567ffffffffffffffff81111561383657600080fd5b6138428582860161347a565b9250506020613853858286016132eb565b9150509250929050565b60006020828403121561386f57600080fd5b600061387d84828501613522565b91505092915050565b600061389283836138ca565b60208301905092915050565b60006138aa8383613a92565b905092915050565b60006138be8383614401565b60208301905092915050565b6138d381614c2a565b82525050565b6138e281614c2a565b82525050565b60006138f382614b6c565b6138fd8185614bca565b935061390883614b27565b8060005b838110156139395781516139208882613886565b975061392b83614ba3565b92505060018101905061390c565b5085935050505092915050565b600061395182614b77565b61395b8185614bdb565b93508360208202850161396d85614b37565b8060005b858110156139a9578484038952815161398a858261389e565b945061399583614bb0565b925060208a01995050600181019050613971565b50829750879550505050505092915050565b60006139c682614b82565b6139d08185614bec565b93506139db83614b47565b8060005b83811015613a0c5781516139f388826138b2565b97506139fe83614bbd565b9250506001810190506139df565b5085935050505092915050565b613a2281614c3c565b82525050565b6000613a3382614b98565b613a3d8185614c0e565b9350613a4d818560208601614c81565b613a5681614cb4565b840191505092915050565b6000613a6c82614b98565b613a768185614c1f565b9350613a86818560208601614c81565b80840191505092915050565b6000613a9d82614b8d565b613aa78185614bfd565b9350613ab7818560208601614c81565b613ac081614cb4565b840191505092915050565b6000613ad682614b8d565b613ae08185614c0e565b9350613af0818560208601614c81565b613af981614cb4565b840191505092915050565b600081546001811660008114613b215760018114613b4757613b8b565b607f6002830416613b328187614c0e565b955060ff198316865260208601935050613b8b565b60028204613b558187614c0e565b9550613b6085614b57565b60005b82811015613b8257815481890152600182019150602081019050613b63565b80880195505050505b505092915050565b600081546001811660008114613bb05760018114613bd557613c19565b607f6002830416613bc18187614c1f565b955060ff1983168652808601935050613c19565b60028204613be38187614c1f565b9550613bee85614b57565b60005b82811015613c1057815481890152600182019150602081019050613bf1565b82880195505050505b505092915050565b6000613c2e601f83614c0e565b91507f70726f706f73616c2068617368206d757374206e6f7420626520656d707479006000830152602082019050919050565b6000613c6e603583614c0e565b91507f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560008301527f2063616e20616363657074206f776e65727368697000000000000000000000006020830152604082019050919050565b6000613cd4601c83614c0e565b91507f656d70747920656c656374696f6e20686173682070726f7669646564000000006000830152602082019050919050565b6000613d14602883614c0e565b91507f656d7074792061737369676e6564566f7465576569676874732061727261792060008301527f70726f76696465640000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d7a602583614c0e565b91507f656d707479206e6f6d696e656573566f746564466f722061727261792070726f60008301527f76696465640000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613de0603183614c0e565b91507f73656e64657220686173206e6f742064656c65676174656420766f74696e672060008301527f77656967687420666f72206d656d6265720000000000000000000000000000006020830152604082019050919050565b6000613e46602983614c0e565b91507f6e756d626572206f66207365617473206d75737420626520677265617465722060008301527f7468616e207a65726f00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613eac602883614c0e565b91507f6d656d62657220746f2064696c757465206d75737420626520612076616c696460008301527f20616464726573730000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f12601783614c0e565b91507f70726f706f73616c20646f6573206e6f742065786973740000000000000000006000830152602082019050919050565b6000613f52602183614c0e565b91507f696e76616c6964206e756d626572206f6620636f756e63696c206d656d62657260008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fb8602f83614c0e565b91507f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660008301527f6f726d207468697320616374696f6e00000000000000000000000000000000006020830152604082019050919050565b600061401e602183614c0e565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614084601c83614c0e565b91507f766f74657220686173206e6f2064696c7574696f6e20776569676874000000006000830152602082019050919050565b60006140c4604183614c0e565b91507f64696c7574696f6e207265636569707420646f6573206e6f742065786973742060008301527f666f722074686973206d656d62657220616e642070726f706f73616c2068617360208301527f68000000000000000000000000000000000000000000000000000000000000006040830152606082019050919050565b6000614150601b83614c0e565b91507f70726f706f73616c2068617368206973206e6f7420756e6971756500000000006000830152602082019050919050565b6000614190603983614c0e565b91507f64696c7574696f6e2063616e206f6e6c79206f636375722077697468696e207460008301527f68652070726f706f73616c20766f74696e6720706572696f64000000000000006020830152604082019050919050565b60006141f6602a83614c0e565b91507f61646472657373206d7573742062652061206e6f6d696e6174656420636f756e60008301527f63696c206d656d626572000000000000000000000000000000000000000000006020830152604082019050919050565b600061425c603e83614c0e565b91507f756e646f2064696c7574696f6e2063616e206f6e6c79206f636375722077697460008301527f68696e207468652070726f706f73616c20766f74696e6720706572696f6400006020830152604082019050919050565b60006142c2601a83614c0e565b91507f73656e6465722068617320616c72656164792064696c757465640000000000006000830152602082019050919050565b6000614302601b83614c0e565b91507f656d70747920766f746572732061727261792070726f766964656400000000006000830152602082019050919050565b6000614342602a83614c0e565b91507f6d656d62657220746f20756e64696c757465206d75737420626520612076616c60008301527f69642061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006143a8603383614c0e565b91507f6d656d62657220746f2064696c757465206d7573742062652061206e6f6d696e60008301527f6174656420636f756e63696c206d656d626572000000000000000000000000006020830152604082019050919050565b61440a81614c68565b82525050565b61441981614c68565b82525050565b600061442b8284613a61565b915081905092915050565b60006144428284613b93565b915081905092915050565b600060208201905061446260008301846138d9565b92915050565b600060408201905061447d60008301856138d9565b61448a60208301846138d9565b9392505050565b600060208201905081810360008301526144ab81846138e8565b905092915050565b600060208201905081810360008301526144cd8184613946565b905092915050565b60006020820190506144ea6000830184613a19565b92915050565b6000602082019050818103600083015261450a8184613acb565b905092915050565b6000602082019050818103600083015261452c8184613a28565b905092915050565b6000608082019050818103600083015261454e8187613a28565b905061455d60208301866138d9565b61456a6040830185614410565b6145776060830184614410565b95945050505050565b600060a082019050818103600083015261459a8188613a28565b905081810360208301526145ae81876138e8565b905081810360408301526145c281866138e8565b905081810360608301526145d681856138e8565b905081810360808301526145ea81846139bb565b90509695505050505050565b600060808201905081810360008301526146108187613a28565b905081810360208301526146248186613b04565b90506146336040830185614410565b6146406060830184614410565b95945050505050565b600060808201905081810360008301526146638187613acb565b905061467260208301866138d9565b61467f6040830185614410565b61468c6060830184613a19565b95945050505050565b600060a08201905081810360008301526146af8188613acb565b905081810360208301526146c38187613acb565b90506146d26040830186614410565b6146df6060830185614410565b6146ec6080830184613a19565b9695505050505050565b600060408201905081810360008301526147108185613acb565b905061471f6020830184614410565b9392505050565b6000602082019050818103600083015261473f81613c21565b9050919050565b6000602082019050818103600083015261475f81613c61565b9050919050565b6000602082019050818103600083015261477f81613cc7565b9050919050565b6000602082019050818103600083015261479f81613d07565b9050919050565b600060208201905081810360008301526147bf81613d6d565b9050919050565b600060208201905081810360008301526147df81613dd3565b9050919050565b600060208201905081810360008301526147ff81613e39565b9050919050565b6000602082019050818103600083015261481f81613e9f565b9050919050565b6000602082019050818103600083015261483f81613f05565b9050919050565b6000602082019050818103600083015261485f81613f45565b9050919050565b6000602082019050818103600083015261487f81613fab565b9050919050565b6000602082019050818103600083015261489f81614011565b9050919050565b600060208201905081810360008301526148bf81614077565b9050919050565b600060208201905081810360008301526148df816140b7565b9050919050565b600060208201905081810360008301526148ff81614143565b9050919050565b6000602082019050818103600083015261491f81614183565b9050919050565b6000602082019050818103600083015261493f816141e9565b9050919050565b6000602082019050818103600083015261495f8161424f565b9050919050565b6000602082019050818103600083015261497f816142b5565b9050919050565b6000602082019050818103600083015261499f816142f5565b9050919050565b600060208201905081810360008301526149bf81614335565b9050919050565b600060208201905081810360008301526149df8161439b565b9050919050565b60006020820190506149fb6000830184614410565b92915050565b6000604082019050614a166000830185614410565b614a236020830184614410565b9392505050565b6000604051905081810181811067ffffffffffffffff82111715614a4d57600080fd5b8060405250919050565b600067ffffffffffffffff821115614a6e57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115614a9657600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115614abe57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115614ae657600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614b1257600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c3582614c48565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c9f578082015181840152602081019050614c84565b83811115614cae576000848401525b50505050565b6000601f19601f8301169050919050565b614cce81614c2a565b8114614cd957600080fd5b50565b614ce581614c68565b8114614cf057600080fd5b5056fea365627a7a723158202e239d6c62eaaf53aa36b7903c266879c69a3998576b22246d76c31e8481b99a6c6578706572696d656e74616cf564736f6c63430005100040

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

0000000000000000000000000000000000000000000000000000000000000008

-----Decoded View---------------
Arg [0] : _numOfSeats (uint256): 8

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


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.