ETH Price: $3,134.38 (+3.39%)
Gas: 0.51 Gwei
 

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Change Deity239627732025-12-07 18:33:591 hr ago1765132439IN
Tellor: TRB Token
0 ETH0.000011130.46105674
Transfer239417192025-12-04 19:25:473 days ago1764876347IN
Tellor: TRB Token
0 ETH0.000031861.18473267
Approve237463662025-11-07 9:01:3530 days ago1762506095IN
Tellor: TRB Token
0 ETH0.000055652.06077883
Approve235576392025-10-11 23:03:2356 days ago1760223803IN
Tellor: TRB Token
0 ETH0.000035641.30138089
Approve235471052025-10-10 11:42:3558 days ago1760096555IN
Tellor: TRB Token
0 ETH0.000030341.10766527
Transfer235470942025-10-10 11:40:2358 days ago1760096423IN
Tellor: TRB Token
0 ETH0.000030611.12850978
Transfer235272302025-10-07 17:00:2361 days ago1759856423IN
Tellor: TRB Token
0 ETH0.000089863.3171922
Approve235272102025-10-07 16:56:2361 days ago1759856183IN
Tellor: TRB Token
0 ETH0.000083993.06619738
Approve235271812025-10-07 16:50:3561 days ago1759855835IN
Tellor: TRB Token
0 ETH0.000100443.66679165
Approve235155132025-10-06 1:40:4762 days ago1759714847IN
Tellor: TRB Token
0 ETH0.000003710.13749953
Approve234738492025-09-30 5:53:4768 days ago1759211627IN
Tellor: TRB Token
0 ETH0.000006450.23913921
Approve234738452025-09-30 5:52:5968 days ago1759211579IN
Tellor: TRB Token
0 ETH0.000006470.23964461
Approve234715762025-09-29 22:16:5968 days ago1759184219IN
Tellor: TRB Token
0 ETH0.000007480.277
Approve233903282025-09-18 13:41:4780 days ago1758202907IN
Tellor: TRB Token
0 ETH0.000119514.36312585
Approve233582862025-09-14 2:18:5984 days ago1757816339IN
Tellor: TRB Token
0 ETH0.000004410.16360935
Approve233582842025-09-14 2:18:3584 days ago1757816315IN
Tellor: TRB Token
0 ETH0.000004250.15739009
Approve233415152025-09-11 18:09:1187 days ago1757614151IN
Tellor: TRB Token
0 ETH0.000039561.44427262
Transfer233415082025-09-11 18:07:3587 days ago1757614055IN
Tellor: TRB Token
0 ETH0.000039551.45896239
Approve233415002025-09-11 18:05:5987 days ago1757613959IN
Tellor: TRB Token
0 ETH0.000036331.32635532
Approve233414992025-09-11 18:05:4787 days ago1757613947IN
Tellor: TRB Token
0 ETH0.000035341.29011233
Approve233414852025-09-11 18:02:5987 days ago1757613779IN
Tellor: TRB Token
0 ETH0.000036271.32406844
Approve233262052025-09-09 14:41:4789 days ago1757428907IN
Tellor: TRB Token
0 ETH0.000055542.05643022
Approve233229162025-09-09 3:41:5989 days ago1757389319IN
Tellor: TRB Token
0 ETH0.000006550.24165518
Approve233072892025-09-06 23:19:2391 days ago1757200763IN
Tellor: TRB Token
0 ETH0.000032441.18427902
Approve233072802025-09-06 23:17:3591 days ago1757200655IN
Tellor: TRB Token
0 ETH0.000032621.19108059
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

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

Contract Source Code Verified (Exact Match)

Contract Name:
TellorMaster

Compiler Version
v0.5.8+commit.23d335f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2019-08-01
*/

pragma solidity ^0.5.0;


//Functions for retrieving min and Max in 51 length array (requestQ)
//Taken partly from: https://github.com/modular-network/ethereum-libraries-array-utils/blob/master/contracts/Array256Lib.sol

library Utilities{

    /**
    * @dev Returns the minimum value in an array.
    */
    function getMax(uint[51] memory data) internal pure returns(uint256 max,uint256 maxIndex) {
        max = data[1];
        maxIndex;
        for(uint i=1;i < data.length;i++){
            if(data[i] > max){
                max = data[i];
                maxIndex = i;
                }
        }
    }

    /**
    * @dev Returns the minimum value in an array.
    */
    function getMin(uint[51] memory data) internal pure returns(uint256 min,uint256 minIndex) {
        minIndex = data.length - 1;
        min = data[minIndex];
        for(uint i = data.length-1;i > 0;i--) {
            if(data[i] < min) {
                min = data[i];
                minIndex = i;
            }
        }
  }




  // /// @dev Returns the minimum value and position in an array.
  // //@note IT IGNORES THE 0 INDEX
  //   function getMin(uint[51] memory arr) internal pure returns (uint256 min, uint256 minIndex) {
  //     assembly {
  //         minIndex := 50
  //         min := mload(add(arr, mul(minIndex , 0x20)))
  //         for {let i := 49 } gt(i,0) { i := sub(i, 1) } {
  //             let item := mload(add(arr, mul(i, 0x20)))
  //             if lt(item,min){
  //                 min := item
  //                 minIndex := i
  //             }
  //         }
  //     }
  //   }


  
  // function getMax(uint256[51] memory arr) internal pure returns (uint256 max, uint256 maxIndex) {
  //     assembly {
  //         for { let i := 0 } lt(i,51) { i := add(i, 1) } {
  //             let item := mload(add(arr, mul(i, 0x20)))
  //             if lt(max, item) {
  //                 max := item
  //                 maxIndex := i
  //             }
  //         }
  //     }
  //   }





  }


/**
* @title Tellor Getters Library
* @dev This is the getter library for all variables in the Tellor Tributes system. TellorGetters references this 
* libary for the getters logic
*/
library TellorGettersLibrary{
    using SafeMath for uint256;

    event NewTellorAddress(address _newTellor); //emmited when a proposed fork is voted true

    /*Functions*/

    //The next two functions are onlyOwner functions.  For Tellor to be truly decentralized, we will need to transfer the Deity to the 0 address.
    //Only needs to be in library
    /**
    * @dev This function allows us to set a new Deity (or remove it) 
    * @param _newDeity address of the new Deity of the tellor system 
    */
    function changeDeity(TellorStorage.TellorStorageStruct storage self, address _newDeity) internal{
        require(self.addressVars[keccak256("_deity")] == msg.sender);
        self.addressVars[keccak256("_deity")] =_newDeity;
    }


    //Only needs to be in library
    /**
    * @dev This function allows the deity to upgrade the Tellor System
    * @param _tellorContract address of new updated TellorCore contract
    */
    function changeTellorContract(TellorStorage.TellorStorageStruct storage self,address _tellorContract) internal{
        require(self.addressVars[keccak256("_deity")] == msg.sender);
        self.addressVars[keccak256("tellorContract")]= _tellorContract;
        emit NewTellorAddress(_tellorContract);
    }


    /*Tellor Getters*/

    /**
    * @dev This function tells you if a given challenge has been completed by a given miner
    * @param _challenge the challenge to search for
    * @param _miner address that you want to know if they solved the challenge
    * @return true if the _miner address provided solved the 
    */
    function didMine(TellorStorage.TellorStorageStruct storage self, bytes32 _challenge,address _miner) internal view returns(bool){
        return self.minersByChallenge[_challenge][_miner];
    }
    

    /**
    * @dev Checks if an address voted in a dispute
    * @param _disputeId to look up
    * @param _address of voting party to look up
    * @return bool of whether or not party voted
    */
    function didVote(TellorStorage.TellorStorageStruct storage self,uint _disputeId, address _address) internal view returns(bool){
        return self.disputesById[_disputeId].voted[_address];
    }


    /**
    * @dev allows Tellor to read data from the addressVars mapping
    * @param _data is the keccak256("variable_name") of the variable that is being accessed. 
    * These are examples of how the variables are saved within other functions:
    * addressVars[keccak256("_owner")]
    * addressVars[keccak256("tellorContract")]
    */
    function getAddressVars(TellorStorage.TellorStorageStruct storage self, bytes32 _data) view internal returns(address){
        return self.addressVars[_data];
    }


    /**
    * @dev Gets all dispute variables
    * @param _disputeId to look up
    * @return bytes32 hash of dispute 
    * @return bool executed where true if it has been voted on
    * @return bool disputeVotePassed
    * @return bool isPropFork true if the dispute is a proposed fork
    * @return address of reportedMiner
    * @return address of reportingParty
    * @return address of proposedForkAddress
    * @return uint of requestId
    * @return uint of timestamp
    * @return uint of value
    * @return uint of minExecutionDate
    * @return uint of numberOfVotes
    * @return uint of blocknumber
    * @return uint of minerSlot
    * @return uint of quorum
    * @return uint of fee
    * @return int count of the current tally
    */
    function getAllDisputeVars(TellorStorage.TellorStorageStruct storage self,uint _disputeId) internal view returns(bytes32, bool, bool, bool, address, address, address,uint[9] memory, int){
        TellorStorage.Dispute storage disp = self.disputesById[_disputeId];
        return(disp.hash,disp.executed, disp.disputeVotePassed, disp.isPropFork, disp.reportedMiner, disp.reportingParty,disp.proposedForkAddress,[disp.disputeUintVars[keccak256("requestId")], disp.disputeUintVars[keccak256("timestamp")], disp.disputeUintVars[keccak256("value")], disp.disputeUintVars[keccak256("minExecutionDate")], disp.disputeUintVars[keccak256("numberOfVotes")], disp.disputeUintVars[keccak256("blockNumber")], disp.disputeUintVars[keccak256("minerSlot")], disp.disputeUintVars[keccak256("quorum")],disp.disputeUintVars[keccak256("fee")]],disp.tally);
    }


    /**
    * @dev Getter function for variables for the requestId being currently mined(currentRequestId)
    * @return current challenge, curretnRequestId, level of difficulty, api/query string, and granularity(number of decimals requested), total tip for the request 
    */
    function getCurrentVariables(TellorStorage.TellorStorageStruct storage self) internal view returns(bytes32, uint, uint,string memory,uint,uint){    
        return (self.currentChallenge,self.uintVars[keccak256("currentRequestId")],self.uintVars[keccak256("difficulty")],self.requestDetails[self.uintVars[keccak256("currentRequestId")]].queryString,self.requestDetails[self.uintVars[keccak256("currentRequestId")]].apiUintVars[keccak256("granularity")],self.requestDetails[self.uintVars[keccak256("currentRequestId")]].apiUintVars[keccak256("totalTip")]);
    }


    /**
    * @dev Checks if a given hash of miner,requestId has been disputed
    * @param _hash is the sha256(abi.encodePacked(_miners[2],_requestId));
    * @return uint disputeId
    */
    function getDisputeIdByDisputeHash(TellorStorage.TellorStorageStruct storage self,bytes32 _hash) internal view returns(uint){
        return  self.disputeIdByDisputeHash[_hash];
    }


    /**
    * @dev Checks for uint variables in the disputeUintVars mapping based on the disuputeId
    * @param _disputeId is the dispute id;
    * @param _data the variable to pull from the mapping. _data = keccak256("variable_name") where variable_name is 
    * the variables/strings used to save the data in the mapping. The variables names are  
    * commented out under the disputeUintVars under the Dispute struct
    * @return uint value for the bytes32 data submitted
    */
    function getDisputeUintVars(TellorStorage.TellorStorageStruct storage self,uint _disputeId,bytes32 _data) internal view returns(uint){
        return self.disputesById[_disputeId].disputeUintVars[_data];
    }

    
    /**
    * @dev Gets the a value for the latest timestamp available
    * @return value for timestamp of last proof of work submited
    * @return true if the is a timestamp for the lastNewValue
    */
    function getLastNewValue(TellorStorage.TellorStorageStruct storage self) internal view returns(uint,bool){
        return (retrieveData(self,self.requestIdByTimestamp[self.uintVars[keccak256("timeOfLastNewValue")]], self.uintVars[keccak256("timeOfLastNewValue")]),true);
    }


    /**
    * @dev Gets the a value for the latest timestamp available
    * @param _requestId being requested
    * @return value for timestamp of last proof of work submited and if true if it exist or 0 and false if it doesn't
    */
    function getLastNewValueById(TellorStorage.TellorStorageStruct storage self,uint _requestId) internal view returns(uint,bool){
        TellorStorage.Request storage _request = self.requestDetails[_requestId]; 
        if(_request.requestTimestamps.length > 0){
            return (retrieveData(self,_requestId,_request.requestTimestamps[_request.requestTimestamps.length - 1]),true);
        }
        else{
            return (0,false);
        }
    }


    /**
    * @dev Gets blocknumber for mined timestamp 
    * @param _requestId to look up
    * @param _timestamp is the timestamp to look up blocknumber
    * @return uint of the blocknumber which the dispute was mined
    */
    function getMinedBlockNum(TellorStorage.TellorStorageStruct storage self,uint _requestId, uint _timestamp) internal view returns(uint){
        return self.requestDetails[_requestId].minedBlockNum[_timestamp];
    }


    /**
    * @dev Gets the 5 miners who mined the value for the specified requestId/_timestamp 
    * @param _requestId to look up
    * @param _timestamp is the timestamp to look up miners for
    * @return the 5 miners' addresses
    */
    function getMinersByRequestIdAndTimestamp(TellorStorage.TellorStorageStruct storage self, uint _requestId, uint _timestamp) internal view returns(address[5] memory){
        return self.requestDetails[_requestId].minersByValue[_timestamp];
    }


    /**
    * @dev Get the name of the token
    * @return string of the token name
    */
    function getName(TellorStorage.TellorStorageStruct storage self) internal pure returns(string memory){
        return "Tellor Tributes";
    }


    /**
    * @dev Counts the number of values that have been submited for the request 
    * if called for the currentRequest being mined it can tell you how many miners have submitted a value for that
    * request so far
    * @param _requestId the requestId to look up
    * @return uint count of the number of values received for the requestId
    */
    function getNewValueCountbyRequestId(TellorStorage.TellorStorageStruct storage self, uint _requestId) internal view returns(uint){
        return self.requestDetails[_requestId].requestTimestamps.length;
    }


    /**
    * @dev Getter function for the specified requestQ index
    * @param _index to look up in the requestQ array
    * @return uint of reqeuestId
    */
    function getRequestIdByRequestQIndex(TellorStorage.TellorStorageStruct storage self, uint _index) internal view returns(uint){
        require(_index <= 50);
        return self.requestIdByRequestQIndex[_index];
    }


    /**
    * @dev Getter function for requestId based on timestamp 
    * @param _timestamp to check requestId
    * @return uint of reqeuestId
    */
    function getRequestIdByTimestamp(TellorStorage.TellorStorageStruct storage self, uint _timestamp) internal view returns(uint){    
        return self.requestIdByTimestamp[_timestamp];
    }


    /**
    * @dev Getter function for requestId based on the qeuaryHash
    * @param _queryHash hash(of string api and granularity) to check if a request already exists
    * @return uint requestId
    */
    function getRequestIdByQueryHash(TellorStorage.TellorStorageStruct storage self, bytes32 _queryHash) internal view returns(uint){    
        return self.requestIdByQueryHash[_queryHash];
    }


    /**
    * @dev Getter function for the requestQ array
    * @return the requestQ arrray
    */
    function getRequestQ(TellorStorage.TellorStorageStruct storage self) view internal returns(uint[51] memory){
        return self.requestQ;
    }


    /**
    * @dev Allowes access to the uint variables saved in the apiUintVars under the requestDetails struct
    * for the requestId specified
    * @param _requestId to look up
    * @param _data the variable to pull from the mapping. _data = keccak256("variable_name") where variable_name is 
    * the variables/strings used to save the data in the mapping. The variables names are  
    * commented out under the apiUintVars under the requestDetails struct
    * @return uint value of the apiUintVars specified in _data for the requestId specified
    */
    function getRequestUintVars(TellorStorage.TellorStorageStruct storage self,uint _requestId,bytes32 _data) internal view returns(uint){
        return self.requestDetails[_requestId].apiUintVars[_data];
    }


    /**
    * @dev Gets the API struct variables that are not mappings
    * @param _requestId to look up
    * @return string of api to query
    * @return string of symbol of api to query
    * @return bytes32 hash of string
    * @return bytes32 of the granularity(decimal places) requested
    * @return uint of index in requestQ array
    * @return uint of current payout/tip for this requestId
    */
    function getRequestVars(TellorStorage.TellorStorageStruct storage self,uint _requestId) internal view returns(string memory,string memory, bytes32,uint, uint, uint) {
        TellorStorage.Request storage _request = self.requestDetails[_requestId]; 
        return (_request.queryString,_request.dataSymbol,_request.queryHash, _request.apiUintVars[keccak256("granularity")],_request.apiUintVars[keccak256("requestQPosition")],_request.apiUintVars[keccak256("totalTip")]);
    }


    /**
    * @dev This function allows users to retireve all information about a staker
    * @param _staker address of staker inquiring about
    * @return uint current state of staker
    * @return uint startDate of staking
    */
    function getStakerInfo(TellorStorage.TellorStorageStruct storage self,address _staker) internal view returns(uint,uint){
        return (self.stakerDetails[_staker].currentStatus,self.stakerDetails[_staker].startDate);
    }


    /**
    * @dev Gets the 5 miners who mined the value for the specified requestId/_timestamp 
    * @param _requestId to look up
    * @param _timestamp is the timestampt to look up miners for
    * @return address[5] array of 5 addresses ofminers that mined the requestId
    */
    function getSubmissionsByTimestamp(TellorStorage.TellorStorageStruct storage self, uint _requestId, uint _timestamp) internal view returns(uint[5] memory){
        return self.requestDetails[_requestId].valuesByTimestamp[_timestamp];
    }

    /**
    * @dev Get the symbol of the token
    * @return string of the token symbol
    */
    function getSymbol(TellorStorage.TellorStorageStruct storage self) internal pure returns(string memory){
        return "TT";
    } 


    /**
    * @dev Gets the timestamp for the value based on their index
    * @param _requestID is the requestId to look up
    * @param _index is the value index to look up
    * @return uint timestamp
    */
    function getTimestampbyRequestIDandIndex(TellorStorage.TellorStorageStruct storage self,uint _requestID, uint _index) internal view returns(uint){
        return self.requestDetails[_requestID].requestTimestamps[_index];
    }


    /**
    * @dev Getter for the variables saved under the TellorStorageStruct uintVars variable
    * @param _data the variable to pull from the mapping. _data = keccak256("variable_name") where variable_name is 
    * the variables/strings used to save the data in the mapping. The variables names are  
    * commented out under the uintVars under the TellorStorageStruct struct
    * This is an example of how data is saved into the mapping within other functions: 
    * self.uintVars[keccak256("stakerCount")]
    * @return uint of specified variable  
    */ 
    function getUintVar(TellorStorage.TellorStorageStruct storage self,bytes32 _data) view internal returns(uint){
        return self.uintVars[_data];
    }


    /**
    * @dev Getter function for next requestId on queue/request with highest payout at time the function is called
    * @return onDeck/info on request with highest payout-- RequestId, Totaltips, and API query string
    */
    function getVariablesOnDeck(TellorStorage.TellorStorageStruct storage self) internal view returns(uint, uint,string memory){ 
        uint newRequestId = getTopRequestID(self);
        return (newRequestId,self.requestDetails[newRequestId].apiUintVars[keccak256("totalTip")],self.requestDetails[newRequestId].queryString);
    }


    /**
    * @dev Getter function for the request with highest payout. This function is used within the getVariablesOnDeck function
    * @return uint _requestId of request with highest payout at the time the function is called
    */
    function getTopRequestID(TellorStorage.TellorStorageStruct storage self) internal view returns(uint _requestId){
            uint _max;
            uint _index;
            (_max,_index) = Utilities.getMax(self.requestQ);
             _requestId = self.requestIdByRequestQIndex[_index];
    }


    /**
    * @dev Gets the 5 miners who mined the value for the specified requestId/_timestamp 
    * @param _requestId to look up
    * @param _timestamp is the timestamp to look up miners for
    * @return bool true if requestId/timestamp is under dispute
    */
    function isInDispute(TellorStorage.TellorStorageStruct storage self, uint _requestId, uint _timestamp) internal view returns(bool){
        return self.requestDetails[_requestId].inDispute[_timestamp];
    }


    /**
    * @dev Retreive value from oracle based on requestId/timestamp
    * @param _requestId being requested
    * @param _timestamp to retreive data/value from
    * @return uint value for requestId/timestamp submitted
    */
    function retrieveData(TellorStorage.TellorStorageStruct storage self, uint _requestId, uint _timestamp) internal view returns (uint) {
        return self.requestDetails[_requestId].finalValues[_timestamp];
    }


    /**
    * @dev Getter for the total_supply of oracle tokens
    * @return uint total supply
    */
    function totalSupply(TellorStorage.TellorStorageStruct storage self) internal view returns (uint) {
       return self.uintVars[keccak256("total_supply")];
    }

}







