Contract 0xb4e8D821b5b43fca08F5986D9B52A8DC00565CC5

 
Ad
Ad
Txn Hash Method
Block
From
To
Value
0x880f890996c2f89822e15aa254a43400ae82cf4520856cb23022e3c960d73aa7Apply And Lock S...50207462018-02-03 2:42:251331 days 23 hrs agoBlockbits: Deployer IN  0xb4e8d821b5b43fca08f5986d9b52a8dc00565cc50 Ether0.0007446510
0xcfdb549321bd2d305128200ae5682708de2ff2cbc0c608883f162b3fdd35a09aAdd Record50206292018-02-03 2:19:291331 days 23 hrs agoBlockbits: Deployer IN  0xb4e8d821b5b43fca08f5986d9b52a8dc00565cc50 Ether0.0013779210
0xf8ba6e52400cbb23240923ff39cb7d7af73c049b8fc8dd4f8ad76d825f85901bAdd Record50206272018-02-03 2:18:581331 days 23 hrs agoBlockbits: Deployer IN  0xb4e8d821b5b43fca08f5986d9b52a8dc00565cc50 Ether0.0013779210
0x4867ffafd4c7346c252e979c9f89563c3cfb9cd3744b84e4cce3db4fe5a7cf84Add Record50206252018-02-03 2:18:351331 days 23 hrs agoBlockbits: Deployer IN  0xb4e8d821b5b43fca08f5986d9b52a8dc00565cc50 Ether0.0013785610
0x116ffbbbac7f43f993bf33d9f64388634766dd938c69338b036aa844eb294315Add Record50206232018-02-03 2:18:111331 days 23 hrs agoBlockbits: Deployer IN  0xb4e8d821b5b43fca08f5986d9b52a8dc00565cc50 Ether0.0017963410
0x183e984d05f789dd0721cfc2a33d978ae6baec6a0299d3ff7fd56825e3012a0fAdd Record50206212018-02-03 2:17:201331 days 23 hrs agoBlockbits: Deployer IN  0xb4e8d821b5b43fca08f5986d9b52a8dc00565cc50 Ether0.0017905810
0x5d1ff30613e4c1c96706780d731f0d71f30c088db0a52f57e411ad590201d97dAdd Record50206172018-02-03 2:16:401331 days 23 hrs agoBlockbits: Deployer IN  0xb4e8d821b5b43fca08f5986d9b52a8dc00565cc50 Ether0.0013836810
0xfeea025881077ee74e719b5e45db834b9cea4cfdd1e724ebf790b722d07cc859Add Record50206092018-02-03 2:13:431331 days 23 hrs agoBlockbits: Deployer IN  0xb4e8d821b5b43fca08f5986d9b52a8dc00565cc50 Ether0.0013779210
0x917090247bdae248ff54f9e66ab33902edbe621addb27e4609a16d72c147fe03Set Initial Appl...50154232018-02-02 5:05:191332 days 20 hrs agoBlockbits: Deployer IN  0xb4e8d821b5b43fca08f5986d9b52a8dc00565cc50 Ether0.0004438910
0x9c43871b9a793b006d043edfe0ffaa2baa917044b5ffefa4faac22277ef6723d0x6060604050152452018-02-02 4:24:551332 days 21 hrs agoBlockbits: Deployer IN  Create: Milestones0 Ether0.0329718310
[ Download CSV Export 
View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Milestones

Compiler Version
v0.4.17+commit.bdeb9e52

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-02-02
*/

pragma solidity ^0.4.17;

/*

 * source       https://github.com/blockbitsio/

 * @name        Application Entity Generic Contract
 * @package     BlockBitsIO
 * @author      Micky Socaci <[email protected]>

    Used for the ABI interface when assets need to call Application Entity.

    This is required, otherwise we end up loading the assets themselves when we load the ApplicationEntity contract
    and end up in a loop
*/



contract ApplicationEntityABI {

    address public ProposalsEntity;
    address public FundingEntity;
    address public MilestonesEntity;
    address public MeetingsEntity;
    address public BountyManagerEntity;
    address public TokenManagerEntity;
    address public ListingContractEntity;
    address public FundingManagerEntity;
    address public NewsContractEntity;

    bool public _initialized = false;
    bool public _locked = false;
    uint8 public CurrentEntityState;
    uint8 public AssetCollectionNum;
    address public GatewayInterfaceAddress;
    address public deployerAddress;
    address testAddressAllowUpgradeFrom;
    mapping (bytes32 => uint8) public EntityStates;
    mapping (bytes32 => address) public AssetCollection;
    mapping (uint8 => bytes32) public AssetCollectionIdToName;
    mapping (bytes32 => uint256) public BylawsUint256;
    mapping (bytes32 => bytes32) public BylawsBytes32;

    function ApplicationEntity() public;
    function getEntityState(bytes32 name) public view returns (uint8);
    function linkToGateway( address _GatewayInterfaceAddress, bytes32 _sourceCodeUrl ) external;
    function setUpgradeState(uint8 state) public ;
    function addAssetProposals(address _assetAddresses) external;
    function addAssetFunding(address _assetAddresses) external;
    function addAssetMilestones(address _assetAddresses) external;
    function addAssetMeetings(address _assetAddresses) external;
    function addAssetBountyManager(address _assetAddresses) external;
    function addAssetTokenManager(address _assetAddresses) external;
    function addAssetFundingManager(address _assetAddresses) external;
    function addAssetListingContract(address _assetAddresses) external;
    function addAssetNewsContract(address _assetAddresses) external;
    function getAssetAddressByName(bytes32 _name) public view returns (address);
    function setBylawUint256(bytes32 name, uint256 value) public;
    function getBylawUint256(bytes32 name) public view returns (uint256);
    function setBylawBytes32(bytes32 name, bytes32 value) public;
    function getBylawBytes32(bytes32 name) public view returns (bytes32);
    function initialize() external returns (bool);
    function getParentAddress() external view returns(address);
    function createCodeUpgradeProposal( address _newAddress, bytes32 _sourceCodeUrl ) external returns (uint256);
    function acceptCodeUpgradeProposal(address _newAddress) external;
    function initializeAssetsToThisApplication() external returns (bool);
    function transferAssetsToNewApplication(address _newAddress) external returns (bool);
    function lock() external returns (bool);
    function canInitiateCodeUpgrade(address _sender) public view returns(bool);
    function doStateChanges() public;
    function hasRequiredStateChanges() public view returns (bool);
    function anyAssetHasChanges() public view returns (bool);
    function extendedAnyAssetHasChanges() internal view returns (bool);
    function getRequiredStateChanges() public view returns (uint8, uint8);
    function getTimestamp() view public returns (uint256);

}

/*

 * source       https://github.com/blockbitsio/

 * @name        Application Asset Contract
 * @package     BlockBitsIO
 * @author      Micky Socaci <[email protected]>

 Any contract inheriting this will be usable as an Asset in the Application Entity

*/




contract ApplicationAsset {

    event EventAppAssetOwnerSet(bytes32 indexed _name, address indexed _owner);
    event EventRunBeforeInit(bytes32 indexed _name);
    event EventRunBeforeApplyingSettings(bytes32 indexed _name);


    mapping (bytes32 => uint8) public EntityStates;
    mapping (bytes32 => uint8) public RecordStates;
    uint8 public CurrentEntityState;

    event EventEntityProcessor(bytes32 indexed _assetName, uint8 indexed _current, uint8 indexed _required);
    event DebugEntityRequiredChanges( bytes32 _assetName, uint8 indexed _current, uint8 indexed _required );

    bytes32 public assetName;

    /* Asset records */
    uint8 public RecordNum = 0;

    /* Asset initialised or not */
    bool public _initialized = false;

    /* Asset settings present or not */
    bool public _settingsApplied = false;

    /* Asset owner ( ApplicationEntity address ) */
    address public owner = address(0x0) ;
    address public deployerAddress;

    function ApplicationAsset() public {
        deployerAddress = msg.sender;
    }

    function setInitialApplicationAddress(address _ownerAddress) public onlyDeployer requireNotInitialised {
        owner = _ownerAddress;
    }

    function setInitialOwnerAndName(bytes32 _name) external
        requireNotInitialised
        onlyOwner
        returns (bool)
    {
        // init states
        setAssetStates();
        assetName = _name;
        // set initial state
        CurrentEntityState = getEntityState("NEW");
        runBeforeInitialization();
        _initialized = true;
        EventAppAssetOwnerSet(_name, owner);
        return true;
    }

    function setAssetStates() internal {
        // Asset States
        EntityStates["__IGNORED__"]     = 0;
        EntityStates["NEW"]             = 1;
        // Funding Stage States
        RecordStates["__IGNORED__"]     = 0;
    }

    function getRecordState(bytes32 name) public view returns (uint8) {
        return RecordStates[name];
    }

    function getEntityState(bytes32 name) public view returns (uint8) {
        return EntityStates[name];
    }

    function runBeforeInitialization() internal requireNotInitialised  {
        EventRunBeforeInit(assetName);
    }

    function applyAndLockSettings()
        public
        onlyDeployer
        requireInitialised
        requireSettingsNotApplied
        returns(bool)
    {
        runBeforeApplyingSettings();
        _settingsApplied = true;
        return true;
    }

    function runBeforeApplyingSettings() internal requireInitialised requireSettingsNotApplied  {
        EventRunBeforeApplyingSettings(assetName);
    }

    function transferToNewOwner(address _newOwner) public requireInitialised onlyOwner returns (bool) {
        require(owner != address(0x0) && _newOwner != address(0x0));
        owner = _newOwner;
        EventAppAssetOwnerSet(assetName, owner);
        return true;
    }

    function getApplicationAssetAddressByName(bytes32 _name)
        public
        view
        returns(address)
    {
        address asset = ApplicationEntityABI(owner).getAssetAddressByName(_name);
        if( asset != address(0x0) ) {
            return asset;
        } else {
            revert();
        }
    }

    function getApplicationState() public view returns (uint8) {
        return ApplicationEntityABI(owner).CurrentEntityState();
    }

    function getApplicationEntityState(bytes32 name) public view returns (uint8) {
        return ApplicationEntityABI(owner).getEntityState(name);
    }

    function getAppBylawUint256(bytes32 name) public view requireInitialised returns (uint256) {
        ApplicationEntityABI CurrentApp = ApplicationEntityABI(owner);
        return CurrentApp.getBylawUint256(name);
    }

    function getAppBylawBytes32(bytes32 name) public view requireInitialised returns (bytes32) {
        ApplicationEntityABI CurrentApp = ApplicationEntityABI(owner);
        return CurrentApp.getBylawBytes32(name);
    }

    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    modifier onlyApplicationEntity() {
        require(msg.sender == owner);
        _;
    }

    modifier requireInitialised() {
        require(_initialized == true);
        _;
    }

    modifier requireNotInitialised() {
        require(_initialized == false);
        _;
    }

    modifier requireSettingsApplied() {
        require(_settingsApplied == true);
        _;
    }

    modifier requireSettingsNotApplied() {
        require(_settingsApplied == false);
        _;
    }

    modifier onlyDeployer() {
        require(msg.sender == deployerAddress);
        _;
    }

    modifier onlyAsset(bytes32 _name) {
        address AssetAddress = getApplicationAssetAddressByName(_name);
        require( msg.sender == AssetAddress);
        _;
    }

    function getTimestamp() view public returns (uint256) {
        return now;
    }


}

/*

 * source       https://github.com/blockbitsio/

 * @name        Application Asset Contract ABI
 * @package     BlockBitsIO
 * @author      Micky Socaci <[email protected]>

 Any contract inheriting this will be usable as an Asset in the Application Entity

*/



contract ABIApplicationAsset {

    bytes32 public assetName;
    uint8 public CurrentEntityState;
    uint8 public RecordNum;
    bool public _initialized;
    bool public _settingsApplied;
    address public owner;
    address public deployerAddress;
    mapping (bytes32 => uint8) public EntityStates;
    mapping (bytes32 => uint8) public RecordStates;

    function setInitialApplicationAddress(address _ownerAddress) public;
    function setInitialOwnerAndName(bytes32 _name) external returns (bool);
    function getRecordState(bytes32 name) public view returns (uint8);
    function getEntityState(bytes32 name) public view returns (uint8);
    function applyAndLockSettings() public returns(bool);
    function transferToNewOwner(address _newOwner) public returns (bool);
    function getApplicationAssetAddressByName(bytes32 _name) public returns(address);
    function getApplicationState() public view returns (uint8);
    function getApplicationEntityState(bytes32 name) public view returns (uint8);
    function getAppBylawUint256(bytes32 name) public view returns (uint256);
    function getAppBylawBytes32(bytes32 name) public view returns (bytes32);
    function getTimestamp() view public returns (uint256);


}

/*

 * source       https://github.com/blockbitsio/

 * @name        Funding Contract ABI
 * @package     BlockBitsIO
 * @author      Micky Socaci <[email protected]>

 Contains the Funding Contract code deployed and linked to the Application Entity

*/





contract ABIFundingManager is ABIApplicationAsset {

    bool public fundingProcessed;
    bool FundingPoolBalancesAllocated;
    uint8 public VaultCountPerProcess;
    uint256 public lastProcessedVaultId;
    uint256 public vaultNum;
    uint256 public LockedVotingTokens;
    bytes32 public currentTask;
    mapping (bytes32 => bool) public taskByHash;
    mapping  (address => address) public vaultList;
    mapping  (uint256 => address) public vaultById;

    function receivePayment(address _sender, uint8 _payment_method, uint8 _funding_stage) payable public returns(bool);
    function getMyVaultAddress(address _sender) public view returns (address);
    function setVaultCountPerProcess(uint8 _perProcess) external;
    function getHash(bytes32 actionType, bytes32 arg1) public pure returns ( bytes32 );
    function getCurrentMilestoneProcessed() public view returns (bool);
    function processFundingFailedFinished() public view returns (bool);
    function processFundingSuccessfulFinished() public view returns (bool);
    function getCurrentMilestoneIdHash() internal view returns (bytes32);
    function processMilestoneFinished() public view returns (bool);
    function processEmergencyFundReleaseFinished() public view returns (bool);
    function getAfterTransferLockedTokenBalances(address vaultAddress, bool excludeCurrent) public view returns (uint256);
    function VaultRequestedUpdateForLockedVotingTokens(address owner) public;
    function doStateChanges() public;
    function hasRequiredStateChanges() public view returns (bool);
    function getRequiredStateChanges() public view returns (uint8, uint8);
    function ApplicationInFundingOrDevelopment() public view returns(bool);

}

/*

 * source       https://github.com/blockbitsio/

 * @name        Meetings Contract ABI
 * @package     BlockBitsIO
 * @author      Micky Socaci <[email protected]>

 Contains the Meetings Contract code deployed and linked to the Application Entity

*/





contract ABIMeetings is ABIApplicationAsset {
    struct Record {
        bytes32 hash;
        bytes32 name;
        uint8 state;
        uint256 time_start;                     // start at unixtimestamp
        uint256 duration;
        uint8 index;
    }
    mapping (uint8 => Record) public Collection;
}

/*

 * source       https://github.com/blockbitsio/

 * @name        Proposals Contract
 * @package     BlockBitsIO
 * @author      Micky Socaci <[email protected]>

 Contains the Proposals Contract code deployed and linked to the Application Entity

*/





contract ABIProposals is ABIApplicationAsset {

    address public Application;
    address public ListingContractEntity;
    address public FundingEntity;
    address public FundingManagerEntity;
    address public TokenManagerEntity;
    address public TokenEntity;
    address public MilestonesEntity;

    struct ProposalRecord {
        address creator;
        bytes32 name;
        uint8 actionType;
        uint8 state;
        bytes32 hash;                       // action name + args hash
        address addr;
        bytes32 sourceCodeUrl;
        uint256 extra;
        uint256 time_start;
        uint256 time_end;
        uint256 index;
    }

    struct VoteStruct {
        address voter;
        uint256 time;
        bool    vote;
        uint256 power;
        bool    annulled;
        uint256 index;
    }

    struct ResultRecord {
        uint256 totalAvailable;
        uint256 requiredForResult;
        uint256 totalSoFar;
        uint256 yes;
        uint256 no;
        bool    requiresCounting;
    }

    uint8 public ActiveProposalNum;
    uint256 public VoteCountPerProcess;
    bool public EmergencyFundingReleaseApproved;

    mapping (bytes32 => uint8) public ActionTypes;
    mapping (uint8 => uint256) public ActiveProposalIds;
    mapping (uint256 => bool) public ExpiredProposalIds;
    mapping (uint256 => ProposalRecord) public ProposalsById;
    mapping (bytes32 => uint256) public ProposalIdByHash;
    mapping (uint256 => mapping (uint256 => VoteStruct) ) public VotesByProposalId;
    mapping (uint256 => mapping (address => VoteStruct) ) public VotesByCaster;
    mapping (uint256 => uint256) public VotesNumByProposalId;
    mapping (uint256 => ResultRecord ) public ResultsByProposalId;
    mapping (uint256 => uint256) public lastProcessedVoteIdByProposal;
    mapping (uint256 => uint256) public ProcessedVotesByProposal;
    mapping (uint256 => uint256) public VoteCountAtProcessingStartByProposal;

    function getRecordState(bytes32 name) public view returns (uint8);
    function getActionType(bytes32 name) public view returns (uint8);
    function getProposalState(uint256 _proposalId) public view returns (uint8);
    function getBylawsProposalVotingDuration() public view returns (uint256);
    function getBylawsMilestoneMinPostponing() public view returns (uint256);
    function getBylawsMilestoneMaxPostponing() public view returns (uint256);
    function getHash(uint8 actionType, bytes32 arg1, bytes32 arg2) public pure returns ( bytes32 );
    function process() public;
    function hasRequiredStateChanges() public view returns (bool);
    function getRequiredStateChanges() public view returns (uint8);
    function addCodeUpgradeProposal(address _addr, bytes32 _sourceCodeUrl) external returns (uint256);
    function createMilestoneAcceptanceProposal() external returns (uint256);
    function createMilestonePostponingProposal(uint256 _duration) external returns (uint256);
    function getCurrentMilestonePostponingProposalDuration() public view returns (uint256);
    function getCurrentMilestoneProposalStatusForType(uint8 _actionType ) public view returns (uint8);
    function createEmergencyFundReleaseProposal() external returns (uint256);
    function createDelistingProposal(uint256 _projectId) external returns (uint256);
    function RegisterVote(uint256 _proposalId, bool _myVote) public;
    function hasPreviousVote(uint256 _proposalId, address _voter) public view returns (bool);
    function getTotalTokenVotingPower(address _voter) public view returns ( uint256 );
    function getVotingPower(uint256 _proposalId, address _voter) public view returns ( uint256 );
    function setVoteCountPerProcess(uint256 _perProcess) external;
    function ProcessVoteTotals(uint256 _proposalId, uint256 length) public;
    function canEndVoting(uint256 _proposalId) public view returns (bool);
    function getProposalType(uint256 _proposalId) public view returns (uint8);
    function expiryChangesState(uint256 _proposalId) public view returns (bool);
    function needsProcessing(uint256 _proposalId) public view returns (bool);
    function getMyVoteForCurrentMilestoneRelease(address _voter) public view returns (bool);
    function getHasVoteForCurrentMilestoneRelease(address _voter) public view returns (bool);
    function getMyVote(uint256 _proposalId, address _voter) public view returns (bool);

}

/*

 * source       https://github.com/blockbitsio/

 * @name        Milestones Contract
 * @package     BlockBitsIO
 * @author      Micky Socaci <[email protected]>

 Contains the Milestones Contract code deployed and linked to the Application Entity

*/









contract Milestones is ApplicationAsset {

    ABIFundingManager FundingManagerEntity;
    ABIProposals ProposalsEntity;
    ABIMeetings MeetingsEntity;

    struct Record {
        bytes32 name;
        string description;                     // will change to hash pointer ( external storage )
        uint8 state;
        uint256 duration;
        uint256 time_start;                     // start at unixtimestamp
        uint256 last_state_change_time;         // time of last state change
        uint256 time_end;                       // estimated end time >> can be increased by proposal
        uint256 time_ended;                     // actual end time
        uint256 meeting_time;
        uint8 funding_percentage;
        uint8 index;
    }

    mapping (uint8 => Record) public Collection;
    uint8 public currentRecord = 1;

    event DebugRecordRequiredChanges( bytes32 indexed _assetName, uint8 indexed _current, uint8 indexed _required );
    event DebugCallAgain(uint8 indexed _who);

    event EventEntityProcessor(bytes32 indexed _assetName, uint8 indexed _current, uint8 indexed _required);
    event EventRecordProcessor(bytes32 indexed _assetName, uint8 indexed _current, uint8 indexed _required);

    event DebugAction(bytes32 indexed _name, bool indexed _allowed);


    function setAssetStates() internal {

        // Contract States
        EntityStates["__IGNORED__"]                  = 0;
        EntityStates["NEW"]                          = 1;
        EntityStates["WAITING"]                      = 2;

        EntityStates["IN_DEVELOPMENT"]               = 5;

        EntityStates["WAITING_MEETING_TIME"]         = 10;
        EntityStates["DEADLINE_MEETING_TIME_YES"]    = 11;
        EntityStates["DEADLINE_MEETING_TIME_FAILED"] = 12;

        EntityStates["VOTING_IN_PROGRESS"]           = 20;
        // EntityStates["VOTING_ENDED"]              = 21;
        EntityStates["VOTING_ENDED_YES"]             = 22;
        EntityStates["VOTING_ENDED_NO"]              = 23;
        EntityStates["VOTING_ENDED_NO_FINAL"]        = 25;

        EntityStates["VOTING_FUNDS_PROCESSED"]       = 30;
        EntityStates["FINAL"]                        = 50;

        EntityStates["CASHBACK_OWNER_MIA"]           = 99;
        EntityStates["DEVELOPMENT_COMPLETE"]         = 250;

        // Funding Stage States
        RecordStates["__IGNORED__"]     = 0;
        RecordStates["NEW"]             = 1;
        RecordStates["IN_PROGRESS"]     = 2;
        RecordStates["FINAL"]           = 3;
    }

    function runBeforeInitialization() internal requireNotInitialised {
        FundingManagerEntity = ABIFundingManager( getApplicationAssetAddressByName('FundingManager') );
        MeetingsEntity = ABIMeetings( getApplicationAssetAddressByName('Meetings') );
        ProposalsEntity = ABIProposals( getApplicationAssetAddressByName('Proposals') );
        EventRunBeforeInit(assetName);
    }

    function runBeforeApplyingSettings() internal requireInitialised requireSettingsNotApplied  {
        // setup first milestone
        Record storage rec = Collection[currentRecord];
            rec.time_start = getBylawsProjectDevelopmentStart();
            rec.time_end = rec.time_start + rec.duration;
        EventRunBeforeApplyingSettings(assetName);
    }

    function getBylawsProjectDevelopmentStart() public view returns (uint256) {
        return getAppBylawUint256("development_start");
    }

    function getBylawsMinTimeInTheFutureForMeetingCreation() public view returns (uint256) {
        return getAppBylawUint256("meeting_time_set_req");
    }

    function getBylawsCashBackVoteRejectedDuration() public view returns (uint256) {
        return getAppBylawUint256("cashback_investor_no");
    }

    /*
    * Add Record
    *
    * @param        bytes32 _name
    * @param        string _description
    * @param        uint256 _duration
    * @param        uint256 _funding_percentage
    *
    * @access       public
    * @type         method
    * @modifiers    onlyDeployer, requireNotInitialised
    */
    function addRecord(
        bytes32 _name,
        string _description,
        uint256 _duration,
        uint8   _perc
    )
        public
        onlyDeployer
        requireSettingsNotApplied
    {

        Record storage rec = Collection[++RecordNum];

        rec.name                = _name;
        rec.description         = _description;
        rec.duration            = _duration;
        rec.funding_percentage  = _perc;
        rec.state               = getRecordState("NEW");
        rec.index               = RecordNum;
    }

    function getMilestoneFundingPercentage(uint8 recordId) public view returns (uint8){
        return Collection[recordId].funding_percentage;
    }

    function doStateChanges() public {

        var (CurrentRecordState, RecordStateRequired, EntityStateRequired) = getRequiredStateChanges();
        bool callAgain = false;

        DebugRecordRequiredChanges( assetName, CurrentRecordState, RecordStateRequired );
        DebugEntityRequiredChanges( assetName, CurrentEntityState, EntityStateRequired );

        if( RecordStateRequired != getRecordState("__IGNORED__") ) {
            // process record changes.
            RecordProcessor(CurrentRecordState, RecordStateRequired);
            DebugCallAgain(2);
            callAgain = true;
        }

        if(EntityStateRequired != getEntityState("__IGNORED__") ) {
            // process entity changes.
            EntityProcessor(EntityStateRequired);
            DebugCallAgain(1);
            callAgain = true;
        }


    }

    function MilestonesCanChange() internal view returns (bool) {
        if(
            CurrentEntityState == getEntityState("WAITING") ||
            CurrentEntityState == getEntityState("IN_DEVELOPMENT") ||
            CurrentEntityState == getEntityState("VOTING_FUNDS_PROCESSED")
        ) {
            return true;
        }
        return false;
    }


    /*
     * Method: Get Record Required State Changes
     *
     * @access       public
     * @type         method
     *
     * @return       uint8 RecordStateRequired
     */
    function getRecordStateRequiredChanges() public view returns (uint8) {
        Record memory record = Collection[currentRecord];
        uint8 RecordStateRequired = getRecordState("__IGNORED__");

        if( ApplicationIsInDevelopment() && MilestonesCanChange() ) {

            if( record.state == getRecordState("NEW") ) {

                if( getTimestamp() >= record.time_start ) {
                    RecordStateRequired = getRecordState("IN_PROGRESS");
                }

            } else if( record.state == getRecordState("IN_PROGRESS") ) {

                if( getTimestamp() >= record.time_end || ( getTimestamp() >= record.meeting_time && record.meeting_time > 0 ) ) {
                    RecordStateRequired = getRecordState("FINAL");
                }
            }

            if( record.state == RecordStateRequired ) {
                RecordStateRequired = getRecordState("__IGNORED__");
            }
        }
        return RecordStateRequired;
    }


    function hasRequiredStateChanges() public view returns (bool) {
        bool hasChanges = false;
        var (CurrentRecordState, RecordStateRequired, EntityStateRequired) = getRequiredStateChanges();
        CurrentRecordState = 0;

        if( RecordStateRequired != getRecordState("__IGNORED__") ) {
            hasChanges = true;
        }
        if(EntityStateRequired != getEntityState("__IGNORED__") ) {
            hasChanges = true;
        }

        return hasChanges;
    }

    // view methods decide if changes are to be made
    // in case of tasks, we do them in the Processors.

    function RecordProcessor(uint8 CurrentRecordState, uint8 RecordStateRequired) internal {
        EventRecordProcessor( assetName, CurrentRecordState, RecordStateRequired );
        updateRecord( RecordStateRequired );
    }


    function EntityProcessor(uint8 EntityStateRequired) internal {
        EventEntityProcessor( assetName, CurrentEntityState, EntityStateRequired );

        // Do State Specific Updates
        // Update our Entity State
        CurrentEntityState = EntityStateRequired;

        if ( CurrentEntityState == getEntityState("DEADLINE_MEETING_TIME_YES") ) {
            // create meeting
            // Meetings.create("internal", "MILESTONE_END", "");

        } else if( CurrentEntityState == getEntityState("VOTING_IN_PROGRESS") ) {
            // create proposal and start voting on it
            createMilestoneAcceptanceProposal();

        } else if( CurrentEntityState == getEntityState("WAITING_MEETING_TIME") ) {

            PostponeMeetingIfApproved();

        } else if( CurrentEntityState == getEntityState("VOTING_ENDED_YES") ) {

        } else if( CurrentEntityState == getEntityState("VOTING_ENDED_NO") ) {

            // possible cashback time starts from now
            MilestoneCashBackTime = getTimestamp();

        } else if( CurrentEntityState == getEntityState("VOTING_FUNDS_PROCESSED") ) {
            MilestoneCashBackTime = 0;
            startNextMilestone();
        }

    }

    mapping (bytes32 => bool) public MilestonePostponingHash;

    function PostponeMeetingIfApproved() internal {
        if(MilestonePostponingHash[ bytes32(currentRecord) ] == false ) {
            if(PostponeForCurrentMilestoneIsApproved()) {
                uint256 time = ProposalsEntity.getCurrentMilestonePostponingProposalDuration();
                Record storage record = Collection[currentRecord];
                record.time_end = record.time_end + time;
                MilestonePostponingHash[ bytes32(currentRecord) ] = true;
            }
        }
    }

    function PostponeForCurrentMilestoneIsApproved() internal view returns ( bool ) {
        uint8 ProposalActionType = ProposalsEntity.getActionType("MILESTONE_POSTPONING");
        uint8 ProposalRecordState = ProposalsEntity.getCurrentMilestoneProposalStatusForType( ProposalActionType  );
        if(ProposalRecordState == ProposalsEntity.getRecordState("VOTING_RESULT_YES") ) {
            return true;
        }
        return false;
    }

    uint256 public MilestoneCashBackTime = 0;

    function afterVoteNoCashBackTime() public view returns ( bool ) {
        uint256 time =  MilestoneCashBackTime + getBylawsCashBackVoteRejectedDuration();
        // after cash back time
        if(getTimestamp() > time) {
            return true;
        }
        return false;
    }

    function getHash(uint8 actionType, bytes32 arg1, bytes32 arg2) public pure returns ( bytes32 ) {
        return keccak256(actionType, arg1, arg2);
    }

    function getCurrentHash() public view returns ( bytes32 ) {
        return getHash(1, bytes32(currentRecord), 0);
    }

    mapping (bytes32 => uint256) public ProposalIdByHash;
    function createMilestoneAcceptanceProposal() internal {
        if(ProposalIdByHash[ getCurrentHash() ] == 0x0 ) {
            ProposalIdByHash[ getCurrentHash() ] = ProposalsEntity.createMilestoneAcceptanceProposal();
        }
    }

    function getCurrentProposalId() internal view returns ( uint256 ) {
        return ProposalIdByHash[ getCurrentHash() ];
    }

    function setCurrentMilestoneMeetingTime(uint256 _meeting_time) public onlyDeployer {
        if ( CurrentEntityState == getEntityState("WAITING_MEETING_TIME") ) {
            if(MeetingTimeSetFailure() == false ) {
                Record storage record = Collection[currentRecord];
                // minimum x days into the future
                uint256 min = getTimestamp() + getBylawsMinTimeInTheFutureForMeetingCreation();
                // minimum days before end date
                uint256 max = record.time_end + 24 * 3600;
                if(_meeting_time > min && _meeting_time < max ) {
                    record.meeting_time = _meeting_time;
                }
            } else {
                revert();
            }
        } else {
            revert();
        }
    }

    function startNextMilestone() internal {
        Record storage rec = Collection[currentRecord];

        // set current record end date etc
        rec.time_ended = getTimestamp();
        rec.state = getRecordState("FINAL");

        if(currentRecord < RecordNum) {
            // jump to next milestone
            currentRecord++;

            Record storage nextRec = Collection[currentRecord];
                nextRec.time_start = rec.time_ended;
                nextRec.time_end = rec.time_ended + nextRec.duration;
        }

    }

    /*
    * Update Existing Record
    *
    * @param        uint8 _record_id
    * @param        uint8 _new_state
    * @param        uint8 _duration
    *
    * @access       public
    * @type         method
    * @modifiers    onlyOwner, requireInitialised, RecordUpdateAllowed
    *
    * @return       void
    */

    function updateRecord( uint8 _new_state )
        internal
        requireInitialised
        RecordUpdateAllowed(_new_state)
        returns (bool)
    {
        Record storage rec = Collection[currentRecord];
        rec.state       = _new_state;
        return true;
    }


    /*
    * Modifier: Validate if record updates are allowed
    *
    * @type         modifier
    *
    * @param        uint8 _record_id
    * @param        uint8 _new_state
    * @param        uint256 _duration
    *
    * @return       bool
    */

    modifier RecordUpdateAllowed(uint8 _new_state) {
        require( isRecordUpdateAllowed( _new_state )  );
        _;
    }

    /*
     * Method: Validate if record can be updated to requested state
     *
     * @access       public
     * @type         method
     *
     * @param        uint8 _record_id
     * @param        uint8 _new_state
     *
     * @return       bool
     */
    function isRecordUpdateAllowed(uint8 _new_state ) public view returns (bool) {

        var (CurrentRecordState, RecordStateRequired, EntityStateRequired) = getRequiredStateChanges();

        CurrentRecordState = 0;
        EntityStateRequired = 0;

        if(_new_state == uint8(RecordStateRequired)) {
            return true;
        }
        return false;
    }

    /*
     * Method: Get Record and Entity State Changes
     *
     * @access       public
     * @type         method
     *
     * @return       ( uint8 CurrentRecordState, uint8 RecordStateRequired, uint8 EntityStateRequired)
     */
    function getRequiredStateChanges() public view returns (uint8, uint8, uint8) {

        Record memory record = Collection[currentRecord];

        uint8 CurrentRecordState = record.state;
        uint8 RecordStateRequired = getRecordStateRequiredChanges();
        uint8 EntityStateRequired = getEntityState("__IGNORED__");

        if( ApplicationIsInDevelopment() ) {

            // Do Entity Checks

            if ( CurrentEntityState == getEntityState("WAITING") ) {

                if(RecordStateRequired == getRecordState("IN_PROGRESS") ) {
                    // both record and entity states need to move to IN_PROGRESS
                    EntityStateRequired = getEntityState("IN_DEVELOPMENT");
                }

            } else if ( CurrentEntityState == getEntityState("IN_DEVELOPMENT") ) {

                EntityStateRequired = getEntityState("WAITING_MEETING_TIME");

            } else if ( CurrentEntityState == getEntityState("WAITING_MEETING_TIME") ) {

                if(record.meeting_time > 0) {

                    EntityStateRequired = getEntityState("DEADLINE_MEETING_TIME_YES");

                } else {

                    if(MilestonePostponingHash[ bytes32(currentRecord) ] == false) {
                        if(PostponeForCurrentMilestoneIsApproved()) {
                            EntityStateRequired = getEntityState("WAITING_MEETING_TIME");
                        }
                    }

                    if(MeetingTimeSetFailure()) {
                        // Force Owner Missing in Action - Cash Back Procedure
                        EntityStateRequired = getEntityState("DEADLINE_MEETING_TIME_FAILED");
                    }
                }

            } else if ( CurrentEntityState == getEntityState("DEADLINE_MEETING_TIME_FAILED") ) {


            } else if ( CurrentEntityState == getEntityState("DEADLINE_MEETING_TIME_YES") ) {

                // create proposal
                // start voting if time passed
                if(getTimestamp() >= record.meeting_time ) {
                    EntityStateRequired = getEntityState("VOTING_IN_PROGRESS");
                }

            } else if ( CurrentEntityState == getEntityState("VOTING_IN_PROGRESS") ) {

                uint8 ProposalRecordState = ProposalsEntity.getProposalState( getCurrentProposalId() );

                if ( ProposalRecordState == ProposalsEntity.getRecordState("VOTING_RESULT_YES") ) {
                    EntityStateRequired = getEntityState("VOTING_ENDED_YES");
                }

                if (ProposalRecordState == ProposalsEntity.getRecordState("VOTING_RESULT_NO") ) {
                    EntityStateRequired = getEntityState("VOTING_ENDED_NO");
                }

            } else if ( CurrentEntityState == getEntityState("VOTING_ENDED_YES") ) {

                if( FundingManagerEntity.CurrentEntityState() == FundingManagerEntity.getEntityState("MILESTONE_PROCESS_DONE")) {
                    EntityStateRequired = getEntityState("VOTING_FUNDS_PROCESSED");
                }

            } else if ( CurrentEntityState == getEntityState("VOTING_ENDED_NO") ) {

                // check if milestone cashout period has passed and if so process fund releases
                if(afterVoteNoCashBackTime()) {
                    EntityStateRequired = getEntityState("VOTING_ENDED_NO_FINAL");
                }

            } else if ( CurrentEntityState == getEntityState("VOTING_ENDED_NO_FINAL") ) {

                if( FundingManagerEntity.CurrentEntityState() == FundingManagerEntity.getEntityState("MILESTONE_PROCESS_DONE")) {
                    EntityStateRequired = getEntityState("VOTING_FUNDS_PROCESSED");
                }

            } else if ( CurrentEntityState == getEntityState("VOTING_FUNDS_PROCESSED") ) {


                if(currentRecord < RecordNum) {
                    EntityStateRequired = getEntityState("IN_DEVELOPMENT");
                } else {

                    if(FundingManagerEntity.getCurrentMilestoneProcessed() == true) {
                        if(FundingManagerEntity.CurrentEntityState() == FundingManagerEntity.getEntityState("COMPLETE_PROCESS_DONE")) {
                            EntityStateRequired = getEntityState("DEVELOPMENT_COMPLETE");
                        } else {
                            EntityStateRequired = getEntityState("VOTING_FUNDS_PROCESSED");
                        }
                    } else {
                        EntityStateRequired = getEntityState("IN_DEVELOPMENT");
                    }
                }

            }
            /*
            else if ( CurrentEntityState == getEntityState("DEVELOPMENT_COMPLETE") ) {

            }
            */

        } else {

            if( CurrentEntityState == getEntityState("NEW") ) {
                EntityStateRequired = getEntityState("WAITING");
            }
        }

        return (CurrentRecordState, RecordStateRequired, EntityStateRequired);
    }

    function ApplicationIsInDevelopment() public view returns(bool) {
        if( getApplicationState() == getApplicationEntityState("IN_DEVELOPMENT") ) {
            return true;
        }
        return false;
    }

    function MeetingTimeSetFailure() public view returns (bool) {
        Record memory record = Collection[currentRecord];
        uint256 meetingCreationMaxTime = record.time_end - getBylawsMinTimeInTheFutureForMeetingCreation();
        if(getTimestamp() >= meetingCreationMaxTime ) {
            return true;
        }
        return false;
    }

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"currentRecord","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"MilestonePostponingHash","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"name","type":"bytes32"}],"name":"getRecordState","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"afterVoteNoCashBackTime","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_initialized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MilestoneCashBackTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint8"}],"name":"Collection","outputs":[{"name":"name","type":"bytes32"},{"name":"description","type":"string"},{"name":"state","type":"uint8"},{"name":"duration","type":"uint256"},{"name":"time_start","type":"uint256"},{"name":"last_state_change_time","type":"uint256"},{"name":"time_end","type":"uint256"},{"name":"time_ended","type":"uint256"},{"name":"meeting_time","type":"uint256"},{"name":"funding_percentage","type":"uint8"},{"name":"index","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"RecordNum","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MeetingTimeSetFailure","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_description","type":"string"},{"name":"_duration","type":"uint256"},{"name":"_perc","type":"uint8"}],"name":"addRecord","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"RecordStates","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"EntityStates","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getApplicationState","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CurrentEntityState","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferToNewOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"getApplicationAssetAddressByName","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentHash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBylawsMinTimeInTheFutureForMeetingCreation","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getRequiredStateChanges","outputs":[{"name":"","type":"uint8"},{"name":"","type":"uint8"},{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_meeting_time","type":"uint256"}],"name":"setCurrentMilestoneMeetingTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getBylawsCashBackVoteRejectedDuration","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"applyAndLockSettings","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getRecordStateRequiredChanges","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"}],"name":"setInitialOwnerAndName","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_ownerAddress","type":"address"}],"name":"setInitialApplicationAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"assetName","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"ProposalIdByHash","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"recordId","type":"uint8"}],"name":"getMilestoneFundingPercentage","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBylawsProjectDevelopmentStart","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ApplicationIsInDevelopment","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_settingsApplied","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"name","type":"bytes32"}],"name":"getAppBylawBytes32","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"actionType","type":"uint8"},{"name":"arg1","type":"bytes32"},{"name":"arg2","type":"bytes32"}],"name":"getHash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"name","type":"bytes32"}],"name":"getEntityState","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"name","type":"bytes32"}],"name":"getAppBylawUint256","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"deployerAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"name","type":"bytes32"}],"name":"getApplicationEntityState","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_new_state","type":"uint8"}],"name":"isRecordUpdateAllowed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"doStateChanges","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"hasRequiredStateChanges","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_assetName","type":"bytes32"},{"indexed":true,"name":"_current","type":"uint8"},{"indexed":true,"name":"_required","type":"uint8"}],"name":"DebugRecordRequiredChanges","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_who","type":"uint8"}],"name":"DebugCallAgain","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_assetName","type":"bytes32"},{"indexed":true,"name":"_current","type":"uint8"},{"indexed":true,"name":"_required","type":"uint8"}],"name":"EventEntityProcessor","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_assetName","type":"bytes32"},{"indexed":true,"name":"_current","type":"uint8"},{"indexed":true,"name":"_required","type":"uint8"}],"name":"EventRecordProcessor","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_name","type":"bytes32"},{"indexed":true,"name":"_allowed","type":"bool"}],"name":"DebugAction","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_name","type":"bytes32"},{"indexed":true,"name":"_owner","type":"address"}],"name":"EventAppAssetOwnerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_name","type":"bytes32"}],"name":"EventRunBeforeInit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_name","type":"bytes32"}],"name":"EventRunBeforeApplyingSettings","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_assetName","type":"bytes32"},{"indexed":true,"name":"_current","type":"uint8"},{"indexed":true,"name":"_required","type":"uint8"}],"name":"DebugEntityRequiredChanges","type":"event"}]

