Contract 0x9EA18BFDB50E9bb4A18F9d3Df7804E398F8fE0dc

Contract Overview

Balance:
0 frxETH
Txn Hash Method
Block
From
To
Value
0x0f408d94c148067bdd104fd2437db25c725afe453fa6a2642713243a3e40ff9b0x60a0604057357072024-03-26 15:59:50198 days 20 hrs ago0x5c84d7220d87e3de7fdbf9037be8f48442f8e40a IN  Create: Governance0 frxETH0.005248456121.500000254
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Governance

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
Yes with 300 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at holesky.fraxscan.com on 2024-03-26
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.3;

/**
 @author Tellor Inc.
 @title TellorFlex
 @dev This is a streamlined Tellor oracle system which handles staking, reporting,
 * slashing, and user data getters in one contract. This contract is controlled
 * by a single address known as 'governance', which could be an externally owned
 * account or a contract, allowing for a flexible, modular design.
*/
interface IOracle {
    /**
     * @dev Removes a value from the oracle.
     * Note: this function is only callable by the Governance contract.
     * @param _queryId is ID of the specific data feed
     * @param _timestamp is the timestamp of the data value to remove
     */
    function removeValue(bytes32 _queryId, uint256 _timestamp) external;

    /**
     * @dev Slashes a reporter and transfers their stake amount to the given recipient
     * Note: this function is only callable by the governance address.
     * @param _reporter is the address of the reporter being slashed
     * @param _recipient is the address receiving the reporter's stake
     * @return uint256 amount of token slashed and sent to recipient address
     */
    function slashReporter(address _reporter, address _recipient)
        external
        returns (uint256);

    // *****************************************************************************
    // *                                                                           *
    // *                               Getters                                     *
    // *                                                                           *
    // *****************************************************************************

    /**
     * @dev Returns the block number at a given timestamp
     * @param _queryId is ID of the specific data feed
     * @param _timestamp is the timestamp to find the corresponding block number for
     * @return uint256 block number of the timestamp for the given data ID
     */
    function getBlockNumberByTimestamp(bytes32 _queryId, uint256 _timestamp)
        external
        view
        returns (uint256);

    /**
     * @dev Returns the address of the reporter who submitted a value for a data ID at a specific time
     * @param _queryId is ID of the specific data feed
     * @param _timestamp is the timestamp to find a corresponding reporter for
     * @return address of the reporter who reported the value for the data ID at the given timestamp
     */
    function getReporterByTimestamp(bytes32 _queryId, uint256 _timestamp)
        external
        view
        returns (address);

    /**
     * @dev Returns the number of values submitted by a specific reporter address
     * @param _reporter is the address of a reporter
     * @return uint256 of the number of values submitted by the given reporter
     */
    function getReportsSubmittedByAddress(address _reporter)
        external
        view
        returns (uint256);

    /**
     * @dev Returns amount required to report oracle values
     * @return uint256 stake amount
     */
    function getStakeAmount() external view returns (uint256);

    /**
     * @dev Allows users to retrieve all information about a staker
     * @param _stakerAddress address of staker inquiring about
     * @return uint startDate of staking
     * @return uint current amount staked
     * @return uint current amount locked for withdrawal
     * @return uint reward debt used to calculate staking rewards
     * @return uint reporter's last reported timestamp
     * @return uint total number of reports submitted by reporter
     * @return uint governance vote count when first staked
     * @return uint number of votes cast by staker when first staked
     */
    function getStakerInfo(address _stakerAddress)
        external
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        );

    /**
     * @dev Retrieves the latest value for the queryId before the specified timestamp
     * @param _queryId is the queryId to look up the value for
     * @param _timestamp before which to search for latest value
     * @return _ifRetrieve bool true if able to retrieve a non-zero value
     * @return _value the value retrieved
     * @return _timestampRetrieved the value's timestamp
     */
    function getDataBefore(bytes32 _queryId, uint256 _timestamp)
        external
        view
        returns (
            bool _ifRetrieve,
            bytes memory _value,
            uint256 _timestampRetrieved
        );

    /**
     * @dev Returns the address of the token used for staking
     * @return address of the token used for staking
     */
    function getTokenAddress() external view returns (address);

    /**
     * @dev Retrieve value from oracle based on timestamp
     * @param _queryId being requested
     * @param _timestamp to retrieve data/value from
     * @return bytes value for timestamp submitted
     */
    function retrieveData(bytes32 _queryId, uint256 _timestamp)
        external
        view
        returns (bytes memory);
}
interface IERC20 {
    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);
}


interface ITellor {
    //Controller
    function addresses(bytes32) external view returns (address);

    function uints(bytes32) external view returns (uint256);

    function burn(uint256 _amount) external;

    function changeDeity(address _newDeity) external;

    function changeOwner(address _newOwner) external;
    function changeUint(bytes32 _target, uint256 _amount) external;

    function migrate() external;

    function mint(address _reciever, uint256 _amount) external;

    function init() external;

    function getAllDisputeVars(uint256 _disputeId)
        external
        view
        returns (
            bytes32,
            bool,
            bool,
            bool,
            address,
            address,
            address,
            uint256[9] memory,
            int256
        );

    function getDisputeIdByDisputeHash(bytes32 _hash)
        external
        view
        returns (uint256);

    function getDisputeUintVars(uint256 _disputeId, bytes32 _data)
        external
        view
        returns (uint256);

    function getLastNewValueById(uint256 _requestId)
        external
        view
        returns (uint256, bool);

    function retrieveData(uint256 _requestId, uint256 _timestamp)
        external
        view
        returns (uint256);

    function getNewValueCountbyRequestId(uint256 _requestId)
        external
        view
        returns (uint256);

    function getAddressVars(bytes32 _data) external view returns (address);

    function getUintVar(bytes32 _data) external view returns (uint256);

    function totalSupply() external view returns (uint256);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function isMigrated(address _addy) external view returns (bool);

    function allowance(address _user, address _spender)
        external
        view
        returns (uint256);

    function allowedToTrade(address _user, uint256 _amount)
        external
        view
        returns (bool);

    function approve(address _spender, uint256 _amount) external returns (bool);

    function approveAndTransferFrom(
        address _from,
        address _to,
        uint256 _amount
    ) external returns (bool);

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

    function balanceOfAt(address _user, uint256 _blockNumber)
        external
        view
        returns (uint256);

    function transfer(address _to, uint256 _amount)
        external
        returns (bool success);

    function transferFrom(
        address _from,
        address _to,
        uint256 _amount
    ) external returns (bool success);

    function depositStake() external;

    function requestStakingWithdraw() external;

    function withdrawStake() external;

    function changeStakingStatus(address _reporter, uint256 _status) external;

    function slashReporter(address _reporter, address _disputer) external;

    function getStakerInfo(address _staker)
        external
        view
        returns (uint256, uint256);

    function getTimestampbyRequestIDandIndex(uint256 _requestId, uint256 _index)
        external
        view
        returns (uint256);

    function getNewCurrentVariables()
        external
        view
        returns (
            bytes32 _c,
            uint256[5] memory _r,
            uint256 _d,
            uint256 _t
        );

    function getNewValueCountbyQueryId(bytes32 _queryId)
        external
        view
        returns (uint256);

    function getTimestampbyQueryIdandIndex(bytes32 _queryId, uint256 _index)
        external
        view
        returns (uint256);

    function retrieveData(bytes32 _queryId, uint256 _timestamp)
        external
        view
        returns (bytes memory);

    //Governance
    enum VoteResult {
        FAILED,
        PASSED,
        INVALID
    }

    function setApprovedFunction(bytes4 _func, bool _val) external;

    function beginDispute(bytes32 _queryId, uint256 _timestamp) external;

    function delegate(address _delegate) external;

    function delegateOfAt(address _user, uint256 _blockNumber)
        external
        view
        returns (address);

    function executeVote(uint256 _disputeId) external;

    function proposeVote(
        address _contract,
        bytes4 _function,
        bytes calldata _data,
        uint256 _timestamp
    ) external;

    function tallyVotes(uint256 _disputeId) external;

    function governance() external view returns (address);

    function updateMinDisputeFee() external;

    function verify() external pure returns (uint256);

    function vote(
        uint256 _disputeId,
        bool _supports,
        bool _invalidQuery
    ) external;

    function voteFor(
        address[] calldata _addys,
        uint256 _disputeId,
        bool _supports,
        bool _invalidQuery
    ) external;

    function getDelegateInfo(address _holder)
        external
        view
        returns (address, uint256);

    function isFunctionApproved(bytes4 _func) external view returns (bool);

    function isApprovedGovernanceContract(address _contract)
        external
        returns (bool);

    function getVoteRounds(bytes32 _hash)
        external
        view
        returns (uint256[] memory);

    function getVoteCount() external view returns (uint256);

    function getVoteInfo(uint256 _disputeId)
        external
        view
        returns (
            bytes32,
            uint256[9] memory,
            bool[2] memory,
            VoteResult,
            bytes memory,
            bytes4,
            address[2] memory
        );

    function getDisputeInfo(uint256 _disputeId)
        external
        view
        returns (
            uint256,
            uint256,
            bytes memory,
            address
        );

    function getOpenDisputesOnId(bytes32 _queryId)
        external
        view
        returns (uint256);

    function didVote(uint256 _disputeId, address _voter)
        external
        view
        returns (bool);

    //Oracle
    function getReportTimestampByIndex(bytes32 _queryId, uint256 _index)
        external
        view
        returns (uint256);

    function getValueByTimestamp(bytes32 _queryId, uint256 _timestamp)
        external
        view
        returns (bytes memory);

    function getBlockNumberByTimestamp(bytes32 _queryId, uint256 _timestamp)
        external
        view
        returns (uint256);

    function getReportingLock() external view returns (uint256);

    function getReporterByTimestamp(bytes32 _queryId, uint256 _timestamp)
        external
        view
        returns (address);

    function reportingLock() external view returns (uint256);

    function removeValue(bytes32 _queryId, uint256 _timestamp) external;
    function getTipsByUser(address _user) external view returns(uint256);
    function tipQuery(bytes32 _queryId, uint256 _tip, bytes memory _queryData) external;
    function submitValue(bytes32 _queryId, bytes calldata _value, uint256 _nonce, bytes memory _queryData) external;
    function burnTips() external;

    function changeReportingLock(uint256 _newReportingLock) external;
    function getReportsSubmittedByAddress(address _reporter) external view returns(uint256);
    function changeTimeBasedReward(uint256 _newTimeBasedReward) external;
    function getReporterLastTimestamp(address _reporter) external view returns(uint256);
    function getTipsById(bytes32 _queryId) external view returns(uint256);
    function getTimeBasedReward() external view returns(uint256);
    function getTimestampCountById(bytes32 _queryId) external view returns(uint256);
    function getTimestampIndexByTimestamp(bytes32 _queryId, uint256 _timestamp) external view returns(uint256);
    function getCurrentReward(bytes32 _queryId) external view returns(uint256, uint256);
    function getCurrentValue(bytes32 _queryId) external view returns(bytes memory);
    function getDataBefore(bytes32 _queryId, uint256 _timestamp) external view returns(bool _ifRetrieve, bytes memory _value, uint256 _timestampRetrieved);
    function getTimeOfLastNewValue() external view returns(uint256);
    function depositStake(uint256 _amount) external;
    function requestStakingWithdraw(uint256 _amount) external;

    //Test functions
    function changeAddressVar(bytes32 _id, address _addy) external;

    //parachute functions
    function killContract() external;

    function migrateFor(address _destination, uint256 _amount) external;

    function rescue51PercentAttack(address _tokenHolder) external;

    function rescueBrokenDataReporting() external;

    function rescueFailedUpdate() external;

    //Tellor 360
    function addStakingRewards(uint256 _amount) external;

    function _sliceUint(bytes memory _b)
        external
        pure
        returns (uint256 _number);

    function claimOneTimeTip(bytes32 _queryId, uint256[] memory _timestamps)
        external;

    function claimTip(
        bytes32 _feedId,
        bytes32 _queryId,
        uint256[] memory _timestamps
    ) external;

    function fee() external view returns (uint256);

    function feedsWithFunding(uint256) external view returns (bytes32);

    function fundFeed(
        bytes32 _feedId,
        bytes32 _queryId,
        uint256 _amount
    ) external;

    function getCurrentFeeds(bytes32 _queryId)
        external
        view
        returns (bytes32[] memory);

    function getCurrentTip(bytes32 _queryId) external view returns (uint256);

    function getDataAfter(bytes32 _queryId, uint256 _timestamp)
        external
        view
        returns (bytes memory _value, uint256 _timestampRetrieved);

    function getDataFeed(bytes32 _feedId)
        external
        view
        returns (Autopay.FeedDetails memory);

    function getFundedFeeds() external view returns (bytes32[] memory);

    function getFundedQueryIds() external view returns (bytes32[] memory);

    function getIndexForDataAfter(bytes32 _queryId, uint256 _timestamp)
        external
        view
        returns (bool _found, uint256 _index);

    function getIndexForDataBefore(bytes32 _queryId, uint256 _timestamp)
        external
        view
        returns (bool _found, uint256 _index);

    function getMultipleValuesBefore(
        bytes32 _queryId,
        uint256 _timestamp,
        uint256 _maxAge,
        uint256 _maxCount
    )
        external
        view
        returns (uint256[] memory _values, uint256[] memory _timestamps);

    function getPastTipByIndex(bytes32 _queryId, uint256 _index)
        external
        view
        returns (Autopay.Tip memory);

    function getPastTipCount(bytes32 _queryId) external view returns (uint256);

    function getPastTips(bytes32 _queryId)
        external
        view
        returns (Autopay.Tip[] memory);

    function getQueryIdFromFeedId(bytes32 _feedId)
        external
        view
        returns (bytes32);

    function getRewardAmount(
        bytes32 _feedId,
        bytes32 _queryId,
        uint256[] memory _timestamps
    ) external view returns (uint256 _cumulativeReward);

    function getRewardClaimedStatus(
        bytes32 _feedId,
        bytes32 _queryId,
        uint256 _timestamp
    ) external view returns (bool);

    function getTipsByAddress(address _user) external view returns (uint256);

    function isInDispute(bytes32 _queryId, uint256 _timestamp)
        external
        view
        returns (bool);

    function queryIdFromDataFeedId(bytes32) external view returns (bytes32);

    function queryIdsWithFunding(uint256) external view returns (bytes32);

    function queryIdsWithFundingIndex(bytes32) external view returns (uint256);

    function setupDataFeed(
        bytes32 _queryId,
        uint256 _reward,
        uint256 _startTime,
        uint256 _interval,
        uint256 _window,
        uint256 _priceThreshold,
        uint256 _rewardIncreasePerSecond,
        bytes memory _queryData,
        uint256 _amount
    ) external;

    function tellor() external view returns (address);

    function tip(
        bytes32 _queryId,
        uint256 _amount,
        bytes memory _queryData
    ) external;

    function tips(bytes32, uint256)
        external
        view
        returns (uint256 amount, uint256 timestamp);

    function token() external view returns (address);

    function userTipsTotal(address) external view returns (uint256);

    function valueFor(bytes32 _id)
        external
        view
        returns (
            int256 _value,
            uint256 _timestamp,
            uint256 _statusCode
        );
}

interface Autopay {
    struct FeedDetails {
        uint256 reward;
        uint256 balance;
        uint256 startTime;
        uint256 interval;
        uint256 window;
        uint256 priceThreshold;
        uint256 rewardIncreasePerSecond;
        uint256 feedsWithFundingIndex;
    }

    struct Tip {
        uint256 amount;
        uint256 timestamp;
    }
    function getStakeAmount() external view returns(uint256);
    function stakeAmount() external view returns(uint256);
    function token() external view returns(address);
}
/**
    * @dev EIP2362 Interface for pull oracles
    * https://github.com/tellor-io/EIP-2362
*/
interface IERC2362
{
	/**
	 * @dev Exposed function pertaining to EIP standards
	 * @param _id bytes32 ID of the query
	 * @return int,uint,uint returns the value, timestamp, and status code of query
	 */
	function valueFor(bytes32 _id) external view returns(int256,uint256,uint256);
}


interface IMappingContract{
    function getTellorID(bytes32 _id) external view returns(bytes32);
}

/**
 @author Tellor Inc
 @title UsingTellor
 @dev This contract helps smart contracts read data from Tellor
 */