pragma solidity ^0.5.0;

//Slightly modified SafeMath library - includes a min and max function, removes useless div function
library SafeMath {

  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }

  function add(int256 a, int256 b) internal pure returns (int256 c) {
    if(b > 0){
      c = a + b;
      assert(c >= a);
    }
    else{
      c = a + b;
      assert(c <= a);
    }

  }

  function max(uint a, uint b) internal pure returns (uint256) {
    return a > b ? a : b;
  }

  function max(int256 a, int256 b) internal pure returns (uint256) {
    return a > b ? uint(a) : uint(b);
  }

  function min(uint a, uint b) internal pure returns (uint256) {
    return a < b ? a : b;
  }
  
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a * b;
    assert(a == 0 || c / a == b);
    return c;
  }

  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  function sub(int256 a, int256 b) internal pure returns (int256 c) {
    if(b > 0){
      c = a - b;
      assert(c <= a);
    }
    else{
      c = a - b;
      assert(c >= a);
    }

  }

}



/**
 * @title Tellor Oracle Storage Library
 * @dev Contains all the variables/structs used by Tellor
 */

library TellorStorage {
    //Internal struct for use in proof-of-work submission
    struct Details {
        uint value;
        address miner;
    }

    struct Dispute {
        bytes32 hash;//unique hash of dispute: keccak256(_miner,_requestId,_timestamp)
        int tally;//current tally of votes for - against measure
        bool executed;//is the dispute settled
        bool disputeVotePassed;//did the vote pass?
        bool isPropFork; //true for fork proposal NEW
        address reportedMiner; //miner who alledgedly submitted the 'bad value' will get disputeFee if dispute vote fails
        address reportingParty;//miner reporting the 'bad value'-pay disputeFee will get reportedMiner's stake if dispute vote passes
        address proposedForkAddress;//new fork address (if fork proposal)
        mapping(bytes32 => uint) disputeUintVars;
        //Each of the variables below is saved in the mapping disputeUintVars for each disputeID
        //e.g. TellorStorageStruct.DisputeById[disputeID].disputeUintVars[keccak256("requestId")]
        //These are the variables saved in this mapping:
            // uint keccak256("requestId");//apiID of disputed value
            // uint keccak256("timestamp");//timestamp of distputed value
            // uint keccak256("value"); //the value being disputed
            // uint keccak256("minExecutionDate");//7 days from when dispute initialized
            // uint keccak256("numberOfVotes");//the number of parties who have voted on the measure
            // uint keccak256("blockNumber");// the blocknumber for which votes will be calculated from
            // uint keccak256("minerSlot"); //index in dispute array
            // uint keccak256("quorum"); //quorum for dispute vote NEW
            // uint keccak256("fee"); //fee paid corresponding to dispute
        mapping (address => bool) voted; //mapping of address to whether or not they voted
    }

    struct StakeInfo {
        uint currentStatus;//0-not Staked, 1=Staked, 2=LockedForWithdraw 3= OnDispute
        uint startDate; //stake start date
    }

    //Internal struct to allow balances to be queried by blocknumber for voting purposes
    struct  Checkpoint {
        uint128 fromBlock;// fromBlock is the block number that the value was generated from
        uint128 value;// value is the amount of tokens at a specific block number
    }

    struct Request {
        string queryString;//id to string api
        string dataSymbol;//short name for api request
        bytes32 queryHash;//hash of api string and granularity e.g. keccak256(abi.encodePacked(_sapi,_granularity))
        uint[]  requestTimestamps; //array of all newValueTimestamps requested
        mapping(bytes32 => uint) apiUintVars;
        //Each of the variables below is saved in the mapping apiUintVars for each api request
        //e.g. requestDetails[_requestId].apiUintVars[keccak256("totalTip")]
        //These are the variables saved in this mapping:
            // uint keccak256("granularity"); //multiplier for miners
            // uint keccak256("requestQPosition"); //index in requestQ
            // uint keccak256("totalTip");//bonus portion of payout
        mapping(uint => uint) minedBlockNum;//[apiId][minedTimestamp]=>block.number
        mapping(uint => uint) finalValues;//This the time series of finalValues stored by the contract where uint UNIX timestamp is mapped to value
        mapping(uint => bool) inDispute;//checks if API id is in dispute or finalized.
        mapping(uint => address[5]) minersByValue;
        mapping(uint => uint[5])valuesByTimestamp;
    }

    struct TellorStorageStruct {
        bytes32 currentChallenge; //current challenge to be solved
        uint[51]  requestQ; //uint50 array of the top50 requests by payment amount
        uint[]  newValueTimestamps; //array of all timestamps requested
        Details[5]  currentMiners; //This struct is for organizing the five mined values to find the median
        mapping(bytes32 => address) addressVars;
        //Address fields in the Tellor contract are saved the addressVars mapping
        //e.g. addressVars[keccak256("tellorContract")] = address
        //These are the variables saved in this mapping:
            // address keccak256("tellorContract");//Tellor address
            // address  keccak256("_owner");//Tellor Owner address
            // address  keccak256("_deity");//Tellor Owner that can do things at will
        mapping(bytes32 => uint) uintVars; 
        //uint fields in the Tellor contract are saved the uintVars mapping
        //e.g. uintVars[keccak256("decimals")] = uint
        //These are the variables saved in this mapping:
            // keccak256("decimals");    //18 decimal standard ERC20
            // keccak256("disputeFee");//cost to dispute a mined value
            // keccak256("disputeCount");//totalHistoricalDisputes
            // keccak256("total_supply"); //total_supply of the token in circulation
            // keccak256("stakeAmount");//stakeAmount for miners (we can cut gas if we just hardcode it in...or should it be variable?)
            // keccak256("stakerCount"); //number of parties currently staked
            // keccak256("timeOfLastNewValue"); // time of last challenge solved
            // keccak256("difficulty"); // Difficulty of current block
            // keccak256("currentTotalTips"); //value of highest api/timestamp PayoutPool
            // keccak256("currentRequestId"); //API being mined--updates with the ApiOnQ Id
            // keccak256("requestCount"); // total number of requests through the system
            // keccak256("slotProgress");//Number of miners who have mined this value so far
            // keccak256("miningReward");//Mining Reward in PoWo tokens given to all miners per value
            // keccak256("timeTarget"); //The time between blocks (mined Oracle values)
        mapping(bytes32 => mapping(address=>bool)) minersByChallenge;//This is a boolean that tells you if a given challenge has been completed by a given miner
        mapping(uint => uint) requestIdByTimestamp;//minedTimestamp to apiId
        mapping(uint => uint) requestIdByRequestQIndex; //link from payoutPoolIndex (position in payout pool array) to apiId
        mapping(uint => Dispute) disputesById;//disputeId=> Dispute details
        mapping (address => Checkpoint[]) balances; //balances of a party given blocks
        mapping(address => mapping (address => uint)) allowed; //allowance for a given party and approver
        mapping(address => StakeInfo)  stakerDetails;//mapping from a persons address to their staking info
        mapping(uint => Request) requestDetails;//mapping of apiID to details
        mapping(bytes32 => uint) requestIdByQueryHash;// api bytes32 gets an id = to count of requests array
        mapping(bytes32 => uint) disputeIdByDisputeHash;//maps a hash to an ID for each dispute
    }
}


/**
* @title Tellor Transfer
* @dev Contais the methods related to transfers and ERC20. Tellor.sol and TellorGetters.sol
* reference this library for function's logic.
*/
library TellorTransfer {
    using SafeMath for uint256;

    event Approval(address indexed _owner, address indexed _spender, uint256 _value);//ERC20 Approval event
    event Transfer(address indexed _from, address indexed _to, uint256 _value);//ERC20 Transfer Event

    /*Functions*/
    
    /**
    * @dev Allows for a transfer of tokens to _to
    * @param _to The address to send tokens to
    * @param _amount The amount of tokens to send
    * @return true if transfer is successful
    */
    function transfer(TellorStorage.TellorStorageStruct storage self, address _to, uint256 _amount) public returns (bool success) {
        doTransfer(self,msg.sender, _to, _amount);
        return true;
    }


    /**
    * @notice Send _amount tokens to _to from _from on the condition it
    * is approved by _from
    * @param _from The address holding the tokens being transferred
    * @param _to The address of the recipient
    * @param _amount The amount of tokens to be transferred
    * @return True if the transfer was successful
    */
    function transferFrom(TellorStorage.TellorStorageStruct storage self, address _from, address _to, uint256 _amount) public returns (bool success) {
        require(self.allowed[_from][msg.sender] >= _amount);
        self.allowed[_from][msg.sender] -= _amount;
        doTransfer(self,_from, _to, _amount);
        return true;
    }


    /**
    * @dev This function approves a _spender an _amount of tokens to use
    * @param _spender address
    * @param _amount amount the spender is being approved for
    * @return true if spender appproved successfully
    */
    function approve(TellorStorage.TellorStorageStruct storage self, address _spender, uint _amount) public returns (bool) {
        require(allowedToTrade(self,msg.sender,_amount));
        require(_spender != address(0));
        self.allowed[msg.sender][_spender] = _amount;
        emit Approval(msg.sender, _spender, _amount);
        return true;
    }


    /**
    * @param _user address of party with the balance
    * @param _spender address of spender of parties said balance
    * @return Returns the remaining allowance of tokens granted to the _spender from the _user
    */
    function allowance(TellorStorage.TellorStorageStruct storage self,address _user, address _spender) public view returns (uint) {
       return self.allowed[_user][_spender]; 
    }


    /**
    * @dev Completes POWO transfers by updating the balances on the current block number
    * @param _from address to transfer from
    * @param _to addres to transfer to
    * @param _amount to transfer
    */
    function doTransfer(TellorStorage.TellorStorageStruct storage self, address _from, address _to, uint _amount) public {
        require(_amount > 0);
        require(_to != address(0));
        require(allowedToTrade(self,_from,_amount)); //allowedToTrade checks the stakeAmount is removed from balance if the _user is staked
        uint previousBalance = balanceOfAt(self,_from, block.number);
        updateBalanceAtNow(self.balances[_from], previousBalance - _amount);
        previousBalance = balanceOfAt(self,_to, block.number);
        require(previousBalance + _amount >= previousBalance); // Check for overflow
        updateBalanceAtNow(self.balances[_to], previousBalance + _amount);
        emit Transfer(_from, _to, _amount);
    }


    /**
    * @dev Gets balance of owner specified
    * @param _user is the owner address used to look up the balance
    * @return Returns the balance associated with the passed in _user
    */
    function balanceOf(TellorStorage.TellorStorageStruct storage self,address _user) public view returns (uint) {
        return balanceOfAt(self,_user, block.number);
    }


    /**
    * @dev Queries the balance of _user at a specific _blockNumber
    * @param _user The address from which the balance will be retrieved
    * @param _blockNumber The block number when the balance is queried
    * @return The balance at _blockNumber specified
    */
    function balanceOfAt(TellorStorage.TellorStorageStruct storage self,address _user, uint _blockNumber) public view returns (uint) {
        if ((self.balances[_user].length == 0) || (self.balances[_user][0].fromBlock > _blockNumber)) {
                return 0;
        }
     else {
        return getBalanceAt(self.balances[_user], _blockNumber);
     }
    }


    /**
    * @dev Getter for balance for owner on the specified _block number
    * @param checkpoints gets the mapping for the balances[owner]
    * @param _block is the block number to search the balance on
    * @return the balance at the checkpoint
    */
    function getBalanceAt(TellorStorage.Checkpoint[] storage checkpoints, uint _block) view public returns (uint) {
        if (checkpoints.length == 0) return 0;
        if (_block >= checkpoints[checkpoints.length-1].fromBlock)
            return checkpoints[checkpoints.length-1].value;
        if (_block < checkpoints[0].fromBlock) return 0;
        // Binary search of the value in the array
        uint min = 0;
        uint max = checkpoints.length-1;
        while (max > min) {
            uint mid = (max + min + 1)/ 2;
            if (checkpoints[mid].fromBlock<=_block) {
                min = mid;
            } else {
                max = mid-1;
            }
        }
        return checkpoints[min].value;
    }


    /**
    * @dev This function returns whether or not a given user is allowed to trade a given amount 
    * and removing the staked amount from their balance if they are staked
    * @param _user address of user
    * @param _amount to check if the user can spend
    * @return true if they are allowed to spend the amount being checked
    */
    function allowedToTrade(TellorStorage.TellorStorageStruct storage self,address _user,uint _amount) public view returns(bool) {
        if(self.stakerDetails[_user].currentStatus >0){
            //Removes the stakeAmount from balance if the _user is staked
            if(balanceOf(self,_user).sub(self.uintVars[keccak256("stakeAmount")]).sub(_amount) >= 0){
                return true;
            }
        }
        else if(balanceOf(self,_user).sub(_amount) >= 0){
                return true;
        }
        return false;
    }
    

    /**
    * @dev Updates balance for from and to on the current block number via doTransfer
    * @param checkpoints gets the mapping for the balances[owner]
    * @param _value is the new balance
    */
    function updateBalanceAtNow(TellorStorage.Checkpoint[] storage checkpoints, uint _value) public {
        if ((checkpoints.length == 0) || (checkpoints[checkpoints.length -1].fromBlock < block.number)) {
               TellorStorage.Checkpoint storage newCheckPoint = checkpoints[ checkpoints.length++ ];
               newCheckPoint.fromBlock =  uint128(block.number);
               newCheckPoint.value = uint128(_value);
        } else {
               TellorStorage.Checkpoint storage oldCheckPoint = checkpoints[checkpoints.length-1];
               oldCheckPoint.value = uint128(_value);
        }
    }
}