606060405260048054600160b860020a0319169055600a805460ff191660011790556000600c556005805433600160a060020a0316600160a060020a0319909116179055612f6e806100526000396000f300606060405236156101e85763ffffffff60e060020a60003504166307b3776c81146101ed57806317c8db5614610216578063188ec356146102405780631af86866146102655780632c684eb61461027b5780633072cf601461028e578063446dde9b146102a157806345f9ac2e146102b45780634a1a650d146103ae5780635dfd1bff146103c15780635e8669f0146103d457806362e2f994146104365780636d0a11c31461044c57806370c0f689146104625780637278d623146104755780637372e9be146104885780637c5c7845146104a75780637cee919c146104d95780637d6dc737146104ec57806388db84bc146104ff5780638da5cb5b1461053d5780639583b7271461055057806398a892c914610566578063af65386114610579578063b4b1b6d91461058c578063b84e183a1461059f578063bc9121cf146105b5578063c9230c5d146105d4578063cd7af078146105e7578063d1c1b945146105fd578063d427ce7414610616578063dd6f0f1914610629578063ddb9769c1461063c578063df077c741461064f578063df6760c514610665578063e490c51314610684578063ed031ae31461069a578063efdee94f146106b0578063f01b1dc1146106c3578063f4698c22146106d9578063f86282da146106f2578063fa9d235214610705575b600080fd5b34156101f857600080fd5b610200610718565b60405160ff909116815260200160405180910390f35b341561022157600080fd5b61022c600435610721565b604051901515815260200160405180910390f35b341561024b57600080fd5b610253610736565b60405190815260200160405180910390f35b341561027057600080fd5b61020060043561073b565b341561028657600080fd5b61022c610750565b341561029957600080fd5b61022c610782565b34156102ac57600080fd5b610253610790565b34156102bf57600080fd5b6102cd60ff60043516610796565b6040518b815260ff808b166040830152606082018a90526080820189905260a0820188905260c0820187905260e08201869052610100808301869052848216610120840152908316610140830152610160602083018181528d54600260018216159094026000190116929092049083018190526101808301908d9080156103955780601f1061036a57610100808354040283529160200191610395565b820191906000526020600020905b81548152906001019060200180831161037857829003601f168201915b50509c5050505050505050505050505060405180910390f35b34156103b957600080fd5b6102006107f8565b34156103cc57600080fd5b61022c610801565b34156103df57600080fd5b610434600480359060446024803590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650508435946020013560ff16935061097d92505050565b005b341561044157600080fd5b610200600435610a53565b341561045757600080fd5b610200600435610a68565b341561046d57600080fd5b610200610a7d565b341561048057600080fd5b610200610aed565b341561049357600080fd5b61022c600160a060020a0360043516610af6565b34156104b257600080fd5b6104bd600435610bdc565b604051600160a060020a03909116815260200160405180910390f35b34156104e457600080fd5b610253610c69565b34156104f757600080fd5b610253610c84565b341561050a57600080fd5b610512610caf565b60405160ff938416815291831660208301529091166040808301919091526060909101905180910390f35b341561054857600080fd5b6104bd61179c565b341561055b57600080fd5b6104346004356117b2565b341561057157600080fd5b61025361185f565b341561058457600080fd5b61022c61188a565b341561059757600080fd5b6102006118f7565b34156105aa57600080fd5b61022c600435611bb0565b34156105c057600080fd5b610434600160a060020a0360043516611c7c565b34156105df57600080fd5b610253611ce5565b34156105f257600080fd5b610253600435611ceb565b341561060857600080fd5b61020060ff60043516611cfd565b341561062157600080fd5b610253611d19565b341561063457600080fd5b61022c611d44565b341561064757600080fd5b61022c611d7f565b341561065a57600080fd5b610253600435611d8e565b341561067057600080fd5b61025360ff60043516602435604435611e28565b341561068f57600080fd5b610200600435611e7b565b34156106a557600080fd5b610253600435611e90565b34156106bb57600080fd5b6104bd611f09565b34156106ce57600080fd5b610200600435611f18565b34156106e457600080fd5b61022c60ff60043516611f92565b34156106fd57600080fd5b610434611fcf565b341561071057600080fd5b61022c612122565b600a5460ff1681565b600b6020526000908152604090205460ff1681565b425b90565b60009081526001602052604090205460ff1690565b60008061075b61185f565b600c540190508061076a610736565b1115610779576001915061077e565b600091505b5090565b600454610100900460ff1681565b600c5481565b60096020819052600091825260409091208054600282015460038301546004840154600585015460068601546007870154600888015498880154969860019098019760ff9687169795969495939492939192909180821691610100909104168b565b60045460ff1681565b600061080b612db2565b600a5460ff166000908152600960205260408082209061016090519081016040529081600082015460001916600019168152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108d85780601f106108ad576101008083540402835291602001916108d8565b820191906000526020600020905b8154815290600101906020018083116108bb57829003601f168201915b5050509183525050600282015460ff9081166020830152600383015460408301526004830154606083015260058301546080830152600683015460a0830152600783015460c0830152600883015460e0830152600990920154808316610100808401919091529004909116610120909101529150610954610c84565b8260c0015103905080610965610736565b106109735760019250610978565b600092505b505090565b60055460009033600160a060020a0390811691161461099b57600080fd5b60045462010000900460ff16156109b157600080fd5b506004805460ff808216600190810190911660ff19909216821790925560009081526009602052604090208581559081018480516109f3929160200190612e1c565b506003810183905560098101805460ff191660ff8416179055610a1e60e860020a624e45570261073b565b60028201805460ff191660ff9283161790556004546009909201805461ff001916610100939092169290920217905550505050565b60016020526000908152604090205460ff1681565b60006020819052908152604090205460ff1681565b60045460009063010000009004600160a060020a0316637278d62382604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610ace57600080fd5b6102c65a03f11515610adf57600080fd5b505050604051805191505090565b60025460ff1681565b60045460009060ff610100909104161515600114610b1357600080fd5b60045433600160a060020a0390811663010000009092041614610b3557600080fd5b60045463010000009004600160a060020a031615801590610b5e5750600160a060020a03821615155b1515610b6957600080fd5b6004805476ffffffffffffffffffffffffffffffffffffffff00000019166301000000600160a060020a0385811682029290921792839055600354920416907f6f7b0a882e7ac0b47fcdb9814cfdaef1622128fa5d29e3318c730c3a5301e8c460405160405180910390a3506001919050565b600454600090819063010000009004600160a060020a031663689216c784836040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515610c3857600080fd5b6102c65a03f11515610c4957600080fd5b5050506040518051915050600160a060020a038116156101e85792915050565b600a54600090610c7f9060019060ff1683611e28565b905090565b6000610c7f7f6d656574696e675f74696d655f7365745f726571000000000000000000000000611e90565b6000806000610cbc612db2565b600a5460ff1660009081526009602052604080822082918291829161016090519081016040529081600082015460001916600019168152602001600182018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d8e5780601f10610d6357610100808354040283529160200191610d8e565b820191906000526020600020905b815481529060010190602001808311610d7157829003601f168201915b5050509183525050600282015460ff908116602083015260038301546040808401919091526004840154606084015260058401546080840152600684015460a0840152600784015460c0840152600884015460e084015260099093015480821661010080850191909152900416610120909101529095508501519350610e126118f7565b9250610e2b600080516020612ec3833981519152611e7b565b9150610e35611d44565b1561174057610e637f57414954494e4700000000000000000000000000000000000000000000000000611e7b565b60025460ff90811691161415610ec857610e9c7f494e5f50524f475245535300000000000000000000000000000000000000000061073b565b60ff168360ff161415610ec357610ec0600080516020612f03833981519152611e7b565b91505b61173b565b610edf600080516020612f03833981519152611e7b565b60025460ff90811691161415610f0657610ec0600080516020612f23833981519152611e7b565b610f1d600080516020612f23833981519152611e7b565b60025460ff90811691161415610fe65760008561010001511115610f6b57610f647f444541444c494e455f4d454554494e475f54494d455f59455300000000000000611e7b565b9150610ec3565b600a5460ff9081166000908152600b6020526040902054161515610fb057610f91612193565b15610fb057610fad600080516020612f23833981519152611e7b565b91505b610fb8610801565b15610ec357610ec07f444541444c494e455f4d454554494e475f54494d455f4641494c454400000000611e7b565b61100f7f444541444c494e455f4d454554494e475f54494d455f4641494c454400000000611e7b565b60025460ff908116911614156110245761173b565b61104d7f444541444c494e455f4d454554494e475f54494d455f59455300000000000000611e7b565b60025460ff908116911614156110995784610100015161106b610736565b10610ec357610ec07f564f54494e475f494e5f50524f47524553530000000000000000000000000000611e7b565b6110c27f564f54494e475f494e5f50524f47524553530000000000000000000000000000611e7b565b60025460ff908116911614156112c957600754600160a060020a0316639080936f6110eb612335565b60006040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561112a57600080fd5b6102c65a03f1151561113b57600080fd5b5050506040518051600754909250600160a060020a03169050631af8686660006040516020015260405160e060020a63ffffffff83160281527f564f54494e475f524553554c545f5945530000000000000000000000000000006004820152602401602060405180830381600087803b15156111b657600080fd5b6102c65a03f115156111c757600080fd5b5050506040518051905060ff168160ff16141561120a576112077f564f54494e475f454e4445445f59455300000000000000000000000000000000611e7b565b91505b600754600160a060020a0316631af8686660006040516020015260405160e060020a63ffffffff83160281527f564f54494e475f524553554c545f4e4f000000000000000000000000000000006004820152602401602060405180830381600087803b151561127857600080fd5b6102c65a03f1151561128957600080fd5b5050506040518051905060ff168160ff161415610ec357610ec07f564f54494e475f454e4445445f4e4f0000000000000000000000000000000000611e7b565b6112f27f564f54494e475f454e4445445f59455300000000000000000000000000000000611e7b565b60025460ff9081169116141561141357600654600160a060020a031663e490c51360006040516020015260405160e060020a63ffffffff83160281527f4d494c4553544f4e455f50524f434553535f444f4e45000000000000000000006004820152602401602060405180830381600087803b151561137057600080fd5b6102c65a03f1151561138157600080fd5b505050604051805160065460ff9091169150600160a060020a0316637278d6236000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156113d857600080fd5b6102c65a03f115156113e957600080fd5b5050506040518051905060ff161415610ec357610ec0600080516020612ee3833981519152611e7b565b61143c7f564f54494e475f454e4445445f4e4f0000000000000000000000000000000000611e7b565b60025460ff9081169116141561148257611454610750565b15610ec357610ec07f564f54494e475f454e4445445f4e4f5f46494e414c0000000000000000000000611e7b565b6114ab7f564f54494e475f454e4445445f4e4f5f46494e414c0000000000000000000000611e7b565b60025460ff9081169116141561152957600654600160a060020a031663e490c51360006040516020015260405160e060020a63ffffffff83160281527f4d494c4553544f4e455f50524f434553535f444f4e45000000000000000000006004820152602401602060405180830381600087803b151561137057600080fd5b611540600080516020612ee3833981519152611e7b565b60025460ff9081169116141561173b57600454600a5460ff9182169116101561157a57610ec0600080516020612f03833981519152611e7b565b600654600160a060020a03166371461be96000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156115c257600080fd5b6102c65a03f115156115d357600080fd5b5050506040518051151560011415905061172157600654600160a060020a031663e490c51360006040516020015260405160e060020a63ffffffff83160281527f434f4d504c4554455f50524f434553535f444f4e4500000000000000000000006004820152602401602060405180830381600087803b151561165557600080fd5b6102c65a03f1151561166657600080fd5b505050604051805160065460ff9091169150600160a060020a0316637278d6236000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156116bd57600080fd5b6102c65a03f115156116ce57600080fd5b5050506040518051905060ff16141561170a57610f647f444556454c4f504d454e545f434f4d504c455445000000000000000000000000611e7b565b610ec0600080516020612ee3833981519152611e7b565b611738600080516020612f03833981519152611e7b565b91505b61178e565b61175260e860020a624e455702611e7b565b60025460ff9081169116141561178e5761178b7f57414954494e4700000000000000000000000000000000000000000000000000611e7b565b91505b509196909550909350915050565b60045463010000009004600160a060020a031681565b6005546000908190819033600160a060020a039081169116146117d457600080fd5b6117eb600080516020612f23833981519152611e7b565b60025460ff908116911614156101e857611803610801565b15156101e857600a5460ff1660009081526009602052604090209250611827610c84565b61182f610736565b019150826006015462015180019050818411801561184c57508084105b1561185957600883018490555b50505050565b6000610c7f7f636173686261636b5f696e766573746f725f6e6f000000000000000000000000611e90565b60055460009033600160a060020a039081169116146118a857600080fd5b60045460ff6101009091041615156001146118c257600080fd5b60045462010000900460ff16156118d857600080fd5b6118e0612359565b506004805462ff0000191662010000179055600190565b6000611901612db2565b600a5460ff166000908152600960205260408082209061016090519081016040529081600082015460001916600019168152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119ce5780601f106119a3576101008083540402835291602001916119ce565b820191906000526020600020905b8154815290600101906020018083116119b157829003601f168201915b5050509183525050600282015460ff9081166020830152600383015460408301526004830154606083015260058301546080830152600683015460a0830152600783015460c0830152600883015460e0830152600990920154808316610100808401919091529004909116610120909101529150611a59600080516020612ec383398151915261073b565b9050611a63611d44565b8015611a725750611a726123ee565b15611baa57611a8960e860020a624e45570261073b565b60ff16826040015160ff161415611add578160800151611aa7610736565b10611ad857611ad57f494e5f50524f475245535300000000000000000000000000000000000000000061073b565b90505b611b7e565b611b067f494e5f50524f475245535300000000000000000000000000000000000000000061073b565b60ff16826040015160ff161415611b7e578160c00151611b24610736565b101580611b4d5750816101000151611b3a610736565b10158015611b4d57506000826101000151115b15611b7e57611b7b7f46494e414c00000000000000000000000000000000000000000000000000000061073b565b90505b8060ff16826040015160ff161415611baa57611ba7600080516020612ec383398151915261073b565b90505b92915050565b600454600090610100900460ff1615611bc857600080fd5b60045433600160a060020a0390811663010000009092041614611bea57600080fd5b611bf2612483565b6003829055611c0960e860020a624e455702611e7b565b6002805460ff191660ff92909216919091179055611c256127d3565b6004805461ff0019166101001790819055600160a060020a03630100000090910416827f6f7b0a882e7ac0b47fcdb9814cfdaef1622128fa5d29e3318c730c3a5301e8c460405160405180910390a3506001919050565b60055433600160a060020a03908116911614611c9757600080fd5b600454610100900460ff1615611cac57600080fd5b60048054600160a060020a0390921663010000000276ffffffffffffffffffffffffffffffffffffffff00000019909216919091179055565b60035481565b600d6020526000908152604090205481565b60ff908116600090815260096020819052604090912001541690565b6000610c7f7f646576656c6f706d656e745f7374617274000000000000000000000000000000611e90565b6000611d5d600080516020612f03833981519152611f18565b60ff16611d68610a7d565b60ff161415611d7957506001610738565b50600090565b60045462010000900460ff1681565b600454600090819060ff610100909104161515600114611dad57600080fd5b5060045463010000009004600160a060020a03168063ee44da7e8460006040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515611e0757600080fd5b6102c65a03f11515611e1857600080fd5b5050506040518051949350505050565b600083838360405160ff939093167f010000000000000000000000000000000000000000000000000000000000000002835260018301919091526021820152604101604051809103902090509392505050565b60009081526020819052604090205460ff1690565b600454600090819060ff610100909104161515600114611eaf57600080fd5b5060045463010000009004600160a060020a03168063b44ce8938460006040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515611e0757600080fd5b600554600160a060020a031681565b60045460009063010000009004600160a060020a031663e490c51383836040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515611f7257600080fd5b6102c65a03f11515611f8357600080fd5b50505060405180519392505050565b600080600080611fa0610caf565b506000945092508391505060ff8581169083161415611fc25760019350611fc7565b600093505b505050919050565b600080600080611fdd610caf565b935093509350600090508260ff168460ff16600354600019167f956147267a6d7deef0b7e79c40af83c9d24edfd649b3bd71b82e9728a550116a60405160405180910390a460025460035460ff8085169216907fac3b1b9b04941d61d4294b1f52e47d24e8b1ab590d5775302fdd5108e15f43ee9060405190815260200160405180910390a361207a600080516020612ec383398151915261073b565b60ff8481169116146120c257612090848461291b565b60027fc95f70c179d14f283454d49fbae175e3f3b35bc4e70702d2dd1bb4433ea337e360405160405180910390a25060015b6120d9600080516020612ec3833981519152611e7b565b60ff838116911614611859576120ee82612964565b60017fc95f70c179d14f283454d49fbae175e3f3b35bc4e70702d2dd1bb4433ea337e360405160405180910390a250505050565b600080808080612130610caf565b92509250925060009250612151600080516020612ec383398151915261073b565b60ff83811691161461216257600193505b612179600080516020612ec3833981519152611e7b565b60ff82811691161461218a57600193505b50919392505050565b60075460009081908190600160a060020a031663cbe94b77826040516020015260405160e060020a63ffffffff83160281527f4d494c4553544f4e455f504f5354504f4e494e470000000000000000000000006004820152602401602060405180830381600087803b151561220757600080fd5b6102c65a03f1151561221857600080fd5b5050506040518051600754909350600160a060020a03169050632f1ec17e8360006040516020015260405160e060020a63ffffffff841602815260ff9091166004820152602401602060405180830381600087803b151561227857600080fd5b6102c65a03f1151561228957600080fd5b5050506040518051600754909250600160a060020a03169050631af8686660006040516020015260405160e060020a63ffffffff83160281527f564f54494e475f524553554c545f5945530000000000000000000000000000006004820152602401602060405180830381600087803b151561230457600080fd5b6102c65a03f1151561231557600080fd5b5050506040518051905060ff168160ff1614156109735760019250610978565b6000600d6000612343610c69565b8152602081019190915260400160002054905090565b60045460009060ff61010090910416151560011461237657600080fd5b60045462010000900460ff161561238c57600080fd5b50600a5460ff1660009081526009602052604090206123a9611d19565b600482018190556003808301549091016006830155547fce50d83c2c178553c51fe8a83d1af61967b308e4ae48086d6526816b465e2f4960405160405180910390a250565b60006124197f57414954494e4700000000000000000000000000000000000000000000000000611e7b565b60025460ff9081169116148061244d5750612441600080516020612f03833981519152611e7b565b60025460ff9081169116145b80612476575061246a600080516020612ee3833981519152611e7b565b60025460ff9081169116145b15611d7957506001610738565b7f82aa092d4c801429a1fff0e42bdcbb41efc63176230d4f4542b13200afb562e8805460ff199081169091557f26c6da47b1522bc44b5826073c13ff8f683a2d7bcb3e45f089817656015efae98054821660019081179091557f0b472e849ed7e57c6860ab569920f9b20f7226a8f60486df39cb8dfdc32464b98054831660029081179091557fde0259a5809e372608d83d28d32270900faed4ebedc30ada6483e287c02717798054841660051790557fe4536871954a196468016c1dfa059c8b2fc0a610f9969639b5a6969e691f6d9580548416600a1790557feca26272154df829530e9f4ab60d360e71c706db978ed5bfe4b284bd4b5ae81380548416600b1790557f1a2d66ce48c3cc245cdbd46a731197e596e262ad35a41bf5b46912a25d93361d80548416600c1790557fdeb5a6254f41dc3e8687edf9e2f7bd8374a547787b706a2432bc824216f8631c8054841660141790557f06efa7a0e36892d6abcef7bc65870d9c54ca674e6afd9b73cce792b5eb7ef3868054841660161790557f69b032c333294f221c70daa74bc35a236aa0b0fabfc43727d47385dcba81e57e8054841660171790557f20f216d8b2e1792a2563c75def665bcd7d93fd444e804e7aa2c9d5a25698795e8054841660191790557f4530777b2f5eef885d3d9caed45aec75720506cfe3b6dd95c2316f659c5aa3aa80548416601e1790557f6881e106a838d423cafbaaf5d5be66ed3c9915cdd97b45afb34ea26cd5ac6d3c8054841660321790557f41be3d15e2013f6f8f85ba044e50f05fa5c0eb72585a79cf955c0e821a6a0ec68054841660631790557ff6fa0759ca3e9b0617d683568ec5cd7052c00749ce9b67e97023e87adce9752a8054841660fa17905560208290527fe4f12cd7531d4b60d6f694b938f9d161e42f7945d6c7e248621b398180482b728054841690557f7682888ea2773830b81e9e9056ddc00853b3dd35cbcafb959db81dd2dcc07110805484169092179091557f6db836eb07cc6ffcaaa17c6971ee87212301b5066365d6c838e86bfa160620758054831690911790557f46494e414c0000000000000000000000000000000000000000000000000000006000527f4fae28347d557af6011a222037aaa8b50d57a888c752b4548eb028b7c83841af80549091166003179055565b600454610100900460ff16156127e857600080fd5b6128117f46756e64696e674d616e61676572000000000000000000000000000000000000610bdc565b6006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556128677f4d656574696e6773000000000000000000000000000000000000000000000000610bdc565b6008805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556128bd7f50726f706f73616c730000000000000000000000000000000000000000000000610bdc565b6007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556003547f6bec69c1d4de72551859e2a42d5f8b4bbb7e6cde7f27a338ad426e098257dfba60405160405180910390a2565b8060ff168260ff16600354600019167f3281ea73b425fee0923ece93ebd39079b597f6fd3913064a2b4cb9c48f20a26c60405160405180910390a461295f81612b1e565b505050565b60025460035460ff8084169216907fa711172fadfeaff9adc3ca2a0ec885d631e96cc1d79e20a1603a1d535966729a60405160405180910390a46002805460ff191660ff83161790556129d67f444541444c494e455f4d454554494e475f54494d455f59455300000000000000611e7b565b60025460ff908116911614156129eb57612b1b565b612a147f564f54494e475f494e5f50524f47524553530000000000000000000000000000611e7b565b60025460ff90811691161415612a3157612a2c612b84565b612b1b565b612a48600080516020612f23833981519152611e7b565b60025460ff90811691161415612a6057612a2c612c2a565b612a897f564f54494e475f454e4445445f59455300000000000000000000000000000000611e7b565b60025460ff90811691161415612a9e57612b1b565b612ac77f564f54494e475f454e4445445f4e4f0000000000000000000000000000000000611e7b565b60025460ff90811691161415612ae757612adf610736565b600c55612b1b565b612afe600080516020612ee3833981519152611e7b565b60025460ff90811691161415612b1b576000600c55612b1b612d00565b50565b600454600090819060ff610100909104161515600114612b3d57600080fd5b82612b4781611f92565b1515612b5257600080fd5b5050600a5460ff9081166000908152600960205260409020600201805460ff1916939091169290921790915550600190565b600d6000612b90610c69565b81526020810191909152604001600020541515612c2857600754600160a060020a03166389f182aa6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612bef57600080fd5b6102c65a03f11515612c0057600080fd5b50505060405180519050600d6000612c16610c69565b81526020810191909152604001600020555b565b600a5460ff9081166000908152600b602052604081205490918291161515612cfc57612c54612193565b15612cfc57600754600160a060020a0316633ac256d86000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612ca157600080fd5b6102c65a03f11515612cb257600080fd5b5050506040518051600a805460ff90811660009081526009602090815260408083206006810180548801905594549093168252600b905220805460ff191660011790559093509150505b5050565b600a5460ff16600090815260096020526040812090612d1d610736565b6007830155612d4b7f46494e414c00000000000000000000000000000000000000000000000000000061073b565b60028301805460ff191660ff928316179055600454600a5490821691161015612cfc5750600a805460ff198116600160ff92831601821617918290551660009081526009602052604090206007919091015460048201819055600382015401600690910155565b6101606040519081016040526000815260208101612dce612e96565b8152602001600060ff168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600060ff168152602001600060ff1681525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612e5d57805160ff1916838001178555612e8a565b82800160010185558215612e8a579182015b82811115612e8a578251825591602001919060010190612e6f565b5061077e929150612ea8565b60206040519081016040526000815290565b61073891905b8082111561077e5760008155600101612eae56005f5f49474e4f5245445f5f000000000000000000000000000000000000000000564f54494e475f46554e44535f50524f43455353454400000000000000000000494e5f444556454c4f504d454e5400000000000000000000000000000000000057414954494e475f4d454554494e475f54494d45000000000000000000000000a165627a7a723058208dc2e671db23926c226d26673e1ac118247a2263a4b1b8542ca6944fbe376b900029

Swarm Source

bzzr://8dc2e671db23926c226d26673e1ac118247a2263a4b1b8542ca6944fbe376b90
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.