contract UsingTellor is IERC2362 {
    ITellor public tellor;
    IMappingContract public idMappingContract;

    /*Constructor*/
    /**
     * @dev the constructor sets the oracle address in storage
     * @param _tellor is the Tellor Oracle address
     */
    constructor(address payable _tellor) {
        tellor = ITellor(_tellor);
    }

    /*Getters*/
    /**
     * @dev Retrieves the next value for the queryId after the specified timestamp
     * @param _queryId is the queryId to look up the value for
     * @param _timestamp after which to search for next value
     * @return _value the value retrieved
     * @return _timestampRetrieved the value's timestamp
     */
    function getDataAfter(bytes32 _queryId, uint256 _timestamp)
        public
        view
        returns (bytes memory _value, uint256 _timestampRetrieved)
    {
        (bool _found, uint256 _index) = getIndexForDataAfter(
            _queryId,
            _timestamp
        );
        if (!_found) {
            return ("", 0);
        }
        _timestampRetrieved = getTimestampbyQueryIdandIndex(_queryId, _index);
        _value = retrieveData(_queryId, _timestampRetrieved);
        return (_value, _timestampRetrieved);
    }

    /**
     * @dev Retrieves the latest value for the queryId before the specified timestamp
     * @param _queryId is the queryId to look up the value for
     * @param _timestamp before which to search for latest value
     * @return _value the value retrieved
     * @return _timestampRetrieved the value's timestamp
     */
    function getDataBefore(bytes32 _queryId, uint256 _timestamp)
        public
        view
        returns (bytes memory _value, uint256 _timestampRetrieved)
    {
        (, _value, _timestampRetrieved) = tellor.getDataBefore(
            _queryId,
            _timestamp
        );
    }

    /**
     * @dev Retrieves latest array index of data before the specified timestamp for the queryId
     * @param _queryId is the queryId to look up the index for
     * @param _timestamp is the timestamp before which to search for the latest index
     * @return _found whether the index was found
     * @return _index the latest index found before the specified timestamp
     */
    // slither-disable-next-line calls-loop
    function getIndexForDataAfter(bytes32 _queryId, uint256 _timestamp)
        public
        view
        returns (bool _found, uint256 _index)
    {
        uint256 _count = getNewValueCountbyQueryId(_queryId);
        if (_count == 0) return (false, 0);
        _count--;
        bool _search = true; // perform binary search
        uint256 _middle = 0;
        uint256 _start = 0;
        uint256 _end = _count;
        uint256 _timestampRetrieved;
        // checking boundaries to short-circuit the algorithm
        _timestampRetrieved = getTimestampbyQueryIdandIndex(_queryId, _end);
        if (_timestampRetrieved <= _timestamp) return (false, 0);
        _timestampRetrieved = getTimestampbyQueryIdandIndex(_queryId, _start);
        if (_timestampRetrieved > _timestamp) {
            // candidate found, check for disputes
            _search = false;
        }
        // since the value is within our boundaries, do a binary search
        while (_search) {
            _middle = (_end + _start) / 2;
            _timestampRetrieved = getTimestampbyQueryIdandIndex(
                _queryId,
                _middle
            );
            if (_timestampRetrieved > _timestamp) {
                // get immediate previous value
                uint256 _prevTime = getTimestampbyQueryIdandIndex(
                    _queryId,
                    _middle - 1
                );
                if (_prevTime <= _timestamp) {
                    // candidate found, check for disputes
                    _search = false;
                } else {
                    // look from start to middle -1(prev value)
                    _end = _middle - 1;
                }
            } else {
                // get immediate next value
                uint256 _nextTime = getTimestampbyQueryIdandIndex(
                    _queryId,
                    _middle + 1
                );
                if (_nextTime > _timestamp) {
                    // candidate found, check for disputes
                    _search = false;
                    _middle++;
                    _timestampRetrieved = _nextTime;
                } else {
                    // look from middle + 1(next value) to end
                    _start = _middle + 1;
                }
            }
        }
        // candidate found, check for disputed values
        if (!isInDispute(_queryId, _timestampRetrieved)) {
            // _timestampRetrieved is correct
            return (true, _middle);
        } else {
            // iterate forward until we find a non-disputed value
            while (
                isInDispute(_queryId, _timestampRetrieved) && _middle < _count
            ) {
                _middle++;
                _timestampRetrieved = getTimestampbyQueryIdandIndex(
                    _queryId,
                    _middle
                );
            }
            if (
                _middle == _count && isInDispute(_queryId, _timestampRetrieved)
            ) {
                return (false, 0);
            }
            // _timestampRetrieved is correct
            return (true, _middle);
        }
    }

    /**
     * @dev Retrieves latest array index of data before the specified timestamp for the queryId
     * @param _queryId is the queryId to look up the index for
     * @param _timestamp is the timestamp before which to search for the latest index
     * @return _found whether the index was found
     * @return _index the latest index found before the specified timestamp
     */
    // slither-disable-next-line calls-loop
    function getIndexForDataBefore(bytes32 _queryId, uint256 _timestamp)
        public
        view
        returns (bool _found, uint256 _index)
    {
        return tellor.getIndexForDataBefore(_queryId, _timestamp);
    }

    /**
     * @dev Retrieves multiple uint256 values before the specified timestamp
     * @param _queryId the unique id of the data query
     * @param _timestamp the timestamp before which to search for values
     * @param _maxAge the maximum number of seconds before the _timestamp to search for values
     * @param _maxCount the maximum number of values to return
     * @return _values the values retrieved, ordered from oldest to newest
     * @return _timestamps the timestamps of the values retrieved
     */
    function getMultipleValuesBefore(
        bytes32 _queryId,
        uint256 _timestamp,
        uint256 _maxAge,
        uint256 _maxCount
    )
        public
        view
        returns (bytes[] memory _values, uint256[] memory _timestamps)
    {
        // get index of first possible value
        (bool _ifRetrieve, uint256 _startIndex) = getIndexForDataAfter(
            _queryId,
            _timestamp - _maxAge
        );
        // no value within range
        if (!_ifRetrieve) {
            return (new bytes[](0), new uint256[](0));
        }
        uint256 _endIndex;
        // get index of last possible value
        (_ifRetrieve, _endIndex) = getIndexForDataBefore(_queryId, _timestamp);
        // no value before _timestamp
        if (!_ifRetrieve) {
            return (new bytes[](0), new uint256[](0));
        }
        uint256 _valCount = 0;
        uint256 _index = 0;
        uint256[] memory _timestampsArrayTemp = new uint256[](_maxCount);
        // generate array of non-disputed timestamps within range
        while (_valCount < _maxCount && _endIndex + 1 - _index > _startIndex) {
            uint256 _timestampRetrieved = getTimestampbyQueryIdandIndex(
                _queryId,
                _endIndex - _index
            );
            if (!isInDispute(_queryId, _timestampRetrieved)) {
                _timestampsArrayTemp[_valCount] = _timestampRetrieved;
                _valCount++;
            }
            _index++;
        }

        bytes[] memory _valuesArray = new bytes[](_valCount);
        uint256[] memory _timestampsArray = new uint256[](_valCount);
        // retrieve values and reverse timestamps order
        for (uint256 _i = 0; _i < _valCount; _i++) {
            _timestampsArray[_i] = _timestampsArrayTemp[_valCount - 1 - _i];
            _valuesArray[_i] = retrieveData(_queryId, _timestampsArray[_i]);
        }
        return (_valuesArray, _timestampsArray);
    }

    /**
     * @dev Counts the number of values that have been submitted for the queryId
     * @param _queryId the id to look up
     * @return uint256 count of the number of values received for the queryId
     */
    function getNewValueCountbyQueryId(bytes32 _queryId)
        public
        view
        returns (uint256)
    {
        return tellor.getNewValueCountbyQueryId(_queryId);
    }

    /**
     * @dev Returns the address of the reporter who submitted a value for a data ID at a specific time
     * @param _queryId is ID of the specific data feed
     * @param _timestamp is the timestamp to find a corresponding reporter for
     * @return address of the reporter who reported the value for the data ID at the given timestamp
     */
    function getReporterByTimestamp(bytes32 _queryId, uint256 _timestamp)
        public
        view
        returns (address)
    {
        return tellor.getReporterByTimestamp(_queryId, _timestamp);
    }

    /**
     * @dev Gets the timestamp for the value based on their index
     * @param _queryId is the id to look up
     * @param _index is the value index to look up
     * @return uint256 timestamp
     */
    function getTimestampbyQueryIdandIndex(bytes32 _queryId, uint256 _index)
        public
        view
        returns (uint256)
    {
        return tellor.getTimestampbyQueryIdandIndex(_queryId, _index);
    }

    /**
     * @dev Determines whether a value with a given queryId and timestamp has been disputed
     * @param _queryId is the value id to look up
     * @param _timestamp is the timestamp of the value to look up
     * @return bool true if queryId/timestamp is under dispute
     */
    function isInDispute(bytes32 _queryId, uint256 _timestamp)
        public
        view
        returns (bool)
    {
        return tellor.isInDispute(_queryId, _timestamp);
    }

    /**
     * @dev Retrieve value from oracle based on queryId/timestamp
     * @param _queryId being requested
     * @param _timestamp to retrieve data/value from
     * @return bytes value for query/timestamp submitted
     */
    function retrieveData(bytes32 _queryId, uint256 _timestamp)
        public
        view
        returns (bytes memory)
    {
        return tellor.retrieveData(_queryId, _timestamp);
    }

    /**
     * @dev allows dev to set mapping contract for valueFor (EIP2362)
     * @param _addy address of mapping contract
     */
    function setIdMappingContract(address _addy) external {
        require(address(idMappingContract) == address(0));
        idMappingContract = IMappingContract(_addy);
    }

    /**
     * @dev Retrieve most recent int256 value from oracle based on queryId
     * @param _id being requested
     * @return _value most recent value submitted
     * @return _timestamp timestamp of most recent value
     * @return _statusCode 200 if value found, 404 if not found
     */
    function valueFor(bytes32 _id)
        external
        view
        override
        returns (
            int256 _value,
            uint256 _timestamp,
            uint256 _statusCode
        )
    {
        bytes32 _queryId = idMappingContract.getTellorID(_id);
        bytes memory _valueBytes;
        (_valueBytes, _timestamp) = getDataBefore(
            _queryId,
            block.timestamp + 1
        );
        if (_timestamp == 0) {
            return (0, 0, 404);
        }
        uint256 _valueUint = _sliceUint(_valueBytes);
        _value = int256(_valueUint);
        return (_value, _timestamp, 200);
    }

    // Internal functions
    /**
     * @dev Convert bytes to uint256
     * @param _b bytes value to convert to uint256
     * @return _number uint256 converted from bytes
     */
    function _sliceUint(bytes memory _b)
        internal
        pure
        returns (uint256 _number)
    {
        for (uint256 _i = 0; _i < _b.length; _i++) {
            _number = _number * 256 + uint8(_b[_i]);
        }
    }
}

/**
 @author Tellor Inc.
 @title Governance
 @dev This is a governance contract to be used with TellorFlex. It handles disputing
 * Tellor oracle data and voting on those disputes
*/
contract Governance is UsingTellor {
    // Storage
    IOracle public oracle; // Tellor oracle contract
    IERC20 public token; // token used for dispute fees, same as reporter staking token
    address public oracleAddress; //tellorFlex address
    address public teamMultisig; // address of team multisig wallet, one of four stakeholder groups
    uint256 public voteCount; // total number of votes initiated
    bytes32 public autopayAddrsQueryId =
        keccak256(abi.encode("AutopayAddresses", abi.encode(bytes("")))); // query id for autopay addresses array
    mapping(uint256 => Dispute) private disputeInfo; // mapping of dispute IDs to the details of the dispute
    mapping(bytes32 => uint256) private openDisputesOnId; // mapping of a query ID to the number of disputes on that query ID
    mapping(uint256 => Vote) private voteInfo; // mapping of dispute IDs to the details of the vote
    mapping(bytes32 => uint256[]) private voteRounds; // mapping of vote identifier hashes to an array of dispute IDs
    mapping(address => uint256) private voteTallyByAddress; // mapping of addresses to the number of votes they have cast
    mapping(address => uint256[]) private disputeIdsByReporter; // mapping of reporter addresses to an array of dispute IDs

    enum VoteResult {
        FAILED,
        PASSED,
        INVALID
    } // status of a potential vote

    // Structs
    struct Dispute {
        bytes32 queryId; // query ID of disputed value
        uint256 timestamp; // timestamp of disputed value
        bytes value; // disputed value
        address disputedReporter; // reporter who submitted the disputed value
        uint256 slashedAmount; // amount of tokens slashed from reporter
    }

    struct Tally {
        uint256 doesSupport; // number of votes in favor
        uint256 against; // number of votes against
        uint256 invalidQuery; // number of votes for invalid
    }

    struct Vote {
        bytes32 identifierHash; // identifier hash of the vote
        uint256 voteRound; // the round of voting on a given dispute or proposal
        uint256 startDate; // timestamp of when vote was initiated
        uint256 blockNumber; // block number of when vote was initiated
        uint256 fee; // fee paid to initiate the vote round
        uint256 tallyDate; // timestamp of when the votes were tallied
        Tally tokenholders; // vote tally of tokenholders
        Tally users; // vote tally of users
        Tally reporters; // vote tally of reporters
        Tally teamMultisig; // vote tally of teamMultisig
        bool executed; // boolean of whether the vote was executed
        VoteResult result; // VoteResult after votes were tallied
        address initiator; // address which initiated dispute/proposal
        mapping(address => bool) voted; // mapping of address to whether or not they voted
    }

    // Events
    event NewDispute(
        uint256 _disputeId,
        bytes32 _queryId,
        uint256 _timestamp,
        address _reporter
    ); // Emitted when a new dispute is opened

    event Voted(
        uint256 _disputeId,
        bool _supports,
        address _voter,
        bool _invalidQuery
    ); // Emitted when an address casts their vote
    event VoteExecuted(uint256 _disputeId, VoteResult _result); // Emitted when a vote is executed
    event VoteTallied(
        uint256 _disputeId,
        VoteResult _result,
        address _initiator,
        address _reporter
    ); // Emitted when all casting for a vote is tallied

    /**
     * @dev Initializes contract parameters
     * @param _tellor address of tellor oracle contract to be governed
     * @param _teamMultisig address of tellor team multisig, one of four voting
     * stakeholder groups
     */
    constructor(
        address payable _tellor,
        address _teamMultisig
    ) UsingTellor(_tellor) {
        oracle = IOracle(_tellor);
        token = IERC20(oracle.getTokenAddress());
        oracleAddress = _tellor;
        teamMultisig = _teamMultisig;
    }

    /**
     * @dev Initializes a dispute/vote in the system
     * @param _queryId being disputed
     * @param _timestamp being disputed
     */
    function beginDispute(bytes32 _queryId, uint256 _timestamp) external {
        // Ensure value actually exists
        address _reporter = oracle.getReporterByTimestamp(_queryId, _timestamp);
        require(_reporter != address(0), "no value exists at given timestamp");
        bytes32 _hash = keccak256(abi.encodePacked(_queryId, _timestamp));
        // Push new vote round
        uint256 _disputeId = voteCount + 1;
        uint256[] storage _voteRounds = voteRounds[_hash];
        _voteRounds.push(_disputeId);

        // Create new vote and dispute
        Vote storage _thisVote = voteInfo[_disputeId];
        Dispute storage _thisDispute = disputeInfo[_disputeId];

        // Initialize dispute information - query ID, timestamp, value, etc.
        _thisDispute.queryId = _queryId;
        _thisDispute.timestamp = _timestamp;
        _thisDispute.disputedReporter = _reporter;
        // Initialize vote information - hash, initiator, block number, etc.
        _thisVote.identifierHash = _hash;
        _thisVote.initiator = msg.sender;
        _thisVote.blockNumber = block.number;
        _thisVote.startDate = block.timestamp;
        _thisVote.voteRound = _voteRounds.length;
        disputeIdsByReporter[_reporter].push(_disputeId);
        uint256 _disputeFee = getDisputeFee();
        if (_voteRounds.length == 1) {
            require(
                block.timestamp - _timestamp < 12 hours,
                "Dispute must be started within reporting lock time"
            );
            openDisputesOnId[_queryId]++;
            // calculate dispute fee based on number of open disputes on query ID
            if (openDisputesOnId[_queryId] > 4) {
                _disputeFee = oracle.getStakeAmount();
            } else {
                _disputeFee =
                    _disputeFee *
                    2 ** (openDisputesOnId[_queryId] - 1);
            }
            // slash a single stakeAmount from reporter
            _thisDispute.slashedAmount = oracle.slashReporter(
                _reporter,
                address(this)
            );
            _thisDispute.value = oracle.retrieveData(_queryId, _timestamp);
            oracle.removeValue(_queryId, _timestamp);
        } else {
            uint256 _prevId = _voteRounds[_voteRounds.length - 2];
            require(
                block.timestamp - voteInfo[_prevId].tallyDate < 1 days,
                "New dispute round must be started within a day"
            );
            if (_voteRounds.length > 4) {
                _disputeFee = oracle.getStakeAmount();
            } else {
                _disputeFee = _disputeFee * 2 ** (_voteRounds.length - 1);
            }
            _thisDispute.slashedAmount = disputeInfo[_voteRounds[0]]
                .slashedAmount;
            _thisDispute.value = disputeInfo[_voteRounds[0]].value;
        }
        _thisVote.fee = _disputeFee;
        voteCount++;
        require(
            token.transferFrom(msg.sender, address(this), _disputeFee),
            "Fee must be paid"
        ); // This is the dispute fee. Returned if dispute passes
        emit NewDispute(_disputeId, _queryId, _timestamp, _reporter);
    }

    /**
     * @dev Executes vote and transfers corresponding balances to initiator/reporter
     * @param _disputeId is the ID of the vote being executed
     */
    function executeVote(uint256 _disputeId) external {
        // Ensure validity of vote ID, vote has been executed, and vote must be tallied
        Vote storage _thisVote = voteInfo[_disputeId];
        require(
            _disputeId <= voteCount && _disputeId > 0,
            "Dispute ID must be valid"
        );
        require(!_thisVote.executed, "Vote has already been executed");
        require(_thisVote.tallyDate > 0, "Vote must be tallied");
        // Ensure vote must be final vote and that time has to be pass (86400 = 24 * 60 * 60 for seconds in a day)
        require(
            voteRounds[_thisVote.identifierHash].length == _thisVote.voteRound,
            "Must be the final vote"
        );
        //The time  has to pass after the vote is tallied
        require(
            block.timestamp - _thisVote.tallyDate >= 1 days,
            "1 day has to pass after tally to allow for disputes"
        );
        _thisVote.executed = true;
        Dispute storage _thisDispute = disputeInfo[_disputeId];
        openDisputesOnId[_thisDispute.queryId]--;
        uint256 _i;
        uint256 _voteID;
        if (_thisVote.result == VoteResult.PASSED) {
            // If vote is in dispute and passed, iterate through each vote round and transfer the dispute to initiator
            for (
                _i = voteRounds[_thisVote.identifierHash].length;
                _i > 0;
                _i--
            ) {
                _voteID = voteRounds[_thisVote.identifierHash][_i - 1];
                _thisVote = voteInfo[_voteID];
                // If the first vote round, also make sure to transfer the reporter's slashed stake to the initiator
                if (_i == 1) {
                    token.transfer(
                        _thisVote.initiator,
                        _thisDispute.slashedAmount
                    );
                }
                token.transfer(_thisVote.initiator, _thisVote.fee);
            }
        } else if (_thisVote.result == VoteResult.INVALID) {
            // If vote is in dispute and is invalid, iterate through each vote round and transfer the dispute fee to initiator
            for (
                _i = voteRounds[_thisVote.identifierHash].length;
                _i > 0;
                _i--
            ) {
                _voteID = voteRounds[_thisVote.identifierHash][_i - 1];
                _thisVote = voteInfo[_voteID];
                token.transfer(_thisVote.initiator, _thisVote.fee);
            }
            // Transfer slashed tokens back to disputed reporter
            token.transfer(
                _thisDispute.disputedReporter,
                _thisDispute.slashedAmount
            );
        } else if (_thisVote.result == VoteResult.FAILED) {
            // If vote is in dispute and fails, iterate through each vote round and transfer the dispute fee to disputed reporter
            uint256 _reporterReward = 0;
            for (
                _i = voteRounds[_thisVote.identifierHash].length;
                _i > 0;
                _i--
            ) {
                _voteID = voteRounds[_thisVote.identifierHash][_i - 1];
                _thisVote = voteInfo[_voteID];
                _reporterReward += _thisVote.fee;
            }
            _reporterReward += _thisDispute.slashedAmount;
            token.transfer(_thisDispute.disputedReporter, _reporterReward);
        }
        emit VoteExecuted(_disputeId, voteInfo[_disputeId].result);
    }

    /**
     * @dev Tallies the votes and begins the 1 day challenge period
     * @param _disputeId is the dispute id
     */
    function tallyVotes(uint256 _disputeId) external {
        // Ensure vote has not been executed and that vote has not been tallied
        Vote storage _thisVote = voteInfo[_disputeId];
        require(_thisVote.tallyDate == 0, "Vote has already been tallied");
        require(
            _disputeId <= voteCount && _disputeId > 0,
            "Vote does not exist"
        );
        // Determine appropriate vote duration dispute round
        // Vote time increases as rounds increase but only up to 6 days (withdrawal period)
        require(
            block.timestamp - _thisVote.startDate >=
                86400 * _thisVote.voteRound ||
                block.timestamp - _thisVote.startDate >= 86400 * 6,
            "Time for voting has not elapsed"
        );
        // Get total votes from each separate stakeholder group.  This will allow
        // normalization so each group's votes can be combined and compared to
        // determine the vote outcome.
        uint256 _tokenVoteSum = _thisVote.tokenholders.doesSupport +
            _thisVote.tokenholders.against +
            _thisVote.tokenholders.invalidQuery;
        uint256 _reportersVoteSum = _thisVote.reporters.doesSupport +
            _thisVote.reporters.against +
            _thisVote.reporters.invalidQuery;
        uint256 _multisigVoteSum = _thisVote.teamMultisig.doesSupport +
            _thisVote.teamMultisig.against +
            _thisVote.teamMultisig.invalidQuery;
        uint256 _usersVoteSum = _thisVote.users.doesSupport +
            _thisVote.users.against +
            _thisVote.users.invalidQuery;
        // Cannot divide by zero
        if (_tokenVoteSum == 0) {
            _tokenVoteSum++;
        }
        if (_reportersVoteSum == 0) {
            _reportersVoteSum++;
        }
        if (_multisigVoteSum == 0) {
            _multisigVoteSum++;
        }
        if (_usersVoteSum == 0) {
            _usersVoteSum++;
        }
        // Normalize and combine each stakeholder group votes
        uint256 _scaledDoesSupport = ((_thisVote.tokenholders.doesSupport *
            1e18) / _tokenVoteSum) +
            ((_thisVote.reporters.doesSupport * 1e18) / _reportersVoteSum) +
            ((_thisVote.teamMultisig.doesSupport * 1e18) / _multisigVoteSum) +
            ((_thisVote.users.doesSupport * 1e18) / _usersVoteSum);
        uint256 _scaledAgainst = ((_thisVote.tokenholders.against * 1e18) /
            _tokenVoteSum) +
            ((_thisVote.reporters.against * 1e18) / _reportersVoteSum) +
            ((_thisVote.teamMultisig.against * 1e18) / _multisigVoteSum) +
            ((_thisVote.users.against * 1e18) / _usersVoteSum);
        uint256 _scaledInvalid = ((_thisVote.tokenholders.invalidQuery * 1e18) /
            _tokenVoteSum) +
            ((_thisVote.reporters.invalidQuery * 1e18) / _reportersVoteSum) +
            ((_thisVote.teamMultisig.invalidQuery * 1e18) / _multisigVoteSum) +
            ((_thisVote.users.invalidQuery * 1e18) / _usersVoteSum);

        // If votes in support outweight the sum of against and invalid, result is passed
        if (_scaledDoesSupport > _scaledAgainst + _scaledInvalid) {
            _thisVote.result = VoteResult.PASSED;
            // If votes in against outweight the sum of support and invalid, result is failed
        } else if (_scaledAgainst > _scaledDoesSupport + _scaledInvalid) {
            _thisVote.result = VoteResult.FAILED;
            // Otherwise, result is invalid
        } else {
            _thisVote.result = VoteResult.INVALID;
        }

        _thisVote.tallyDate = block.timestamp; // Update time vote was tallied
        emit VoteTallied(
            _disputeId,
            _thisVote.result,
            _thisVote.initiator,
            disputeInfo[_disputeId].disputedReporter
        );
    }

    /**
     * @dev Enables the sender address to cast a vote
     * @param _disputeId is the ID of the vote
     * @param _supports is the address's vote: whether or not they support or are against
     * @param _invalidQuery is whether or not the dispute is valid
     */
    function vote(
        uint256 _disputeId,
        bool _supports,
        bool _invalidQuery
    ) public {
        // Ensure that dispute has not been executed and that vote does not exist and is not tallied
        require(
            _disputeId <= voteCount && _disputeId > 0,
            "Vote does not exist"
        );
        Vote storage _thisVote = voteInfo[_disputeId];
        require(_thisVote.tallyDate == 0, "Vote has already been tallied");
        require(!_thisVote.voted[msg.sender], "Sender has already voted");
        // Update voting status and increment total queries for support, invalid, or against based on vote
        _thisVote.voted[msg.sender] = true;
        uint256 _tokenBalance = token.balanceOf(msg.sender);
        (, uint256 _stakedBalance, uint256 _lockedBalance, , , , , ) = oracle
            .getStakerInfo(msg.sender);
        _tokenBalance += _stakedBalance + _lockedBalance;
        if (_invalidQuery) {
            _thisVote.tokenholders.invalidQuery += _tokenBalance;
            _thisVote.reporters.invalidQuery += oracle
                .getReportsSubmittedByAddress(msg.sender);
            _thisVote.users.invalidQuery += _getUserTips(msg.sender);
            if (msg.sender == teamMultisig) {
                _thisVote.teamMultisig.invalidQuery += 1;
            }
        } else if (_supports) {
            _thisVote.tokenholders.doesSupport += _tokenBalance;
            _thisVote.reporters.doesSupport += oracle
                .getReportsSubmittedByAddress(msg.sender);
            _thisVote.users.doesSupport += _getUserTips(msg.sender);
            if (msg.sender == teamMultisig) {
                _thisVote.teamMultisig.doesSupport += 1;
            }
        } else {
            _thisVote.tokenholders.against += _tokenBalance;
            _thisVote.reporters.against += oracle.getReportsSubmittedByAddress(
                msg.sender
            );
            _thisVote.users.against += _getUserTips(msg.sender);
            if (msg.sender == teamMultisig) {
                _thisVote.teamMultisig.against += 1;
            }
        }
        voteTallyByAddress[msg.sender]++;
        emit Voted(_disputeId, _supports, msg.sender, _invalidQuery);
    }

    /**
     * @dev Enables the sender address to cast votes for multiple disputes
     * @param _disputeIds is an array of vote IDs
     * @param _supports is an array of the address's votes: whether or not they support or are against
     * @param _invalidQuery is array of whether or not the dispute is valid
     */
    function voteOnMultipleDisputes(
        uint256[] memory _disputeIds,
        bool[] memory _supports,
        bool[] memory _invalidQuery
    ) external {
        for (uint256 _i = 0; _i < _disputeIds.length; _i++) {
            vote(_disputeIds[_i], _supports[_i], _invalidQuery[_i]);
        }
    }

    // *****************************************************************************
    // *                                                                           *
    // *                               Getters                                     *
    // *                                                                           *
    // *****************************************************************************

    /**
     * @dev Determines if an address voted for a specific vote
     * @param _disputeId is the ID of the vote
     * @param _voter is the address of the voter to check for
     * @return bool of whether or note the address voted for the specific vote
     */
    function didVote(
        uint256 _disputeId,
        address _voter
    ) external view returns (bool) {
        return voteInfo[_disputeId].voted[_voter];
    }

    /**
     * @dev Get the latest dispute fee
     */
    function getDisputeFee() public view returns (uint256) {
        return (oracle.getStakeAmount() / 10);
    }

    function getDisputesByReporter(
        address _reporter
    ) external view returns (uint256[] memory) {
        return disputeIdsByReporter[_reporter];
    }

    /**
     * @dev Returns info on a dispute for a given ID
     * @param _disputeId is the ID of a specific dispute
     * @return bytes32 of the data ID of the dispute
     * @return uint256 of the timestamp of the dispute
     * @return bytes memory of the value being disputed
     * @return address of the reporter being disputed
     */
    function getDisputeInfo(
        uint256 _disputeId
    ) external view returns (bytes32, uint256, bytes memory, address) {
        Dispute storage _d = disputeInfo[_disputeId];
        return (_d.queryId, _d.timestamp, _d.value, _d.disputedReporter);
    }

    /**
     * @dev Returns the number of open disputes for a specific query ID
     * @param _queryId is the ID of a specific data feed
     * @return uint256 of the number of open disputes for the query ID
     */
    function getOpenDisputesOnId(
        bytes32 _queryId
    ) external view returns (uint256) {
        return openDisputesOnId[_queryId];
    }

    /**
     * @dev Returns the total number of votes
     * @return uint256 of the total number of votes
     */
    function getVoteCount() external view returns (uint256) {
        return voteCount;
    }

    /**
     * @dev Returns info on a vote for a given vote ID
     * @param _disputeId is the ID of a specific vote
     * @return bytes32 identifier hash of the vote
     * @return uint256[17] memory of the pertinent round info (vote rounds, start date, fee, etc.)
     * @return bool memory of both whether or not the vote was executed
     * @return VoteResult result of the vote
     * @return address memory of the vote initiator
     */
    function getVoteInfo(
        uint256 _disputeId
    )
        external
        view
        returns (bytes32, uint256[17] memory, bool, VoteResult, address)
    {
        Vote storage _v = voteInfo[_disputeId];
        return (
            _v.identifierHash,
            [
                _v.voteRound,
                _v.startDate,
                _v.blockNumber,
                _v.fee,
                _v.tallyDate,
                _v.tokenholders.doesSupport,
                _v.tokenholders.against,
                _v.tokenholders.invalidQuery,
                _v.users.doesSupport,
                _v.users.against,
                _v.users.invalidQuery,
                _v.reporters.doesSupport,
                _v.reporters.against,
                _v.reporters.invalidQuery,
                _v.teamMultisig.doesSupport,
                _v.teamMultisig.against,
                _v.teamMultisig.invalidQuery
            ],
            _v.executed,
            _v.result,
            _v.initiator
        );
    }

    /**
     * @dev Returns an array of voting rounds for a given vote
     * @param _hash is the identifier hash for a vote
     * @return uint256[] memory dispute IDs of the vote rounds
     */
    function getVoteRounds(
        bytes32 _hash
    ) external view returns (uint256[] memory) {
        return voteRounds[_hash];
    }

    /**
     * @dev Returns the total number of votes cast by an address
     * @param _voter is the address of the voter to check for
     * @return uint256 of the total number of votes cast by the voter
     */
    function getVoteTallyByAddress(
        address _voter
    ) external view returns (uint256) {
        return voteTallyByAddress[_voter];
    }

    // Internal
    /**
     * @dev Retrieves total tips contributed to autopay by a given address
     * @param _user address of the user to check the tip count for
     * @return _userTipTally uint256 of total tips contributed to autopay by the address
     */
    function _getUserTips(
        address _user
    ) internal returns (uint256 _userTipTally) {
        // get autopay addresses array from oracle
        (bytes memory _autopayAddrsBytes, uint256 _timestamp) = getDataBefore(
            autopayAddrsQueryId,
            block.timestamp - 12 hours
        );
        if (_timestamp > 0) {
            address[] memory _autopayAddrs = abi.decode(
                _autopayAddrsBytes,
                (address[])
            );
            // iterate through autopay addresses retrieve tips by user address
            for (uint256 _i = 0; _i < _autopayAddrs.length; _i++) {
                (bool _success, bytes memory _returnData) = _autopayAddrs[_i]
                    .call(
                        abi.encodeWithSignature(
                            "getTipsByAddress(address)",
                            _user
                        )
                    );
                if (_success) {
                    _userTipTally += abi.decode(_returnData, (uint256));
                }
            }
        }
    }
}