//import "./SafeMath.sol";

/**
* @title Tellor Dispute
* @dev Contais the methods related to disputes. Tellor.sol references this library for function's logic.
*/


library TellorDispute {
    using SafeMath for uint256;
    using SafeMath for int256;

    event NewDispute(uint indexed _disputeId, uint indexed _requestId, uint _timestamp, address _miner);//emitted when a new dispute is initialized
    event Voted(uint indexed _disputeID, bool _position, address indexed _voter);//emitted when a new vote happens
    event DisputeVoteTallied(uint indexed _disputeID, int _result,address indexed _reportedMiner,address _reportingParty, bool _active);//emitted upon dispute tally
    event NewTellorAddress(address _newTellor); //emmited when a proposed fork is voted true

    /*Functions*/
    
    /**
    * @dev Helps initialize a dispute by assigning it a disputeId
    * when a miner returns a false on the validate array(in Tellor.ProofOfWork) it sends the
    * invalidated value information to POS voting
    * @param _requestId being disputed
    * @param _timestamp being disputed
    * @param _minerIndex the index of the miner that submitted the value being disputed. Since each official value
    * requires 5 miners to submit a value.
    */
    function beginDispute(TellorStorage.TellorStorageStruct storage self,uint _requestId, uint _timestamp,uint _minerIndex) public {
        TellorStorage.Request storage _request = self.requestDetails[_requestId];
        //require that no more than a day( (24 hours * 60 minutes)/10minutes=144 blocks) has gone by since the value was "mined"
        require(block.number- _request.minedBlockNum[_timestamp]<= 144);
        require(_request.minedBlockNum[_timestamp] > 0);
        require(_minerIndex < 5);
        
        //_miner is the miner being disputed. For every mined value 5 miners are saved in an array and the _minerIndex
        //provided by the party initiating the dispute
        address _miner = _request.minersByValue[_timestamp][_minerIndex];
        bytes32 _hash = keccak256(abi.encodePacked(_miner,_requestId,_timestamp));
        
        //Ensures that a dispute is not already open for the that miner, requestId and timestamp
        require(self.disputeIdByDisputeHash[_hash] == 0);
        TellorTransfer.doTransfer(self, msg.sender,address(this), self.uintVars[keccak256("disputeFee")]);
        
        //Increase the dispute count by 1
        self.uintVars[keccak256("disputeCount")] =  self.uintVars[keccak256("disputeCount")] + 1;
        
        //Sets the new disputeCount as the disputeId
        uint disputeId = self.uintVars[keccak256("disputeCount")];
        
        //maps the dispute hash to the disputeId
        self.disputeIdByDisputeHash[_hash] = disputeId;
        //maps the dispute to the Dispute struct
        self.disputesById[disputeId] = TellorStorage.Dispute({
            hash:_hash,
            isPropFork: false,
            reportedMiner: _miner,
            reportingParty: msg.sender,
            proposedForkAddress:address(0),
            executed: false,
            disputeVotePassed: false,
            tally: 0
            });
        
        //Saves all the dispute variables for the disputeId
        self.disputesById[disputeId].disputeUintVars[keccak256("requestId")] = _requestId;
        self.disputesById[disputeId].disputeUintVars[keccak256("timestamp")] = _timestamp;
        self.disputesById[disputeId].disputeUintVars[keccak256("value")] = _request.valuesByTimestamp[_timestamp][_minerIndex];
        self.disputesById[disputeId].disputeUintVars[keccak256("minExecutionDate")] = now + 7 days;
        self.disputesById[disputeId].disputeUintVars[keccak256("blockNumber")] = block.number;
        self.disputesById[disputeId].disputeUintVars[keccak256("minerSlot")] = _minerIndex;
        self.disputesById[disputeId].disputeUintVars[keccak256("fee")]  = self.uintVars[keccak256("disputeFee")];
        
        //Values are sorted as they come in and the official value is the median of the first five
        //So the "official value" miner is always minerIndex==2. If the official value is being 
        //disputed, it sets its status to inDispute(currentStatus = 3) so that users are made aware it is under dispute
        if(_minerIndex == 2){
            self.requestDetails[_requestId].inDispute[_timestamp] = true;
        }
        self.stakerDetails[_miner].currentStatus = 3;
        emit NewDispute(disputeId,_requestId,_timestamp,_miner);
    }


    /**
    * @dev Allows token holders to vote
    * @param _disputeId is the dispute id
    * @param _supportsDispute is the vote (true=the dispute has basis false = vote against dispute)
    */
    function vote(TellorStorage.TellorStorageStruct storage self, uint _disputeId, bool _supportsDispute) public {
        TellorStorage.Dispute storage disp = self.disputesById[_disputeId];
        
        //Get the voteWeight or the balance of the user at the time/blockNumber the disupte began
        uint voteWeight = TellorTransfer.balanceOfAt(self,msg.sender,disp.disputeUintVars[keccak256("blockNumber")]);
        
        //Require that the msg.sender has not voted
        require(disp.voted[msg.sender] != true);
        
        //Requre that the user had a balance >0 at time/blockNumber the disupte began
        require(voteWeight > 0);
        
        //ensures miners that are under dispute cannot vote
        require(self.stakerDetails[msg.sender].currentStatus != 3);
        
        //Update user voting status to true
        disp.voted[msg.sender] = true;
        
        //Update the number of votes for the dispute
        disp.disputeUintVars[keccak256("numberOfVotes")] += 1;
        
        //Update the quorum by adding the voteWeight
        disp.disputeUintVars[keccak256("quorum")] += voteWeight; 
        
        //If the user supports the dispute increase the tally for the dispute by the voteWeight
        //otherwise decrease it
        if (_supportsDispute) {
            disp.tally = disp.tally.add(int(voteWeight));
        } else {
            disp.tally = disp.tally.sub(int(voteWeight));
        }
        
        //Let the network know the user has voted on the dispute and their casted vote
        emit Voted(_disputeId,_supportsDispute,msg.sender);
    }


    /**
    * @dev tallies the votes.
    * @param _disputeId is the dispute id
    */
    function tallyVotes(TellorStorage.TellorStorageStruct storage self, uint _disputeId) public {
        TellorStorage.Dispute storage disp = self.disputesById[_disputeId];
        TellorStorage.Request storage _request = self.requestDetails[disp.disputeUintVars[keccak256("requestId")]];

        //Ensure this has not already been executed/tallied
        require(disp.executed == false);

        //Ensure the time for voting has elapsed
        require(now > disp.disputeUintVars[keccak256("minExecutionDate")]);  

        //If the vote is not a proposed fork 
        if (disp.isPropFork== false){
        TellorStorage.StakeInfo storage stakes = self.stakerDetails[disp.reportedMiner];  
            //If the vote for disputing a value is succesful(disp.tally >0) then unstake the reported 
            // miner and transfer the stakeAmount and dispute fee to the reporting party 
            if (disp.tally > 0 ) { 

                //Changing the currentStatus and startDate unstakes the reported miner and allows for the
                //transfer of the stakeAmount
                stakes.currentStatus = 0;
                stakes.startDate = now -(now % 86400);

                //Decreases the stakerCount since the miner's stake is being slashed
                self.uintVars[keccak256("stakerCount")]--;
                updateDisputeFee(self);

                //Transfers the StakeAmount from the reporded miner to the reporting party
                TellorTransfer.doTransfer(self, disp.reportedMiner,disp.reportingParty, self.uintVars[keccak256("stakeAmount")]);
                
                //Returns the dispute fee to the reportingParty
                TellorTransfer.doTransfer(self, address(this),disp.reportingParty,disp.disputeUintVars[keccak256("fee")]);
                
                //Set the dispute state to passed/true
                disp.disputeVotePassed = true;

                //If the dispute was succeful(miner found guilty) then update the timestamp value to zero
                //so that users don't use this datapoint
                if(_request.inDispute[disp.disputeUintVars[keccak256("timestamp")]] == true){
                    _request.finalValues[disp.disputeUintVars[keccak256("timestamp")]] = 0;
                }

            //If the vote for disputing a value is unsuccesful then update the miner status from being on 
            //dispute(currentStatus=3) to staked(currentStatus =1) and tranfer the dispute fee to the miner
            } else {
                //Update the miner's current status to staked(currentStatus = 1)
                stakes.currentStatus = 1;              
                //tranfer the dispute fee to the miner
                TellorTransfer.doTransfer(self,address(this),disp.reportedMiner,disp.disputeUintVars[keccak256("fee")]);
                if(_request.inDispute[disp.disputeUintVars[keccak256("timestamp")]] == true){
                    _request.inDispute[disp.disputeUintVars[keccak256("timestamp")]] = false;
                }
            }
        //If the vote is for a proposed fork require a 20% quorum before excecuting the update to the new tellor contract address
        } else {
            if(disp.tally > 0 ){
                require(disp.disputeUintVars[keccak256("quorum")] >  (self.uintVars[keccak256("total_supply")] * 20 / 100));
                self.addressVars[keccak256("tellorContract")] = disp.proposedForkAddress;
                disp.disputeVotePassed = true;
                emit NewTellorAddress(disp.proposedForkAddress);
            }
        }
        
        //update the dispute status to executed
        disp.executed = true;
        emit DisputeVoteTallied(_disputeId,disp.tally,disp.reportedMiner,disp.reportingParty,disp.disputeVotePassed);
    }


    /**
    * @dev Allows for a fork to be proposed
    * @param _propNewTellorAddress address for new proposed Tellor
    */
    function proposeFork(TellorStorage.TellorStorageStruct storage self, address _propNewTellorAddress) public {
        bytes32 _hash = keccak256(abi.encodePacked(_propNewTellorAddress));
        require(self.disputeIdByDisputeHash[_hash] == 0);
        TellorTransfer.doTransfer(self, msg.sender,address(this), self.uintVars[keccak256("disputeFee")]);//This is the fork fee
        self.uintVars[keccak256("disputeCount")]++;
        uint disputeId = self.uintVars[keccak256("disputeCount")];
        self.disputeIdByDisputeHash[_hash] = disputeId;
        self.disputesById[disputeId] = TellorStorage.Dispute({
            hash: _hash,
            isPropFork: true,
            reportedMiner: msg.sender, 
            reportingParty: msg.sender, 
            proposedForkAddress: _propNewTellorAddress,
            executed: false,
            disputeVotePassed: false,
            tally: 0
            }); 
        self.disputesById[disputeId].disputeUintVars[keccak256("blockNumber")] = block.number;
        self.disputesById[disputeId].disputeUintVars[keccak256("fee")]  = self.uintVars[keccak256("disputeFee")];
        self.disputesById[disputeId].disputeUintVars[keccak256("minExecutionDate")] = now + 7 days;
    }
    

    /**
    * @dev this function allows the dispute fee to fluctuate based on the number of miners on the system.
    * The floor for the fee is 15e18.
    */
    function updateDisputeFee(TellorStorage.TellorStorageStruct storage self) public {
            //if the number of staked miners divided by the target count of staked miners is less than 1
            if(self.uintVars[keccak256("stakerCount")]*1000/self.uintVars[keccak256("targetMiners")] < 1000){
                //Set the dispute fee at stakeAmt * (1- stakerCount/targetMiners)
                //or at the its minimum of 15e18 
                self.uintVars[keccak256("disputeFee")] = SafeMath.max(15e18,self.uintVars[keccak256("stakeAmount")].mul(1000 - self.uintVars[keccak256("stakerCount")]*1000/self.uintVars[keccak256("targetMiners")])/1000);
            }
            else{
                //otherwise set the dispute fee at 15e18 (the floor/minimum fee allowed)
                self.uintVars[keccak256("disputeFee")] = 15e18;
            }
    }
}


/**
* itle Tellor Dispute
* @dev Contais the methods related to miners staking and unstaking. Tellor.sol 
* references this library for function's logic.
*/

library TellorStake {
    event NewStake(address indexed _sender);//Emits upon new staker
    event StakeWithdrawn(address indexed _sender);//Emits when a staker is now no longer staked
    event StakeWithdrawRequested(address indexed _sender);//Emits when a staker begins the 7 day withdraw period

    /*Functions*/
    
    /**
    * @dev This function stakes the five initial miners, sets the supply and all the constant variables.
    * This function is called by the constructor function on TellorMaster.sol
    */
    function init(TellorStorage.TellorStorageStruct storage self) public{
        require(self.uintVars[keccak256("decimals")] == 0);
        //Give this contract 6000 Tellor Tributes so that it can stake the initial 6 miners
        TellorTransfer.updateBalanceAtNow(self.balances[address(this)], 2**256-1 - 6000e18);

        // //the initial 5 miner addresses are specfied below
        // //changed payable[5] to 6
        address payable[6] memory _initalMiners = [address(0x4c49172A499D18eA3093D59A304eEF63F9754e25),
        address(0xbfc157b09346AC15873160710B00ec8d4d520C5a),
        address(0xa3792188E76c55b1A649fE5Df77DDd4bFD6D03dB),
        address(0xbAF31Bbbba24AF83c8a7a76e16E109d921E4182a),
        address(0x8c9841fEaE5Fc2061F2163033229cE0d9DfAbC71),
        address(0xc31Ef608aDa4003AaD4D2D1ec2Be72232A9E2A86)];
        //Stake each of the 5 miners specified above
        for(uint i=0;i<6;i++){//6th miner to allow for dispute
            //Miner balance is set at 1000e18 at the block that this function is ran
            TellorTransfer.updateBalanceAtNow(self.balances[_initalMiners[i]],1000e18);

            newStake(self, _initalMiners[i]);
        }

        //update the total suppply
        self.uintVars[keccak256("total_supply")] += 6000e18;//6th miner to allow for dispute
        //set Constants
        self.uintVars[keccak256("decimals")] = 18;
        self.uintVars[keccak256("targetMiners")] = 200;
        self.uintVars[keccak256("stakeAmount")] = 1000e18;
        self.uintVars[keccak256("disputeFee")] = 970e18;
        self.uintVars[keccak256("timeTarget")]= 600;
        self.uintVars[keccak256("timeOfLastNewValue")] = now - now  % self.uintVars[keccak256("timeTarget")];
        self.uintVars[keccak256("difficulty")] = 1;
    }


    /**
    * @dev This function allows stakers to request to withdraw their stake (no longer stake)
    * once they lock for withdraw(stakes.currentStatus = 2) they are locked for 7 days before they
    * can withdraw the deposit
    */
    function requestStakingWithdraw(TellorStorage.TellorStorageStruct storage self) public {
        TellorStorage.StakeInfo storage stakes = self.stakerDetails[msg.sender];
        //Require that the miner is staked
        require(stakes.currentStatus == 1);

        //Change the miner staked to locked to be withdrawStake
        stakes.currentStatus = 2;

        //Change the startDate to now since the lock up period begins now
        //and the miner can only withdraw 7 days later from now(check the withdraw function)
        stakes.startDate = now -(now % 86400);

        //Reduce the staker count
        self.uintVars[keccak256("stakerCount")] -= 1;
        TellorDispute.updateDisputeFee(self);
        emit StakeWithdrawRequested(msg.sender);
    }


    /**
    * @dev This function allows users to withdraw their stake after a 7 day waiting period from request 
    */
    function withdrawStake(TellorStorage.TellorStorageStruct storage self) public {
        TellorStorage.StakeInfo storage stakes = self.stakerDetails[msg.sender];
        //Require the staker has locked for withdraw(currentStatus ==2) and that 7 days have 
        //passed by since they locked for withdraw
        require(now - (now % 86400) - stakes.startDate >= 7 days);
        require(stakes.currentStatus == 2);
        stakes.currentStatus = 0;
        emit StakeWithdrawn(msg.sender);
    }


    /**
    * @dev This function allows miners to deposit their stake.
    */
    function depositStake(TellorStorage.TellorStorageStruct storage self) public {
      newStake(self, msg.sender);
      //self adjusting disputeFee
      TellorDispute.updateDisputeFee(self);
    }

    /**
    * @dev This function is used by the init function to succesfully stake the initial 5 miners.
    * The function updates their status/state and status start date so they are locked it so they can't withdraw
    * and updates the number of stakers in the system.
    */
    function newStake(TellorStorage.TellorStorageStruct storage self, address staker) internal {
        require(TellorTransfer.balanceOf(self,staker) >= self.uintVars[keccak256("stakeAmount")]);
        //Ensure they can only stake if they are not currrently staked or if their stake time frame has ended
        //and they are currently locked for witdhraw
        require(self.stakerDetails[staker].currentStatus == 0 || self.stakerDetails[staker].currentStatus == 2);
        self.uintVars[keccak256("stakerCount")] += 1;
        self.stakerDetails[staker] = TellorStorage.StakeInfo({
            currentStatus: 1,
            //this resets their stake start date to today
            startDate: now - (now % 86400)
        });
        emit NewStake(staker);
    }
}


/**
* @title Tellor Getters
* @dev Oracle contract with all tellor getter functions. The logic for the functions on this contract 
* is saved on the TellorGettersLibrary, TellorTransfer, TellorGettersLibrary, and TellorStake
*/
contract TellorGetters{
    using SafeMath for uint256;

    using TellorTransfer for TellorStorage.TellorStorageStruct;
    using TellorGettersLibrary for TellorStorage.TellorStorageStruct;
    using TellorStake for TellorStorage.TellorStorageStruct;

    TellorStorage.TellorStorageStruct tellor;
    
    /**
    * @param _user address
    * @param _spender address
    * @return Returns the remaining allowance of tokens granted to the _spender from the _user
    */
    function allowance(address _user, address _spender) external view returns (uint) {
       return tellor.allowance(_user,_spender);
    }

    /**
    * @dev This function returns whether or not a given user is allowed to trade a given amount  
    * @param _user address
    * @param _amount uint of amount
    * @return true if the user is alloed to trade the amount specified
    */
    function allowedToTrade(address _user,uint _amount) external view returns(bool){
        return tellor.allowedToTrade(_user,_amount);
    }

    /**
    * @dev Gets balance of owner specified
    * @param _user is the owner address used to look up the balance
    * @return Returns the balance associated with the passed in _user
    */
    function balanceOf(address _user) external view returns (uint) { 
        return tellor.balanceOf(_user);
    }

    /**
    * @dev Queries the balance of _user at a specific _blockNumber
    * @param _user The address from which the balance will be retrieved
    * @param _blockNumber The block number when the balance is queried
    * @return The balance at _blockNumber
    */
    function balanceOfAt(address _user, uint _blockNumber) external view returns (uint) {
        return tellor.balanceOfAt(_user,_blockNumber);
    }

    /**
    * @dev This function tells you if a given challenge has been completed by a given miner
    * @param _challenge the challenge to search for
    * @param _miner address that you want to know if they solved the challenge
    * @return true if the _miner address provided solved the 
    */
    function didMine(bytes32 _challenge, address _miner) external view returns(bool){
        return tellor.didMine(_challenge,_miner);
    }


    /**
    * @dev Checks if an address voted in a given dispute
    * @param _disputeId to look up
    * @param _address to look up
    * @return bool of whether or not party voted
    */
    function didVote(uint _disputeId, address _address) external view returns(bool){
        return tellor.didVote(_disputeId,_address);
    }


    /**
    * @dev allows Tellor to read data from the addressVars mapping
    * @param _data is the keccak256("variable_name") of the variable that is being accessed. 
    * These are examples of how the variables are saved within other functions:
    * addressVars[keccak256("_owner")]
    * addressVars[keccak256("tellorContract")]
    */
    function getAddressVars(bytes32 _data) view external returns(address){
        return tellor.getAddressVars(_data);
    }


    /**
    * @dev Gets all dispute variables
    * @param _disputeId to look up
    * @return bytes32 hash of dispute 
    * @return bool executed where true if it has been voted on
    * @return bool disputeVotePassed
    * @return bool isPropFork true if the dispute is a proposed fork
    * @return address of reportedMiner
    * @return address of reportingParty
    * @return address of proposedForkAddress
    * @return uint of requestId
    * @return uint of timestamp
    * @return uint of value
    * @return uint of minExecutionDate
    * @return uint of numberOfVotes
    * @return uint of blocknumber
    * @return uint of minerSlot
    * @return uint of quorum
    * @return uint of fee
    * @return int count of the current tally
    */
    function getAllDisputeVars(uint _disputeId) public view returns(bytes32, bool, bool, bool, address, address, address,uint[9] memory, int){
        return tellor.getAllDisputeVars(_disputeId);
    }
    

    /**
    * @dev Getter function for variables for the requestId being currently mined(currentRequestId)
    * @return current challenge, curretnRequestId, level of difficulty, api/query string, and granularity(number of decimals requested), total tip for the request 
    */
    function getCurrentVariables() external view returns(bytes32, uint, uint,string memory,uint,uint){    
        return tellor.getCurrentVariables();
    }

    /**
    * @dev Checks if a given hash of miner,requestId has been disputed
    * @param _hash is the sha256(abi.encodePacked(_miners[2],_requestId));
    * @return uint disputeId
    */
    function getDisputeIdByDisputeHash(bytes32 _hash) external view returns(uint){
        return  tellor.getDisputeIdByDisputeHash(_hash);
    }
    

    /**
    * @dev Checks for uint variables in the disputeUintVars mapping based on the disuputeId
    * @param _disputeId is the dispute id;
    * @param _data the variable to pull from the mapping. _data = keccak256("variable_name") where variable_name is 
    * the variables/strings used to save the data in the mapping. The variables names are  
    * commented out under the disputeUintVars under the Dispute struct
    * @return uint value for the bytes32 data submitted
    */
    function getDisputeUintVars(uint _disputeId,bytes32 _data) external view returns(uint){
        return tellor.getDisputeUintVars(_disputeId,_data);
    }


    /**
    * @dev Gets the a value for the latest timestamp available
    * @return value for timestamp of last proof of work submited
    * @return true if the is a timestamp for the lastNewValue
    */
    function getLastNewValue() external view returns(uint,bool){
        return tellor.getLastNewValue();
    }


    /**
    * @dev Gets the a value for the latest timestamp available
    * @param _requestId being requested
    * @return value for timestamp of last proof of work submited and if true if it exist or 0 and false if it doesn't
    */
    function getLastNewValueById(uint _requestId) external view returns(uint,bool){
        return tellor.getLastNewValueById(_requestId);
    }
        

    /**
    * @dev Gets blocknumber for mined timestamp 
    * @param _requestId to look up
    * @param _timestamp is the timestamp to look up blocknumber
    * @return uint of the blocknumber which the dispute was mined
    */
    function getMinedBlockNum(uint _requestId, uint _timestamp) external view returns(uint){
        return tellor.getMinedBlockNum(_requestId,_timestamp);
    }


    /**
    * @dev Gets the 5 miners who mined the value for the specified requestId/_timestamp 
    * @param _requestId to look up
    * @param _timestamp is the timestamp to look up miners for
    * @return the 5 miners' addresses
    */
    function getMinersByRequestIdAndTimestamp(uint _requestId, uint _timestamp) external view returns(address[5] memory){
        return tellor.getMinersByRequestIdAndTimestamp(_requestId,_timestamp);
    }


    /**
    * @dev Get the name of the token
    * return string of the token name
    */
    function getName() external view returns(string memory){
        return tellor.getName();
    }


    /**
    * @dev Counts the number of values that have been submited for the request 
    * if called for the currentRequest being mined it can tell you how many miners have submitted a value for that
    * request so far
    * @param _requestId the requestId to look up
    * @return uint count of the number of values received for the requestId
    */
    function getNewValueCountbyRequestId(uint _requestId) external view returns(uint){
        return tellor.getNewValueCountbyRequestId(_requestId);
    }


    /**
    * @dev Getter function for the specified requestQ index
    * @param _index to look up in the requestQ array
    * @return uint of reqeuestId
    */
    function getRequestIdByRequestQIndex(uint _index) external view returns(uint){
        return tellor.getRequestIdByRequestQIndex(_index);
    }


    /**
    * @dev Getter function for requestId based on timestamp 
    * @param _timestamp to check requestId
    * @return uint of reqeuestId
    */
    function getRequestIdByTimestamp(uint _timestamp) external view returns(uint){    
        return tellor.getRequestIdByTimestamp(_timestamp);
    }

    /**
    * @dev Getter function for requestId based on the queryHash
    * @param _request is the hash(of string api and granularity) to check if a request already exists
    * @return uint requestId
    */
    function getRequestIdByQueryHash(bytes32 _request) external view returns(uint){    
        return tellor.getRequestIdByQueryHash(_request);
    }


    /**
    * @dev Getter function for the requestQ array
    * @return the requestQ arrray
    */
    function getRequestQ() view public returns(uint[51] memory){
        return tellor.getRequestQ();
    }


    /**
    * @dev Allowes access to the uint variables saved in the apiUintVars under the requestDetails struct
    * for the requestId specified
    * @param _requestId to look up
    * @param _data the variable to pull from the mapping. _data = keccak256("variable_name") where variable_name is 
    * the variables/strings used to save the data in the mapping. The variables names are  
    * commented out under the apiUintVars under the requestDetails struct
    * @return uint value of the apiUintVars specified in _data for the requestId specified
    */
    function getRequestUintVars(uint _requestId,bytes32 _data) external view returns(uint){
        return tellor.getRequestUintVars(_requestId,_data);
    }


    /**
    * @dev Gets the API struct variables that are not mappings
    * @param _requestId to look up
    * @return string of api to query
    * @return string of symbol of api to query
    * @return bytes32 hash of string
    * @return bytes32 of the granularity(decimal places) requested
    * @return uint of index in requestQ array
    * @return uint of current payout/tip for this requestId
    */
    function getRequestVars(uint _requestId) external view returns(string memory, string memory,bytes32,uint, uint, uint) {
        return tellor.getRequestVars(_requestId);
    }


    /**
    * @dev This function allows users to retireve all information about a staker
    * @param _staker address of staker inquiring about
    * @return uint current state of staker
    * @return uint startDate of staking
    */
    function getStakerInfo(address _staker) external view returns(uint,uint){
        return tellor.getStakerInfo(_staker);
    }
    
    /**
    * @dev Gets the 5 miners who mined the value for the specified requestId/_timestamp 
    * @param _requestId to look up
    * @param _timestamp is the timestampt to look up miners for
    * @return address[5] array of 5 addresses ofminers that mined the requestId
    */    
    function getSubmissionsByTimestamp(uint _requestId, uint _timestamp) external view returns(uint[5] memory){
        return tellor.getSubmissionsByTimestamp(_requestId,_timestamp);
    }

    /**
    * @dev Get the symbol of the token
    * return string of the token symbol
    */
    function getSymbol() external view returns(string memory){
        return tellor.getSymbol();
    } 

    /**
    * @dev Gets the timestamp for the value based on their index
    * @param _requestID is the requestId to look up
    * @param _index is the value index to look up
    * @return uint timestamp
    */
    function getTimestampbyRequestIDandIndex(uint _requestID, uint _index) external view returns(uint){
        return tellor.getTimestampbyRequestIDandIndex(_requestID,_index);
    }


    /**
    * @dev Getter for the variables saved under the TellorStorageStruct uintVars variable
    * @param _data the variable to pull from the mapping. _data = keccak256("variable_name") where variable_name is 
    * the variables/strings used to save the data in the mapping. The variables names are  
    * commented out under the uintVars under the TellorStorageStruct struct
    * This is an example of how data is saved into the mapping within other functions: 
    * self.uintVars[keccak256("stakerCount")]
    * @return uint of specified variable  
    */ 
    function getUintVar(bytes32 _data) view public returns(uint){
        return tellor.getUintVar(_data);
    }


    /**
    * @dev Getter function for next requestId on queue/request with highest payout at time the function is called
    * @return onDeck/info on request with highest payout-- RequestId, Totaltips, and API query string
    */
    function getVariablesOnDeck() external view returns(uint, uint,string memory){    
        return tellor.getVariablesOnDeck();
    }

    
    /**
    * @dev Gets the 5 miners who mined the value for the specified requestId/_timestamp 
    * @param _requestId to look up
    * @param _timestamp is the timestamp to look up miners for
    * @return bool true if requestId/timestamp is under dispute
    */
    function isInDispute(uint _requestId, uint _timestamp) external view returns(bool){
        return tellor.isInDispute(_requestId,_timestamp);
    }
    

    /**
    * @dev Retreive value from oracle based on timestamp
    * @param _requestId being requested
    * @param _timestamp to retreive data/value from
    * @return value for timestamp submitted
    */
    function retrieveData(uint _requestId, uint _timestamp) external view returns (uint) {
        return tellor.retrieveData(_requestId,_timestamp);
    }


    /**
    * @dev Getter for the total_supply of oracle tokens
    * @return uint total supply
    */
    function totalSupply() external view returns (uint) {
       return tellor.totalSupply();
    }


}

/**
* @title Tellor Master
* @dev This is the Master contract with all tellor getter functions and delegate call to Tellor. 
* The logic for the functions on this contract is saved on the TellorGettersLibrary, TellorTransfer, 
* TellorGettersLibrary, and TellorStake
*/
contract TellorMaster is TellorGetters{
    
    event NewTellorAddress(address _newTellor);

    /**
    * @dev The constructor sets the original `tellorStorageOwner` of the contract to the sender
    * account, the tellor contract to the Tellor master address and owner to the Tellor master owner address 
    * @param _tellorContract is the address for the tellor contract
    */
    constructor (address _tellorContract)  public{
        tellor.init();
        tellor.addressVars[keccak256("_owner")] = msg.sender;
        tellor.addressVars[keccak256("_deity")] = msg.sender;
        tellor.addressVars[keccak256("tellorContract")]= _tellorContract;
        emit NewTellorAddress(_tellorContract);
    }
    

    /**
    * @dev Gets the 5 miners who mined the value for the specified requestId/_timestamp 
    * @dev Only needs to be in library
    * @param _newDeity the new Deity in the contract
    */

    function changeDeity(address _newDeity) external{
        tellor.changeDeity(_newDeity);
    }


    /**
    * @dev  allows for the deity to make fast upgrades.  Deity should be 0 address if decentralized
    * @param _tellorContract the address of the new Tellor Contract
    */
    function changeTellorContract(address _tellorContract) external{
        tellor.changeTellorContract(_tellorContract);
    }
  

    /**
    * @dev This is the fallback function that allows contracts to call the tellor contract at the address stored
    */
    function () external payable {
        address addr = tellor.addressVars[keccak256("tellorContract")];
        bytes memory _calldata = msg.data;
        assembly {
            let result := delegatecall(not(0), addr, add(_calldata, 0x20), mload(_calldata), 0, 0)
            let size := returndatasize
            let ptr := mload(0x40)
            returndatacopy(ptr, 0, size)
            // revert instead of invalid() bc if the underlying call failed with invalid() it already wasted gas.
            // if the call returned error data, forward it
            switch result case 0 { revert(ptr, size) }
            default { return(ptr, size) }
        }
    }
}

Contract Security Audit

Contract ABI

API
[{"constant":true,"inputs":[{"name":"_timestamp","type":"uint256"}],"name":"getRequestIdByTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_requestId","type":"uint256"},{"name":"_timestamp","type":"uint256"}],"name":"getSubmissionsByTimestamp","outputs":[{"name":"","type":"uint256[5]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_data","type":"bytes32"}],"name":"getAddressVars","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSymbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getVariablesOnDeck","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_request","type":"bytes32"}],"name":"getRequestIdByQueryHash","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_requestId","type":"uint256"}],"name":"getLastNewValueById","outputs":[{"name":"","type":"uint256"},{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_requestId","type":"uint256"},{"name":"_timestamp","type":"uint256"}],"name":"isInDispute","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_requestId","type":"uint256"}],"name":"getNewValueCountbyRequestId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newDeity","type":"address"}],"name":"changeDeity","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"},{"name":"_blockNumber","type":"uint256"}],"name":"balanceOfAt","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_data","type":"bytes32"}],"name":"getUintVar","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"getRequestIdByRequestQIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_challenge","type":"bytes32"},{"name":"_miner","type":"address"}],"name":"didMine","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_requestId","type":"uint256"},{"name":"_timestamp","type":"uint256"}],"name":"getMinersByRequestIdAndTimestamp","outputs":[{"name":"","type":"address[5]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_staker","type":"address"}],"name":"getStakerInfo","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_requestID","type":"uint256"},{"name":"_index","type":"uint256"}],"name":"getTimestampbyRequestIDandIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_disputeId","type":"uint256"},{"name":"_data","type":"bytes32"}],"name":"getDisputeUintVars","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_requestId","type":"uint256"},{"name":"_timestamp","type":"uint256"}],"name":"retrieveData","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"},{"name":"_amount","type":"uint256"}],"name":"allowedToTrade","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentVariables","outputs":[{"name":"","type":"bytes32"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"string"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_disputeId","type":"uint256"},{"name":"_address","type":"address"}],"name":"didVote","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tellorContract","type":"address"}],"name":"changeTellorContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_disputeId","type":"uint256"}],"name":"getAllDisputeVars","outputs":[{"name":"","type":"bytes32"},{"name":"","type":"bool"},{"name":"","type":"bool"},{"name":"","type":"bool"},{"name":"","type":"address"},{"name":"","type":"address"},{"name":"","type":"address"},{"name":"","type":"uint256[9]"},{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getRequestQ","outputs":[{"name":"","type":"uint256[51]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_requestId","type":"uint256"},{"name":"_timestamp","type":"uint256"}],"name":"getMinedBlockNum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_hash","type":"bytes32"}],"name":"getDisputeIdByDisputeHash","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_requestId","type":"uint256"},{"name":"_data","type":"bytes32"}],"name":"getRequestUintVars","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_requestId","type":"uint256"}],"name":"getRequestVars","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"bytes32"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getLastNewValue","outputs":[{"name":"","type":"uint256"},{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_tellorContract","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_newTellor","type":"address"}],"name":"NewTellorAddress","type":"event"}]

608060405234801561001057600080fd5b50604051602080620031e78339810180604052602081101561003157600080fd5b8101908080519060200190929190505050600073114d0b96a13bdd0778908b9a02a1606475995249634601f1cd90916040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b15801561009457600080fd5b505af41580156100a8573d6000803e3d6000fd5b50505050336000603f01600060405180807f5f6f776e6572000000000000000000000000000000000000000000000000000081525060060190506040518091039020815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550336000603f01600060405180807f5f6465697479000000000000000000000000000000000000000000000000000081525060060190506040518091039020815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806000603f01600060405180807f74656c6c6f72436f6e7472616374000000000000000000000000000000000000815250600e0190506040518091039020815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fc2d1449eb0b6547aa426e09d9942a77fa4fc8cd3296305b3163e22452e0bcb8d81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150612f2980620002be6000396000f3fe6080604052600436106101f95760003560e01c806370a082311161010d578063ae0a8279116100a0578063da3799411161006f578063da37994114610f66578063dd62ed3e14610fb5578063e0ae93c11461103a578063e1eee6d614611093578063fc7cf0a0146111cf576101f9565b8063ae0a827914610d2a578063af0b132714610d7b578063b541302914610eba578063c775b54214610f0d576101f9565b806393fa4915116100dc57806393fa491514610b38578063999cf26c14610b91578063a22e407a14610c04578063a7c438bc14610cb7576101f9565b806370a08231146109b5578063733bdef014610a1a57806377fbb66314610a865780637f6fd5d914610adf576101f9565b80633180f8df116101905780634ee2cd7e1161015f5780634ee2cd7e146107b4578063612c8f7f146108235780636173c0b81461087257806363bb82ad146108c157806369026d6314610934576101f9565b80633180f8df1461065d5780633df0777b146106b757806346eee1c41461071457806347abd7f114610763576101f9565b806317d7de7c116101cc57806317d7de7c146104b557806318160ddd1461054557806319e8e03b146105705780631db842f01461060e576101f9565b80630f0b424d146102da57806311c9851214610329578063133bee5e146103aa5780631507040114610425575b600080603f01600060405180807f74656c6c6f72436f6e7472616374000000000000000000000000000000000000815250600e0190506040518091039020815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060606000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060008082516020840185600019f43d604051816000823e82600081146102d6578282f35b8282fd5b3480156102e657600080fd5b50610313600480360360208110156102fd57600080fd5b8101908080359060200190929190505050611205565b6040518082815260200191505060405180910390f35b34801561033557600080fd5b5061036c6004803603604081101561034c57600080fd5b810190808035906020019092919080359060200190929190505050611222565b6040518082600560200280838360005b8381101561039757808201518184015260208101905061037c565b5050505090500191505060405180910390f35b3480156103b657600080fd5b506103e3600480360360208110156103cd57600080fd5b8101908080359060200190929190505050611248565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561043157600080fd5b5061043a611265565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561047a57808201518184015260208101905061045f565b50505050905090810190601f1680156104a75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104c157600080fd5b506104ca611276565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561050a5780820151818401526020810190506104ef565b50505050905090810190601f1680156105375780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561055157600080fd5b5061055a611287565b6040518082815260200191505060405180910390f35b34801561057c57600080fd5b50610585611298565b6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156105d15780820151818401526020810190506105b6565b50505050905090810190601f1680156105fe5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b34801561061a57600080fd5b506106476004803603602081101561063157600080fd5b81019080803590602001909291905050506112b2565b6040518082815260200191505060405180910390f35b34801561066957600080fd5b506106966004803603602081101561068057600080fd5b81019080803590602001909291905050506112cf565b60405180838152602001821515151581526020019250505060405180910390f35b3480156106c357600080fd5b506106fa600480360360408110156106da57600080fd5b8101908080359060200190929190803590602001909291905050506112ef565b604051808215151515815260200191505060405180910390f35b34801561072057600080fd5b5061074d6004803603602081101561073757600080fd5b810190808035906020019092919050505061130f565b6040518082815260200191505060405180910390f35b34801561076f57600080fd5b506107b26004803603602081101561078657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061132c565b005b3480156107c057600080fd5b5061080d600480360360408110156107d757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611343565b6040518082815260200191505060405180910390f35b34801561082f57600080fd5b5061085c6004803603602081101561084657600080fd5b8101908080359060200190929190505050611415565b6040518082815260200191505060405180910390f35b34801561087e57600080fd5b506108ab6004803603602081101561089557600080fd5b8101908080359060200190929190505050611432565b6040518082815260200191505060405180910390f35b3480156108cd57600080fd5b5061091a600480360360408110156108e457600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061144f565b604051808215151515815260200191505060405180910390f35b34801561094057600080fd5b506109776004803603604081101561095757600080fd5b81019080803590602001909291908035906020019092919050505061146f565b6040518082600560200280838360005b838110156109a2578082015181840152602081019050610987565b5050505090500191505060405180910390f35b3480156109c157600080fd5b50610a04600480360360208110156109d857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611495565b6040518082815260200191505060405180910390f35b348015610a2657600080fd5b50610a6960048036036020811015610a3d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061155e565b604051808381526020018281526020019250505060405180910390f35b348015610a9257600080fd5b50610ac960048036036040811015610aa957600080fd5b81019080803590602001909291908035906020019092919050505061157e565b6040518082815260200191505060405180910390f35b348015610aeb57600080fd5b50610b2260048036036040811015610b0257600080fd5b81019080803590602001909291908035906020019092919050505061159e565b6040518082815260200191505060405180910390f35b348015610b4457600080fd5b50610b7b60048036036040811015610b5b57600080fd5b8101908080359060200190929190803590602001909291905050506115be565b6040518082815260200191505060405180910390f35b348015610b9d57600080fd5b50610bea60048036036040811015610bb457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115de565b604051808215151515815260200191505060405180910390f35b348015610c1057600080fd5b50610c196116b0565b6040518087815260200186815260200185815260200180602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015610c77578082015181840152602081019050610c5c565b50505050905090810190601f168015610ca45780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b348015610cc357600080fd5b50610d1060048036036040811015610cda57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116d8565b604051808215151515815260200191505060405180910390f35b348015610d3657600080fd5b50610d7960048036036020811015610d4d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116f8565b005b348015610d8757600080fd5b50610db460048036036020811015610d9e57600080fd5b810190808035906020019092919050505061170f565b604051808a81526020018915151515815260200188151515158152602001871515151581526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183600960200280838360005b83811015610e99578082015181840152602081019050610e7e565b50505050905001828152602001995050505050505050505060405180910390f35b348015610ec657600080fd5b50610ecf611757565b6040518082603360200280838360005b83811015610efa578082015181840152602081019050610edf565b5050505090500191505060405180910390f35b348015610f1957600080fd5b50610f5060048036036040811015610f3057600080fd5b81019080803590602001909291908035906020019092919050505061176e565b6040518082815260200191505060405180910390f35b348015610f7257600080fd5b50610f9f60048036036020811015610f8957600080fd5b810190808035906020019092919050505061178e565b6040518082815260200191505060405180910390f35b348015610fc157600080fd5b5061102460048036036040811015610fd857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506117ab565b6040518082815260200191505060405180910390f35b34801561104657600080fd5b5061107d6004803603604081101561105d57600080fd5b8101908080359060200190929190803590602001909291905050506118a9565b6040518082815260200191505060405180910390f35b34801561109f57600080fd5b506110cc600480360360208110156110b657600080fd5b81019080803590602001909291905050506118c9565b604051808060200180602001878152602001868152602001858152602001848152602001838103835289818151815260200191508051906020019080838360005b8381101561112857808201518184015260208101905061110d565b50505050905090810190601f1680156111555780820380516001836020036101000a031916815260200191505b50838103825288818151815260200191508051906020019080838360005b8381101561118e578082015181840152602081019050611173565b50505050905090810190601f1680156111bb5780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390f35b3480156111db57600080fd5b506111e46118fb565b60405180838152602001821515151581526020019250505060405180910390f35b600061121b82600061191090919063ffffffff16565b9050919050565b61122a612e73565b611240838360006119309092919063ffffffff16565b905092915050565b600061125e8260006119a690919063ffffffff16565b9050919050565b606061127160006119e6565b905090565b60606112826000611a25565b905090565b60006112936000611a64565b905090565b60008060606112a76000611ab8565b925092509250909192565b60006112c8826000611bec90919063ffffffff16565b9050919050565b6000806112e6836000611c0c90919063ffffffff16565b91509150915091565b600061130783836000611c859092919063ffffffff16565b905092915050565b6000611325826000611cc790919063ffffffff16565b9050919050565b611340816000611ced90919063ffffffff16565b50565b60008073aaed2224d17326c9b710925f075dce1e2bbc77df633f48b1ff909185856040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060206040518083038186803b1580156113d257600080fd5b505af41580156113e6573d6000803e3d6000fd5b505050506040513d60208110156113fc57600080fd5b8101908080519060200190929190505050905092915050565b600061142b826000611e1c90919063ffffffff16565b9050919050565b6000611448826000611e3c90919063ffffffff16565b9050919050565b600061146783836000611e6a9092919063ffffffff16565b905092915050565b611477612e95565b61148d83836000611ed59092919063ffffffff16565b905092915050565b60008073aaed2224d17326c9b710925f075dce1e2bbc77df6393b182b39091846040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561151c57600080fd5b505af4158015611530573d6000803e3d6000fd5b505050506040513d602081101561154657600080fd5b81019080805190602001909291905050509050919050565b600080611575836000611f8190919063ffffffff16565b91509150915091565b6000611596838360006120199092919063ffffffff16565b905092915050565b60006115b6838360006120529092919063ffffffff16565b905092915050565b60006115d6838360006120879092919063ffffffff16565b905092915050565b60008073aaed2224d17326c9b710925f075dce1e2bbc77df63acaab9e2909185856040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060206040518083038186803b15801561166d57600080fd5b505af4158015611681573d6000803e3d6000fd5b505050506040513d602081101561169757600080fd5b8101908080519060200190929190505050905092915050565b600080600060606000806116c460006120bc565b955095509550955095509550909192939495565b60006116f0838360006123c69092919063ffffffff16565b905092915050565b61170c81600061243490919063ffffffff16565b50565b6000806000806000806000611722612eb7565b60006117388a60006125c690919063ffffffff16565b9850985098509850985098509850985098509193959799909294969850565b61175f612eda565b611769600061299c565b905090565b6000611786838360006129eb9092919063ffffffff16565b905092915050565b60006117a4826000612a2090919063ffffffff16565b9050919050565b60008073aaed2224d17326c9b710925f075dce1e2bbc77df63bf32006c909185856040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b15801561186657600080fd5b505af415801561187a573d6000803e3d6000fd5b505050506040513d602081101561189057600080fd5b8101908080519060200190929190505050905092915050565b60006118c183836000612a409092919063ffffffff16565b905092915050565b6060806000806000806118e6876000612a7590919063ffffffff16565b95509550955095509550955091939550919395565b6000806119086000612cd4565b915091509091565b600082604201600083815260200190815260200160002054905092915050565b611938612e73565b8360480160008481526020019081526020016000206009016000838152602001908152602001600020600580602002604051908101604052809291908260058015611998576020028201915b815481526020019060010190808311611984575b505050505090509392505050565b600082603f01600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b60606040518060400160405280600281526020017f54540000000000000000000000000000000000000000000000000000000000008152509050919050565b60606040518060400160405280600f81526020017f54656c6c6f7220547269627574657300000000000000000000000000000000008152509050919050565b600081604001600060405180807f746f74616c5f737570706c790000000000000000000000000000000000000000815250600c01905060405180910390208152602001908152602001600020549050919050565b60008060606000611ac885612d96565b905080856048016000838152602001908152602001600020600401600060405180807f746f74616c54697000000000000000000000000000000000000000000000000081525060080190506040518091039020815260200190815260200160002054866048016000848152602001908152602001600020600001808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611bd75780601f10611bac57610100808354040283529160200191611bd7565b820191906000526020600020905b815481529060010190602001808311611bba57829003601f168201915b50505050509050935093509350509193909250565b600082604901600083815260200190815260200160002054905092915050565b60008060008460480160008581526020019081526020016000209050600081600301805490501115611c7257611c66858583600301600185600301805490500381548110611c5657fe5b9060005260206000200154612087565b60019250925050611c7e565b60008081915092509250505b9250929050565b6000836048016000848152602001908152602001600020600701600083815260200190815260200160002060009054906101000a900460ff1690509392505050565b600082604801600083815260200190815260200160002060030180549050905092915050565b3373ffffffffffffffffffffffffffffffffffffffff1682603f01600060405180807f5f6465697479000000000000000000000000000000000000000000000000000081525060060190506040518091039020815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d8f57600080fd5b8082603f01600060405180807f5f6465697479000000000000000000000000000000000000000000000000000081525060060190506040518091039020815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600082604001600083815260200190815260200160002054905092915050565b60006032821115611e4c57600080fd5b82604301600083815260200190815260200160002054905092915050565b600083604101600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690509392505050565b611edd612e95565b8360480160008481526020019081526020016000206008016000838152602001908152602001600020600580602002604051908101604052809291908260058015611f73576020028201915b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611f29575b505050505090509392505050565b6000808360470160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548460470160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154915091509250929050565b6000836048016000848152602001908152602001600020600301828154811061203e57fe5b906000526020600020015490509392505050565b600083604401600084815260200190815260200160002060050160008381526020019081526020016000205490509392505050565b600083604801600084815260200190815260200160002060060160008381526020019081526020016000205490509392505050565b60008060006060600080866000015487604001600060405180807f63757272656e74526571756573744964000000000000000000000000000000008152506010019050604051809103902081526020019081526020016000205488604001600060405180807f646966666963756c747900000000000000000000000000000000000000000000815250600a01905060405180910390208152602001908152602001600020548960480160008b604001600060405180807f63757272656e74526571756573744964000000000000000000000000000000008152506010019050604051809103902081526020019081526020016000205481526020019081526020016000206000018a60480160008c604001600060405180807f63757272656e7452657175657374496400000000000000000000000000000000815250601001905060405180910390208152602001908152602001600020548152602001908152602001600020600401600060405180807f6772616e756c6172697479000000000000000000000000000000000000000000815250600b01905060405180910390208152602001908152602001600020548b60480160008d604001600060405180807f63757272656e7452657175657374496400000000000000000000000000000000815250601001905060405180910390208152602001908152602001600020548152602001908152602001600020600401600060405180807f746f74616c54697000000000000000000000000000000000000000000000000081525060080190506040518091039020815260200190815260200160002054828054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123aa5780601f1061237f576101008083540402835291602001916123aa565b820191906000526020600020905b81548152906001019060200180831161238d57829003601f168201915b5050505050925095509550955095509550955091939550919395565b600083604401600084815260200190815260200160002060060160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690509392505050565b3373ffffffffffffffffffffffffffffffffffffffff1682603f01600060405180807f5f6465697479000000000000000000000000000000000000000000000000000081525060060190506040518091039020815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146124d657600080fd5b8082603f01600060405180807f74656c6c6f72436f6e7472616374000000000000000000000000000000000000815250600e0190506040518091039020815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fc2d1449eb0b6547aa426e09d9942a77fa4fc8cd3296305b3163e22452e0bcb8d81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b60008060008060008060006125d9612eb7565b6000808b60440160008c8152602001908152602001600020905080600001548160020160009054906101000a900460ff168260020160019054906101000a900460ff168360020160029054906101000a900460ff168460020160039054906101000a900473ffffffffffffffffffffffffffffffffffffffff168560030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168660040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660405180610120016040528089600501600060405180807f726571756573744964000000000000000000000000000000000000000000000081525060090190506040518091039020815260200190815260200160002054815260200189600501600060405180807f74696d657374616d70000000000000000000000000000000000000000000000081525060090190506040518091039020815260200190815260200160002054815260200189600501600060405180807f76616c756500000000000000000000000000000000000000000000000000000081525060050190506040518091039020815260200190815260200160002054815260200189600501600060405180807f6d696e457865637574696f6e446174650000000000000000000000000000000081525060100190506040518091039020815260200190815260200160002054815260200189600501600060405180807f6e756d6265724f66566f74657300000000000000000000000000000000000000815250600d0190506040518091039020815260200190815260200160002054815260200189600501600060405180807f626c6f636b4e756d626572000000000000000000000000000000000000000000815250600b0190506040518091039020815260200190815260200160002054815260200189600501600060405180807f6d696e6572536c6f74000000000000000000000000000000000000000000000081525060090190506040518091039020815260200190815260200160002054815260200189600501600060405180807f71756f72756d000000000000000000000000000000000000000000000000000081525060060190506040518091039020815260200190815260200160002054815260200189600501600060405180807f6665650000000000000000000000000000000000000000000000000000000000815250600301905060405180910390208152602001908152602001600020548152508860010154995099509950995099509950995099509950509295985092959850929598565b6129a4612eda565b816001016033806020026040519081016040528092919082603380156129df576020028201915b8154815260200190600101908083116129cb575b50505050509050919050565b600083604801600084815260200190815260200160002060050160008381526020019081526020016000205490509392505050565b600082604a01600083815260200190815260200160002054905092915050565b600083604801600084815260200190815260200160002060040160008381526020019081526020016000205490509392505050565b606080600080600080600088604801600089815260200190815260200160002090508060000181600101826002015483600401600060405180807f6772616e756c6172697479000000000000000000000000000000000000000000815250600b019050604051809103902081526020019081526020016000205484600401600060405180807f7265717565737451506f736974696f6e000000000000000000000000000000008152506010019050604051809103902081526020019081526020016000205485600401600060405180807f746f74616c54697000000000000000000000000000000000000000000000000081525060080190506040518091039020815260200190815260200160002054858054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612c1a5780601f10612bef57610100808354040283529160200191612c1a565b820191906000526020600020905b815481529060010190602001808311612bfd57829003601f168201915b50505050509550848054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612cb65780601f10612c8b57610100808354040283529160200191612cb6565b820191906000526020600020905b815481529060010190602001808311612c9957829003601f168201915b50505050509450965096509650965096509650509295509295509295565b600080612d8b8384604201600086604001600060405180807f74696d654f664c6173744e657756616c756500000000000000000000000000008152506012019050604051809103902081526020019081526020016000205481526020019081526020016000205485604001600060405180807f74696d654f664c6173744e657756616c7565000000000000000000000000000081525060120190506040518091039020815260200190815260200160002054612087565b600191509150915091565b6000806000612de384600101603380602002604051908101604052809291908260338015612dd9576020028201915b815481526020019060010190808311612dc5575b5050505050612e0a565b80925081935050508360430160008281526020019081526020016000205492505050919050565b60008082600160338110612e1a57fe5b602002015191506000600190505b6033811015612e6d5782848260338110612e3e57fe5b60200201511115612e6057838160338110612e5557fe5b602002015192508091505b8080600101915050612e28565b50915091565b6040518060a00160405280600590602082028038833980820191505090505090565b6040518060a00160405280600590602082028038833980820191505090505090565b604051806101200160405280600990602082028038833980820191505090505090565b60405180610660016040528060339060208202803883398082019150509050509056fea165627a7a7230582006e09de4d2ff8ea7df56db950a0a9f5960b9419da791b9b87465cf51b2f709320029000000000000000000000000350e67de9e92f55c1164556b02deb320b45a4a2a

Deployed Bytecode

0x6080604052600436106101f95760003560e01c806370a082311161010d578063ae0a8279116100a0578063da3799411161006f578063da37994114610f66578063dd62ed3e14610fb5578063e0ae93c11461103a578063e1eee6d614611093578063fc7cf0a0146111cf576101f9565b8063ae0a827914610d2a578063af0b132714610d7b578063b541302914610eba578063c775b54214610f0d576101f9565b806393fa4915116100dc57806393fa491514610b38578063999cf26c14610b91578063a22e407a14610c04578063a7c438bc14610cb7576101f9565b806370a08231146109b5578063733bdef014610a1a57806377fbb66314610a865780637f6fd5d914610adf576101f9565b80633180f8df116101905780634ee2cd7e1161015f5780634ee2cd7e146107b4578063612c8f7f146108235780636173c0b81461087257806363bb82ad146108c157806369026d6314610934576101f9565b80633180f8df1461065d5780633df0777b146106b757806346eee1c41461071457806347abd7f114610763576101f9565b806317d7de7c116101cc57806317d7de7c146104b557806318160ddd1461054557806319e8e03b146105705780631db842f01461060e576101f9565b80630f0b424d146102da57806311c9851214610329578063133bee5e146103aa5780631507040114610425575b600080603f01600060405180807f74656c6c6f72436f6e7472616374000000000000000000000000000000000000815250600e0190506040518091039020815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060606000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060008082516020840185600019f43d604051816000823e82600081146102d6578282f35b8282fd5b3480156102e657600080fd5b50610313600480360360208110156102fd57600080fd5b8101908080359060200190929190505050611205565b6040518082815260200191505060405180910390f35b34801561033557600080fd5b5061036c6004803603604081101561034c57600080fd5b810190808035906020019092919080359060200190929190505050611222565b6040518082600560200280838360005b8381101561039757808201518184015260208101905061037c565b5050505090500191505060405180910390f35b3480156103b657600080fd5b506103e3600480360360208110156103cd57600080fd5b8101908080359060200190929190505050611248565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561043157600080fd5b5061043a611265565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561047a57808201518184015260208101905061045f565b50505050905090810190601f1680156104a75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104c157600080fd5b506104ca611276565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561050a5780820151818401526020810190506104ef565b50505050905090810190601f1680156105375780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561055157600080fd5b5061055a611287565b6040518082815260200191505060405180910390f35b34801561057c57600080fd5b50610585611298565b6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156105d15780820151818401526020810190506105b6565b50505050905090810190601f1680156105fe5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b34801561061a57600080fd5b506106476004803603602081101561063157600080fd5b81019080803590602001909291905050506112b2565b6040518082815260200191505060405180910390f35b34801561066957600080fd5b506106966004803603602081101561068057600080fd5b81019080803590602001909291905050506112cf565b60405180838152602001821515151581526020019250505060405180910390f35b3480156106c357600080fd5b506106fa600480360360408110156106da57600080fd5b8101908080359060200190929190803590602001909291905050506112ef565b604051808215151515815260200191505060405180910390f35b34801561072057600080fd5b5061074d6004803603602081101561073757600080fd5b810190808035906020019092919050505061130f565b6040518082815260200191505060405180910390f35b34801561076f57600080fd5b506107b26004803603602081101561078657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061132c565b005b3480156107c057600080fd5b5061080d600480360360408110156107d757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611343565b6040518082815260200191505060405180910390f35b34801561082f57600080fd5b5061085c6004803603602081101561084657600080fd5b8101908080359060200190929190505050611415565b6040518082815260200191505060405180910390f35b34801561087e57600080fd5b506108ab6004803603602081101561089557600080fd5b8101908080359060200190929190505050611432565b6040518082815260200191505060405180910390f35b3480156108cd57600080fd5b5061091a600480360360408110156108e457600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061144f565b604051808215151515815260200191505060405180910390f35b34801561094057600080fd5b506109776004803603604081101561095757600080fd5b81019080803590602001909291908035906020019092919050505061146f565b6040518082600560200280838360005b838110156109a2578082015181840152602081019050610987565b5050505090500191505060405180910390f35b3480156109c157600080fd5b50610a04600480360360208110156109d857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611495565b6040518082815260200191505060405180910390f35b348015610a2657600080fd5b50610a6960048036036020811015610a3d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061155e565b604051808381526020018281526020019250505060405180910390f35b348015610a9257600080fd5b50610ac960048036036040811015610aa957600080fd5b81019080803590602001909291908035906020019092919050505061157e565b6040518082815260200191505060405180910390f35b348015610aeb57600080fd5b50610b2260048036036040811015610b0257600080fd5b81019080803590602001909291908035906020019092919050505061159e565b6040518082815260200191505060405180910390f35b348015610b4457600080fd5b50610b7b60048036036040811015610b5b57600080fd5b8101908080359060200190929190803590602001909291905050506115be565b6040518082815260200191505060405180910390f35b348015610b9d57600080fd5b50610bea60048036036040811015610bb457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115de565b604051808215151515815260200191505060405180910390f35b348015610c1057600080fd5b50610c196116b0565b6040518087815260200186815260200185815260200180602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015610c77578082015181840152602081019050610c5c565b50505050905090810190601f168015610ca45780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b348015610cc357600080fd5b50610d1060048036036040811015610cda57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116d8565b604051808215151515815260200191505060405180910390f35b348015610d3657600080fd5b50610d7960048036036020811015610d4d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116f8565b005b348015610d8757600080fd5b50610db460048036036020811015610d9e57600080fd5b810190808035906020019092919050505061170f565b604051808a81526020018915151515815260200188151515158152602001871515151581526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183600960200280838360005b83811015610e99578082015181840152602081019050610e7e565b50505050905001828152602001995050505050505050505060405180910390f35b348015610ec657600080fd5b50610ecf611757565b6040518082603360200280838360005b83811015610efa578082015181840152602081019050610edf565b5050505090500191505060405180910390f35b348015610f1957600080fd5b50610f5060048036036040811015610f3057600080fd5b81019080803590602001909291908035906020019092919050505061176e565b6040518082815260200191505060405180910390f35b348015610f7257600080fd5b50610f9f60048036036020811015610f8957600080fd5b810190808035906020019092919050505061178e565b6040518082815260200191505060405180910390f35b348015610fc157600080fd5b5061102460048036036040811015610fd857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506117ab565b6040518082815260200191505060405180910390f35b34801561104657600080fd5b5061107d6004803603604081101561105d57600080fd5b8101908080359060200190929190803590602001909291905050506118a9565b6040518082815260200191505060405180910390f35b34801561109f57600080fd5b506110cc600480360360208110156110b657600080fd5b81019080803590602001909291905050506118c9565b604051808060200180602001878152602001868152602001858152602001848152602001838103835289818151815260200191508051906020019080838360005b8381101561112857808201518184015260208101905061110d565b50505050905090810190601f1680156111555780820380516001836020036101000a031916815260200191505b50838103825288818151815260200191508051906020019080838360005b8381101561118e578082015181840152602081019050611173565b50505050905090810190601f1680156111bb5780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390f35b3480156111db57600080fd5b506111e46118fb565b60405180838152602001821515151581526020019250505060405180910390f35b600061121b82600061191090919063ffffffff16565b9050919050565b61122a612e73565b611240838360006119309092919063ffffffff16565b905092915050565b600061125e8260006119a690919063ffffffff16565b9050919050565b606061127160006119e6565b905090565b60606112826000611a25565b905090565b60006112936000611a64565b905090565b60008060606112a76000611ab8565b925092509250909192565b60006112c8826000611bec90919063ffffffff16565b9050919050565b6000806112e6836000611c0c90919063ffffffff16565b91509150915091565b600061130783836000611c859092919063ffffffff16565b905092915050565b6000611325826000611cc790919063ffffffff16565b9050919050565b611340816000611ced90919063ffffffff16565b50565b60008073aaed2224d17326c9b710925f075dce1e2bbc77df633f48b1ff909185856040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060206040518083038186803b1580156113d257600080fd5b505af41580156113e6573d6000803e3d6000fd5b505050506040513d60208110156113fc57600080fd5b8101908080519060200190929190505050905092915050565b600061142b826000611e1c90919063ffffffff16565b9050919050565b6000611448826000611e3c90919063ffffffff16565b9050919050565b600061146783836000611e6a9092919063ffffffff16565b905092915050565b611477612e95565b61148d83836000611ed59092919063ffffffff16565b905092915050565b60008073aaed2224d17326c9b710925f075dce1e2bbc77df6393b182b39091846040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561151c57600080fd5b505af4158015611530573d6000803e3d6000fd5b505050506040513d602081101561154657600080fd5b81019080805190602001909291905050509050919050565b600080611575836000611f8190919063ffffffff16565b91509150915091565b6000611596838360006120199092919063ffffffff16565b905092915050565b60006115b6838360006120529092919063ffffffff16565b905092915050565b60006115d6838360006120879092919063ffffffff16565b905092915050565b60008073aaed2224d17326c9b710925f075dce1e2bbc77df63acaab9e2909185856040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060206040518083038186803b15801561166d57600080fd5b505af4158015611681573d6000803e3d6000fd5b505050506040513d602081101561169757600080fd5b8101908080519060200190929190505050905092915050565b600080600060606000806116c460006120bc565b955095509550955095509550909192939495565b60006116f0838360006123c69092919063ffffffff16565b905092915050565b61170c81600061243490919063ffffffff16565b50565b6000806000806000806000611722612eb7565b60006117388a60006125c690919063ffffffff16565b9850985098509850985098509850985098509193959799909294969850565b61175f612eda565b611769600061299c565b905090565b6000611786838360006129eb9092919063ffffffff16565b905092915050565b60006117a4826000612a2090919063ffffffff16565b9050919050565b60008073aaed2224d17326c9b710925f075dce1e2bbc77df63bf32006c909185856040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b15801561186657600080fd5b505af415801561187a573d6000803e3d6000fd5b505050506040513d602081101561189057600080fd5b8101908080519060200190929190505050905092915050565b60006118c183836000612a409092919063ffffffff16565b905092915050565b6060806000806000806118e6876000612a7590919063ffffffff16565b95509550955095509550955091939550919395565b6000806119086000612cd4565b915091509091565b600082604201600083815260200190815260200160002054905092915050565b611938612e73565b8360480160008481526020019081526020016000206009016000838152602001908152602001600020600580602002604051908101604052809291908260058015611998576020028201915b815481526020019060010190808311611984575b505050505090509392505050565b600082603f01600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b60606040518060400160405280600281526020017f54540000000000000000000000000000000000000000000000000000000000008152509050919050565b60606040518060400160405280600f81526020017f54656c6c6f7220547269627574657300000000000000000000000000000000008152509050919050565b600081604001600060405180807f746f74616c5f737570706c790000000000000000000000000000000000000000815250600c01905060405180910390208152602001908152602001600020549050919050565b60008060606000611ac885612d96565b905080856048016000838152602001908152602001600020600401600060405180807f746f74616c54697000000000000000000000000000000000000000000000000081525060080190506040518091039020815260200190815260200160002054866048016000848152602001908152602001600020600001808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611bd75780601f10611bac57610100808354040283529160200191611bd7565b820191906000526020600020905b815481529060010190602001808311611bba57829003601f168201915b50505050509050935093509350509193909250565b600082604901600083815260200190815260200160002054905092915050565b60008060008460480160008581526020019081526020016000209050600081600301805490501115611c7257611c66858583600301600185600301805490500381548110611c5657fe5b9060005260206000200154612087565b60019250925050611c7e565b60008081915092509250505b9250929050565b6000836048016000848152602001908152602001600020600701600083815260200190815260200160002060009054906101000a900460ff1690509392505050565b600082604801600083815260200190815260200160002060030180549050905092915050565b3373ffffffffffffffffffffffffffffffffffffffff1682603f01600060405180807f5f6465697479000000000000000000000000000000000000000000000000000081525060060190506040518091039020815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d8f57600080fd5b8082603f01600060405180807f5f6465697479000000000000000000000000000000000000000000000000000081525060060190506040518091039020815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600082604001600083815260200190815260200160002054905092915050565b60006032821115611e4c57600080fd5b82604301600083815260200190815260200160002054905092915050565b600083604101600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690509392505050565b611edd612e95565b8360480160008481526020019081526020016000206008016000838152602001908152602001600020600580602002604051908101604052809291908260058015611f73576020028201915b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611f29575b505050505090509392505050565b6000808360470160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548460470160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154915091509250929050565b6000836048016000848152602001908152602001600020600301828154811061203e57fe5b906000526020600020015490509392505050565b600083604401600084815260200190815260200160002060050160008381526020019081526020016000205490509392505050565b600083604801600084815260200190815260200160002060060160008381526020019081526020016000205490509392505050565b60008060006060600080866000015487604001600060405180807f63757272656e74526571756573744964000000000000000000000000000000008152506010019050604051809103902081526020019081526020016000205488604001600060405180807f646966666963756c747900000000000000000000000000000000000000000000815250600a01905060405180910390208152602001908152602001600020548960480160008b604001600060405180807f63757272656e74526571756573744964000000000000000000000000000000008152506010019050604051809103902081526020019081526020016000205481526020019081526020016000206000018a60480160008c604001600060405180807f63757272656e7452657175657374496400000000000000000000000000000000815250601001905060405180910390208152602001908152602001600020548152602001908152602001600020600401600060405180807f6772616e756c6172697479000000000000000000000000000000000000000000815250600b01905060405180910390208152602001908152602001600020548b60480160008d604001600060405180807f63757272656e7452657175657374496400000000000000000000000000000000815250601001905060405180910390208152602001908152602001600020548152602001908152602001600020600401600060405180807f746f74616c54697000000000000000000000000000000000000000000000000081525060080190506040518091039020815260200190815260200160002054828054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123aa5780601f1061237f576101008083540402835291602001916123aa565b820191906000526020600020905b81548152906001019060200180831161238d57829003601f168201915b5050505050925095509550955095509550955091939550919395565b600083604401600084815260200190815260200160002060060160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690509392505050565b3373ffffffffffffffffffffffffffffffffffffffff1682603f01600060405180807f5f6465697479000000000000000000000000000000000000000000000000000081525060060190506040518091039020815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146124d657600080fd5b8082603f01600060405180807f74656c6c6f72436f6e7472616374000000000000000000000000000000000000815250600e0190506040518091039020815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fc2d1449eb0b6547aa426e09d9942a77fa4fc8cd3296305b3163e22452e0bcb8d81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b60008060008060008060006125d9612eb7565b6000808b60440160008c8152602001908152602001600020905080600001548160020160009054906101000a900460ff168260020160019054906101000a900460ff168360020160029054906101000a900460ff168460020160039054906101000a900473ffffffffffffffffffffffffffffffffffffffff168560030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168660040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660405180610120016040528089600501600060405180807f726571756573744964000000000000000000000000000000000000000000000081525060090190506040518091039020815260200190815260200160002054815260200189600501600060405180807f74696d657374616d70000000000000000000000000000000000000000000000081525060090190506040518091039020815260200190815260200160002054815260200189600501600060405180807f76616c756500000000000000000000000000000000000000000000000000000081525060050190506040518091039020815260200190815260200160002054815260200189600501600060405180807f6d696e457865637574696f6e446174650000000000000000000000000000000081525060100190506040518091039020815260200190815260200160002054815260200189600501600060405180807f6e756d6265724f66566f74657300000000000000000000000000000000000000815250600d0190506040518091039020815260200190815260200160002054815260200189600501600060405180807f626c6f636b4e756d626572000000000000000000000000000000000000000000815250600b0190506040518091039020815260200190815260200160002054815260200189600501600060405180807f6d696e6572536c6f74000000000000000000000000000000000000000000000081525060090190506040518091039020815260200190815260200160002054815260200189600501600060405180807f71756f72756d000000000000000000000000000000000000000000000000000081525060060190506040518091039020815260200190815260200160002054815260200189600501600060405180807f6665650000000000000000000000000000000000000000000000000000000000815250600301905060405180910390208152602001908152602001600020548152508860010154995099509950995099509950995099509950509295985092959850929598565b6129a4612eda565b816001016033806020026040519081016040528092919082603380156129df576020028201915b8154815260200190600101908083116129cb575b50505050509050919050565b600083604801600084815260200190815260200160002060050160008381526020019081526020016000205490509392505050565b600082604a01600083815260200190815260200160002054905092915050565b600083604801600084815260200190815260200160002060040160008381526020019081526020016000205490509392505050565b606080600080600080600088604801600089815260200190815260200160002090508060000181600101826002015483600401600060405180807f6772616e756c6172697479000000000000000000000000000000000000000000815250600b019050604051809103902081526020019081526020016000205484600401600060405180807f7265717565737451506f736974696f6e000000000000000000000000000000008152506010019050604051809103902081526020019081526020016000205485600401600060405180807f746f74616c54697000000000000000000000000000000000000000000000000081525060080190506040518091039020815260200190815260200160002054858054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612c1a5780601f10612bef57610100808354040283529160200191612c1a565b820191906000526020600020905b815481529060010190602001808311612bfd57829003601f168201915b50505050509550848054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612cb65780601f10612c8b57610100808354040283529160200191612cb6565b820191906000526020600020905b815481529060010190602001808311612c9957829003601f168201915b50505050509450965096509650965096509650509295509295509295565b600080612d8b8384604201600086604001600060405180807f74696d654f664c6173744e657756616c756500000000000000000000000000008152506012019050604051809103902081526020019081526020016000205481526020019081526020016000205485604001600060405180807f74696d654f664c6173744e657756616c7565000000000000000000000000000081525060120190506040518091039020815260200190815260200160002054612087565b600191509150915091565b6000806000612de384600101603380602002604051908101604052809291908260338015612dd9576020028201915b815481526020019060010190808311612dc5575b5050505050612e0a565b80925081935050508360430160008281526020019081526020016000205492505050919050565b60008082600160338110612e1a57fe5b602002015191506000600190505b6033811015612e6d5782848260338110612e3e57fe5b60200201511115612e6057838160338110612e5557fe5b602002015192508091505b8080600101915050612e28565b50915091565b6040518060a00160405280600590602082028038833980820191505090505090565b6040518060a00160405280600590602082028038833980820191505090505090565b604051806101200160405280600990602082028038833980820191505090505090565b60405180610660016040528060339060208202803883398082019150509050509056fea165627a7a7230582006e09de4d2ff8ea7df56db950a0a9f5960b9419da791b9b87465cf51b2f709320029

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

000000000000000000000000350e67de9e92f55c1164556b02deb320b45a4a2a

-----Decoded View---------------
Arg [0] : _tellorContract (address): 0x350E67De9E92f55c1164556b02deB320b45a4a2a

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


Libraries Used


Deployed Bytecode Sourcemap

68330:2182:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69872:12;69887:6;:18;;:47;69906:27;;;;;;;;;;;;;;;;;;;69887:47;;;;;;;;;;;;;;;;;;;;;69872:62;;69945:22;69970:8;;69945:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;69945:33:0;;;;;;;;70097:1;70094;70082:9;70076:16;70069:4;70058:9;70054:20;70048:4;70044:1;70040:6;70027:72;70125:14;70170:4;70164:11;70212:4;70209:1;70204:3;70189:28;70413:6;70425:1;70420:28;;;;70484:4;70479:3;70472:17;70420:28;70441:4;70436:3;70429:17;62375:149;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62375:149:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;62375:149:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;65136:187;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65136:187:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;65136:187:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;65136:187:0;;;;;;;;;;;;;;;;57000:123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57000:123:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;57000:123:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;65429:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65429:101:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;65429:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61264:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61264:97:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;61264:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67946;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67946:97:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;66879:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66879:134:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;66879:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62747:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62747:148:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;62747:148:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;60146:142;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60146:142:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;60146:142:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67299:149;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67299:149:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;67299:149:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;61734:153;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61734:153:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;61734:153:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;69270:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;69270:96:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;69270:96:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;55695:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55695:148:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;55695:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;66524:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66524:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;66524:110:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;62063:145;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62063:145:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;62063:145:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;56157:139;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56157:139:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;56157:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;60956:204;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60956:204:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;60956:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;60956:204:0;;;;;;;;;;;;;;;;55301:113;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55301:113:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;55301:113:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;64704:127;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64704:127:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;64704:127:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;65756:181;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65756:181:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;65756:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;59411:155;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59411:155:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;59411:155:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;67676:153;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67676:153:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;67676:153:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54951:141;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54951:141:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;54951:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;58402:155;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58402:155:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;58402:155:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56501:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56501:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;56501:140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;69563:126;;8:9:-1;5:2;;;30:1;27;20:12;5:2;69563:126:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;69563:126:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;57907:199;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57907:199:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;57907:199:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;57907:199:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63008:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63008:105:0;;;:::i;:::-;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;63008:105:0;;;;;;;;;;;;;;;;60541:159;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60541:159:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;60541:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;58760:143;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58760:143:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58760:143:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54552:138;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54552:138:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;54552:138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;63695:155;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63695:155:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;63695:155:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;64277:177;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64277:177:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;64277:177:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;64277:177:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;64277:177:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59786:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59786:109:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62375:149;62447:4;62474:42;62505:10;62474:6;:30;;:42;;;;:::i;:::-;62467:49;;62375:149;;;:::o;65136:187::-;65227:14;;:::i;:::-;65260:55;65293:10;65304;65260:6;:32;;:55;;;;;:::i;:::-;65253:62;;65136:187;;;;:::o;57000:123::-;57061:7;57087:28;57109:5;57087:6;:21;;:28;;;;:::i;:::-;57080:35;;57000:123;;;:::o;65429:101::-;65472:13;65504:18;:6;:16;:18::i;:::-;65497:25;;65429:101;:::o;61264:97::-;61305:13;61337:16;:6;:14;:16::i;:::-;61330:23;;61264:97;:::o;67946:::-;67992:4;68015:20;:6;:18;:20::i;:::-;68008:27;;67946:97;:::o;66879:134::-;66931:4;66937;66942:13;66978:27;:6;:25;:27::i;:::-;66971:34;;;;;;66879:134;;;:::o;62747:148::-;62820:4;62847:40;62878:8;62847:6;:30;;:40;;;;:::i;:::-;62840:47;;62747:148;;;:::o;60146:142::-;60214:4;60219;60242:38;60269:10;60242:6;:26;;:38;;;;:::i;:::-;60235:45;;;;60146:142;;;:::o;67299:149::-;67376:4;67399:41;67418:10;67429;67399:6;:18;;:41;;;;;:::i;:::-;67392:48;;67299:149;;;;:::o;61734:153::-;61810:4;61833:46;61868:10;61833:6;:34;;:46;;;;:::i;:::-;61826:53;;61734:153;;;:::o;69270:96::-;69329:29;69348:9;69329:6;:18;;:29;;;;:::i;:::-;69270:96;:::o;55695:148::-;55773:4;55797:6;:18;;;;55816:5;55822:12;55797:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55797:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55797:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;55797:38:0;;;;;;;;;;;;;;;;55790:45;;55695:148;;;;:::o;66524:110::-;66579:4;66602:24;66620:5;66602:6;:17;;:24;;;;:::i;:::-;66595:31;;66524:110;;;:::o;62063:145::-;62135:4;62158:42;62193:6;62158;:34;;:42;;;;:::i;:::-;62151:49;;62063:145;;;:::o;56157:139::-;56232:4;56255:33;56270:10;56281:6;56255;:14;;:33;;;;;:::i;:::-;56248:40;;56157:139;;;;:::o;60956:204::-;61054:17;;:::i;:::-;61090:62;61130:10;61141;61090:6;:39;;:62;;;;;:::i;:::-;61083:69;;60956:204;;;;:::o;55301:113::-;55358:4;55383:6;:16;;;;55400:5;55383:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55383:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55383:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;55383:23:0;;;;;;;;;;;;;;;;55376:30;;55301:113;;;:::o;64704:127::-;64766:4;64771;64794:29;64815:7;64794:6;:20;;:29;;;;:::i;:::-;64787:36;;;;64704:127;;;:::o;65756:181::-;65849:4;65872:57;65911:10;65922:6;65872;:38;;:57;;;;;:::i;:::-;65865:64;;65756:181;;;;:::o;59411:155::-;59492:4;59515:43;59541:10;59552:5;59515:6;:25;;:43;;;;;:::i;:::-;59508:50;;59411:155;;;;:::o;67676:153::-;67755:4;67779:42;67799:10;67810;67779:6;:19;;:42;;;;;:::i;:::-;67772:49;;67676:153;;;;:::o;54951:141::-;55025:4;55048:6;:21;;;;55070:5;55076:7;55048:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55048:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55048:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;55048:36:0;;;;;;;;;;;;;;;;55041:43;;54951:141;;;;:::o;58402:155::-;58455:7;58464:4;58470;58475:13;58489:4;58494;58521:28;:6;:26;:28::i;:::-;58514:35;;;;;;;;;;;;58402:155;;;;;;:::o;56501:140::-;56575:4;56598:35;56613:10;56624:8;56598:6;:14;;:35;;;;;:::i;:::-;56591:42;;56501:140;;;;:::o;69563:126::-;69637:44;69665:15;69637:6;:27;;:44;;;;:::i;:::-;69563:126;:::o;57907:199::-;57971:7;57980:4;57986;57992;57998:7;58007;58016;58024:14;;:::i;:::-;58040:3;58062:36;58087:10;58062:6;:24;;:36;;;;:::i;:::-;58055:43;;;;;;;;;;;;;;;;;;57907:199;;;;;;;;;;;:::o;63008:105::-;63051:15;;:::i;:::-;63085:20;:6;:18;:20::i;:::-;63078:27;;63008:105;:::o;60541:159::-;60623:4;60646:46;60670:10;60681;60646:6;:23;;:46;;;;;:::i;:::-;60639:53;;60541:159;;;;:::o;58760:143::-;58832:4;58856:39;58889:5;58856:6;:32;;:39;;;;:::i;:::-;58848:47;;58760:143;;;:::o;54552:138::-;54627:4;54650:6;:16;;;;54667:5;54673:8;54650:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54650:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54650:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;54650:32:0;;;;;;;;;;;;;;;;54643:39;;54552:138;;;;:::o;63695:155::-;63776:4;63799:43;63825:10;63836:5;63799:6;:25;;:43;;;;;:::i;:::-;63792:50;;63695:155;;;;:::o;64277:177::-;64340:13;64355;64369:7;64377:4;64383;64389;64413:33;64435:10;64413:6;:21;;:33;;;;:::i;:::-;64406:40;;;;;;;;;;;;64277:177;;;;;;;:::o;59786:109::-;59835:4;59840;59863:24;:6;:22;:24::i;:::-;59856:31;;;;59786:109;;:::o;12200:192::-;12320:4;12347;:25;;:37;12373:10;12347:37;;;;;;;;;;;;12340:44;;12200:192;;;;:::o;15540:241::-;15679:14;;:::i;:::-;15712:4;:19;;:31;15732:10;15712:31;;;;;;;;;;;:49;;:61;15762:10;15712:61;;;;;;;;;;;15705:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15540:241;;;;;:::o;4870:166::-;4979:7;5005:4;:16;;:23;5022:5;5005:23;;;;;;;;;;;;;;;;;;;;;4998:30;;4870:166;;;;:::o;15888:133::-;15977:13;16002:11;;;;;;;;;;;;;;;;;;;15888:133;;;:::o;10909:144::-;10996:13;11021:24;;;;;;;;;;;;;;;;;;;10909:144;;;:::o;19413:163::-;19505:4;19528;:13;;:40;19542:25;;;;;;;;;;;;;;;;;;;19528:40;;;;;;;;;;;;19521:47;;19413:163;;;:::o;17464:331::-;17562:4;17568;17573:13;17599:17;17619:21;17635:4;17619:15;:21::i;:::-;17599:41;;17659:12;17672:4;:19;;:33;17692:12;17672:33;;;;;;;;;;;:45;;:68;17718:21;;;;;;;;;;;;;;;;;;;17672:68;;;;;;;;;;;;17741:4;:19;;:33;17761:12;17741:33;;;;;;;;;;;:45;;17651:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17464:331;;;;;:::o;12613:195::-;12736:4;12763;:25;;:37;12789:10;12763:37;;;;;;;;;;;;12756:44;;12613:195;;;;:::o;9378:461::-;9493:4;9498;9514:38;9555:4;:19;;:31;9575:10;9555:31;;;;;;;;;;;9514:72;;9637:1;9601:8;:26;;:33;;;;:37;9598:234;;;9662:95;9675:4;9680:10;9691:8;:26;;9754:1;9718:8;:26;;:33;;;;:37;9691:65;;;;;;;;;;;;;;;;9662:12;:95::i;:::-;9758:4;9654:109;;;;;;;9598:234;9812:1;9814:5;9804:16;;;;;;;;9378:461;;;;;;:::o;18624:209::-;18749:4;18772;:19;;:31;18792:10;18772:31;;;;;;;;;;;:41;;:53;18814:10;18772:53;;;;;;;;;;;;;;;;;;;;;18765:60;;18624:209;;;;;:::o;11426:211::-;11550:4;11573;:19;;:31;11593:10;11573:31;;;;;;;;;;;:49;;:56;;;;11566:63;;11426:211;;;;:::o;2806:234::-;2962:10;2921:51;;:4;:16;;:37;2938:19;;;;;;;;;;;;;;;;;;;2921:37;;;;;;;;;;;;;;;;;;;;;:51;;;2913:60;;;;;;3023:9;2984:4;:16;;:37;3001:19;;;;;;;;;;;;;;;;;;;2984:37;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;2806:234;;:::o;17064:155::-;17168:4;17191;:13;;:20;17205:5;17191:20;;;;;;;;;;;;17184:27;;17064:155;;;;:::o;11813:220::-;11933:4;11967:2;11957:6;:12;;11949:21;;;;;;11988:4;:29;;:37;12018:6;11988:37;;;;;;;;;;;;11981:44;;11813:220;;;;:::o;3900:195::-;4022:4;4045;:22;;:34;4068:10;4045:34;;;;;;;;;;;:42;4080:6;4045:42;;;;;;;;;;;;;;;;;;;;;;;;;4038:49;;3900:195;;;;;:::o;10557:247::-;10703:17;;:::i;:::-;10739:4;:19;;:31;10759:10;10739:31;;;;;;;;;;;:45;;:57;10785:10;10739:57;;;;;;;;;;;10732:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10557:247;;;;;:::o;15015:226::-;15124:4;15129;15153;:18;;:27;15172:7;15153:27;;;;;;;;;;;;;;;:41;;;15195:4;:18;;:27;15214:7;15195:27;;;;;;;;;;;;;;;:37;;;15145:88;;;;15015:226;;;;;:::o;16249:228::-;16389:4;16412;:19;;:31;16432:10;16412:31;;;;;;;;;;;:49;;16462:6;16412:57;;;;;;;;;;;;;;;;16405:64;;16249:228;;;;;:::o;8414:211::-;8542:4;8565;:17;;:29;8583:10;8565:29;;;;;;;;;;;:45;;:52;8611:5;8565:52;;;;;;;;;;;;8558:59;;8414:211;;;;;:::o;19082:214::-;19209:4;19233;:19;;:31;19253:10;19233:31;;;;;;;;;;;:43;;:55;19277:10;19233:55;;;;;;;;;;;;19226:62;;19082:214;;;;;:::o;6957:563::-;7056:7;7065:4;7071;7076:13;7090:4;7095;7123;:21;;;7145:4;:13;;:44;7159:29;;;;;;;;;;;;;;;;;;;7145:44;;;;;;;;;;;;7190:4;:13;;:38;7204:23;;;;;;;;;;;;;;;;;;;7190:38;;;;;;;;;;;;7229:4;:19;;:65;7249:4;:13;;:44;7263:29;;;;;;;;;;;;;;;;;;;7249:44;;;;;;;;;;;;7229:65;;;;;;;;;;;:77;;7307:4;:19;;:65;7327:4;:13;;:44;7341:29;;;;;;;;;;;;;;;;;;;7327:44;;;;;;;;;;;;7307:65;;;;;;;;;;;:77;;:103;7385:24;;;;;;;;;;;;;;;;;;;7307:103;;;;;;;;;;;;7411:4;:19;;:65;7431:4;:13;;:44;7445:29;;;;;;;;;;;;;;;;;;;7431:44;;;;;;;;;;;;7411:65;;;;;;;;;;;:77;;:100;7489:21;;;;;;;;;;;;;;;;;;;7411:100;;;;;;;;;;;;7115:397;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6957:563;;;;;;;:::o;4314:197::-;4435:4;4458;:17;;:29;4476:10;4458:29;;;;;;;;;;;:35;;:45;4494:8;4458:45;;;;;;;;;;;;;;;;;;;;;;;;;4451:52;;4314:197;;;;;:::o;3247:311::-;3417:10;3376:51;;:4;:16;;:37;3393:19;;;;;;;;;;;;;;;;;;;3376:37;;;;;;;;;;;;;;;;;;;;;:51;;;3368:60;;;;;;3486:15;3439:4;:16;;:45;3456:27;;;;;;;;;;;;;;;;;;;3439:45;;;;;;;;;;;;:62;;;;;;;;;;;;;;;;;;3517:33;3534:15;3517:33;;;;;;;;;;;;;;;;;;;;;;3247:311;;:::o;5820:845::-;5933:7;5942:4;5948;5954;5960:7;5969;5978;5986:14;;:::i;:::-;6002:3;6017:34;6054:4;:17;;:29;6072:10;6054:29;;;;;;;;;;;6017:66;;6101:4;:9;;;6111:4;:13;;;;;;;;;;;;6126:4;:22;;;;;;;;;;;;6150:4;:15;;;;;;;;;;;;6167:4;:18;;;;;;;;;;;;6187:4;:19;;;;;;;;;;;;6207:4;:24;;;;;;;;;;;;6094:563;;;;;;;;6233:4;:20;;:44;6254:22;;;;;;;;;;;;;;;;;;;6233:44;;;;;;;;;;;;6094:563;;;;6279:4;:20;;:44;6300:22;;;;;;;;;;;;;;;;;;;6279:44;;;;;;;;;;;;6094:563;;;;6325:4;:20;;:40;6346:18;;;;;;;;;;;;;;;;;;;6325:40;;;;;;;;;;;;6094:563;;;;6367:4;:20;;:51;6388:29;;;;;;;;;;;;;;;;;;;6367:51;;;;;;;;;;;;6094:563;;;;6420:4;:20;;:48;6441:26;;;;;;;;;;;;;;;;;;;6420:48;;;;;;;;;;;;6094:563;;;;6470:4;:20;;:46;6491:24;;;;;;;;;;;;;;;;;;;6470:46;;;;;;;;;;;;6094:563;;;;6518:4;:20;;:44;6539:22;;;;;;;;;;;;;;;;;;;6518:44;;;;;;;;;;;;6094:563;;;;6564:4;:20;;:41;6585:19;;;;;;;;;;;;;;;;;;;6564:41;;;;;;;;;;;;6094:563;;;;6606:4;:20;;:38;6627:16;;;;;;;;;;;;;;;;;;;6606:38;;;;;;;;;;;;6094:563;;;6646:4;:10;;;6094:563;;;;;;;;;;;;;;;;;;;5820:845;;;;;;;;;;;:::o;12921:146::-;13012:15;;:::i;:::-;13046:4;:13;;13039:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12921:146;;;:::o;10084:217::-;10213:4;10236;:19;;:31;10256:10;10236:31;;;;;;;;;;;:45;;:57;10282:10;10236:57;;;;;;;;;;;;10229:64;;10084:217;;;;;:::o;7725:185::-;7844:4;7868;:27;;:34;7896:5;7868:34;;;;;;;;;;;;7860:42;;7725:185;;;;:::o;13649:209::-;13777:4;13800;:19;;:31;13820:10;13800:31;;;;;;;;;;;:43;;:50;13844:5;13800:50;;;;;;;;;;;;13793:57;;13649:209;;;;;:::o;14285:480::-;14395:13;14409;14424:7;14432:4;14438;14444;14461:38;14502:4;:19;;:31;14522:10;14502:31;;;;;;;;;;;14461:72;;14553:8;:20;;14574:8;:19;;14594:8;:18;;;14614:8;:20;;:46;14635:24;;;;;;;;;;;;;;;;;;;14614:46;;;;;;;;;;;;14661:8;:20;;:51;14682:29;;;;;;;;;;;;;;;;;;;14661:51;;;;;;;;;;;;14713:8;:20;;:43;14734:21;;;;;;;;;;;;;;;;;;;14713:43;;;;;;;;;;;;14545:212;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14285:480;;;;;;;;:::o;8849:278::-;8944:4;8949;8973:140;8986:4;8991;:25;;:73;9017:4;:13;;:46;9031:31;;;;;;;;;;;;;;;;;;;9017:46;;;;;;;;;;;;8991:73;;;;;;;;;;;;9066:4;:13;;:46;9080:31;;;;;;;;;;;;;;;;;;;9066:46;;;;;;;;;;;;8973:12;:140::i;:::-;9114:4;8965:154;;;;8849:278;;;:::o;18045:297::-;18140:15;18171:9;18195:11;18237:31;18254:4;:13;;18237:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:31::i;:::-;18221:47;;;;;;;;18297:4;:29;;:37;18327:6;18297:37;;;;;;;;;;;;18284:50;;18045:297;;;;;:::o;321:310::-;381:11;393:16;428:4;433:1;428:7;;;;;;;;;;;422:13;;469:6;476:1;469:8;;465:159;482:11;478:1;:15;465:159;;;526:3;516:4;521:1;516:7;;;;;;;;;;;:13;513:100;;;555:4;560:1;555:7;;;;;;;;;;;549:13;;592:1;581:12;;513:100;494:3;;;;;;;465:159;;;;321:310;;;:::o;68330:2182::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;68330:2182:0;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;68330:2182:0;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;68330:2182:0;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;68330:2182:0;;;;:::o

Swarm Source

bzzr://06e09de4d2ff8ea7df56db950a0a9f5960b9419da791b9b87465cf51b2f70932

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

Tellor is a decentralized oracle that provides an on-chain data bank where staked miners compete to add the data points.

Loading...
Loading
[ Download: CSV Export  ]

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