Contract ABI

[{"inputs":[{"internalType":"address payable","name":"_tellor","type":"address"},{"internalType":"address","name":"_teamMultisig","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_disputeId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"},{"indexed":false,"internalType":"address","name":"_reporter","type":"address"}],"name":"NewDispute","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_disputeId","type":"uint256"},{"indexed":false,"internalType":"enum Governance.VoteResult","name":"_result","type":"uint8"}],"name":"VoteExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_disputeId","type":"uint256"},{"indexed":false,"internalType":"enum Governance.VoteResult","name":"_result","type":"uint8"},{"indexed":false,"internalType":"address","name":"_initiator","type":"address"},{"indexed":false,"internalType":"address","name":"_reporter","type":"address"}],"name":"VoteTallied","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_disputeId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_supports","type":"bool"},{"indexed":false,"internalType":"address","name":"_voter","type":"address"},{"indexed":false,"internalType":"bool","name":"_invalidQuery","type":"bool"}],"name":"Voted","type":"event"},{"inputs":[],"name":"autopayAddrsQueryId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"beginDispute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_disputeId","type":"uint256"},{"internalType":"address","name":"_voter","type":"address"}],"name":"didVote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_disputeId","type":"uint256"}],"name":"executeVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getDataAfter","outputs":[{"internalType":"bytes","name":"_value","type":"bytes"},{"internalType":"uint256","name":"_timestampRetrieved","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getDataBefore","outputs":[{"internalType":"bytes","name":"_value","type":"bytes"},{"internalType":"uint256","name":"_timestampRetrieved","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDisputeFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_disputeId","type":"uint256"}],"name":"getDisputeInfo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_reporter","type":"address"}],"name":"getDisputesByReporter","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getIndexForDataAfter","outputs":[{"internalType":"bool","name":"_found","type":"bool"},{"internalType":"uint256","name":"_index","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getIndexForDataBefore","outputs":[{"internalType":"bool","name":"_found","type":"bool"},{"internalType":"uint256","name":"_index","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"uint256","name":"_maxAge","type":"uint256"},{"internalType":"uint256","name":"_maxCount","type":"uint256"}],"name":"getMultipleValuesBefore","outputs":[{"internalType":"bytes[]","name":"_values","type":"bytes[]"},{"internalType":"uint256[]","name":"_timestamps","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"}],"name":"getNewValueCountbyQueryId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"}],"name":"getOpenDisputesOnId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getReporterByTimestamp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getTimestampbyQueryIdandIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVoteCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_disputeId","type":"uint256"}],"name":"getVoteInfo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256[17]","name":"","type":"uint256[17]"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"enum Governance.VoteResult","name":"","type":"uint8"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"getVoteRounds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_voter","type":"address"}],"name":"getVoteTallyByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"idMappingContract","outputs":[{"internalType":"contract IMappingContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"isInDispute","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"retrieveData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addy","type":"address"}],"name":"setIdMappingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_disputeId","type":"uint256"}],"name":"tallyVotes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamMultisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tellor","outputs":[{"internalType":"contract ITellor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"valueFor","outputs":[{"internalType":"int256","name":"_value","type":"int256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"uint256","name":"_statusCode","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_disputeId","type":"uint256"},{"internalType":"bool","name":"_supports","type":"bool"},{"internalType":"bool","name":"_invalidQuery","type":"bool"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"voteCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_disputeIds","type":"uint256[]"},{"internalType":"bool[]","name":"_supports","type":"bool[]"},{"internalType":"bool[]","name":"_invalidQuery","type":"bool[]"}],"name":"voteOnMultipleDisputes","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a060405260006080908152620000189060c06200020f565b60408051601f1981840301815290829052620000379160200162000224565b604051602081830303815290604052805190602001206007553480156200005d57600080fd5b5060405162003e3438038062003e34833981016040819052620000809162000183565b600080546001600160a01b0384166001600160a01b0319918216811790925560028054909116821790556040805163021fd35d60e31b815290516310fe9ae891600480820192602092909190829003018186803b158015620000e157600080fd5b505afa158015620000f6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200011c91906200015d565b600380546001600160a01b03199081166001600160a01b03938416179091556004805482169483169490941790935560058054909316911617905562000279565b6000602082840312156200016f578081fd5b81516200017c8162000260565b9392505050565b6000806040838503121562000196578081fd5b8251620001a38162000260565b6020840151909250620001b68162000260565b809150509250929050565b60008151808452815b81811015620001e857602081850181015186830182015201620001ca565b81811115620001fa5782602083870101525b50601f01601f19169290920160200192915050565b6000602082526200017c6020830184620001c1565b600060408252601060408301526f4175746f70617941646472657373657360801b6060830152608060208301526200017c6080830184620001c1565b6001600160a01b03811681146200027657600080fd5b50565b613bab80620002896000396000f3fe608060405234801561001057600080fd5b50600436106102055760003560e01c8063a7c438bc1161011a578063dbc0c085116100ad578063f66f49c31161007c578063f66f49c3146104f1578063f78eea8314610504578063f98a4eca14610532578063fc0c546a14610545578063fcd4a5461461055857610205565b8063dbc0c085146104b0578063df133bca146104c3578063e07c5486146104d6578063e7b3387c146104e957610205565b8063c5958af9116100e9578063c5958af91461046b578063c63840711461048b578063ce5e11bf14610494578063d8add0f6146104a757610205565b8063a7c438bc146103ea578063a89ae4ba14610427578063bbf3e10b1461043a578063bdc7d9d81461044257610205565b806344e87f911161019d57806364ee3c6d1161016c57806364ee3c6d1461036c57806377b03e0d1461038d5780637dc0d1d0146103a05780638d824273146103b3578063a792765f146103d757610205565b806344e87f91146103005780634d318b0e146103235780634e9fe708146103365780636169c3081461034957610205565b80631f379acc116101d95780631f379acc14610290578063248638e5146102a357806329449085146102c35780632af8aae0146102ed57610205565b8062b121901461020a5780630e1596ef1461021f578063193b505b146102525780631959ad5b14610265575b600080fd5b61021d61021836600461337c565b610579565b005b61023f61022d3660046134fa565b60009081526009602052604090205490565b6040519081526020015b60405180910390f35b61021d6102603660046132a8565b61061d565b600054610278906001600160a01b031681565b6040516001600160a01b039091168152602001610249565b61021d61029e36600461352a565b610655565b6102b66102b13660046134fa565b610eba565b6040516102499190613794565b6102d66102d136600461352a565b610f1c565b604080519215158352602083019190915201610249565b600154610278906001600160a01b031681565b61031361030e36600461352a565b610fab565b6040519015158152602001610249565b61021d6103313660046134fa565b611036565b6102b66103443660046132a8565b61154b565b61035c6103573660046134fa565b6115b5565b604051610249949392919061380a565b61037f61037a36600461352a565b611689565b604051610249929190613856565b61023f61039b3660046134fa565b6116e2565b600254610278906001600160a01b031681565b6103c66103c13660046134fa565b611765565b6040516102499594939291906137a7565b61037f6103e536600461352a565b61186a565b6103136103f83660046135af565b6000828152600a602090815260408083206001600160a01b038516845260130190915290205460ff1692915050565b600454610278906001600160a01b031681565b61023f611900565b61023f6104503660046132a8565b6001600160a01b03166000908152600c602052604090205490565b61047e61047936600461352a565b611999565b6040516102499190613843565b61023f60065481565b61023f6104a236600461352a565b611a21565b61023f60075481565b600554610278906001600160a01b031681565b61021d6104d13660046135de565b611aa5565b6102786104e436600461352a565b612082565b60065461023f565b6102d66104ff36600461352a565b612106565b6105176105123660046134fa565b6122c2565b60408051938452602084019290925290820152606001610249565b61021d6105403660046134fa565b612392565b600354610278906001600160a01b031681565b61056b61056636600461354b565b612b71565b60405161024992919061371f565b60005b8351811015610617576106058482815181106105a857634e487b7160e01b600052603260045260246000fd5b60200260200101518483815181106105d057634e487b7160e01b600052603260045260246000fd5b60200260200101518484815181106105f857634e487b7160e01b600052603260045260246000fd5b6020026020010151611aa5565b8061060f81613b08565b91505061057c565b50505050565b6001546001600160a01b03161561063357600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60025460405163703e2a4360e11b815260048101849052602481018390526000916001600160a01b03169063e07c54869060440160206040518083038186803b1580156106a157600080fd5b505afa1580156106b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d991906132c4565b90506001600160a01b0381166107415760405162461bcd60e51b815260206004820152602260248201527f6e6f2076616c75652065786973747320617420676976656e2074696d6573746160448201526106d760f41b60648201526084015b60405180910390fd5b6040805160208082018690528183018590528251808303840181526060909201909252805191012060065460009061077a906001613917565b6000838152600b60209081526040808320805460018082018355828652848620909101869055858552600a8452828520600885528386208c81558083018c9055600380820180546001600160a01b0319166001600160a01b038e169081179091558b845560128401805475ffffffffffffffffffffffffffffffffffffffff0000191633620100000217905543918401919091554260028401558454838501558752600d8652938620805492830181558652938520018590559394509091610840611900565b845490915060011415610b4b5761a8c061085a8942613a79565b106108c25760405162461bcd60e51b815260206004820152603260248201527f44697370757465206d75737420626520737461727465642077697468696e207260448201527165706f7274696e67206c6f636b2074696d6560701b6064820152608401610738565b60008981526009602052604081208054916108dc83613b08565b90915550506000898152600960205260409020546004101561098557600260009054906101000a90046001600160a01b03166001600160a01b031663722580b66040518163ffffffff1660e01b815260040160206040518083038186803b15801561094657600080fd5b505afa15801561095a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097e9190613512565b90506109b8565b6000898152600960205260409020546109a090600190613a79565b6109ab90600261398c565b6109b59082613a5a565b90505b60025460405163137f0a8d60e21b81526001600160a01b03898116600483015230602483015290911690634dfc2a3490604401602060405180830381600087803b158015610a0557600080fd5b505af1158015610a19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3d9190613512565b60048381019190915560025460405163c5958af960e01b81529182018b9052602482018a90526001600160a01b03169063c5958af99060440160006040518083038186803b158015610a8e57600080fd5b505afa158015610aa2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610aca919081019061357c565b8051610ae0916002850191602090910190613093565b506002546040516316d7b73f60e21b8152600481018b9052602481018a90526001600160a01b0390911690635b5edcfc90604401600060405180830381600087803b158015610b2e57600080fd5b505af1158015610b42573d6000803e3d6000fd5b50505050610d79565b83546000908590610b5e90600290613a79565b81548110610b7c57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905062015180600a60008381526020019081526020016000206005015442610baf9190613a79565b10610c135760405162461bcd60e51b815260206004820152602e60248201527f4e6577206469737075746520726f756e64206d7573742062652073746172746560448201526d642077697468696e20612064617960901b6064820152608401610738565b845460041015610caa57600260009054906101000a90046001600160a01b03166001600160a01b031663722580b66040518163ffffffff1660e01b815260040160206040518083038186803b158015610c6b57600080fd5b505afa158015610c7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca39190613512565b9150610cd0565b8454610cb890600190613a79565b610cc390600261398c565b610ccd9083613a5a565b91505b6008600086600081548110610cf557634e487b7160e01b600052603260045260246000fd5b906000526020600020015481526020019081526020016000206004015483600401819055506008600086600081548110610d3f57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154815260200190815260200160002060020183600201908054610d6b90613ad3565b610d76929190613117565b50505b6004830181905560068054906000610d9083613b08565b90915550506003546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401602060405180830381600087803b158015610de757600080fd5b505af1158015610dfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1f9190613459565b610e5e5760405162461bcd60e51b815260206004820152601060248201526f119959481b5d5cdd081899481c185a5960821b6044820152606401610738565b60408051868152602081018b90529081018990526001600160a01b03881660608201527f12b7317353cd7caa8eae8057464e3de356c1429d814fb3421797eccb19043044906080015b60405180910390a1505050505050505050565b6000818152600b6020908152604091829020805483518184028101840190945280845260609392830182828015610f1057602002820191906000526020600020905b815481526020019060010190808311610efc575b50505050509050919050565b60008054604051632944908560e01b8152600481018590526024810184905282916001600160a01b031690632944908590604401604080518083038186803b158015610f6757600080fd5b505afa158015610f7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9f91906134cd565b915091505b9250929050565b600080546040516344e87f9160e01b815260048101859052602481018490526001600160a01b03909116906344e87f919060440160206040518083038186803b158015610ff757600080fd5b505afa15801561100b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102f9190613459565b9392505050565b6000818152600a602052604090206005810154156110965760405162461bcd60e51b815260206004820152601d60248201527f566f74652068617320616c7265616479206265656e2074616c6c6965640000006044820152606401610738565b60065482111580156110a85750600082115b6110ea5760405162461bcd60e51b8152602060048201526013602482015272159bdd1948191bd95cc81b9bdd08195e1a5cdd606a1b6044820152606401610738565b60018101546110fc9062015180613a5a565b600282015461110b9042613a79565b10158061112a57506207e9008160020154426111279190613a79565b10155b6111765760405162461bcd60e51b815260206004820152601f60248201527f54696d6520666f7220766f74696e6720686173206e6f7420656c6170736564006044820152606401610738565b6008810154600782015460068301546000929161119291613917565b61119c9190613917565b600e830154600d840154600c8501549293506000926111bb9190613917565b6111c59190613917565b60118401546010850154600f8601549293506000926111e49190613917565b6111ee9190613917565b600b850154600a860154600987015492935060009261120d9190613917565b6112179190613917565b90508361122c578361122881613b08565b9450505b8261123f578261123b81613b08565b9350505b81611252578161124e81613b08565b9250505b80611265578061126181613b08565b9150505b6009850154600090829061128190670de0b6b3a7640000613a5a565b61128b919061392f565b600f87015484906112a490670de0b6b3a7640000613a5a565b6112ae919061392f565b600c88015486906112c790670de0b6b3a7640000613a5a565b6112d1919061392f565b600689015488906112ea90670de0b6b3a7640000613a5a565b6112f4919061392f565b6112fe9190613917565b6113089190613917565b6113129190613917565b90506000828760090160010154670de0b6b3a76400006113329190613a5a565b61133c919061392f565b6010880154859061135590670de0b6b3a7640000613a5a565b61135f919061392f565b600d890154879061137890670de0b6b3a7640000613a5a565b611382919061392f565b60078a0154899061139b90670de0b6b3a7640000613a5a565b6113a5919061392f565b6113af9190613917565b6113b99190613917565b6113c39190613917565b90506000838860090160020154670de0b6b3a76400006113e39190613a5a565b6113ed919061392f565b6011890154869061140690670de0b6b3a7640000613a5a565b611410919061392f565b600e8a0154889061142990670de0b6b3a7640000613a5a565b611433919061392f565b60088b01548a9061144c90670de0b6b3a7640000613a5a565b611456919061392f565b6114609190613917565b61146a9190613917565b6114749190613917565b90506114808183613917565b8311156114a5576012880180546001919061ff001916610100835b02179055506114e0565b6114af8184613917565b8211156114ce576012880180546000919061ff0019166101008361149b565b60128801805461ff0019166102001790555b426005890155601288015460008a815260086020526040908190206003015490517fa2d4e500801849d40ad00f0f12ba92a5263f83ec68946e647be95cfbe581c7b692610ea7928d9260ff610100840416926001600160a01b0362010000909104811692169061388c565b6001600160a01b0381166000908152600d6020908152604091829020805483518184028101840190945280845260609392830182828015610f105760200282019190600052602060002090815481526020019060010190808311610efc5750505050509050919050565b6000818152600860205260408120805460018201546003830154600284018054869560609587959194909391926001600160a01b039091169082906115f990613ad3565b80601f016020809104026020016040519081016040528092919081815260200182805461162590613ad3565b80156116725780601f1061164757610100808354040283529160200191611672565b820191906000526020600020905b81548152906001019060200180831161165557829003601f168201915b505050505091509450945094509450509193509193565b6060600080600061169a8686612106565b91509150816116c15760006040518060200160405280600081525090935093505050610fa4565b6116cb8682611a21565b92506116d78684611999565b935050509250929050565b600080546040516377b03e0d60e01b8152600481018490526001600160a01b03909116906377b03e0d9060240160206040518083038186803b15801561172757600080fd5b505afa15801561173b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175f9190613512565b92915050565b600061176f613192565b50506000908152600a60208181526040928390208054845161022081018652600183015481526002830154938101939093526003820154948301949094526004810154606083015260058101546080830152600681015460a0830152600781015460c0830152600881015460e083015260098101546101008084019190915292810154610120830152600b810154610140830152600c810154610160830152600d810154610180830152600e8101546101a0830152600f8101546101c083015260108101546101e08301526011810154610200830152601201549293909260ff8082169382041691620100009091046001600160a01b031690565b6000805460405163a792765f60e01b81526004810185905260248101849052606092916001600160a01b03169063a792765f9060440160006040518083038186803b1580156118b857600080fd5b505afa1580156118cc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118f49190810190613475565b90969095509350505050565b6000600a600260009054906101000a90046001600160a01b03166001600160a01b031663722580b66040518163ffffffff1660e01b815260040160206040518083038186803b15801561195257600080fd5b505afa158015611966573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198a9190613512565b611994919061392f565b905090565b60005460405163c5958af960e01b815260048101849052602481018390526060916001600160a01b03169063c5958af99060440160006040518083038186803b1580156119e557600080fd5b505afa1580156119f9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261102f919081019061357c565b6000805460405163ce5e11bf60e01b815260048101859052602481018490526001600160a01b039091169063ce5e11bf9060440160206040518083038186803b158015611a6d57600080fd5b505afa158015611a81573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102f9190613512565b6006548311158015611ab75750600083115b611af95760405162461bcd60e51b8152602060048201526013602482015272159bdd1948191bd95cc81b9bdd08195e1a5cdd606a1b6044820152606401610738565b6000838152600a60205260409020600581015415611b595760405162461bcd60e51b815260206004820152601d60248201527f566f74652068617320616c7265616479206265656e2074616c6c6965640000006044820152606401610738565b33600090815260138201602052604090205460ff1615611bbb5760405162461bcd60e51b815260206004820152601860248201527f53656e6465722068617320616c726561647920766f74656400000000000000006044820152606401610738565b336000818152601383016020526040808220805460ff1916600117905560035490516370a0823160e01b8152600481019390935290916001600160a01b03909116906370a082319060240160206040518083038186803b158015611c1e57600080fd5b505afa158015611c32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c569190613512565b600254604051630733bdef60e41b815233600482015291925060009182916001600160a01b03169063733bdef0906024016101006040518083038186803b158015611ca057600080fd5b505afa158015611cb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd8919061361f565b505050505092509250508082611cee9190613917565b611cf89084613917565b92508415611e095782846006016002016000828254611d179190613917565b9091555050600254604051631c3c149f60e11b81523360048201526001600160a01b0390911690633878293e9060240160206040518083038186803b158015611d5f57600080fd5b505afa158015611d73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d979190613512565b600e85018054600090611dab908490613917565b90915550611dba905033612ed0565b600b85018054600090611dce908490613917565b90915550506005546001600160a01b0316331415611e0457600184600f016002016000828254611dfe9190613917565b90915550505b612011565b8515611f0d5782846006016000016000828254611e269190613917565b9091555050600254604051631c3c149f60e11b81523360048201526001600160a01b0390911690633878293e9060240160206040518083038186803b158015611e6e57600080fd5b505afa158015611e82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea69190613512565b600c85018054600090611eba908490613917565b90915550611ec9905033612ed0565b600985018054600090611edd908490613917565b90915550506005546001600160a01b0316331415611e0457600184600f016000016000828254611dfe9190613917565b82846006016001016000828254611f249190613917565b9091555050600254604051631c3c149f60e11b81523360048201526001600160a01b0390911690633878293e9060240160206040518083038186803b158015611f6c57600080fd5b505afa158015611f80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa49190613512565b600d85018054600090611fb8908490613917565b90915550611fc7905033612ed0565b600a85018054600090611fdb908490613917565b90915550506005546001600160a01b031633141561201157600184600f01600101600082825461200b9190613917565b90915550505b336000908152600c6020526040812080549161202c83613b08565b90915550506040805188815287151560208201523381830152861515606082015290517fbe6f1c58cc15c8e86d6f0ef23c5a30eb33319af3b57f6b7d9b56ccfa87696b849181900360800190a150505050505050565b6000805460405163703e2a4360e11b815260048101859052602481018490526001600160a01b039091169063e07c54869060440160206040518083038186803b1580156120ce57600080fd5b505afa1580156120e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102f91906132c4565b6000806000612114856116e2565b905080612128576000809250925050610fa4565b8061213281613abc565b91506001905060008083816121478a83611a21565b90508881116121625760008097509750505050505050610fa4565b61216c8a84611a21565b90508881111561217b57600094505b841561222d57600261218d8484613917565b612197919061392f565b93506121a38a85611a21565b9050888111156121e45760006121be8b6104a2600188613a79565b90508981116121d057600095506121de565b6121db600186613a79565b92505b50612228565b60006121f58b6104a2876001613917565b90508981111561221857600095508461220d81613b08565b955050809150612226565b612223856001613917565b93505b505b61217b565b6122378a82610fab565b61224d5760018497509750505050505050610fa4565b6122578a82610fab565b801561226257508584105b15612285578361227181613b08565b94505061227e8a85611a21565b905061224d565b858414801561229957506122998a82610fab565b156122b05760008097509750505050505050610fa4565b60018497509750505050505050610fa4565b6001546040516387a475fd60e01b8152600481018390526000918291829182916001600160a01b03909116906387a475fd9060240160206040518083038186803b15801561230f57600080fd5b505afa158015612323573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123479190613512565b9050606061235a826103e5426001613917565b945090508361237657600080610194945094509450505061238b565b60006123818261302e565b955060c893505050505b9193909250565b6000818152600a6020526040902060065482118015906123b25750600082115b6123fe5760405162461bcd60e51b815260206004820152601860248201527f44697370757465204944206d7573742062652076616c696400000000000000006044820152606401610738565b601281015460ff16156124535760405162461bcd60e51b815260206004820152601e60248201527f566f74652068617320616c7265616479206265656e20657865637574656400006044820152606401610738565b60008160050154116124a75760405162461bcd60e51b815260206004820152601460248201527f566f7465206d7573742062652074616c6c6965640000000000000000000000006044820152606401610738565b600181015481546000908152600b60205260409020541461250a5760405162461bcd60e51b815260206004820152601660248201527f4d757374206265207468652066696e616c20766f7465000000000000000000006044820152606401610738565b6201518081600501544261251e9190613a79565b10156125885760405162461bcd60e51b815260206004820152603360248201527f31206461792068617320746f20706173732061667465722074616c6c7920746f60448201527220616c6c6f7720666f7220646973707574657360681b6064820152608401610738565b60128101805460ff1916600117905560008281526008602090815260408083208054845260099092528220805491926125c083613abc565b90915550600090508060016012850154610100900460ff1660028111156125f757634e487b7160e01b600052602160045260246000fd5b14156127c15783546000908152600b602052604090205491505b81156127bc5783546000908152600b60205260409020612632600184613a79565b8154811061265057634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050600a60008281526020019081526020016000209350816001141561271357600354601285015460048581015460405163a9059cbb60e01b81526001600160a01b0362010000909404841692810192909252602482015291169063a9059cbb90604401602060405180830381600087803b1580156126d957600080fd5b505af11580156126ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127119190613459565b505b600354601285015460048087015460405163a9059cbb60e01b81526001600160a01b0362010000909404841692810192909252602482015291169063a9059cbb90604401602060405180830381600087803b15801561277157600080fd5b505af1158015612785573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a99190613459565b50816127b481613abc565b925050612611565b612b16565b60026012850154610100900460ff1660028111156127ef57634e487b7160e01b600052602160045260246000fd5b14156129ab5783546000908152600b602052604090205491505b81156129155783546000908152600b6020526040902061282a600184613a79565b8154811061284857634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910154808352600a9091526040918290206003546012820154600480840154955163a9059cbb60e01b81526001600160a01b03620100009093048316918101919091526024810195909552919750919350169063a9059cbb90604401602060405180830381600087803b1580156128ca57600080fd5b505af11580156128de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129029190613459565b508161290d81613abc565b925050612809565b600380549084015460048086015460405163a9059cbb60e01b81526001600160a01b0393841692810192909252602482015291169063a9059cbb90604401602060405180830381600087803b15801561296d57600080fd5b505af1158015612981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a59190613459565b50612b16565b60006012850154610100900460ff1660028111156129d957634e487b7160e01b600052602160045260246000fd5b1415612b165783546000908152600b602052604081205492505b8215612a785784546000908152600b60205260409020612a14600185613a79565b81548110612a3257634e487b7160e01b600052603260045260246000fd5b90600052602060002001549150600a60008381526020019081526020016000209450846004015481612a649190613917565b905082612a7081613abc565b9350506129f3565b6004840154612a879082613917565b600380549086015460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb90604401602060405180830381600087803b158015612adb57600080fd5b505af1158015612aef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b139190613459565b50505b6000858152600a6020526040908190206012015490517f40d231bf91823121de9e1c012d95f835ea5684dc1d93360d9510a30543345da491612b62918891610100900460ff1690613878565b60405180910390a15050505050565b606080600080612b85886104ff888a613a79565b9150915081612bd6576040805160008082526020820190925290612bb9565b6060815260200190600190039081612ba45790505b506040805160008152602081019091529094509250612ec7915050565b6000612be28989610f1c565b909350905082612c35576040805160008082526020820190925290612c17565b6060815260200190600190039081612c025790505b506040805160008152602081019091529095509350612ec792505050565b60008060008867ffffffffffffffff811115612c6157634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612c8a578160200160208202803683370190505b5090505b8883108015612cb157508482612ca5866001613917565b612caf9190613a79565b115b15612d23576000612cc68d6104a28588613a79565b9050612cd28d82610fab565b612d105780828581518110612cf757634e487b7160e01b600052603260045260246000fd5b602090810291909101015283612d0c81613b08565b9450505b82612d1a81613b08565b93505050612c8e565b60008367ffffffffffffffff811115612d4c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612d7f57816020015b6060815260200190600190039081612d6a5790505b50905060008467ffffffffffffffff811115612dab57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612dd4578160200160208202803683370190505b50905060005b85811015612eba578381612def600189613a79565b612df99190613a79565b81518110612e1757634e487b7160e01b600052603260045260246000fd5b6020026020010151828281518110612e3f57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050612e7c8f838381518110612e6f57634e487b7160e01b600052603260045260246000fd5b6020026020010151611999565b838281518110612e9c57634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080612eb290613b08565b915050612dda565b5090985096505050505050505b94509492505050565b6000806000612ee960075461a8c0426103e59190613a79565b9092509050801561302757600082806020019051810190612f0a91906132e0565b905060005b815181101561302457600080838381518110612f3b57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031688604051602401612f6c91906001600160a01b0391909116815260200190565b60408051601f198184030181529181526020820180516001600160e01b03166345d6082360e01b17905251612fa19190613703565b6000604051808303816000865af19150503d8060008114612fde576040519150601f19603f3d011682016040523d82523d6000602084013e612fe3565b606091505b5091509150811561300f57808060200190518101906130029190613512565b61300c9088613917565b96505b5050808061301c90613b08565b915050612f0f565b50505b5050919050565b6000805b825181101561308d5782818151811061305b57634e487b7160e01b600052603260045260246000fd5b016020015160f81c61306f83610100613a5a565b6130799190613917565b91508061308581613b08565b915050613032565b50919050565b82805461309f90613ad3565b90600052602060002090601f0160209004810192826130c15760008555613107565b82601f106130da57805160ff1916838001178555613107565b82800160010185558215613107579182015b828111156131075782518255916020019190600101906130ec565b506131139291506131b1565b5090565b82805461312390613ad3565b90600052602060002090601f0160209004810192826131455760008555613107565b82601f106131565780548555613107565b8280016001018555821561310757600052602060002091601f016020900482015b82811115613107578254825591600101919060010190613177565b6040518061022001604052806011906020820280368337509192915050565b5b8082111561311357600081556001016131b2565b600082601f8301126131d6578081fd5b813560206131eb6131e6836138f3565b6138c2565b80838252828201915082860187848660051b890101111561320a578586fd5b855b8581101561323157813561321f81613b67565b8452928401929084019060010161320c565b5090979650505050505050565b600082601f83011261324e578081fd5b815167ffffffffffffffff81111561326857613268613b39565b61327b601f8201601f19166020016138c2565b81815284602083860101111561328f578283fd5b6132a0826020830160208701613a90565b949350505050565b6000602082840312156132b9578081fd5b813561102f81613b4f565b6000602082840312156132d5578081fd5b815161102f81613b4f565b600060208083850312156132f2578182fd5b825167ffffffffffffffff811115613308578283fd5b8301601f81018513613318578283fd5b80516133266131e6826138f3565b80828252848201915084840188868560051b8701011115613345578687fd5b8694505b8385101561337057805161335c81613b4f565b835260019490940193918501918501613349565b50979650505050505050565b600080600060608486031215613390578182fd5b833567ffffffffffffffff808211156133a7578384fd5b818601915086601f8301126133ba578384fd5b813560206133ca6131e6836138f3565b8083825282820191508286018b848660051b89010111156133e9578889fd5b8896505b8487101561340b5780358352600196909601959183019183016133ed565b5097505087013592505080821115613421578384fd5b61342d878388016131c6565b93506040860135915080821115613442578283fd5b5061344f868287016131c6565b9150509250925092565b60006020828403121561346a578081fd5b815161102f81613b67565b600080600060608486031215613489578283fd5b835161349481613b67565b602085015190935067ffffffffffffffff8111156134b0578283fd5b6134bc8682870161323e565b925050604084015190509250925092565b600080604083850312156134df578182fd5b82516134ea81613b67565b6020939093015192949293505050565b60006020828403121561350b578081fd5b5035919050565b600060208284031215613523578081fd5b5051919050565b6000806040838503121561353c578182fd5b50508035926020909101359150565b60008060008060808587031215613560578182fd5b5050823594602084013594506040840135936060013592509050565b60006020828403121561358d578081fd5b815167ffffffffffffffff8111156135a3578182fd5b6132a08482850161323e565b600080604083850312156135c1578182fd5b8235915060208301356135d381613b4f565b809150509250929050565b6000806000606084860312156135f2578081fd5b83359250602084013561360481613b67565b9150604084013561361481613b67565b809150509250925092565b600080600080600080600080610100898b03121561363b578586fd5b505086516020880151604089015160608a015160808b015160a08c015160c08d015160e0909d0151959e949d50929b919a50985090965094509092509050565b6000815180845260208085019450808401835b838110156136aa5781518752958201959082019060010161368e565b509495945050505050565b600081518084526136cd816020860160208601613a90565b601f01601f19169290920160200192915050565b600381106136ff57634e487b7160e01b600052602160045260246000fd5b9052565b60008251613715818460208701613a90565b9190910192915050565b6000604082016040835280855180835260608501915060608160051b86010192506020808801855b8381101561377557605f198887030185526137638683516136b5565b95509382019390820190600101613747565b50508584038187015250505061378b818561367b565b95945050505050565b60006020825261102f602083018461367b565b8581526102a0810160208083018760005b60118110156137d5578151835291830191908301906001016137b8565b505050508415156102408301526137f06102608301856136e1565b6001600160a01b0383166102808301529695505050505050565b60008582528460208301526080604083015261382960808301856136b5565b90506001600160a01b038316606083015295945050505050565b60006020825261102f60208301846136b5565b60006040825261386960408301856136b5565b90508260208301529392505050565b8281526040810161102f60208301846136e1565b848152608081016138a060208301866136e1565b6001600160a01b03808516604084015280841660608401525095945050505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156138eb576138eb613b39565b604052919050565b600067ffffffffffffffff82111561390d5761390d613b39565b5060051b60200190565b6000821982111561392a5761392a613b23565b500190565b60008261394a57634e487b7160e01b81526012600452602481fd5b500490565b80825b60018086116139615750612ec7565b81870482111561397357613973613b23565b8086161561398057918102915b9490941c938002613952565b600061102f60001984846000826139a55750600161102f565b816139b25750600061102f565b81600181146139c857600281146139d2576139ff565b600191505061102f565b60ff8411156139e3576139e3613b23565b6001841b9150848211156139f9576139f9613b23565b5061102f565b5060208310610133831016604e8410600b8410161715613a32575081810a83811115613a2d57613a2d613b23565b61102f565b613a3f848484600161394f565b808604821115613a5157613a51613b23565b02949350505050565b6000816000190483118215151615613a7457613a74613b23565b500290565b600082821015613a8b57613a8b613b23565b500390565b60005b83811015613aab578181015183820152602001613a93565b838111156106175750506000910152565b600081613acb57613acb613b23565b506000190190565b600181811c90821680613ae757607f821691505b6020821081141561308d57634e487b7160e01b600052602260045260246000fd5b6000600019821415613b1c57613b1c613b23565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114613b6457600080fd5b50565b8015158114613b6457600080fdfea2646970667358221220d430664f5f63987d8c7e884d4eda4cc1876f1977aa1fea560434b0fb9ca3dfe564736f6c634300080300330000000000000000000000006684e5ddbee1b97e10847468cb5f4e38f3ab83fe000000000000000000000000cea3a146a34af31ed20d01ada2e8169cc49bda34

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102055760003560e01c8063a7c438bc1161011a578063dbc0c085116100ad578063f66f49c31161007c578063f66f49c3146104f1578063f78eea8314610504578063f98a4eca14610532578063fc0c546a14610545578063fcd4a5461461055857610205565b8063dbc0c085146104b0578063df133bca146104c3578063e07c5486146104d6578063e7b3387c146104e957610205565b8063c5958af9116100e9578063c5958af91461046b578063c63840711461048b578063ce5e11bf14610494578063d8add0f6146104a757610205565b8063a7c438bc146103ea578063a89ae4ba14610427578063bbf3e10b1461043a578063bdc7d9d81461044257610205565b806344e87f911161019d57806364ee3c6d1161016c57806364ee3c6d1461036c57806377b03e0d1461038d5780637dc0d1d0146103a05780638d824273146103b3578063a792765f146103d757610205565b806344e87f91146103005780634d318b0e146103235780634e9fe708146103365780636169c3081461034957610205565b80631f379acc116101d95780631f379acc14610290578063248638e5146102a357806329449085146102c35780632af8aae0146102ed57610205565b8062b121901461020a5780630e1596ef1461021f578063193b505b146102525780631959ad5b14610265575b600080fd5b61021d61021836600461337c565b610579565b005b61023f61022d3660046134fa565b60009081526009602052604090205490565b6040519081526020015b60405180910390f35b61021d6102603660046132a8565b61061d565b600054610278906001600160a01b031681565b6040516001600160a01b039091168152602001610249565b61021d61029e36600461352a565b610655565b6102b66102b13660046134fa565b610eba565b6040516102499190613794565b6102d66102d136600461352a565b610f1c565b604080519215158352602083019190915201610249565b600154610278906001600160a01b031681565b61031361030e36600461352a565b610fab565b6040519015158152602001610249565b61021d6103313660046134fa565b611036565b6102b66103443660046132a8565b61154b565b61035c6103573660046134fa565b6115b5565b604051610249949392919061380a565b61037f61037a36600461352a565b611689565b604051610249929190613856565b61023f61039b3660046134fa565b6116e2565b600254610278906001600160a01b031681565b6103c66103c13660046134fa565b611765565b6040516102499594939291906137a7565b61037f6103e536600461352a565b61186a565b6103136103f83660046135af565b6000828152600a602090815260408083206001600160a01b038516845260130190915290205460ff1692915050565b600454610278906001600160a01b031681565b61023f611900565b61023f6104503660046132a8565b6001600160a01b03166000908152600c602052604090205490565b61047e61047936600461352a565b611999565b6040516102499190613843565b61023f60065481565b61023f6104a236600461352a565b611a21565b61023f60075481565b600554610278906001600160a01b031681565b61021d6104d13660046135de565b611aa5565b6102786104e436600461352a565b612082565b60065461023f565b6102d66104ff36600461352a565b612106565b6105176105123660046134fa565b6122c2565b60408051938452602084019290925290820152606001610249565b61021d6105403660046134fa565b612392565b600354610278906001600160a01b031681565b61056b61056636600461354b565b612b71565b60405161024992919061371f565b60005b8351811015610617576106058482815181106105a857634e487b7160e01b600052603260045260246000fd5b60200260200101518483815181106105d057634e487b7160e01b600052603260045260246000fd5b60200260200101518484815181106105f857634e487b7160e01b600052603260045260246000fd5b6020026020010151611aa5565b8061060f81613b08565b91505061057c565b50505050565b6001546001600160a01b03161561063357600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60025460405163703e2a4360e11b815260048101849052602481018390526000916001600160a01b03169063e07c54869060440160206040518083038186803b1580156106a157600080fd5b505afa1580156106b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d991906132c4565b90506001600160a01b0381166107415760405162461bcd60e51b815260206004820152602260248201527f6e6f2076616c75652065786973747320617420676976656e2074696d6573746160448201526106d760f41b60648201526084015b60405180910390fd5b6040805160208082018690528183018590528251808303840181526060909201909252805191012060065460009061077a906001613917565b6000838152600b60209081526040808320805460018082018355828652848620909101869055858552600a8452828520600885528386208c81558083018c9055600380820180546001600160a01b0319166001600160a01b038e169081179091558b845560128401805475ffffffffffffffffffffffffffffffffffffffff0000191633620100000217905543918401919091554260028401558454838501558752600d8652938620805492830181558652938520018590559394509091610840611900565b845490915060011415610b4b5761a8c061085a8942613a79565b106108c25760405162461bcd60e51b815260206004820152603260248201527f44697370757465206d75737420626520737461727465642077697468696e207260448201527165706f7274696e67206c6f636b2074696d6560701b6064820152608401610738565b60008981526009602052604081208054916108dc83613b08565b90915550506000898152600960205260409020546004101561098557600260009054906101000a90046001600160a01b03166001600160a01b031663722580b66040518163ffffffff1660e01b815260040160206040518083038186803b15801561094657600080fd5b505afa15801561095a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097e9190613512565b90506109b8565b6000898152600960205260409020546109a090600190613a79565b6109ab90600261398c565b6109b59082613a5a565b90505b60025460405163137f0a8d60e21b81526001600160a01b03898116600483015230602483015290911690634dfc2a3490604401602060405180830381600087803b158015610a0557600080fd5b505af1158015610a19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3d9190613512565b60048381019190915560025460405163c5958af960e01b81529182018b9052602482018a90526001600160a01b03169063c5958af99060440160006040518083038186803b158015610a8e57600080fd5b505afa158015610aa2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610aca919081019061357c565b8051610ae0916002850191602090910190613093565b506002546040516316d7b73f60e21b8152600481018b9052602481018a90526001600160a01b0390911690635b5edcfc90604401600060405180830381600087803b158015610b2e57600080fd5b505af1158015610b42573d6000803e3d6000fd5b50505050610d79565b83546000908590610b5e90600290613a79565b81548110610b7c57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905062015180600a60008381526020019081526020016000206005015442610baf9190613a79565b10610c135760405162461bcd60e51b815260206004820152602e60248201527f4e6577206469737075746520726f756e64206d7573742062652073746172746560448201526d642077697468696e20612064617960901b6064820152608401610738565b845460041015610caa57600260009054906101000a90046001600160a01b03166001600160a01b031663722580b66040518163ffffffff1660e01b815260040160206040518083038186803b158015610c6b57600080fd5b505afa158015610c7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca39190613512565b9150610cd0565b8454610cb890600190613a79565b610cc390600261398c565b610ccd9083613a5a565b91505b6008600086600081548110610cf557634e487b7160e01b600052603260045260246000fd5b906000526020600020015481526020019081526020016000206004015483600401819055506008600086600081548110610d3f57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154815260200190815260200160002060020183600201908054610d6b90613ad3565b610d76929190613117565b50505b6004830181905560068054906000610d9083613b08565b90915550506003546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401602060405180830381600087803b158015610de757600080fd5b505af1158015610dfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1f9190613459565b610e5e5760405162461bcd60e51b815260206004820152601060248201526f119959481b5d5cdd081899481c185a5960821b6044820152606401610738565b60408051868152602081018b90529081018990526001600160a01b03881660608201527f12b7317353cd7caa8eae8057464e3de356c1429d814fb3421797eccb19043044906080015b60405180910390a1505050505050505050565b6000818152600b6020908152604091829020805483518184028101840190945280845260609392830182828015610f1057602002820191906000526020600020905b815481526020019060010190808311610efc575b50505050509050919050565b60008054604051632944908560e01b8152600481018590526024810184905282916001600160a01b031690632944908590604401604080518083038186803b158015610f6757600080fd5b505afa158015610f7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9f91906134cd565b915091505b9250929050565b600080546040516344e87f9160e01b815260048101859052602481018490526001600160a01b03909116906344e87f919060440160206040518083038186803b158015610ff757600080fd5b505afa15801561100b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102f9190613459565b9392505050565b6000818152600a602052604090206005810154156110965760405162461bcd60e51b815260206004820152601d60248201527f566f74652068617320616c7265616479206265656e2074616c6c6965640000006044820152606401610738565b60065482111580156110a85750600082115b6110ea5760405162461bcd60e51b8152602060048201526013602482015272159bdd1948191bd95cc81b9bdd08195e1a5cdd606a1b6044820152606401610738565b60018101546110fc9062015180613a5a565b600282015461110b9042613a79565b10158061112a57506207e9008160020154426111279190613a79565b10155b6111765760405162461bcd60e51b815260206004820152601f60248201527f54696d6520666f7220766f74696e6720686173206e6f7420656c6170736564006044820152606401610738565b6008810154600782015460068301546000929161119291613917565b61119c9190613917565b600e830154600d840154600c8501549293506000926111bb9190613917565b6111c59190613917565b60118401546010850154600f8601549293506000926111e49190613917565b6111ee9190613917565b600b850154600a860154600987015492935060009261120d9190613917565b6112179190613917565b90508361122c578361122881613b08565b9450505b8261123f578261123b81613b08565b9350505b81611252578161124e81613b08565b9250505b80611265578061126181613b08565b9150505b6009850154600090829061128190670de0b6b3a7640000613a5a565b61128b919061392f565b600f87015484906112a490670de0b6b3a7640000613a5a565b6112ae919061392f565b600c88015486906112c790670de0b6b3a7640000613a5a565b6112d1919061392f565b600689015488906112ea90670de0b6b3a7640000613a5a565b6112f4919061392f565b6112fe9190613917565b6113089190613917565b6113129190613917565b90506000828760090160010154670de0b6b3a76400006113329190613a5a565b61133c919061392f565b6010880154859061135590670de0b6b3a7640000613a5a565b61135f919061392f565b600d890154879061137890670de0b6b3a7640000613a5a565b611382919061392f565b60078a0154899061139b90670de0b6b3a7640000613a5a565b6113a5919061392f565b6113af9190613917565b6113b99190613917565b6113c39190613917565b90506000838860090160020154670de0b6b3a76400006113e39190613a5a565b6113ed919061392f565b6011890154869061140690670de0b6b3a7640000613a5a565b611410919061392f565b600e8a0154889061142990670de0b6b3a7640000613a5a565b611433919061392f565b60088b01548a9061144c90670de0b6b3a7640000613a5a565b611456919061392f565b6114609190613917565b61146a9190613917565b6114749190613917565b90506114808183613917565b8311156114a5576012880180546001919061ff001916610100835b02179055506114e0565b6114af8184613917565b8211156114ce576012880180546000919061ff0019166101008361149b565b60128801805461ff0019166102001790555b426005890155601288015460008a815260086020526040908190206003015490517fa2d4e500801849d40ad00f0f12ba92a5263f83ec68946e647be95cfbe581c7b692610ea7928d9260ff610100840416926001600160a01b0362010000909104811692169061388c565b6001600160a01b0381166000908152600d6020908152604091829020805483518184028101840190945280845260609392830182828015610f105760200282019190600052602060002090815481526020019060010190808311610efc5750505050509050919050565b6000818152600860205260408120805460018201546003830154600284018054869560609587959194909391926001600160a01b039091169082906115f990613ad3565b80601f016020809104026020016040519081016040528092919081815260200182805461162590613ad3565b80156116725780601f1061164757610100808354040283529160200191611672565b820191906000526020600020905b81548152906001019060200180831161165557829003601f168201915b505050505091509450945094509450509193509193565b6060600080600061169a8686612106565b91509150816116c15760006040518060200160405280600081525090935093505050610fa4565b6116cb8682611a21565b92506116d78684611999565b935050509250929050565b600080546040516377b03e0d60e01b8152600481018490526001600160a01b03909116906377b03e0d9060240160206040518083038186803b15801561172757600080fd5b505afa15801561173b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175f9190613512565b92915050565b600061176f613192565b50506000908152600a60208181526040928390208054845161022081018652600183015481526002830154938101939093526003820154948301949094526004810154606083015260058101546080830152600681015460a0830152600781015460c0830152600881015460e083015260098101546101008084019190915292810154610120830152600b810154610140830152600c810154610160830152600d810154610180830152600e8101546101a0830152600f8101546101c083015260108101546101e08301526011810154610200830152601201549293909260ff8082169382041691620100009091046001600160a01b031690565b6000805460405163a792765f60e01b81526004810185905260248101849052606092916001600160a01b03169063a792765f9060440160006040518083038186803b1580156118b857600080fd5b505afa1580156118cc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118f49190810190613475565b90969095509350505050565b6000600a600260009054906101000a90046001600160a01b03166001600160a01b031663722580b66040518163ffffffff1660e01b815260040160206040518083038186803b15801561195257600080fd5b505afa158015611966573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198a9190613512565b611994919061392f565b905090565b60005460405163c5958af960e01b815260048101849052602481018390526060916001600160a01b03169063c5958af99060440160006040518083038186803b1580156119e557600080fd5b505afa1580156119f9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261102f919081019061357c565b6000805460405163ce5e11bf60e01b815260048101859052602481018490526001600160a01b039091169063ce5e11bf9060440160206040518083038186803b158015611a6d57600080fd5b505afa158015611a81573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102f9190613512565b6006548311158015611ab75750600083115b611af95760405162461bcd60e51b8152602060048201526013602482015272159bdd1948191bd95cc81b9bdd08195e1a5cdd606a1b6044820152606401610738565b6000838152600a60205260409020600581015415611b595760405162461bcd60e51b815260206004820152601d60248201527f566f74652068617320616c7265616479206265656e2074616c6c6965640000006044820152606401610738565b33600090815260138201602052604090205460ff1615611bbb5760405162461bcd60e51b815260206004820152601860248201527f53656e6465722068617320616c726561647920766f74656400000000000000006044820152606401610738565b336000818152601383016020526040808220805460ff1916600117905560035490516370a0823160e01b8152600481019390935290916001600160a01b03909116906370a082319060240160206040518083038186803b158015611c1e57600080fd5b505afa158015611c32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c569190613512565b600254604051630733bdef60e41b815233600482015291925060009182916001600160a01b03169063733bdef0906024016101006040518083038186803b158015611ca057600080fd5b505afa158015611cb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd8919061361f565b505050505092509250508082611cee9190613917565b611cf89084613917565b92508415611e095782846006016002016000828254611d179190613917565b9091555050600254604051631c3c149f60e11b81523360048201526001600160a01b0390911690633878293e9060240160206040518083038186803b158015611d5f57600080fd5b505afa158015611d73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d979190613512565b600e85018054600090611dab908490613917565b90915550611dba905033612ed0565b600b85018054600090611dce908490613917565b90915550506005546001600160a01b0316331415611e0457600184600f016002016000828254611dfe9190613917565b90915550505b612011565b8515611f0d5782846006016000016000828254611e269190613917565b9091555050600254604051631c3c149f60e11b81523360048201526001600160a01b0390911690633878293e9060240160206040518083038186803b158015611e6e57600080fd5b505afa158015611e82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea69190613512565b600c85018054600090611eba908490613917565b90915550611ec9905033612ed0565b600985018054600090611edd908490613917565b90915550506005546001600160a01b0316331415611e0457600184600f016000016000828254611dfe9190613917565b82846006016001016000828254611f249190613917565b9091555050600254604051631c3c149f60e11b81523360048201526001600160a01b0390911690633878293e9060240160206040518083038186803b158015611f6c57600080fd5b505afa158015611f80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa49190613512565b600d85018054600090611fb8908490613917565b90915550611fc7905033612ed0565b600a85018054600090611fdb908490613917565b90915550506005546001600160a01b031633141561201157600184600f01600101600082825461200b9190613917565b90915550505b336000908152600c6020526040812080549161202c83613b08565b90915550506040805188815287151560208201523381830152861515606082015290517fbe6f1c58cc15c8e86d6f0ef23c5a30eb33319af3b57f6b7d9b56ccfa87696b849181900360800190a150505050505050565b6000805460405163703e2a4360e11b815260048101859052602481018490526001600160a01b039091169063e07c54869060440160206040518083038186803b1580156120ce57600080fd5b505afa1580156120e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102f91906132c4565b6000806000612114856116e2565b905080612128576000809250925050610fa4565b8061213281613abc565b91506001905060008083816121478a83611a21565b90508881116121625760008097509750505050505050610fa4565b61216c8a84611a21565b90508881111561217b57600094505b841561222d57600261218d8484613917565b612197919061392f565b93506121a38a85611a21565b9050888111156121e45760006121be8b6104a2600188613a79565b90508981116121d057600095506121de565b6121db600186613a79565b92505b50612228565b60006121f58b6104a2876001613917565b90508981111561221857600095508461220d81613b08565b955050809150612226565b612223856001613917565b93505b505b61217b565b6122378a82610fab565b61224d5760018497509750505050505050610fa4565b6122578a82610fab565b801561226257508584105b15612285578361227181613b08565b94505061227e8a85611a21565b905061224d565b858414801561229957506122998a82610fab565b156122b05760008097509750505050505050610fa4565b60018497509750505050505050610fa4565b6001546040516387a475fd60e01b8152600481018390526000918291829182916001600160a01b03909116906387a475fd9060240160206040518083038186803b15801561230f57600080fd5b505afa158015612323573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123479190613512565b9050606061235a826103e5426001613917565b945090508361237657600080610194945094509450505061238b565b60006123818261302e565b955060c893505050505b9193909250565b6000818152600a6020526040902060065482118015906123b25750600082115b6123fe5760405162461bcd60e51b815260206004820152601860248201527f44697370757465204944206d7573742062652076616c696400000000000000006044820152606401610738565b601281015460ff16156124535760405162461bcd60e51b815260206004820152601e60248201527f566f74652068617320616c7265616479206265656e20657865637574656400006044820152606401610738565b60008160050154116124a75760405162461bcd60e51b815260206004820152601460248201527f566f7465206d7573742062652074616c6c6965640000000000000000000000006044820152606401610738565b600181015481546000908152600b60205260409020541461250a5760405162461bcd60e51b815260206004820152601660248201527f4d757374206265207468652066696e616c20766f7465000000000000000000006044820152606401610738565b6201518081600501544261251e9190613a79565b10156125885760405162461bcd60e51b815260206004820152603360248201527f31206461792068617320746f20706173732061667465722074616c6c7920746f60448201527220616c6c6f7720666f7220646973707574657360681b6064820152608401610738565b60128101805460ff1916600117905560008281526008602090815260408083208054845260099092528220805491926125c083613abc565b90915550600090508060016012850154610100900460ff1660028111156125f757634e487b7160e01b600052602160045260246000fd5b14156127c15783546000908152600b602052604090205491505b81156127bc5783546000908152600b60205260409020612632600184613a79565b8154811061265057634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050600a60008281526020019081526020016000209350816001141561271357600354601285015460048581015460405163a9059cbb60e01b81526001600160a01b0362010000909404841692810192909252602482015291169063a9059cbb90604401602060405180830381600087803b1580156126d957600080fd5b505af11580156126ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127119190613459565b505b600354601285015460048087015460405163a9059cbb60e01b81526001600160a01b0362010000909404841692810192909252602482015291169063a9059cbb90604401602060405180830381600087803b15801561277157600080fd5b505af1158015612785573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a99190613459565b50816127b481613abc565b925050612611565b612b16565b60026012850154610100900460ff1660028111156127ef57634e487b7160e01b600052602160045260246000fd5b14156129ab5783546000908152600b602052604090205491505b81156129155783546000908152600b6020526040902061282a600184613a79565b8154811061284857634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910154808352600a9091526040918290206003546012820154600480840154955163a9059cbb60e01b81526001600160a01b03620100009093048316918101919091526024810195909552919750919350169063a9059cbb90604401602060405180830381600087803b1580156128ca57600080fd5b505af11580156128de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129029190613459565b508161290d81613abc565b925050612809565b600380549084015460048086015460405163a9059cbb60e01b81526001600160a01b0393841692810192909252602482015291169063a9059cbb90604401602060405180830381600087803b15801561296d57600080fd5b505af1158015612981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a59190613459565b50612b16565b60006012850154610100900460ff1660028111156129d957634e487b7160e01b600052602160045260246000fd5b1415612b165783546000908152600b602052604081205492505b8215612a785784546000908152600b60205260409020612a14600185613a79565b81548110612a3257634e487b7160e01b600052603260045260246000fd5b90600052602060002001549150600a60008381526020019081526020016000209450846004015481612a649190613917565b905082612a7081613abc565b9350506129f3565b6004840154612a879082613917565b600380549086015460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb90604401602060405180830381600087803b158015612adb57600080fd5b505af1158015612aef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b139190613459565b50505b6000858152600a6020526040908190206012015490517f40d231bf91823121de9e1c012d95f835ea5684dc1d93360d9510a30543345da491612b62918891610100900460ff1690613878565b60405180910390a15050505050565b606080600080612b85886104ff888a613a79565b9150915081612bd6576040805160008082526020820190925290612bb9565b6060815260200190600190039081612ba45790505b506040805160008152602081019091529094509250612ec7915050565b6000612be28989610f1c565b909350905082612c35576040805160008082526020820190925290612c17565b6060815260200190600190039081612c025790505b506040805160008152602081019091529095509350612ec792505050565b60008060008867ffffffffffffffff811115612c6157634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612c8a578160200160208202803683370190505b5090505b8883108015612cb157508482612ca5866001613917565b612caf9190613a79565b115b15612d23576000612cc68d6104a28588613a79565b9050612cd28d82610fab565b612d105780828581518110612cf757634e487b7160e01b600052603260045260246000fd5b602090810291909101015283612d0c81613b08565b9450505b82612d1a81613b08565b93505050612c8e565b60008367ffffffffffffffff811115612d4c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612d7f57816020015b6060815260200190600190039081612d6a5790505b50905060008467ffffffffffffffff811115612dab57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612dd4578160200160208202803683370190505b50905060005b85811015612eba578381612def600189613a79565b612df99190613a79565b81518110612e1757634e487b7160e01b600052603260045260246000fd5b6020026020010151828281518110612e3f57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050612e7c8f838381518110612e6f57634e487b7160e01b600052603260045260246000fd5b6020026020010151611999565b838281518110612e9c57634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080612eb290613b08565b915050612dda565b5090985096505050505050505b94509492505050565b6000806000612ee960075461a8c0426103e59190613a79565b9092509050801561302757600082806020019051810190612f0a91906132e0565b905060005b815181101561302457600080838381518110612f3b57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031688604051602401612f6c91906001600160a01b0391909116815260200190565b60408051601f198184030181529181526020820180516001600160e01b03166345d6082360e01b17905251612fa19190613703565b6000604051808303816000865af19150503d8060008114612fde576040519150601f19603f3d011682016040523d82523d6000602084013e612fe3565b606091505b5091509150811561300f57808060200190518101906130029190613512565b61300c9088613917565b96505b5050808061301c90613b08565b915050612f0f565b50505b5050919050565b6000805b825181101561308d5782818151811061305b57634e487b7160e01b600052603260045260246000fd5b016020015160f81c61306f83610100613a5a565b6130799190613917565b91508061308581613b08565b915050613032565b50919050565b82805461309f90613ad3565b90600052602060002090601f0160209004810192826130c15760008555613107565b82601f106130da57805160ff1916838001178555613107565b82800160010185558215613107579182015b828111156131075782518255916020019190600101906130ec565b506131139291506131b1565b5090565b82805461312390613ad3565b90600052602060002090601f0160209004810192826131455760008555613107565b82601f106131565780548555613107565b8280016001018555821561310757600052602060002091601f016020900482015b82811115613107578254825591600101919060010190613177565b6040518061022001604052806011906020820280368337509192915050565b5b8082111561311357600081556001016131b2565b600082601f8301126131d6578081fd5b813560206131eb6131e6836138f3565b6138c2565b80838252828201915082860187848660051b890101111561320a578586fd5b855b8581101561323157813561321f81613b67565b8452928401929084019060010161320c565b5090979650505050505050565b600082601f83011261324e578081fd5b815167ffffffffffffffff81111561326857613268613b39565b61327b601f8201601f19166020016138c2565b81815284602083860101111561328f578283fd5b6132a0826020830160208701613a90565b949350505050565b6000602082840312156132b9578081fd5b813561102f81613b4f565b6000602082840312156132d5578081fd5b815161102f81613b4f565b600060208083850312156132f2578182fd5b825167ffffffffffffffff811115613308578283fd5b8301601f81018513613318578283fd5b80516133266131e6826138f3565b80828252848201915084840188868560051b8701011115613345578687fd5b8694505b8385101561337057805161335c81613b4f565b835260019490940193918501918501613349565b50979650505050505050565b600080600060608486031215613390578182fd5b833567ffffffffffffffff808211156133a7578384fd5b818601915086601f8301126133ba578384fd5b813560206133ca6131e6836138f3565b8083825282820191508286018b848660051b89010111156133e9578889fd5b8896505b8487101561340b5780358352600196909601959183019183016133ed565b5097505087013592505080821115613421578384fd5b61342d878388016131c6565b93506040860135915080821115613442578283fd5b5061344f868287016131c6565b9150509250925092565b60006020828403121561346a578081fd5b815161102f81613b67565b600080600060608486031215613489578283fd5b835161349481613b67565b602085015190935067ffffffffffffffff8111156134b0578283fd5b6134bc8682870161323e565b925050604084015190509250925092565b600080604083850312156134df578182fd5b82516134ea81613b67565b6020939093015192949293505050565b60006020828403121561350b578081fd5b5035919050565b600060208284031215613523578081fd5b5051919050565b6000806040838503121561353c578182fd5b50508035926020909101359150565b60008060008060808587031215613560578182fd5b5050823594602084013594506040840135936060013592509050565b60006020828403121561358d578081fd5b815167ffffffffffffffff8111156135a3578182fd5b6132a08482850161323e565b600080604083850312156135c1578182fd5b8235915060208301356135d381613b4f565b809150509250929050565b6000806000606084860312156135f2578081fd5b83359250602084013561360481613b67565b9150604084013561361481613b67565b809150509250925092565b600080600080600080600080610100898b03121561363b578586fd5b505086516020880151604089015160608a015160808b015160a08c015160c08d015160e0909d0151959e949d50929b919a50985090965094509092509050565b6000815180845260208085019450808401835b838110156136aa5781518752958201959082019060010161368e565b509495945050505050565b600081518084526136cd816020860160208601613a90565b601f01601f19169290920160200192915050565b600381106136ff57634e487b7160e01b600052602160045260246000fd5b9052565b60008251613715818460208701613a90565b9190910192915050565b6000604082016040835280855180835260608501915060608160051b86010192506020808801855b8381101561377557605f198887030185526137638683516136b5565b95509382019390820190600101613747565b50508584038187015250505061378b818561367b565b95945050505050565b60006020825261102f602083018461367b565b8581526102a0810160208083018760005b60118110156137d5578151835291830191908301906001016137b8565b505050508415156102408301526137f06102608301856136e1565b6001600160a01b0383166102808301529695505050505050565b60008582528460208301526080604083015261382960808301856136b5565b90506001600160a01b038316606083015295945050505050565b60006020825261102f60208301846136b5565b60006040825261386960408301856136b5565b90508260208301529392505050565b8281526040810161102f60208301846136e1565b848152608081016138a060208301866136e1565b6001600160a01b03808516604084015280841660608401525095945050505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156138eb576138eb613b39565b604052919050565b600067ffffffffffffffff82111561390d5761390d613b39565b5060051b60200190565b6000821982111561392a5761392a613b23565b500190565b60008261394a57634e487b7160e01b81526012600452602481fd5b500490565b80825b60018086116139615750612ec7565b81870482111561397357613973613b23565b8086161561398057918102915b9490941c938002613952565b600061102f60001984846000826139a55750600161102f565b816139b25750600061102f565b81600181146139c857600281146139d2576139ff565b600191505061102f565b60ff8411156139e3576139e3613b23565b6001841b9150848211156139f9576139f9613b23565b5061102f565b5060208310610133831016604e8410600b8410161715613a32575081810a83811115613a2d57613a2d613b23565b61102f565b613a3f848484600161394f565b808604821115613a5157613a51613b23565b02949350505050565b6000816000190483118215151615613a7457613a74613b23565b500290565b600082821015613a8b57613a8b613b23565b500390565b60005b83811015613aab578181015183820152602001613a93565b838111156106175750506000910152565b600081613acb57613acb613b23565b506000190190565b600181811c90821680613ae757607f821691505b6020821081141561308d57634e487b7160e01b600052602260045260246000fd5b6000600019821415613b1c57613b1c613b23565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114613b6457600080fd5b50565b8015158114613b6457600080fdfea2646970667358221220d430664f5f63987d8c7e884d4eda4cc1876f1977aa1fea560434b0fb9ca3dfe564736f6c63430008030033

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

0000000000000000000000006684e5ddbee1b97e10847468cb5f4e38f3ab83fe000000000000000000000000cea3a146a34af31ed20d01ada2e8169cc49bda34

-----Decoded View---------------
Arg [0] : _tellor (address): 0x6684E5DdbEe1b97E10847468cB5f4e38f3aB83FE
Arg [1] : _teamMultisig (address): 0xCEa3a146A34aF31Ed20d01ADa2E8169cc49bDA34

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000006684e5ddbee1b97e10847468cb5f4e38f3ab83fe
Arg [1] : 000000000000000000000000cea3a146a34af31ed20d01ada2e8169cc49bda34


Deployed ByteCode Sourcemap

33031:24511:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51179:311;;;;;;:::i;:::-;;:::i;:::-;;53570:147;;;;;;:::i;:::-;53656:7;53683:26;;;:16;:26;;;;;;;53570:147;;;;13231:25:1;;;13219:2;13204:18;53570:147:0;;;;;;;;31267:176;;;;;;:::i;:::-;;:::i;20054:21::-;;;;;-1:-1:-1;;;;;20054:21:0;;;;;;-1:-1:-1;;;;;10275:55:1;;;10257:74;;10245:2;10230:18;20054:21:0;10212:125:1;37305:3242:0;;;;;;:::i;:::-;;:::i;55658:138::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26017:227::-;;;;;;:::i;:::-;;:::i;:::-;;;;13015:14:1;;13008:22;12990:41;;13062:2;13047:18;;13040:34;;;;12963:18;26017:227:0;12945:135:1;20082:41:0;;;;;-1:-1:-1;;;;;20082:41:0;;;30498:184;;;;;;:::i;:::-;;:::i;:::-;;;12795:14:1;;12788:22;12770:41;;12758:2;12743:18;30498:184:0;12725:92:1;44405:3886:0;;;;;;:::i;:::-;;:::i;52555:164::-;;;;;;:::i;:::-;;:::i;53079:262::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;20723:547::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;28998:183::-;;;;;;:::i;:::-;;:::i;33089:21::-;;;;;-1:-1:-1;;;;;33089:21:0;;;54395:1054;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;21614:296::-;;;;;;:::i;:::-;;:::i;52203:167::-;;;;;;:::i;:::-;52304:4;52328:20;;;:8;:20;;;;;;;;-1:-1:-1;;;;;52328:34:0;;;;:26;;:34;;;;;;;;52203:167;;;;;33232:28;;;;;-1:-1:-1;;;;;33232:28:0;;;52436:111;;;:::i;56022:147::-;;;;;;:::i;:::-;-1:-1:-1;;;;;56135:26:0;56108:7;56135:26;;;:18;:26;;;;;;;56022:147;30927:194;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;33389:24::-;;;;;;29982:215;;;;;;:::i;:::-;;:::i;33455:110::-;;;;;;33288:27;;;;;-1:-1:-1;;;;;33288:27:0;;;48579:2266;;;;;;:::i;:::-;;:::i;29549:209::-;;;;;;:::i;:::-;;:::i;53843:91::-;53917:9;;53843:91;;22357:3213;;;;;;:::i;:::-;;:::i;31754:649::-;;;;;;:::i;:::-;;:::i;:::-;;;;16584:25:1;;;16640:2;16625:18;;16618:34;;;;16668:18;;;16661:34;16572:2;16557:18;31754:649:0;16539:162:1;40722:3544:0;;;;;;:::i;:::-;;:::i;33143:19::-;;;;;-1:-1:-1;;;;;33143:19:0;;;26781:1988;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;51179:311::-;51354:10;51349:134;51375:11;:18;51370:2;:23;51349:134;;;51416:55;51421:11;51433:2;51421:15;;;;;;-1:-1:-1;;;51421:15:0;;;;;;;;;;;;;;;51438:9;51448:2;51438:13;;;;;;-1:-1:-1;;;51438:13:0;;;;;;;;;;;;;;;51453;51467:2;51453:17;;;;;;-1:-1:-1;;;51453:17:0;;;;;;;;;;;;;;;51416:4;:55::i;:::-;51395:4;;;;:::i;:::-;;;;51349:134;;;;51179:311;;;:::o;31267:176::-;31348:17;;-1:-1:-1;;;;;31348:17:0;31340:40;31332:49;;;;;;31392:17;:43;;-1:-1:-1;;;;;;31392:43:0;-1:-1:-1;;;;;31392:43:0;;;;;;;;;;31267:176::o;37305:3242::-;37446:6;;:51;;-1:-1:-1;;;37446:51:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;37426:17:0;;-1:-1:-1;;;;;37446:6:0;;:29;;14283:18:1;;37446:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37426:71;-1:-1:-1;;;;;;37516:23:0;;37508:70;;;;-1:-1:-1;;;37508:70:0;;18390:2:1;37508:70:0;;;18372:21:1;18429:2;18409:18;;;18402:30;18468:34;18448:18;;;18441:62;-1:-1:-1;;;18519:18:1;;;18512:32;18561:19;;37508:70:0;;;;;;;;;37615:38;;;;;;;9737:19:1;;;9772:12;;;9765:28;;;37615:38:0;;;;;;;;;9809:12:1;;;;37615:38:0;;;37605:49;;;;;37718:9;;-1:-1:-1;;37718:13:0;;37730:1;37718:13;:::i;:::-;37742:29;37774:17;;;:10;:17;;;;;;;;37802:28;;;;;;;;;;;;;;;;;;;;37908:20;;;:8;:20;;;;;37970:11;:23;;;;;38084:31;;;38126:22;;;:35;;;38172:29;;;;:41;;-1:-1:-1;;;;;;38172:41:0;-1:-1:-1;;;;;38172:41:0;;;;;;;;38302:32;;;38345:19;;;:32;;-1:-1:-1;;38345:32:0;38367:10;38345:32;;;;;38412:12;38388:21;;;:36;;;;38457:15;38345:19;38435;;:37;38505:18;;38483:19;;;:40;38534:31;;:20;:31;;;;;:48;;;;;;;;;;;;;;;;37802:28;;-1:-1:-1;37908:20:0;;38615:15;:13;:15::i;:::-;38645:18;;38593:37;;-1:-1:-1;38667:1:0;38645:23;38641:1578;;;38742:8;38711:28;38729:10;38711:15;:28;:::i;:::-;:39;38685:151;;;;-1:-1:-1;;;38685:151:0;;17266:2:1;38685:151:0;;;17248:21:1;17305:2;17285:18;;;17278:30;17344:34;17324:18;;;17317:62;-1:-1:-1;;;17395:18:1;;;17388:48;17453:19;;38685:151:0;17238:240:1;38685:151:0;38851:26;;;;:16;:26;;;;;:28;;;;;;:::i;:::-;;;;-1:-1:-1;;38981:26:0;;;;:16;:26;;;;;;39010:1;-1:-1:-1;38977:256:0;;;39046:6;;;;;;;;;-1:-1:-1;;;;;39046:6:0;-1:-1:-1;;;;;39046:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39032:37;;38977:256;;;39186:26;;;;:16;:26;;;;;;:30;;39215:1;;39186:30;:::i;:::-;39180:37;;:1;:37;:::i;:::-;39145:72;;:11;:72;:::i;:::-;39110:107;;38977:256;39333:6;;:95;;-1:-1:-1;;;39333:95:0;;-1:-1:-1;;;;;10595:15:1;;;39333:95:0;;;10577:34:1;39408:4:0;10627:18:1;;;10620:43;39333:6:0;;;;:20;;10489:18:1;;39333:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39304:26;;;;:124;;;;39464:6;;:41;;-1:-1:-1;;;39464:41:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;-1:-1:-1;;;;;39464:6:0;;:19;;14283:18:1;;39464:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39464:41:0;;;;;;;;;;;;:::i;:::-;39443:62;;;;:18;;;;:62;;;;;;:::i;:::-;-1:-1:-1;39520:6:0;;:40;;-1:-1:-1;;;39520:40:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;-1:-1:-1;;;;;39520:6:0;;;;:18;;14283::1;;39520:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38641:1578;;;39623:18;;39593:15;;39611:11;;39623:22;;39644:1;;39623:22;:::i;:::-;39611:35;;;;;;-1:-1:-1;;;39611:35:0;;;;;;;;;;;;;;;;;39593:53;;39735:6;39705:8;:17;39714:7;39705:17;;;;;;;;;;;:27;;;39687:15;:45;;;;:::i;:::-;:54;39661:162;;;;-1:-1:-1;;;39661:162:0;;20629:2:1;39661:162:0;;;20611:21:1;20668:2;20648:18;;;20641:30;20707:34;20687:18;;;20680:62;-1:-1:-1;;;20758:18:1;;;20751:44;20812:19;;39661:162:0;20601:236:1;39661:162:0;39842:18;;39863:1;-1:-1:-1;39838:198:0;;;39899:6;;;;;;;;;-1:-1:-1;;;;;39899:6:0;-1:-1:-1;;;;;39899:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39885:37;;39838:198;;;39997:18;;:22;;40018:1;;39997:22;:::i;:::-;39991:29;;:1;:29;:::i;:::-;39977:43;;:11;:43;:::i;:::-;39963:57;;39838:198;40079:11;:27;40091:11;40103:1;40091:14;;;;;;-1:-1:-1;;;40091:14:0;;;;;;;;;;;;;;;;;40079:27;;;;;;;;;;;:59;;;40050:12;:26;;:88;;;;40174:11;:27;40186:11;40198:1;40186:14;;;;;;-1:-1:-1;;;40186:14:0;;;;;;;;;;;;;;;;;40174:27;;;;;;;;;;;:33;;40153:12;:18;;:54;;;;;;:::i;:::-;;;;;;:::i;:::-;;38641:1578;;40229:13;;;:27;;;40267:9;:11;;;:9;:11;;;:::i;:::-;;;;-1:-1:-1;;40311:5:0;;:58;;-1:-1:-1;;;40311:58:0;;40330:10;40311:58;;;10937:34:1;40350:4:0;10987:18:1;;;10980:43;11039:18;;;11032:34;;;-1:-1:-1;;;;;40311:5:0;;;;:18;;10849::1;;40311:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40289:124;;;;-1:-1:-1;;;40289:124:0;;18045:2:1;40289:124:0;;;18027:21:1;18084:2;18064:18;;;18057:30;-1:-1:-1;;;18103:18:1;;;18096:46;18159:18;;40289:124:0;18017:166:1;40289:124:0;40484:55;;;22417:25:1;;;22473:2;22458:18;;22451:34;;;22501:18;;;22494:34;;;-1:-1:-1;;;;;22564:55:1;;22559:2;22544:18;;22537:83;40484:55:0;;22404:3:1;22389:19;40484:55:0;;;;;;;;37305:3242;;;;;;;;;:::o;55658:138::-;55771:17;;;;:10;:17;;;;;;;;;55764:24;;;;;;;;;;;;;;;;;55735:16;;55764:24;;;55771:17;55764:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55658:138;;;:::o;26017:227::-;26134:11;26186:6;;:50;;-1:-1:-1;;;26186:50:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;26134:11:0;;-1:-1:-1;;;;;26186:6:0;;:28;;14283:18:1;;26186:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26179:57;;;;26017:227;;;;;;:::o;30498:184::-;30605:4;30634:6;;:40;;-1:-1:-1;;;30634:40:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;-1:-1:-1;;;;;30634:6:0;;;;:18;;14283::1;;30634:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30627:47;30498:184;-1:-1:-1;;;30498:184:0:o;44405:3886::-;44546:22;44571:20;;;:8;:20;;;;;44610:19;;;;:24;44602:66;;;;-1:-1:-1;;;44602:66:0;;16908:2:1;44602:66:0;;;16890:21:1;16947:2;16927:18;;;16920:30;16986:31;16966:18;;;16959:59;17035:18;;44602:66:0;16880:179:1;44602:66:0;44715:9;;44701:10;:23;;:41;;;;;44741:1;44728:10;:14;44701:41;44679:110;;;;-1:-1:-1;;;44679:110:0;;21393:2:1;44679:110:0;;;21375:21:1;21432:2;21412:18;;;21405:30;-1:-1:-1;;;21451:18:1;;;21444:49;21510:18;;44679:110:0;21365:169:1;44679:110:0;45043:19;;;;45035:27;;:5;:27;:::i;:::-;44995:19;;;;44977:37;;:15;:37;:::i;:::-;:85;;:156;;;;45124:9;45101;:19;;;45083:15;:37;;;;:::i;:::-;:50;;44977:156;44955:237;;;;-1:-1:-1;;;44955:237:0;;17685:2:1;44955:237:0;;;17667:21:1;17724:2;17704:18;;;17697:30;17763:33;17743:18;;;17736:61;17814:18;;44955:237:0;17657:181:1;44955:237:0;45526:35;;;;45480:30;;;;45526:22;;;45430:34;45406:21;;45526:35;45430:80;;;:::i;:::-;:131;;;;:::i;:::-;45690:32;;;;45647:27;;;;45690:19;;;45600:31;45406:155;;-1:-1:-1;45572:25:0;;45600:74;;45647:27;45600:74;:::i;:::-;:122;;;;:::i;:::-;45856:35;;;;45810:30;;;;45856:22;;;45760:34;45572:150;;-1:-1:-1;45733:24:0;;45760:80;;45810:30;45760:80;:::i;:::-;:131;;;;:::i;:::-;46008:28;;;;45969:23;;;;46008:15;;;45926:27;45733:158;;-1:-1:-1;45902:21:0;;45926:66;;45969:23;45926:66;:::i;:::-;:110;;;;:::i;:::-;45902:134;-1:-1:-1;46085:18:0;46081:66;;46120:15;;;;:::i;:::-;;;;46081:66;46161:22;46157:74;;46200:19;;;;:::i;:::-;;;;46157:74;46245:21;46241:72;;46283:18;;;;:::i;:::-;;;;46241:72;46327:18;46323:66;;46362:15;;;;:::i;:::-;;;;46323:66;46741:15;;;:27;46462:26;;46779:13;;46741:34;;46771:4;46741:34;:::i;:::-;46740:52;;;;:::i;:::-;46661:22;;;:34;46706:16;;46661:41;;46698:4;46661:41;:::i;:::-;46660:62;;;;:::i;:::-;46583:19;;;:31;46625:17;;46583:38;;46617:4;46583:38;:::i;:::-;46582:60;;;;:::i;:::-;46493:22;;;:34;46551:13;;46493:54;;46543:4;46493:54;:::i;:::-;46492:72;;;;:::i;:::-;46491:152;;;;:::i;:::-;:232;;;;:::i;:::-;:302;;;;:::i;:::-;46462:331;;46804:22;47101:13;47067:9;:15;;:23;;;47093:4;47067:30;;;;:::i;:::-;47066:48;;;;:::i;:::-;46991:30;;;;47032:16;;46991:37;;47024:4;46991:37;:::i;:::-;46990:58;;;;:::i;:::-;46917:27;;;;46955:17;;46917:34;;46947:4;46917:34;:::i;:::-;46916:56;;;;:::i;:::-;46831:30;;;;46885:13;;46831:37;;46864:4;46831:37;:::i;:::-;46830:68;;;;:::i;:::-;46829:144;;;;:::i;:::-;:220;;;;:::i;:::-;:286;;;;:::i;:::-;46804:311;;47126:22;47443:13;47404:9;:15;;:28;;;47435:4;47404:35;;;;:::i;:::-;47403:53;;;;:::i;:::-;47323:35;;;;47369:16;;47323:42;;47361:4;47323:42;:::i;:::-;47322:63;;;;:::i;:::-;47244:32;;;;47287:17;;47244:39;;47279:4;47244:39;:::i;:::-;47243:61;;;;:::i;:::-;47153:35;;;;47212:13;;47153:42;;47191:4;47153:42;:::i;:::-;47152:73;;;;:::i;:::-;47151:154;;;;:::i;:::-;:235;;;;:::i;:::-;:306;;;;:::i;:::-;47126:331;-1:-1:-1;47586:31:0;47126:331;47586:14;:31;:::i;:::-;47565:18;:52;47561:458;;;47634:16;;;:36;;47653:17;;47634:16;-1:-1:-1;;47634:36:0;;47653:17;47634:36;;;;;;47561:458;;;47804:35;47825:14;47804:18;:35;:::i;:::-;47787:14;:52;47783:236;;;47856:16;;;:36;;47875:17;;47856:16;-1:-1:-1;;47856:36:0;;47875:17;47856:36;;47783:236;47970:16;;;:37;;-1:-1:-1;;47970:37:0;;;;;47783:236;48053:15;48031:19;;;:37;48167:16;;;;48232:23;;;;:11;:23;;;;;;;:40;;;48116:167;;;;;;48142:10;;48167:16;;;;;;-1:-1:-1;;;;;48198:19:0;;;;;;;48232:40;;48116:167;:::i;52555:164::-;-1:-1:-1;;;;;52680:31:0;;;;;;:20;:31;;;;;;;;;52673:38;;;;;;;;;;;;;;;;;52644:16;;52673:38;;;52680:31;52673:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52555:164;;;:::o;53079:262::-;53162:7;53235:23;;;:11;:23;;;;;53277:10;;53289:12;;;;53313:19;;;;53303:8;;;53269:64;;53162:7;;53180:12;;53162:7;;53235:23;;53277:10;;53289:12;;-1:-1:-1;;;;;53313:19:0;;;;53303:8;;53269:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53079:262;;;;;:::o;20723:547::-;20831:19;20852:27;20898:11;20911:14;20929:79;20964:8;20987:10;20929:20;:79::i;:::-;20897:111;;;;21024:6;21019:54;;21059:1;21047:14;;;;;;;;;;;;;;;;;;;;;21019:54;21105:47;21135:8;21145:6;21105:29;:47::i;:::-;21083:69;;21172:43;21185:8;21195:19;21172:12;:43::i;:::-;21163:52;;21226:36;;20723:547;;;;;:::o;28998:183::-;29099:7;29131:6;;:42;;-1:-1:-1;;;29131:42:0;;;;;13231:25:1;;;-1:-1:-1;;;;;29131:6:0;;;;:32;;13204:18:1;;29131:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29124:49;28998:183;-1:-1:-1;;28998:183:0:o;54395:1054::-;54502:7;54511:18;;:::i;:::-;-1:-1:-1;;54531:4:0;54592:20;;;:8;:20;;;;;;;;;54645:17;;54623:818;;;;;;;54696:12;;;;54623:818;;54727:12;;;;54623:818;;;;;;;54758:14;;;;54623:818;;;;;;;54791:6;;;;54623:818;;;;54816:12;;;;54623:818;;;;54847:15;;;:27;54623:818;;;;54893:23;;;;54623:818;;;;54935:28;;;;54623:818;;;;54982:8;;;:20;54623:818;;;;;;;;55021:16;;;;54623:818;;;;55056:21;;;;54623:818;;;;55096:12;;;:24;54623:818;;;;55139:20;;;;54623:818;;;;55178:25;;;;54623:818;;;;55222:15;;;:27;54623:818;;;;55268:23;;;;54623:818;;;;55310:28;;;;54623:818;;;;55368:11;;;54645:17;;54623:818;;55368:11;;;;;55394:9;;;;55418:12;;;;-1:-1:-1;;;;;55418:12:0;;54395:1054::o;21614:296::-;21744:27;21823:6;;:79;;-1:-1:-1;;;21823:79:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;21723:19:0;;21744:27;-1:-1:-1;;;;;21823:6:0;;:20;;14283:18:1;;21823:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21823:79:0;;;;;;;;;;;;:::i;:::-;21789:113;;;;-1:-1:-1;21614:296:0;-1:-1:-1;;;;21614:296:0:o;52436:111::-;52482:7;52536:2;52510:6;;;;;;;;;-1:-1:-1;;;;;52510:6:0;-1:-1:-1;;;;;52510:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:28;;;;:::i;:::-;52502:37;;52436:111;:::o;30927:194::-;31072:6;;:41;;-1:-1:-1;;;31072:41:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;31035:12:0;;-1:-1:-1;;;;;31072:6:0;;:19;;14283:18:1;;31072:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31072:41:0;;;;;;;;;;;;:::i;29982:215::-;30103:7;30135:6;;:54;;-1:-1:-1;;;30135:54:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;-1:-1:-1;;;;;30135:6:0;;;;:36;;14283:18:1;;30135:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;48579:2266::-;48839:9;;48825:10;:23;;:41;;;;;48865:1;48852:10;:14;48825:41;48803:110;;;;-1:-1:-1;;;48803:110:0;;21393:2:1;48803:110:0;;;21375:21:1;21432:2;21412:18;;;21405:30;-1:-1:-1;;;21451:18:1;;;21444:49;21510:18;;48803:110:0;21365:169:1;48803:110:0;48924:22;48949:20;;;:8;:20;;;;;48988:19;;;;:24;48980:66;;;;-1:-1:-1;;;48980:66:0;;16908:2:1;48980:66:0;;;16890:21:1;16947:2;16927:18;;;16920:30;16986:31;16966:18;;;16959:59;17035:18;;48980:66:0;16880:179:1;48980:66:0;49082:10;49066:27;;;;:15;;;:27;;;;;;;;49065:28;49057:65;;;;-1:-1:-1;;;49057:65:0;;19925:2:1;49057:65:0;;;19907:21:1;19964:2;19944:18;;;19937:30;20003:26;19983:18;;;19976:54;20047:18;;49057:65:0;19897:174:1;49057:65:0;49257:10;49241:27;;;;:15;;;:27;;;;;;:34;;-1:-1:-1;;49241:34:0;49271:4;49241:34;;;49310:5;;:27;;-1:-1:-1;;;49310:27:0;;;;;10257:74:1;;;;49241:27:0;;-1:-1:-1;;;;;49310:5:0;;;;:15;;10230:18:1;;49310:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49411:6;;:46;;-1:-1:-1;;;49411:46:0;;49446:10;49411:46;;;10257:74:1;49286:51:0;;-1:-1:-1;49351:22:0;;;;-1:-1:-1;;;;;49411:6:0;;:34;;10230:18:1;;49411:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49348:109;;;;;;;;;;49502:14;49485;:31;;;;:::i;:::-;49468:48;;;;:::i;:::-;;;49531:13;49527:1197;;;49600:13;49561:9;:22;;:35;;;:52;;;;;;;:::i;:::-;;;;-1:-1:-1;;49664:6:0;;:65;;-1:-1:-1;;;49664:65:0;;49718:10;49664:65;;;10257:74:1;-1:-1:-1;;;;;49664:6:0;;;;:53;;10230:18:1;;49664:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49628:32;;;:101;;:32;;:101;;;;;:::i;:::-;;;;-1:-1:-1;49776:24:0;;-1:-1:-1;49789:10:0;49776:12;:24::i;:::-;49744:28;;;:56;;:28;;:56;;;;;:::i;:::-;;;;-1:-1:-1;;49833:12:0;;-1:-1:-1;;;;;49833:12:0;49819:10;:26;49815:107;;;49905:1;49866:9;:22;;:35;;;:40;;;;;;;:::i;:::-;;;;-1:-1:-1;;49815:107:0;49527:1197;;;49943:9;49939:785;;;50007:13;49969:9;:22;;:34;;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;;50070:6:0;;:65;;-1:-1:-1;;;50070:65:0;;50124:10;50070:65;;;10257:74:1;-1:-1:-1;;;;;50070:6:0;;;;:53;;10230:18:1;;50070:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50035:19;;;:100;;:31;;:100;;;;;:::i;:::-;;;;-1:-1:-1;50181:24:0;;-1:-1:-1;50194:10:0;50181:12;:24::i;:::-;50150:15;;;:55;;:27;;:55;;;;;:::i;:::-;;;;-1:-1:-1;;50238:12:0;;-1:-1:-1;;;;;50238:12:0;50224:10;:26;50220:106;;;50309:1;50271:9;:22;;:34;;;:39;;;;;;;:::i;49939:785::-;50392:13;50358:9;:22;;:30;;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;50451:6:0;;:79;;-1:-1:-1;;;50451:79:0;;50505:10;50451:79;;;10257:74:1;-1:-1:-1;;;;;50451:6:0;;;;:35;;10230:18:1;;50451:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50420:27;;;:110;;:27;;:110;;;;;:::i;:::-;;;;-1:-1:-1;50572:24:0;;-1:-1:-1;50585:10:0;50572:12;:24::i;:::-;50545:23;;;:51;;:23;;:51;;;;;:::i;:::-;;;;-1:-1:-1;;50629:12:0;;-1:-1:-1;;;;;50629:12:0;50615:10;:26;50611:102;;;50696:1;50662:9;:22;;:30;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;50611:102:0;50753:10;50734:30;;;;:18;:30;;;;;:32;;;;;;:::i;:::-;;;;-1:-1:-1;;50782:55:0;;;21940:25:1;;;22008:14;;22001:22;21996:2;21981:18;;21974:50;50811:10:0;22040:18:1;;;22033:83;22159:14;;22152:22;22147:2;22132:18;;22125:50;50782:55:0;;;;;;;21927:3:1;50782:55:0;;;48579:2266;;;;;;;:::o;29549:209::-;29667:7;29699:6;;:51;;-1:-1:-1;;;29699:51:0;;;;;14310:25:1;;;14351:18;;;14344:34;;;-1:-1:-1;;;;;29699:6:0;;;;:29;;14283:18:1;;29699:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22357:3213::-;22473:11;22486:14;22518;22535:35;22561:8;22535:25;:35::i;:::-;22518:52;-1:-1:-1;22585:11:0;22581:34;;22606:5;22613:1;22598:17;;;;;;;22581:34;22626:8;;;;:::i;:::-;;-1:-1:-1;22660:4:0;;-1:-1:-1;22645:12:0;;22626:8;22645:12;22914:45;22944:8;22626;22914:29;:45::i;:::-;22892:67;;22997:10;22974:19;:33;22970:56;;23017:5;23024:1;23009:17;;;;;;;;;;;;22970:56;23059:47;23089:8;23099:6;23059:29;:47::i;:::-;23037:69;;23143:10;23121:19;:32;23117:132;;;23232:5;23222:15;;23117:132;23339:7;23332:1374;;;23391:1;23374:13;23381:6;23374:4;:13;:::i;:::-;23373:19;;;;:::i;:::-;23363:29;;23429:97;23477:8;23504:7;23429:29;:97::i;:::-;23407:119;;23567:10;23545:19;:32;23541:1154;;;23647:17;23667:113;23719:8;23750:11;23760:1;23750:7;:11;:::i;23667:113::-;23647:133;;23816:10;23803:9;:23;23799:279;;23921:5;23911:15;;23799:279;;;24047:11;24057:1;24047:7;:11;:::i;:::-;24040:18;;23799:279;23541:1154;;;;24163:17;24183:113;24235:8;24266:11;:7;24276:1;24266:11;:::i;24183:113::-;24163:133;;24331:10;24319:9;:22;24315:365;;;24436:5;;-1:-1:-1;24464:9:0;;;;:::i;:::-;;;;24518;24496:31;;24315:365;;;24649:11;:7;24659:1;24649:11;:::i;:::-;24640:20;;24315:365;23541:1154;;23332:1374;;;24776:42;24788:8;24798:19;24776:11;:42::i;:::-;24771:792;;24890:4;24896:7;24882:22;;;;;;;;;;;;24771:792;25029:42;25041:8;25051:19;25029:11;:42::i;:::-;:62;;;;;25085:6;25075:7;:16;25029:62;25004:297;;;25126:9;;;;:::i;:::-;;;;25176:109;25228:8;25259:7;25176:29;:109::i;:::-;25154:131;;25004:297;;;25348:6;25337:7;:17;:63;;;;;25358:42;25370:8;25380:19;25358:11;:42::i;:::-;25315:153;;;25443:5;25450:1;25435:17;;;;;;;;;;;;25315:153;25537:4;25543:7;25529:22;;;;;;;;;;;;31754:649;31994:17;;:34;;-1:-1:-1;;;31994:34:0;;;;;13231:25:1;;;31867:13:0;;;;;;;;-1:-1:-1;;;;;31994:17:0;;;;:29;;13204:18:1;;31994:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31975:53;-1:-1:-1;32039:24:0;32102:81;31975:53;32153:19;:15;32171:1;32153:19;:::i;32102:81::-;32074:109;-1:-1:-1;32074:109:0;-1:-1:-1;32198:15:0;32194:66;;32238:1;32241;32244:3;32230:18;;;;;;;;;;32194:66;32270:18;32291:23;32302:11;32291:10;:23::i;:::-;32270:44;-1:-1:-1;32391:3:0;;-1:-1:-1;;;;31754:649:0;;;;;;:::o;40722:3544::-;40872:22;40897:20;;;:8;:20;;;;;40964:9;;40950:23;;;;;:41;;;40990:1;40977:10;:14;40950:41;40928:115;;;;-1:-1:-1;;;40928:115:0;;19213:2:1;40928:115:0;;;19195:21:1;19252:2;19232:18;;;19225:30;19291:26;19271:18;;;19264:54;19335:18;;40928:115:0;19185:174:1;40928:115:0;41063:18;;;;;;41062:19;41054:62;;;;-1:-1:-1;;;41054:62:0;;19566:2:1;41054:62:0;;;19548:21:1;19605:2;19585:18;;;19578:30;19644:32;19624:18;;;19617:60;19694:18;;41054:62:0;19538:180:1;41054:62:0;41157:1;41135:9;:19;;;:23;41127:56;;;;-1:-1:-1;;;41127:56:0;;21044:2:1;41127:56:0;;;21026:21:1;21083:2;21063:18;;;21056:30;21122:22;21102:18;;;21095:50;21162:18;;41127:56:0;21016:170:1;41127:56:0;41379:19;;;;41343:24;;41332:36;;;;:10;:36;;;;;:43;:66;41310:138;;;;-1:-1:-1;;;41310:138:0;;20278:2:1;41310:138:0;;;20260:21:1;20317:2;20297:18;;;20290:30;20356:24;20336:18;;;20329:52;20398:18;;41310:138:0;20250:172:1;41310:138:0;41581:6;41558:9;:19;;;41540:15;:37;;;;:::i;:::-;:47;;41518:148;;;;-1:-1:-1;;;41518:148:0;;18793:2:1;41518:148:0;;;18775:21:1;18832:2;18812:18;;;18805:30;18871:34;18851:18;;;18844:62;-1:-1:-1;;;18922:18:1;;;18915:49;18981:19;;41518:148:0;18765:241:1;41518:148:0;41677:18;;;:25;;-1:-1:-1;;41677:25:0;41698:4;41677:25;;;:18;41744:23;;;:11;:23;;;;;;;;41795:20;;41778:38;;:16;:38;;;;;:40;;41744:23;;41778:40;;;:::i;:::-;;;;-1:-1:-1;41829:10:0;;-1:-1:-1;41829:10:0;41900:17;41880:16;;;;;;;;;:37;;;;;;-1:-1:-1;;;41880:37:0;;;;;;;;;;41876:2314;;;42093:24;;42082:36;;;;:10;:36;;;;;:43;;-1:-1:-1;42054:669:0;42144:6;;42054:669;;42229:24;;42218:36;;;;:10;:36;;;;;42255:6;42260:1;42255:2;:6;:::i;:::-;42218:44;;;;;;-1:-1:-1;;;42218:44:0;;;;;;;;;;;;;;;;;42208:54;;42293:8;:17;42302:7;42293:17;;;;;;;;;;;42281:29;;42451:2;42457:1;42451:7;42447:192;;;42483:5;;42524:19;;;;42570:26;;;;;42483:136;;-1:-1:-1;;;42483:136:0;;-1:-1:-1;;;;;42524:19:0;;;;;;42483:136;;;11251:74:1;;;;11341:18;;;11334:34;42483:5:0;;;:14;;11224:18:1;;42483:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42447:192;42657:5;;42672:19;;;;42693:13;;;;;42657:50;;-1:-1:-1;;;42657:50:0;;-1:-1:-1;;;;;42672:19:0;;;;;;42657:50;;;11251:74:1;;;;11341:18;;;11334:34;42657:5:0;;;:14;;11224:18:1;;42657:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;42169:4:0;;;;:::i;:::-;;;;42054:669;;;41876:2314;;;42764:18;42744:16;;;;;;;;;:38;;;;;;-1:-1:-1;;;42744:38:0;;;;;;;;;;42740:1450;;;42966:24;;42955:36;;;;:10;:36;;;;;:43;;-1:-1:-1;42927:341:0;43017:6;;42927:341;;43102:24;;43091:36;;;;:10;:36;;;;;43128:6;43133:1;43128:2;:6;:::i;:::-;43091:44;;;;;;-1:-1:-1;;;43091:44:0;;;;;;;;;;;;;;;;;;;;;;43166:17;;;:8;:17;;;;;;;;43202:5;;43217:19;;;;43238:13;;;;;43202:50;;-1:-1:-1;;;43202:50:0;;-1:-1:-1;;;;;43217:19:0;;;;;;43202:50;;;11251:74:1;;;;11341:18;;;11334:34;;;;43166:17:0;;-1:-1:-1;43091:44:0;;-1:-1:-1;43202:5:0;;:14;;11224:18:1;;43202:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;43042:4:0;;;;:::i;:::-;;;;42927:341;;;43348:5;;;43381:29;;;;43429:26;;;;;43348:122;;-1:-1:-1;;;43348:122:0;;-1:-1:-1;;;;;43381:29:0;;;43348:122;;;11251:74:1;;;;11341:18;;;11334:34;43348:5:0;;;:14;;11224:18:1;;43348:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42740:1450;;;43512:17;43492:16;;;;;;;;;:37;;;;;;-1:-1:-1;;;43492:37:0;;;;;;;;;;43488:702;;;43758:24;;43677:23;43747:36;;;:10;:36;;;;;:43;;-1:-1:-1;43719:323:0;43809:6;;43719:323;;43894:24;;43883:36;;;;:10;:36;;;;;43920:6;43925:1;43920:2;:6;:::i;:::-;43883:44;;;;;;-1:-1:-1;;;43883:44:0;;;;;;;;;;;;;;;;;43873:54;;43958:8;:17;43967:7;43958:17;;;;;;;;;;;43946:29;;44013:9;:13;;;43994:32;;;;;:::i;:::-;;-1:-1:-1;43834:4:0;;;;:::i;:::-;;;;43719:323;;;44075:26;;;;44056:45;;;;:::i;:::-;44116:5;;;44131:29;;;;44116:62;;-1:-1:-1;;;44116:62:0;;-1:-1:-1;;;;;44131:29:0;;;44116:62;;;11251:74:1;11341:18;;;11334:34;;;44056:45:0;;-1:-1:-1;44116:5:0;;:14;;11224:18:1;;44116:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43488:702;;44230:20;;;;:8;:20;;;;;;;:27;;;44205:53;;;;;;44230:20;;:27;;;;;;44205:53;:::i;:::-;;;;;;;;40722:3544;;;;;:::o;26781:1988::-;26979:22;;27096:16;;27137:89;27172:8;27195:20;27208:7;27195:10;:20;:::i;27137:89::-;27095:131;;;;27276:11;27271:86;;27312:14;;;27324:1;27312:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27328:16:0;;;27342:1;27328:16;;;;;;;;27304:41;;-1:-1:-1;27328:16:0;-1:-1:-1;27304:41:0;;-1:-1:-1;;27304:41:0;27271:86;27367:17;27467:43;27489:8;27499:10;27467:21;:43::i;:::-;27440:70;;-1:-1:-1;27440:70:0;-1:-1:-1;27440:70:0;27560:86;;27601:14;;;27613:1;27601:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27617:16:0;;;27631:1;27617:16;;;;;;;;27593:41;;-1:-1:-1;27617:16:0;-1:-1:-1;27593:41:0;;-1:-1:-1;;;27593:41:0;27560:86;27656:17;27688:14;27717:37;27771:9;27757:24;;;;;;-1:-1:-1;;;27757:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27757:24:0;;27717:64;;27859:439;27878:9;27866;:21;:61;;;;-1:-1:-1;27916:11:0;27907:6;27891:13;:9;27903:1;27891:13;:::i;:::-;:22;;;;:::i;:::-;:36;27866:61;27859:439;;;27944:27;27974:108;28022:8;28049:18;28061:6;28049:9;:18;:::i;27974:108::-;27944:138;;28102:42;28114:8;28124:19;28102:11;:42::i;:::-;28097:167;;28199:19;28165:20;28186:9;28165:31;;;;;;-1:-1:-1;;;28165:31:0;;;;;;;;;;;;;;;;;;:53;28237:11;;;;:::i;:::-;;;;28097:167;28278:8;;;;:::i;:::-;;;;27859:439;;;;28310:27;28352:9;28340:22;;;;;;-1:-1:-1;;;28340:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28310:52;;28373:33;28423:9;28409:24;;;;;;-1:-1:-1;;;28409:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28409:24:0;;28373:60;;28506:10;28501:211;28527:9;28522:2;:14;28501:211;;;28582:20;28619:2;28603:13;28615:1;28603:9;:13;:::i;:::-;:18;;;;:::i;:::-;28582:40;;;;;;-1:-1:-1;;;28582:40:0;;;;;;;;;;;;;;;28559:16;28576:2;28559:20;;;;;;-1:-1:-1;;;28559:20:0;;;;;;;;;;;;;;:63;;;;;28656:44;28669:8;28679:16;28696:2;28679:20;;;;;;-1:-1:-1;;;28679:20:0;;;;;;;;;;;;;;;28656:12;:44::i;:::-;28637:12;28650:2;28637:16;;;;;;-1:-1:-1;;;28637:16:0;;;;;;;;;;;;;;:63;;;;28538:4;;;;;:::i;:::-;;;;28501:211;;;-1:-1:-1;28730:12:0;;-1:-1:-1;28744:16:0;-1:-1:-1;;;;;;;26781:1988:0;;;;;;;;:::o;56446:1093::-;56517:21;56604:31;56637:18;56659:99;56687:19;;56739:8;56721:15;:26;;;;:::i;56659:99::-;56603:155;;-1:-1:-1;56603:155:0;-1:-1:-1;56773:14:0;;56769:763;;56804:30;56866:18;56837:92;;;;;;;;;;;;:::i;:::-;56804:125;;57029:10;57024:497;57050:13;:20;57045:2;:25;57024:497;;;57098:13;57113:24;57141:13;57155:2;57141:17;;;;;;-1:-1:-1;;;57141:17:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;57141:44:0;57324:5;57212:144;;;;;;;-1:-1:-1;;;;;10275:55:1;;;;10257:74;;10245:2;10230:18;;10212:125;57212:144:0;;;;-1:-1:-1;;57212:144:0;;;;;;;;;;;;;;-1:-1:-1;;;;;57212:144:0;-1:-1:-1;;;57212:144:0;;;57141:238;;;57212:144;57141:238;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57097:282;;;;57402:8;57398:108;;;57463:11;57452:34;;;;;;;;;;;;:::i;:::-;57435:51;;;;:::i;:::-;;;57398:108;57024:497;;57072:4;;;;;:::i;:::-;;;;57024:497;;;;56769:763;;56446:1093;;;;;:::o;32599:236::-;32686:15;;32719:109;32745:2;:9;32740:2;:14;32719:109;;;32809:2;32812;32809:6;;;;;;-1:-1:-1;;;32809:6:0;;;;;;;;;;;;;;;32787:13;:7;32797:3;32787:13;:::i;:::-;:29;;;;:::i;:::-;32777:39;-1:-1:-1;32756:4:0;;;;:::i;:::-;;;;32719:109;;;;32599:236;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:762:1;;118:3;111:4;103:6;99:17;95:27;85:2;;140:5;133;126:20;85:2;180:6;167:20;206:4;230:60;246:43;286:2;246:43;:::i;:::-;230:60;:::i;:::-;312:3;336:2;331:3;324:15;364:2;359:3;355:12;348:19;;399:2;391:6;387:15;451:3;446:2;440;437:1;433:10;425:6;421:23;417:32;414:41;411:2;;;472:5;465;458:20;411:2;498:5;512:235;526:2;523:1;520:9;512:235;;;597:3;584:17;614:28;636:5;614:28;:::i;:::-;655:18;;693:12;;;;725;;;;544:1;537:9;512:235;;;-1:-1:-1;765:5:1;;75:701;-1:-1:-1;;;;;;;75:701:1:o;781:512::-;;887:3;880:4;872:6;868:17;864:27;854:2;;909:5;902;895:20;854:2;942:6;936:13;968:18;964:2;961:26;958:2;;;990:18;;:::i;:::-;1034:55;1077:2;1058:13;;-1:-1:-1;;1054:27:1;1083:4;1050:38;1034:55;:::i;:::-;1114:2;1105:7;1098:19;1160:3;1153:4;1148:2;1140:6;1136:15;1132:26;1129:35;1126:2;;;1181:5;1174;1167:20;1126:2;1198:64;1259:2;1252:4;1243:7;1239:18;1232:4;1224:6;1220:17;1198:64;:::i;:::-;1280:7;844:449;-1:-1:-1;;;;844:449:1:o;1298:257::-;;1410:2;1398:9;1389:7;1385:23;1381:32;1378:2;;;1431:6;1423;1416:22;1378:2;1475:9;1462:23;1494:31;1519:5;1494:31;:::i;1560:261::-;;1683:2;1671:9;1662:7;1658:23;1654:32;1651:2;;;1704:6;1696;1689:22;1651:2;1741:9;1735:16;1760:31;1785:5;1760:31;:::i;1826:1012::-;;1952:2;1995;1983:9;1974:7;1970:23;1966:32;1963:2;;;2016:6;2008;2001:22;1963:2;2054:9;2048:16;2087:18;2079:6;2076:30;2073:2;;;2124:6;2116;2109:22;2073:2;2152:22;;2205:4;2197:13;;2193:27;-1:-1:-1;2183:2:1;;2239:6;2231;2224:22;2183:2;2273;2267:9;2296:60;2312:43;2352:2;2312:43;:::i;2296:60::-;2378:3;2402:2;2397:3;2390:15;2430:2;2425:3;2421:12;2414:19;;2461:2;2457;2453:11;2509:7;2504:2;2498;2495:1;2491:10;2487:2;2483:19;2479:28;2476:41;2473:2;;;2535:6;2527;2520:22;2473:2;2562:6;2553:15;;2577:231;2591:2;2588:1;2585:9;2577:231;;;2655:3;2649:10;2672:31;2697:5;2672:31;:::i;:::-;2716:18;;2609:1;2602:9;;;;;2754:12;;;;2786;;2577:231;;;-1:-1:-1;2827:5:1;1932:906;-1:-1:-1;;;;;;;1932:906:1:o;2843:1430::-;;;;3058:2;3046:9;3037:7;3033:23;3029:32;3026:2;;;3079:6;3071;3064:22;3026:2;3124:9;3111:23;3153:18;3194:2;3186:6;3183:14;3180:2;;;3215:6;3207;3200:22;3180:2;3258:6;3247:9;3243:22;3233:32;;3303:7;3296:4;3292:2;3288:13;3284:27;3274:2;;3330:6;3322;3315:22;3274:2;3371;3358:16;3393:4;3417:60;3433:43;3473:2;3433:43;:::i;3417:60::-;3499:3;3523:2;3518:3;3511:15;3551:2;3546:3;3542:12;3535:19;;3582:2;3578;3574:11;3630:7;3625:2;3619;3616:1;3612:10;3608:2;3604:19;3600:28;3597:41;3594:2;;;3656:6;3648;3641:22;3594:2;3683:6;3674:15;;3698:163;3712:2;3709:1;3706:9;3698:163;;;3769:17;;3757:30;;3730:1;3723:9;;;;;3807:12;;;;3839;;3698:163;;;-1:-1:-1;3880:5:1;-1:-1:-1;;3923:18:1;;3910:32;;-1:-1:-1;;3954:16:1;;;3951:2;;;3988:6;3980;3973:22;3951:2;4016:60;4068:7;4057:8;4046:9;4042:24;4016:60;:::i;:::-;4006:70;;4129:2;4118:9;4114:18;4101:32;4085:48;;4158:2;4148:8;4145:16;4142:2;;;4179:6;4171;4164:22;4142:2;;4207:60;4259:7;4248:8;4237:9;4233:24;4207:60;:::i;:::-;4197:70;;;3016:1257;;;;;:::o;4278:255::-;;4398:2;4386:9;4377:7;4373:23;4369:32;4366:2;;;4419:6;4411;4404:22;4366:2;4456:9;4450:16;4475:28;4497:5;4475:28;:::i;4538:538::-;;;;4701:2;4689:9;4680:7;4676:23;4672:32;4669:2;;;4722:6;4714;4707:22;4669:2;4759:9;4753:16;4778:28;4800:5;4778:28;:::i;:::-;4874:2;4859:18;;4853:25;4825:5;;-1:-1:-1;4901:18:1;4890:30;;4887:2;;;4938:6;4930;4923:22;4887:2;4966:60;5018:7;5009:6;4998:9;4994:22;4966:60;:::i;:::-;4956:70;;;5066:2;5055:9;5051:18;5045:25;5035:35;;4659:417;;;;;:::o;5081:316::-;;;5218:2;5206:9;5197:7;5193:23;5189:32;5186:2;;;5239:6;5231;5224:22;5186:2;5276:9;5270:16;5295:28;5317:5;5295:28;:::i;:::-;5387:2;5372:18;;;;5366:25;5342:5;;5366:25;;-1:-1:-1;;;5176:221:1:o;5402:190::-;;5514:2;5502:9;5493:7;5489:23;5485:32;5482:2;;;5535:6;5527;5520:22;5482:2;-1:-1:-1;5563:23:1;;5472:120;-1:-1:-1;5472:120:1:o;5597:194::-;;5720:2;5708:9;5699:7;5695:23;5691:32;5688:2;;;5741:6;5733;5726:22;5688:2;-1:-1:-1;5769:16:1;;5678:113;-1:-1:-1;5678:113:1:o;5796:258::-;;;5925:2;5913:9;5904:7;5900:23;5896:32;5893:2;;;5946:6;5938;5931:22;5893:2;-1:-1:-1;;5974:23:1;;;6044:2;6029:18;;;6016:32;;-1:-1:-1;5883:171:1:o;6059:395::-;;;;;6222:3;6210:9;6201:7;6197:23;6193:33;6190:2;;;6244:6;6236;6229:22;6190:2;-1:-1:-1;;6272:23:1;;;6342:2;6327:18;;6314:32;;-1:-1:-1;6393:2:1;6378:18;;6365:32;;6444:2;6429:18;6416:32;;-1:-1:-1;6180:274:1;-1:-1:-1;6180:274:1:o;6459:355::-;;6591:2;6579:9;6570:7;6566:23;6562:32;6559:2;;;6612:6;6604;6597:22;6559:2;6650:9;6644:16;6683:18;6675:6;6672:30;6669:2;;;6720:6;6712;6705:22;6669:2;6748:60;6800:7;6791:6;6780:9;6776:22;6748:60;:::i;7213:325::-;;;7342:2;7330:9;7321:7;7317:23;7313:32;7310:2;;;7363:6;7355;7348:22;7310:2;7404:9;7391:23;7381:33;;7464:2;7453:9;7449:18;7436:32;7477:31;7502:5;7477:31;:::i;:::-;7527:5;7517:15;;;7300:238;;;;;:::o;7543:454::-;;;;7683:2;7671:9;7662:7;7658:23;7654:32;7651:2;;;7704:6;7696;7689:22;7651:2;7745:9;7732:23;7722:33;;7805:2;7794:9;7790:18;7777:32;7818:28;7840:5;7818:28;:::i;:::-;7865:5;-1:-1:-1;7922:2:1;7907:18;;7894:32;7935:30;7894:32;7935:30;:::i;:::-;7984:7;7974:17;;;7641:356;;;;;:::o;8002:626::-;;;;;;;;;8244:3;8232:9;8223:7;8219:23;8215:33;8212:2;;;8266:6;8258;8251:22;8212:2;-1:-1:-1;;8294:16:1;;8350:2;8335:18;;8329:25;8394:2;8379:18;;8373:25;8438:2;8423:18;;8417:25;8482:3;8467:19;;8461:26;8527:3;8512:19;;8506:26;8572:3;8557:19;;8551:26;8617:3;8602:19;;;8596:26;8294:16;;8329:25;;-1:-1:-1;8373:25:1;;8417;;-1:-1:-1;8461:26:1;-1:-1:-1;8506:26:1;;-1:-1:-1;8551:26:1;-1:-1:-1;8596:26:1;;-1:-1:-1;8202:426:1;-1:-1:-1;8202:426:1:o;8633:437::-;;8724:5;8718:12;8751:6;8746:3;8739:19;8777:4;8806:2;8801:3;8797:12;8790:19;;8843:2;8836:5;8832:14;8864:3;8876:169;8890:6;8887:1;8884:13;8876:169;;;8951:13;;8939:26;;8985:12;;;;9020:15;;;;8912:1;8905:9;8876:169;;;-1:-1:-1;9061:3:1;;8694:376;-1:-1:-1;;;;;8694:376:1:o;9075:257::-;;9154:5;9148:12;9181:6;9176:3;9169:19;9197:63;9253:6;9246:4;9241:3;9237:14;9230:4;9223:5;9219:16;9197:63;:::i;:::-;9314:2;9293:15;-1:-1:-1;;9289:29:1;9280:39;;;;9321:4;9276:50;;9124:208;-1:-1:-1;;9124:208:1:o;9337:238::-;9419:1;9412:5;9409:12;9399:2;;9464:10;9459:3;9455:20;9452:1;9445:31;9499:4;9496:1;9489:15;9527:4;9524:1;9517:15;9399:2;9551:18;;9389:186::o;9832:274::-;;9999:6;9993:13;10015:53;10061:6;10056:3;10049:4;10041:6;10037:17;10015:53;:::i;:::-;10084:16;;;;;9969:137;-1:-1:-1;;9969:137:1:o;11379:980::-;;11665:2;11654:9;11650:18;11695:2;11684:9;11677:21;11718:6;11753;11747:13;11784:6;11776;11769:22;11822:2;11811:9;11807:18;11800:25;;11884:2;11874:6;11871:1;11867:14;11856:9;11852:30;11848:39;11834:53;;11906:4;11945:2;11937:6;11933:15;11966:4;11979:254;11993:6;11990:1;11987:13;11979:254;;;12086:2;12082:7;12070:9;12062:6;12058:22;12054:36;12049:3;12042:49;12114:39;12146:6;12137;12131:13;12114:39;:::i;:::-;12104:49;-1:-1:-1;12211:12:1;;;;12176:15;;;;12015:1;12008:9;11979:254;;;11983:3;;12281:9;12273:6;12269:22;12264:2;12253:9;12249:18;12242:50;;;;12309:44;12346:6;12338;12309:44;:::i;:::-;12301:52;11626:733;-1:-1:-1;;;;;11626:733:1:o;12364:261::-;;12543:2;12532:9;12525:21;12563:56;12615:2;12604:9;12600:18;12592:6;12563:56;:::i;13267:864::-;13581:25;;;13568:3;13553:19;;13625:2;13647:18;;;13707:6;13267:864;13741:167;13755:4;13752:1;13749:11;13741:167;;;13814:13;;13802:26;;13848:12;;;;13883:15;;;;13775:1;13768:9;13741:167;;;13745:3;;;;13959:6;13952:14;13945:22;13939:3;13928:9;13924:19;13917:51;13977:55;14027:3;14016:9;14012:19;14004:6;13977:55;:::i;:::-;-1:-1:-1;;;;;14073:6:1;14069:55;14063:3;14052:9;14048:19;14041:84;13535:596;;;;;;;;:::o;14389:481::-;;14620:6;14609:9;14602:25;14663:6;14658:2;14647:9;14643:18;14636:34;14706:3;14701:2;14690:9;14686:18;14679:31;14727:45;14767:3;14756:9;14752:19;14744:6;14727:45;:::i;:::-;14719:53;;-1:-1:-1;;;;;14812:6:1;14808:55;14803:2;14792:9;14788:18;14781:83;14592:278;;;;;;;:::o;14875:217::-;;15022:2;15011:9;15004:21;15042:44;15082:2;15071:9;15067:18;15059:6;15042:44;:::i;15097:288::-;;15272:2;15261:9;15254:21;15292:44;15332:2;15321:9;15317:18;15309:6;15292:44;:::i;:::-;15284:52;;15372:6;15367:2;15356:9;15352:18;15345:34;15244:141;;;;;:::o;22631:281::-;22818:25;;;22806:2;22791:18;;22852:54;22902:2;22887:18;;22879:6;22852:54;:::i;22917:503::-;23161:25;;;23148:3;23133:19;;23195:54;23245:2;23230:18;;23222:6;23195:54;:::i;:::-;-1:-1:-1;;;;;23358:2:1;23350:6;23346:15;23341:2;23330:9;23326:18;23319:43;23410:2;23402:6;23398:15;23393:2;23382:9;23378:18;23371:43;;23115:305;;;;;;;:::o;23425:275::-;23496:2;23490:9;23561:2;23542:13;;-1:-1:-1;;23538:27:1;23526:40;;23596:18;23581:34;;23617:22;;;23578:62;23575:2;;;23643:18;;:::i;:::-;23679:2;23672:22;23470:230;;-1:-1:-1;23470:230:1:o;23705:183::-;;23798:18;23790:6;23787:30;23784:2;;;23820:18;;:::i;:::-;-1:-1:-1;23865:1:1;23861:14;23877:4;23857:25;;23774:114::o;23893:128::-;;23964:1;23960:6;23957:1;23954:13;23951:2;;;23970:18;;:::i;:::-;-1:-1:-1;24006:9:1;;23941:80::o;24026:217::-;;24092:1;24082:2;;-1:-1:-1;;;24117:31:1;;24171:4;24168:1;24161:15;24199:4;24124:1;24189:15;24082:2;-1:-1:-1;24228:9:1;;24072:171::o;24248:453::-;24344:6;24367:5;24381:314;24430:1;24467:2;24457:8;24454:16;24444:2;;24474:5;;;24444:2;24515:4;24510:3;24506:14;24500:4;24497:24;24494:2;;;24524:18;;:::i;:::-;24574:2;24564:8;24560:17;24557:2;;;24589:16;;;;24557:2;24668:17;;;;;24628:15;;24381:314;;24706:139;;24795:44;-1:-1:-1;;24822:8:1;24816:4;24850:922;24934:8;24924:2;;-1:-1:-1;24975:1:1;24989:5;;24924:2;25023:4;25013:2;;-1:-1:-1;25060:1:1;25074:5;;25013:2;25105:4;25123:1;25118:59;;;;25191:1;25186:183;;;;25098:271;;25118:59;25148:1;25139:10;;25162:5;;;25186:183;25223:3;25213:8;25210:17;25207:2;;;25230:18;;:::i;:::-;25286:1;25276:8;25272:16;25263:25;;25314:3;25307:5;25304:14;25301:2;;;25321:18;;:::i;:::-;25354:5;;;25098:271;;25453:2;25443:8;25440:16;25434:3;25428:4;25425:13;25421:36;25415:2;25405:8;25402:16;25397:2;25391:4;25388:12;25384:35;25381:77;25378:2;;;-1:-1:-1;25490:19:1;;;25525:14;;;25522:2;;;25542:18;;:::i;:::-;25575:5;;25378:2;25622:42;25660:3;25650:8;25644:4;25641:1;25622:42;:::i;:::-;25697:6;25692:3;25688:16;25679:7;25676:29;25673:2;;;25708:18;;:::i;:::-;25746:20;;24914:858;-1:-1:-1;;;;24914:858:1:o;25777:168::-;;25883:1;25879;25875:6;25871:14;25868:1;25865:21;25860:1;25853:9;25846:17;25842:45;25839:2;;;25890:18;;:::i;:::-;-1:-1:-1;25930:9:1;;25829:116::o;25950:125::-;;26018:1;26015;26012:8;26009:2;;;26023:18;;:::i;:::-;-1:-1:-1;26060:9:1;;25999:76::o;26080:258::-;26152:1;26162:113;26176:6;26173:1;26170:13;26162:113;;;26252:11;;;26246:18;26233:11;;;26226:39;26198:2;26191:10;26162:113;;;26293:6;26290:1;26287:13;26284:2;;;-1:-1:-1;;26328:1:1;26310:16;;26303:27;26133:205::o;26343:136::-;;26410:5;26400:2;;26419:18;;:::i;:::-;-1:-1:-1;;;26455:18:1;;26390:89::o;26484:380::-;26563:1;26559:12;;;;26606;;;26627:2;;26681:4;26673:6;26669:17;26659:27;;26627:2;26734;26726:6;26723:14;26703:18;26700:38;26697:2;;;26780:10;26775:3;26771:20;26768:1;26761:31;26815:4;26812:1;26805:15;26843:4;26840:1;26833:15;26869:135;;-1:-1:-1;;26929:17:1;;26926:2;;;26949:18;;:::i;:::-;-1:-1:-1;26996:1:1;26985:13;;26916:88::o;27009:127::-;27070:10;27065:3;27061:20;27058:1;27051:31;27101:4;27098:1;27091:15;27125:4;27122:1;27115:15;27141:127;27202:10;27197:3;27193:20;27190:1;27183:31;27233:4;27230:1;27223:15;27257:4;27254:1;27247:15;27273:154;-1:-1:-1;;;;;27352:5:1;27348:54;27341:5;27338:65;27328:2;;27417:1;27414;27407:12;27328:2;27318:109;:::o;27432:118::-;27518:5;27511:13;27504:21;27497:5;27494:32;27484:2;;27540:1;27537;27530:12

Swarm Source

ipfs://d430664f5f63987d8c7e884d4eda4cc1876f1977aa1fea560434b0fb9ca3dfe5
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading