Source Code
Overview
MATIC Balance
0 MATIC
More Info
ContractCreator:
Multichain Info
N/A
Latest 25 from a total of 13,205 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Claim Block Rewa... | 20961856 | 876 days ago | IN | 0 MATIC | 0.00006013 | ||||
Claim Block Rewa... | 20961856 | 876 days ago | IN | 0 MATIC | 0.00006013 | ||||
Claim Block Rewa... | 20961856 | 876 days ago | IN | 0 MATIC | 0.00025 | ||||
Claim Block Rewa... | 20961855 | 876 days ago | IN | 0 MATIC | 0.00006013 | ||||
Claim Block Rewa... | 20961855 | 876 days ago | IN | 0 MATIC | 0.00006013 | ||||
Propose | 20961738 | 876 days ago | IN | 0 MATIC | 0.00025462 | ||||
Propose | 20961738 | 876 days ago | IN | 0 MATIC | 0.00026856 | ||||
Propose | 20961736 | 876 days ago | IN | 0 MATIC | 0.00025323 | ||||
Claim Block Rewa... | 20961557 | 877 days ago | IN | 0 MATIC | 0.00025 | ||||
Claim Block Rewa... | 20961556 | 877 days ago | IN | 0 MATIC | 0.00006013 | ||||
Claim Block Rewa... | 20961555 | 877 days ago | IN | 0 MATIC | 0.00006013 | ||||
Claim Block Rewa... | 20961555 | 877 days ago | IN | 0 MATIC | 0.00006013 | ||||
Claim Block Rewa... | 20961555 | 877 days ago | IN | 0 MATIC | 0.00006013 | ||||
Propose | 20961438 | 877 days ago | IN | 0 MATIC | 0.00026456 | ||||
Propose | 20961436 | 877 days ago | IN | 0 MATIC | 0.00025723 | ||||
Claim Block Rewa... | 20961256 | 877 days ago | IN | 0 MATIC | 0.00006013 | ||||
Claim Block Rewa... | 20961255 | 877 days ago | IN | 0 MATIC | 0.00006013 | ||||
Claim Block Rewa... | 20961255 | 877 days ago | IN | 0 MATIC | 0.0002497 | ||||
Claim Block Rewa... | 20961255 | 877 days ago | IN | 0 MATIC | 0.00006013 | ||||
Claim Block Rewa... | 20961254 | 877 days ago | IN | 0 MATIC | 0.00006013 | ||||
Propose | 20961137 | 877 days ago | IN | 0 MATIC | 0.00025911 | ||||
Propose | 20961137 | 877 days ago | IN | 0 MATIC | 0.00026456 | ||||
Propose | 20961137 | 877 days ago | IN | 0 MATIC | 0.00023732 | ||||
Claim Block Rewa... | 20960957 | 877 days ago | IN | 0 MATIC | 0.00006013 | ||||
Claim Block Rewa... | 20960957 | 877 days ago | IN | 0 MATIC | 0.00025 |
Loading...
Loading
Contract Name:
BlockManager
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 30000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "./interface/IBlockManager.sol"; import "./interface/IParameters.sol"; import "./interface/IStakeManager.sol"; import "./interface/IRewardManager.sol"; import "./interface/IVoteManager.sol"; import "./interface/IAssetManager.sol"; import "../randomNumber/IRandomNoProvider.sol"; import "./storage/BlockStorage.sol"; import "./StateManager.sol"; import "../lib/Random.sol"; import "../Initializable.sol"; import "./ACL.sol"; contract BlockManager is Initializable, ACL, BlockStorage, StateManager, IBlockManager { IParameters public parameters; IStakeManager public stakeManager; IRewardManager public rewardManager; IVoteManager public voteManager; IAssetManager public assetManager; IRandomNoProvider public randomNoProvider; event BlockConfirmed(uint32 epoch, uint32 stakerId, uint32[] medians, uint256 timestamp); event Proposed(uint32 epoch, uint32 stakerId, uint32[] medians, uint256 iteration, uint32 biggestInfluencerId, uint256 timestamp); function initialize( address stakeManagerAddress, address rewardManagerAddress, address voteManagerAddress, address assetManagerAddress, address parametersAddress, address randomNoManagerAddress ) external initializer onlyRole(DEFAULT_ADMIN_ROLE) { stakeManager = IStakeManager(stakeManagerAddress); rewardManager = IRewardManager(rewardManagerAddress); voteManager = IVoteManager(voteManagerAddress); assetManager = IAssetManager(assetManagerAddress); parameters = IParameters(parametersAddress); randomNoProvider = IRandomNoProvider(randomNoManagerAddress); } // elected proposer proposes block. //we use a probabilistic method to elect stakers weighted by stake // protocol works like this. //select a staker pseudorandomly (not weighted by anything) // that staker then tosses a biased coin. //bias = hisStake/biggestStake. if its heads, he can propose block // end of iteration. try next iteration // note that only one staker or no stakers selected in each iteration. // stakers elected in higher iterations can also propose hoping that // stakers with lower iteration do not propose for some reason function propose( uint32 epoch, uint32[] memory medians, uint256 iteration, uint32 biggestInfluencerId ) external initialized checkEpochAndState(State.Propose, epoch, parameters.epochLength()) { uint32 proposerId = stakeManager.getStakerId(msg.sender); require(isElectedProposer(iteration, biggestInfluencerId, proposerId), "not elected"); require(stakeManager.getStake(proposerId) >= parameters.minStake(), "stake below minimum stake"); //staker can just skip commit/reveal and only propose every epoch to avoid penalty. //following line is to prevent that require(voteManager.getEpochLastRevealed(proposerId) == epoch, "Cannot propose without revealing"); require(medians.length == assetManager.getNumActiveAssets(), "invalid block proposed"); uint256 biggestInfluence = stakeManager.getInfluence(biggestInfluencerId); if (sortedProposedBlockIds[epoch].length == 0) numProposedBlocks = 0; proposedBlocks[epoch][numProposedBlocks] = Structs.Block(proposerId, medians, iteration, biggestInfluence, true); _insertAppropriately(epoch, numProposedBlocks, iteration, biggestInfluence); numProposedBlocks = numProposedBlocks + 1; emit Proposed(epoch, proposerId, medians, iteration, biggestInfluencerId, block.timestamp); } //anyone can give sorted votes in batches in dispute state function giveSorted( uint32 epoch, uint8 assetId, uint32[] memory sortedStakers ) external initialized checkEpochAndState(State.Dispute, epoch, parameters.epochLength()) { uint256 accWeight = disputes[epoch][msg.sender].accWeight; uint256 accProd = disputes[epoch][msg.sender].accProd; uint32 lastVisitedStaker = disputes[epoch][msg.sender].lastVisitedStaker; uint8 assetIndex = assetManager.getAssetIndex(assetId); if (disputes[epoch][msg.sender].accWeight == 0) { disputes[epoch][msg.sender].assetId = assetId; } else { require(disputes[epoch][msg.sender].assetId == assetId, "AssetId not matching"); // require(disputes[epoch][msg.sender].median == 0, "median already found"); } for (uint16 i = 0; i < sortedStakers.length; i++) { require(sortedStakers[i] > lastVisitedStaker, "sorted[i] is not greater than lastVisited"); lastVisitedStaker = sortedStakers[i]; // slither-disable-next-line calls-loop Structs.Vote memory vote = voteManager.getVote(lastVisitedStaker); require(vote.epoch == epoch, "epoch in vote doesnt match with current"); uint48 value = vote.values[assetIndex - 1]; // slither-disable-next-line calls-loop uint256 influence = voteManager.getInfluenceSnapshot(epoch, lastVisitedStaker); accProd = accProd + value * influence; accWeight = accWeight + influence; } disputes[epoch][msg.sender].lastVisitedStaker = lastVisitedStaker; disputes[epoch][msg.sender].accWeight = accWeight; disputes[epoch][msg.sender].accProd = accProd; } // //if any mistake made during giveSorted, resetDispute and start again function resetDispute(uint32 epoch) external initialized checkEpochAndState(State.Dispute, epoch, parameters.epochLength()) { disputes[epoch][msg.sender] = Structs.Dispute(0, 0, 0, 0); } //O(1) function claimBlockReward() external initialized checkState(State.Confirm, parameters.epochLength()) { uint32 epoch = parameters.getEpoch(); uint32 stakerId = stakeManager.getStakerId(msg.sender); require(stakerId > 0, "Structs.Staker does not exist"); require(blocks[epoch].proposerId == 0, "Block already confirmed"); uint8[] memory deactivatedAssets = assetManager.getPendingDeactivations(); if (sortedProposedBlockIds[epoch].length == 0 || blockIndexToBeConfirmed == -1) { assetManager.executePendingDeactivations(epoch); return; } uint32 proposerId = proposedBlocks[epoch][sortedProposedBlockIds[epoch][uint8(blockIndexToBeConfirmed)]].proposerId; require(proposerId == stakerId, "Block can be confirmed by proposer of the block"); _confirmBlock(epoch, deactivatedAssets, proposerId); } function confirmPreviousEpochBlock(uint32 stakerId) external override initialized onlyRole(BLOCK_CONFIRMER_ROLE) { uint32 epoch = parameters.getEpoch(); uint8[] memory deactivatedAssets = assetManager.getPendingDeactivations(); if (sortedProposedBlockIds[epoch - 1].length == 0 || blockIndexToBeConfirmed == -1) { assetManager.executePendingDeactivations(epoch); return; } _confirmBlock(epoch - 1, deactivatedAssets, stakerId); } function disputeBiggestInfluenceProposed( uint32 epoch, uint8 blockIndex, uint32 correctBiggestInfluencerId ) external initialized checkEpochAndState(State.Dispute, epoch, parameters.epochLength()) returns (uint32) { uint8 blockId = sortedProposedBlockIds[epoch][blockIndex]; require(proposedBlocks[epoch][blockId].valid, "Block already has been disputed"); uint256 correctBiggestInfluence = stakeManager.getInfluence(correctBiggestInfluencerId); require(correctBiggestInfluence > proposedBlocks[epoch][blockId].biggestInfluence, "Invalid dispute : Influence"); return _executeDispute(epoch, blockIndex, blockId); } // Complexity O(1) function finalizeDispute(uint32 epoch, uint8 blockIndex) external initialized checkEpochAndState(State.Dispute, epoch, parameters.epochLength()) returns (uint32) { require( disputes[epoch][msg.sender].accWeight == voteManager.getTotalInfluenceRevealed(epoch), "Total influence revealed doesnt match" ); uint32 median = uint32(disputes[epoch][msg.sender].accProd / disputes[epoch][msg.sender].accWeight); require(median > 0, "median can not be zero"); uint8 blockId = sortedProposedBlockIds[epoch][blockIndex]; require(proposedBlocks[epoch][blockId].valid, "Block already has been disputed"); uint8 assetId = disputes[epoch][msg.sender].assetId; uint8 assetIndex = assetManager.getAssetIndex(assetId); require( proposedBlocks[epoch][blockId].medians[assetIndex - 1] != median, "Proposed Alternate block is identical to proposed block" ); return _executeDispute(epoch, blockIndex, blockId); } function getBlock(uint32 epoch) external view override returns (Structs.Block memory _block) { return (blocks[epoch]); } function getProposedBlock(uint32 epoch, uint8 proposedBlock) external view returns (Structs.Block memory _block) { _block = proposedBlocks[epoch][proposedBlock]; return (_block); } function getNumProposedBlocks(uint32 epoch) external view returns (uint8) { return (uint8(sortedProposedBlockIds[epoch].length)); } function isBlockConfirmed(uint32 epoch) external view override returns (bool) { return (blocks[epoch].proposerId != 0); } function isElectedProposer( uint256 iteration, uint32 biggestInfluencerId, uint32 stakerId ) public view initialized returns (bool) { // generating pseudo random number (range 0..(totalstake - 1)), add (+1) to the result, // since prng returns 0 to max-1 and staker start from 1 bytes32 randaoHashes = voteManager.getRandaoHash(); bytes32 seed1 = Random.prngHash(randaoHashes, keccak256(abi.encode(iteration))); uint256 rand1 = Random.prng(stakeManager.getNumStakers(), seed1); if ((rand1 + 1) != stakerId) { return false; } bytes32 seed2 = Random.prngHash(randaoHashes, keccak256(abi.encode(stakerId, iteration))); uint256 rand2 = Random.prng(2**32, seed2); uint256 biggestInfluence = stakeManager.getInfluence(biggestInfluencerId); uint256 influence = stakeManager.getInfluence(stakerId); if (rand2 * (biggestInfluence) > influence * (2**32)) return (false); return true; } function _confirmBlock( uint32 epoch, uint8[] memory deactivatedAssets, uint32 stakerId ) internal { uint8 blockId = sortedProposedBlockIds[epoch][uint8(blockIndexToBeConfirmed)]; for (uint8 i = uint8(deactivatedAssets.length); i > 0; i--) { // slither-disable-next-line calls-loop uint8 index = assetManager.getAssetIndex(deactivatedAssets[i - 1]); if (index == proposedBlocks[epoch][blockId].medians.length) { proposedBlocks[epoch][blockId].medians.pop(); } else { proposedBlocks[epoch][blockId].medians[index - 1] = proposedBlocks[epoch][blockId].medians[ proposedBlocks[epoch][blockId].medians.length - 1 ]; proposedBlocks[epoch][blockId].medians.pop(); } } blocks[epoch] = proposedBlocks[epoch][blockId]; emit BlockConfirmed(epoch, proposedBlocks[epoch][blockId].proposerId, proposedBlocks[epoch][blockId].medians, block.timestamp); assetManager.executePendingDeactivations(epoch); rewardManager.giveBlockReward(stakerId, epoch); randomNoProvider.provideSecret(epoch, voteManager.getRandaoHash()); } function _insertAppropriately( uint32 epoch, uint8 blockId, uint256 iteration, uint256 biggestInfluence ) internal { uint8 sortedProposedBlockslength = uint8(sortedProposedBlockIds[epoch].length); if (sortedProposedBlockslength == 0) { sortedProposedBlockIds[epoch].push(0); blockIndexToBeConfirmed = 0; return; } uint8 maxAltBlocks = parameters.maxAltBlocks(); for (uint8 i = 0; i < sortedProposedBlockslength; i++) { // Replace : New Block has better biggest influence if (proposedBlocks[epoch][sortedProposedBlockIds[epoch][i]].biggestInfluence < biggestInfluence) { sortedProposedBlockIds[epoch][i] = blockId; return; } // Push and Shift else if (proposedBlocks[epoch][sortedProposedBlockIds[epoch][i]].iteration > iteration) { sortedProposedBlockIds[epoch].push(blockId); sortedProposedBlockslength = sortedProposedBlockslength + 1; for (uint256 j = sortedProposedBlockslength - 1; j > i; j--) { sortedProposedBlockIds[epoch][j] = sortedProposedBlockIds[epoch][j - 1]; } sortedProposedBlockIds[epoch][i] = blockId; if (sortedProposedBlockIds[epoch].length > maxAltBlocks) { sortedProposedBlockIds[epoch].pop(); } return; } } // Worst Iteration and for all other blocks, influence was >= if (sortedProposedBlockIds[epoch].length < maxAltBlocks) { sortedProposedBlockIds[epoch].push(blockId); } } function _executeDispute( uint32 epoch, uint8 blockIndex, uint8 blockId ) internal returns (uint32) { proposedBlocks[epoch][blockId].valid = false; uint8 sortedProposedBlocksLength = uint8(sortedProposedBlockIds[epoch].length); if (uint8(blockIndexToBeConfirmed) == blockIndex) { // If the chosen one only is the culprit one, find successor // O(maxAltBlocks) blockIndexToBeConfirmed = -1; for (uint8 i = blockIndex + 1; i < sortedProposedBlocksLength; i++) { uint8 _blockId = sortedProposedBlockIds[epoch][i]; if (proposedBlocks[epoch][_blockId].valid) { // slither-disable-next-line costly-loop blockIndexToBeConfirmed = int8(i); break; } } } uint32 proposerId = proposedBlocks[epoch][blockId].proposerId; return stakeManager.slash(epoch, proposerId, msg.sender); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "../../lib/Structs.sol"; interface IBlockManager { function confirmPreviousEpochBlock(uint32 stakerId) external; function getBlock(uint32 epoch) external view returns (Structs.Block memory _block); function isBlockConfirmed(uint32 epoch) external view returns (bool); }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; interface IParameters { function getEpoch() external view returns (uint32); function getState() external view returns (uint8); function getAllSlashParams() external view returns ( uint16, uint16, uint16, uint16 ); function epochLength() external view returns (uint16); function minStake() external view returns (uint256); function maxAltBlocks() external view returns (uint8); function blockReward() external view returns (uint256); function penaltyNotRevealNum() external view returns (uint16); function baseDenominator() external view returns (uint16); function maxCommission() external view returns (uint8); function withdrawLockPeriod() external view returns (uint8); function withdrawReleasePeriod() external view returns (uint8); function escapeHatchEnabled() external view returns (bool); function gracePeriod() external view returns (uint16); function maxAge() external view returns (uint32); function exposureDenominator() external view returns (uint16); function extendLockPenalty() external view returns (uint8); }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "../../lib/Structs.sol"; import "../storage/Constants.sol"; interface IStakeManager { function setStakerStake( uint32 _epoch, uint32 _id, Constants.StakeChanged reason, uint256 _stake ) external; function slash( uint32 epoch, uint32 stakerId, address bountyHunter ) external returns (uint32); function setStakerAge( uint32 _epoch, uint32 _id, uint32 _age ) external; function setStakerEpochFirstStakedOrLastPenalized(uint32 _epoch, uint32 _id) external; function escape(address _address) external; function getStakerId(address _address) external view returns (uint32); function getStaker(uint32 _id) external view returns (Structs.Staker memory staker); function getNumStakers() external view returns (uint32); function getInfluence(uint32 stakerId) external view returns (uint256); function getStake(uint32 stakerId) external view returns (uint256); function getEpochFirstStakedOrLastPenalized(uint32 stakerId) external view returns (uint32); }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "../../lib/Structs.sol"; interface IRewardManager { function givePenalties(uint32 epoch, uint32 stakerId) external; function giveBlockReward(uint32 epoch, uint32 stakerId) external; function giveInactivityPenalties(uint32 epoch, uint32 stakerId) external; }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "../../lib/Structs.sol"; interface IVoteManager { function getVoteValue(uint8 assetId, uint32 stakerId) external view returns (uint48); function getVote(uint32 stakerId) external view returns (Structs.Vote memory vote); function getInfluenceSnapshot(uint32 epoch, uint32 stakerId) external view returns (uint256); function getTotalInfluenceRevealed(uint32 epoch) external view returns (uint256); function getEpochLastRevealed(uint32 stakerId) external view returns (uint32); function getEpochLastCommitted(uint32 stakerId) external view returns (uint32); function getRandaoHash() external view returns (bytes32); }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; interface IAssetManager { function executePendingDeactivations(uint32 epoch) external; function getActiveAssets() external view returns (uint8[] memory); function getPendingDeactivations() external view returns (uint8[] memory); function getAssetIndex(uint8 id) external view returns (uint8); function getNumActiveAssets() external view returns (uint256); function getCollectionPower(uint8 id) external view returns (int8); }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; interface IRandomNoProvider { /// @notice Called by BlockManager in ClaimBlockReward or ConfirmBlockLastEpoch /// @param epoch current epoch /// @param _secret hash of encoded rando secret from stakers function provideSecret(uint32 epoch, bytes32 _secret) external; }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "../../lib/Structs.sol"; contract BlockStorage { //epoch -> address -> dispute -> assetid mapping(uint32 => mapping(address => Structs.Dispute)) public disputes; //epoch -> blockId -> block mapping(uint32 => mapping(uint8 => Structs.Block)) public proposedBlocks; //epoch->blockId mapping(uint32 => uint8[]) public sortedProposedBlockIds; // slither-disable-next-line constable-states uint8 public numProposedBlocks; // slither-disable-next-line constable-states int8 public blockIndexToBeConfirmed; // Index in sortedProposedBlockIds // epoch -> blocks mapping(uint32 => Structs.Block) public blocks; }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "./storage/Constants.sol"; contract StateManager is Constants { modifier checkState(State state, uint32 epochLength) { // slither-disable-next-line incorrect-equality require(state == getState(epochLength), "incorrect state"); _; } modifier notState(State state, uint32 epochLength) { // slither-disable-next-line incorrect-equality require(state != getState(epochLength), "incorrect state"); _; } modifier checkEpochAndState( State state, uint32 epoch, uint32 epochLength ) { // slither-disable-next-line incorrect-equality require(epoch == getEpoch(epochLength), "incorrect epoch"); // slither-disable-next-line incorrect-equality require(state == getState(epochLength), "incorrect state"); _; } function getEpoch(uint32 epochLength) public view returns (uint32) { return (uint32(block.number) / (epochLength)); } function getState(uint32 epochLength) public view returns (State) { uint8 state = uint8(((block.number) / (epochLength / NUM_STATES)) % (NUM_STATES)); return State(state); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; library Random { // pseudo random number generator based on hash. returns 0 -> max-1 // slither ignore reason : Internal library // slither-disable-next-line dead-code function prng(uint256 max, bytes32 randHash) internal pure returns (uint256) { uint256 sum = uint256(randHash); return (sum % max); } // pseudo random hash generator based on hashes. // slither ignore reason : Internal library // slither-disable-next-line dead-code function prngHash(bytes32 seed, bytes32 salt) internal pure returns (bytes32) { bytes32 prngHashVal = keccak256(abi.encodePacked(seed, salt)); return (prngHashVal); } }
// SPDX-License-Identifier: MIT // solhint-disable-next-line compiler-version pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * Forked from OZ's (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/b9125001f0a1c44d596ca3a47536f1a467e3a29d/contracts/proxy/utils/Initializable.sol) */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } modifier initialized() { require(_initialized, "Contract should be initialized"); _; } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/AccessControl.sol"; contract ACL is AccessControl { constructor() { _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; library Structs { struct Vote { uint32 epoch; uint48[] values; } struct Commitment { uint32 epoch; bytes32 commitmentHash; } struct Staker { bool acceptDelegation; uint8 commission; address _address; address tokenAddress; uint32 id; uint32 age; uint32 epochFirstStakedOrLastPenalized; uint256 stake; } struct Lock { uint256 amount; //amount in RZR uint256 commission; uint256 withdrawAfter; } struct BountyLock { address bountyHunter; uint256 amount; //amount in RZR uint256 redeemAfter; } struct Block { uint32 proposerId; uint32[] medians; uint256 iteration; uint256 biggestInfluence; bool valid; } struct Dispute { uint8 assetId; uint32 lastVisitedStaker; uint256 accWeight; uint256 accProd; // uint32 median; } struct Job { uint8 id; uint8 selectorType; // 0-1 uint8 weight; // 1-100 int8 power; string name; string selector; string url; } struct Collection { bool active; uint8 id; uint8 assetIndex; int8 power; uint32 aggregationMethod; uint8[] jobIDs; string name; } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; contract Constants { enum State { Commit, Reveal, Propose, Dispute, Confirm } enum StakeChanged { BlockReward, InactivityPenalty, Slashed } uint8 public constant NUM_STATES = 5; // keccak256("BLOCK_CONFIRMER_ROLE") bytes32 public constant BLOCK_CONFIRMER_ROLE = 0x18797bc7973e1dadee1895be2f1003818e30eae3b0e7a01eb9b2e66f3ea2771f; // keccak256("ASSET_CONFIRMER_ROLE") bytes32 public constant ASSET_CONFIRMER_ROLE = 0xed202a1bc048f9b31cb3937bc52e7c8fe76413f0674b9146ff4bcc15612ccbc2; // keccak256("STAKER_ACTIVITY_UPDATER_ROLE") bytes32 public constant STAKER_ACTIVITY_UPDATER_ROLE = 0x4cd3070aaa07d03ab33731cbabd0cb27eb9e074a9430ad006c96941d71b77ece; // keccak256("STAKE_MODIFIER_ROLE") bytes32 public constant STAKE_MODIFIER_ROLE = 0xdbaaaff2c3744aa215ebd99971829e1c1b728703a0bf252f96685d29011fc804; // keccak256("REWARD_MODIFIER_ROLE") bytes32 public constant REWARD_MODIFIER_ROLE = 0xcabcaf259dd9a27f23bd8a92bacd65983c2ebf027c853f89f941715905271a8d; // keccak256("ASSET_MODIFIER_ROLE") bytes32 public constant ASSET_MODIFIER_ROLE = 0xca0fffcc0404933256f3ec63d47233fbb05be25fc0eacc2cfb1a2853993fbbe4; // keccak256("VOTE_MODIFIER_ROLE") bytes32 public constant VOTE_MODIFIER_ROLE = 0xca0fffcc0404933256f3ec63d47233fbb05be25fc0eacc2cfb1a2853993fbbe5; // keccak256("DELEGATOR_MODIFIER_ROLE") bytes32 public constant DELEGATOR_MODIFIER_ROLE = 0x6b7da7a33355c6e035439beb2ac6a052f1558db73f08690b1c9ef5a4e8389597; // keccak256("SECRETS_MODIFIER_ROLE") bytes32 public constant SECRETS_MODIFIER_ROLE = 0x46aaf8a125792dfff6db03d74f94fe1acaf55c8cab22f65297c15809c364465c; address public constant BURN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": true, "runs": 30000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"epoch","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"stakerId","type":"uint32"},{"indexed":false,"internalType":"uint32[]","name":"medians","type":"uint32[]"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"BlockConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"epoch","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"stakerId","type":"uint32"},{"indexed":false,"internalType":"uint32[]","name":"medians","type":"uint32[]"},{"indexed":false,"internalType":"uint256","name":"iteration","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"biggestInfluencerId","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Proposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"ASSET_CONFIRMER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ASSET_MODIFIER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCK_CONFIRMER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DELEGATOR_MODIFIER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NUM_STATES","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_MODIFIER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECRETS_MODIFIER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKER_ACTIVITY_UPDATER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKE_MODIFIER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOTE_MODIFIER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assetManager","outputs":[{"internalType":"contract IAssetManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockIndexToBeConfirmed","outputs":[{"internalType":"int8","name":"","type":"int8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"}],"name":"blocks","outputs":[{"internalType":"uint32","name":"proposerId","type":"uint32"},{"internalType":"uint256","name":"iteration","type":"uint256"},{"internalType":"uint256","name":"biggestInfluence","type":"uint256"},{"internalType":"bool","name":"valid","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimBlockReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"stakerId","type":"uint32"}],"name":"confirmPreviousEpochBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint8","name":"blockIndex","type":"uint8"},{"internalType":"uint32","name":"correctBiggestInfluencerId","type":"uint32"}],"name":"disputeBiggestInfluenceProposed","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"address","name":"","type":"address"}],"name":"disputes","outputs":[{"internalType":"uint8","name":"assetId","type":"uint8"},{"internalType":"uint32","name":"lastVisitedStaker","type":"uint32"},{"internalType":"uint256","name":"accWeight","type":"uint256"},{"internalType":"uint256","name":"accProd","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint8","name":"blockIndex","type":"uint8"}],"name":"finalizeDispute","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"epoch","type":"uint32"}],"name":"getBlock","outputs":[{"components":[{"internalType":"uint32","name":"proposerId","type":"uint32"},{"internalType":"uint32[]","name":"medians","type":"uint32[]"},{"internalType":"uint256","name":"iteration","type":"uint256"},{"internalType":"uint256","name":"biggestInfluence","type":"uint256"},{"internalType":"bool","name":"valid","type":"bool"}],"internalType":"struct Structs.Block","name":"_block","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"epochLength","type":"uint32"}],"name":"getEpoch","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"epoch","type":"uint32"}],"name":"getNumProposedBlocks","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint8","name":"proposedBlock","type":"uint8"}],"name":"getProposedBlock","outputs":[{"components":[{"internalType":"uint32","name":"proposerId","type":"uint32"},{"internalType":"uint32[]","name":"medians","type":"uint32[]"},{"internalType":"uint256","name":"iteration","type":"uint256"},{"internalType":"uint256","name":"biggestInfluence","type":"uint256"},{"internalType":"bool","name":"valid","type":"bool"}],"internalType":"struct Structs.Block","name":"_block","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"epochLength","type":"uint32"}],"name":"getState","outputs":[{"internalType":"enum Constants.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint8","name":"assetId","type":"uint8"},{"internalType":"uint32[]","name":"sortedStakers","type":"uint32[]"}],"name":"giveSorted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"stakeManagerAddress","type":"address"},{"internalType":"address","name":"rewardManagerAddress","type":"address"},{"internalType":"address","name":"voteManagerAddress","type":"address"},{"internalType":"address","name":"assetManagerAddress","type":"address"},{"internalType":"address","name":"parametersAddress","type":"address"},{"internalType":"address","name":"randomNoManagerAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"epoch","type":"uint32"}],"name":"isBlockConfirmed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"iteration","type":"uint256"},{"internalType":"uint32","name":"biggestInfluencerId","type":"uint32"},{"internalType":"uint32","name":"stakerId","type":"uint32"}],"name":"isElectedProposer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numProposedBlocks","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"parameters","outputs":[{"internalType":"contract IParameters","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint32[]","name":"medians","type":"uint32[]"},{"internalType":"uint256","name":"iteration","type":"uint256"},{"internalType":"uint32","name":"biggestInfluencerId","type":"uint32"}],"name":"propose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"proposedBlocks","outputs":[{"internalType":"uint32","name":"proposerId","type":"uint32"},{"internalType":"uint256","name":"iteration","type":"uint256"},{"internalType":"uint256","name":"biggestInfluence","type":"uint256"},{"internalType":"bool","name":"valid","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomNoProvider","outputs":[{"internalType":"contract IRandomNoProvider","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"epoch","type":"uint32"}],"name":"resetDispute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardManager","outputs":[{"internalType":"contract IRewardManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"sortedProposedBlockIds","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakeManager","outputs":[{"internalType":"contract IStakeManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voteManager","outputs":[{"internalType":"contract IVoteManager","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506200001f60003362000025565b620000bd565b62000031828262000035565b5050565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff16620000315760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b615ac580620000cd6000396000f3fe608060405234801561001057600080fd5b50600436106102ff5760003560e01c80637a0c2fcc1161019c578063a217fddf116100ee578063c9e99c2511610097578063da98429511610071578063da984295146108ca578063ef8bf684146108f1578063fccc28131461091857600080fd5b8063c9e99c2514610891578063cc2a9a5b146108a4578063d547741f146108b757600080fd5b8063be436df1116100c8578063be436df1146107da578063bf897a9a14610800578063c1a2bab51461082057600080fd5b8063a217fddf146107ac578063a2719868146107b4578063accd8f53146107c757600080fd5b8063890357301161015057806391d148541161012a57806391d148541461073357806392f3d0661461077957806394217ad11461078c57600080fd5b806389035730146106c557806389447125146106e55780638b5b922d1461070c57600080fd5b806381d96db81161018157806381d96db81461067457806385a9777c146106875780638622f3a91461069a57600080fd5b80637a0c2fcc1461060b5780637e8616901461065457600080fd5b80632f50bcc4116102555780634bc68b50116102095780635cd0783e116101e35780635cd0783e1461055c5780637542ff95146105c4578063776076e7146105e457600080fd5b80634bc68b501461050f5780634d4b56bd146105225780635c9521ba1461054957600080fd5b806342a1035f1161023a57806342a1035f146104bb57806342c1e587146104c85780634912b72a146104e857600080fd5b80632f50bcc41461048157806336568abe146104a857600080fd5b806311e29f52116102b7578063248a9ca311610291578063248a9ca3146104155780632d93b9a0146104475780632f2ff15d1461046e57600080fd5b806311e29f52146103c657806316391253146103eb5780631bea14e9146103f557600080fd5b80630cde122a116102e85780630cde122a146103465780630d28df481461036e5780630f4ef8a61461038157600080fd5b806301ffc9a71461030457806305db56df1461032c575b600080fd5b61031761031236600461504f565b610933565b60405190151581526020015b60405180910390f35b610334600581565b60405160ff9091168152602001610323565b6103596103543660046152d5565b6109cc565b60405163ffffffff9091168152602001610323565b61035961037c3660046151dd565b611025565b6009546103a19073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610323565b6005546103d890610100900460000b81565b60405160009190910b8152602001610323565b6103f3611031565b005b6104086104033660046151dd565b61167d565b60405161032391906154f2565b610439610423366004614ff4565b6000908152600160208190526040909120015490565b604051908152602001610323565b6104397fca0fffcc0404933256f3ec63d47233fbb05be25fc0eacc2cfb1a2853993fbbe581565b6103f361047c366004615024565b61178c565b6104397f46aaf8a125792dfff6db03d74f94fe1acaf55c8cab22f65297c15809c364465c81565b6103f36104b6366004615024565b6117b8565b6005546103349060ff1681565b600a546103a19073ffffffffffffffffffffffffffffffffffffffff1681565b6104397f6b7da7a33355c6e035439beb2ac6a052f1558db73f08690b1c9ef5a4e838959781565b61031761051d36600461519c565b61184d565b6104397f4cd3070aaa07d03ab33731cbabd0cb27eb9e074a9430ad006c96941d71b77ece81565b6104086105573660046152d5565b611c29565b61059b61056a3660046151dd565b600660205260009081526040902080546002820154600383015460049093015463ffffffff90921692909160ff1684565b6040805163ffffffff909516855260208501939093529183015215156060820152608001610323565b6008546103a19073ffffffffffffffffffffffffffffffffffffffff1681565b6104397fdbaaaff2c3744aa215ebd99971829e1c1b728703a0bf252f96685d29011fc80481565b61059b6106193660046152d5565b60036020818152600093845260408085209091529183529120805460028201549282015460049092015463ffffffff90911692919060ff1684565b6106676106623660046151dd565b611d44565b6040516103239190615479565b6103f36106823660046151dd565b611d92565b6103346106953660046152aa565b612017565b6103176106a83660046151dd565b63ffffffff90811660009081526006602052604090205416151590565b6007546103a19073ffffffffffffffffffffffffffffffffffffffff1681565b6104397fca0fffcc0404933256f3ec63d47233fbb05be25fc0eacc2cfb1a2853993fbbe481565b6104397fed202a1bc048f9b31cb3937bc52e7c8fe76413f0674b9146ff4bcc15612ccbc281565b610317610741366004615024565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b61035961078736600461536d565b61205a565b600b546103a19073ffffffffffffffffffffffffffffffffffffffff1681565b610439600081565b6103f36107c236600461530d565b612449565b6103f36107d5366004615240565b612bf7565b6103346107e83660046151dd565b63ffffffff1660009081526004602052604090205490565b600c546103a19073ffffffffffffffffffffffffffffffffffffffff1681565b61086861082e366004615215565b6002602081815260009384526040808520909152918352912080546001820154919092015460ff831692610100900463ffffffff16919084565b6040805160ff909516855263ffffffff9093166020850152918301526060820152608001610323565b6103f361089f3660046151dd565b6134d4565b6103f36108b2366004614ee5565b6137cb565b6103f36108c5366004615024565b613961565b6104397f18797bc7973e1dadee1895be2f1003818e30eae3b0e7a01eb9b2e66f3ea2771f81565b6104397fcabcaf259dd9a27f23bd8a92bacd65983c2ebf027c853f89f941715905271a8d81565b6103a173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806109c657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6000805460ff16610a245760405162461bcd60e51b815260206004820152601e60248201527f436f6e74726163742073686f756c6420626520696e697469616c697a6564000060448201526064015b60405180910390fd5b600383600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357d775f86040518163ffffffff1660e01b815260040160206040518083038186803b158015610a8f57600080fd5b505afa158015610aa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac7919061517a565b61ffff16610ad481611025565b63ffffffff168263ffffffff1614610b2e5760405162461bcd60e51b815260206004820152600f60248201527f696e636f72726563742065706f636800000000000000000000000000000000006044820152606401610a1b565b610b3781611d44565b6004811115610b5657634e487b7160e01b600052602160045260246000fd5b836004811115610b7657634e487b7160e01b600052602160045260246000fd5b14610bc35760405162461bcd60e51b815260206004820152600f60248201527f696e636f727265637420737461746500000000000000000000000000000000006044820152606401610a1b565b600a546040517f38e692a900000000000000000000000000000000000000000000000000000000815263ffffffff8816600482015273ffffffffffffffffffffffffffffffffffffffff909116906338e692a99060240160206040518083038186803b158015610c3257600080fd5b505afa158015610c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6a919061500c565b63ffffffff8716600090815260026020908152604080832033845290915290206001015414610d015760405162461bcd60e51b815260206004820152602560248201527f546f74616c20696e666c75656e63652072657665616c656420646f65736e742060448201527f6d617463680000000000000000000000000000000000000000000000000000006064820152608401610a1b565b63ffffffff8616600090815260026020818152604080842033855290915282206001810154910154610d339190615864565b905060008163ffffffff1611610d8b5760405162461bcd60e51b815260206004820152601660248201527f6d656469616e2063616e206e6f74206265207a65726f000000000000000000006044820152606401610a1b565b63ffffffff87166000908152600460205260408120805460ff8916908110610dc357634e487b7160e01b600052603260045260246000fd5b60009182526020808320818304015463ffffffff8c16845260038252604080852060ff601f9095166101000a90920484168086529190925292206004015491925016610e515760405162461bcd60e51b815260206004820152601f60248201527f426c6f636b20616c726561647920686173206265656e206469737075746564006044820152606401610a1b565b63ffffffff8816600090815260026020908152604080832033845290915280822054600b5491517f7691265000000000000000000000000000000000000000000000000000000000815260ff90911660048201819052929173ffffffffffffffffffffffffffffffffffffffff169063769126509060240160206040518083038186803b158015610ee157600080fd5b505afa158015610ef5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f19919061539c565b63ffffffff8b8116600090815260036020908152604080832060ff891684529091529020919250851690600190810190610f539084615914565b60ff1681548110610f7457634e487b7160e01b600052603260045260246000fd5b6000918252602090912060088204015460079091166004026101000a900463ffffffff16141561100c5760405162461bcd60e51b815260206004820152603760248201527f50726f706f73656420416c7465726e61746520626c6f636b206973206964656e60448201527f746963616c20746f2070726f706f73656420626c6f636b0000000000000000006064820152608401610a1b565b6110178a8a85613988565b9a9950505050505050505050565b60006109c68243615878565b60005460ff166110835760405162461bcd60e51b815260206004820152601e60248201527f436f6e74726163742073686f756c6420626520696e697469616c697a656400006044820152606401610a1b565b600754604080517f57d775f8000000000000000000000000000000000000000000000000000000008152905160049273ffffffffffffffffffffffffffffffffffffffff16916357d775f891818501916020919081900386018186803b1580156110ec57600080fd5b505afa158015611100573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611124919061517a565b61ffff1661113181611d44565b600481111561115057634e487b7160e01b600052602160045260246000fd5b82600481111561117057634e487b7160e01b600052602160045260246000fd5b146111bd5760405162461bcd60e51b815260206004820152600f60248201527f696e636f727265637420737461746500000000000000000000000000000000006044820152606401610a1b565b600754604080517f757991a8000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163757991a8916004808301926020929190829003018186803b15801561122857600080fd5b505afa15801561123c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126091906151f9565b6008546040517f6022a48500000000000000000000000000000000000000000000000000000000815233600482015291925060009173ffffffffffffffffffffffffffffffffffffffff90911690636022a4859060240160206040518083038186803b1580156112cf57600080fd5b505afa1580156112e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130791906151f9565b905060008163ffffffff161161135f5760405162461bcd60e51b815260206004820152601d60248201527f537472756374732e5374616b657220646f6573206e6f742065786973740000006044820152606401610a1b565b63ffffffff80831660009081526006602052604090205416156113c45760405162461bcd60e51b815260206004820152601760248201527f426c6f636b20616c726561647920636f6e6669726d65640000000000000000006044820152606401610a1b565b600b54604080517fbe780837000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163be7808379160048083019286929190829003018186803b15801561142e57600080fd5b505afa158015611442573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526114889190810190614f58565b63ffffffff841660009081526004602052604090205490915015806114da57506005546101009004600090810b900b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff145b1561156f57600b546040517fbbefc10a00000000000000000000000000000000000000000000000000000000815263ffffffff8516600482015273ffffffffffffffffffffffffffffffffffffffff9091169063bbefc10a90602401600060405180830381600087803b15801561155057600080fd5b505af1158015611564573d6000803e3d6000fd5b505050505050505050565b63ffffffff831660009081526003602090815260408083206004909252822060055481548492916101009004830b60ff169081106115bd57634e487b7160e01b600052603260045260246000fd5b600091825260208083208183040154601f9092166101000a90910460ff16835282019290925260400190205463ffffffff9081169150831681146116695760405162461bcd60e51b815260206004820152602f60248201527f426c6f636b2063616e20626520636f6e6669726d65642062792070726f706f7360448201527f6572206f662074686520626c6f636b00000000000000000000000000000000006064820152608401610a1b565b611674848383613bf8565b505050505b5050565b6116b76040518060a00160405280600063ffffffff1681526020016060815260200160008152602001600081526020016000151581525090565b63ffffffff808316600090815260066020908152604091829020825160a0810184528154909416845260018101805484518185028101850190955280855291938584019390929083018282801561175957602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff168152602001906004019060208260030104928301926001038202915080841161171c5790505b5050509183525050600282015460208201526003820154604082015260049091015460ff16151560609091015292915050565b600082815260016020819052604090912001546117a981336142cd565b6117b38383614385565b505050565b73ffffffffffffffffffffffffffffffffffffffff811633146118435760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610a1b565b6116798282614444565b6000805460ff166118a05760405162461bcd60e51b815260206004820152601e60248201527f436f6e74726163742073686f756c6420626520696e697469616c697a656400006044820152606401610a1b565b600a54604080517fa7a62a10000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163a7a62a10916004808301926020929190829003018186803b15801561190b57600080fd5b505afa15801561191f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611943919061500c565b90506000611979828760405160200161195e91815260200190565b604051602081830303815290604052805190602001206144ff565b90506000611a2c600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bc788d466040518163ffffffff1660e01b815260040160206040518083038186803b1580156119e857600080fd5b505afa1580156119fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2091906151f9565b63ffffffff168361455c565b905063ffffffff8516611a40826001615827565b14611a515760009350505050611c22565b6040805163ffffffff87166020820152908101889052600090611a7890859060600161195e565b90506000611a8b6401000000008361455c565b6008546040517f05065cd400000000000000000000000000000000000000000000000000000000815263ffffffff8b16600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906305065cd49060240160206040518083038186803b158015611b0057600080fd5b505afa158015611b14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b38919061500c565b6008546040517f05065cd400000000000000000000000000000000000000000000000000000000815263ffffffff8b16600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906305065cd49060240160206040518083038186803b158015611bad57600080fd5b505afa158015611bc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be5919061500c565b9050611bf68164010000000061589b565b611c00838561589b565b1115611c16576000975050505050505050611c22565b60019750505050505050505b9392505050565b611c636040518060a00160405280600063ffffffff1681526020016060815260200160008152602001600081526020016000151581525090565b63ffffffff808416600090815260036020908152604080832060ff87168452825291829020825160a08101845281549094168452600181018054845181850281018501909552808552919385840193909290830182828015611d1057602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411611cd35790505b5050509183525050600282015460208201526003820154604082015260049091015460ff1615156060909101529392505050565b6000806005611d538185615878565b611d639063ffffffff1643615864565b611d6d9190615a15565b90508060ff166004811115611c2257634e487b7160e01b600052602160045260246000fd5b60005460ff16611de45760405162461bcd60e51b815260206004820152601e60248201527f436f6e74726163742073686f756c6420626520696e697469616c697a656400006044820152606401610a1b565b600381600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357d775f86040518163ffffffff1660e01b815260040160206040518083038186803b158015611e4f57600080fd5b505afa158015611e63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e87919061517a565b61ffff16611e9481611025565b63ffffffff168263ffffffff1614611eee5760405162461bcd60e51b815260206004820152600f60248201527f696e636f72726563742065706f636800000000000000000000000000000000006044820152606401610a1b565b611ef781611d44565b6004811115611f1657634e487b7160e01b600052602160045260246000fd5b836004811115611f3657634e487b7160e01b600052602160045260246000fd5b14611f835760405162461bcd60e51b815260206004820152600f60248201527f696e636f727265637420737461746500000000000000000000000000000000006044820152606401610a1b565b505060408051608081018252600080825260208083018281528385018381526060850184815263ffffffff9889168552600280855287862033875290945295909320935184549151909716610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000090911660ff9790971696909617959095178255516001820155905192019190915550565b6004602052816000526040600020818154811061203357600080fd5b9060005260206000209060209182820401919006915091509054906101000a900460ff1681565b6000805460ff166120ad5760405162461bcd60e51b815260206004820152601e60248201527f436f6e74726163742073686f756c6420626520696e697469616c697a656400006044820152606401610a1b565b600384600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357d775f86040518163ffffffff1660e01b815260040160206040518083038186803b15801561211857600080fd5b505afa15801561212c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612150919061517a565b61ffff1661215d81611025565b63ffffffff168263ffffffff16146121b75760405162461bcd60e51b815260206004820152600f60248201527f696e636f72726563742065706f636800000000000000000000000000000000006044820152606401610a1b565b6121c081611d44565b60048111156121df57634e487b7160e01b600052602160045260246000fd5b8360048111156121ff57634e487b7160e01b600052602160045260246000fd5b1461224c5760405162461bcd60e51b815260206004820152600f60248201527f696e636f727265637420737461746500000000000000000000000000000000006044820152606401610a1b565b63ffffffff87166000908152600460205260408120805460ff891690811061228457634e487b7160e01b600052603260045260246000fd5b60009182526020808320818304015463ffffffff8c16845260038252604080852060ff601f9095166101000a909204841680865291909252922060040154919250166123125760405162461bcd60e51b815260206004820152601f60248201527f426c6f636b20616c726561647920686173206265656e206469737075746564006044820152606401610a1b565b6008546040517f05065cd400000000000000000000000000000000000000000000000000000000815263ffffffff8816600482015260009173ffffffffffffffffffffffffffffffffffffffff16906305065cd49060240160206040518083038186803b15801561238257600080fd5b505afa158015612396573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ba919061500c565b63ffffffff8a16600090815260036020818152604080842060ff88168552909152909120015490915081116124315760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642064697370757465203a20496e666c75656e636500000000006044820152606401610a1b565b61243c898984613988565b9998505050505050505050565b60005460ff1661249b5760405162461bcd60e51b815260206004820152601e60248201527f436f6e74726163742073686f756c6420626520696e697469616c697a656400006044820152606401610a1b565b600383600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357d775f86040518163ffffffff1660e01b815260040160206040518083038186803b15801561250657600080fd5b505afa15801561251a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253e919061517a565b61ffff1661254b81611025565b63ffffffff168263ffffffff16146125a55760405162461bcd60e51b815260206004820152600f60248201527f696e636f72726563742065706f636800000000000000000000000000000000006044820152606401610a1b565b6125ae81611d44565b60048111156125cd57634e487b7160e01b600052602160045260246000fd5b8360048111156125ed57634e487b7160e01b600052602160045260246000fd5b1461263a5760405162461bcd60e51b815260206004820152600f60248201527f696e636f727265637420737461746500000000000000000000000000000000006044820152606401610a1b565b63ffffffff86811660009081526002602081815260408084203385529091528083206001810154928101549054600b5492517f7691265000000000000000000000000000000000000000000000000000000000815260ff8c1660048201529395919461010090910490911692909173ffffffffffffffffffffffffffffffffffffffff169063769126509060240160206040518083038186803b1580156126e057600080fd5b505afa1580156126f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612718919061539c565b63ffffffff8b1660009081526002602090815260408083203384529091529020600101549091506127935763ffffffff8a166000908152600260209081526040808320338452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8b16179055612808565b63ffffffff8a16600090815260026020908152604080832033845290915290205460ff8a81169116146128085760405162461bcd60e51b815260206004820152601460248201527f41737365744964206e6f74206d61746368696e670000000000000000000000006044820152606401610a1b565b60005b88518161ffff161015612b8a578263ffffffff16898261ffff168151811061284357634e487b7160e01b600052603260045260246000fd5b602002602001015163ffffffff16116128c45760405162461bcd60e51b815260206004820152602960248201527f736f727465645b695d206973206e6f742067726561746572207468616e206c6160448201527f73745669736974656400000000000000000000000000000000000000000000006064820152608401610a1b565b888161ffff16815181106128e857634e487b7160e01b600052603260045260246000fd5b6020908102919091010151600a546040517fca0652bf00000000000000000000000000000000000000000000000000000000815263ffffffff8316600482015291945060009173ffffffffffffffffffffffffffffffffffffffff9091169063ca0652bf9060240160006040518083038186803b15801561296857600080fd5b505afa15801561297c573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526129c2919081019061508f565b90508b63ffffffff16816000015163ffffffff1614612a495760405162461bcd60e51b815260206004820152602760248201527f65706f636820696e20766f746520646f65736e74206d6174636820776974682060448201527f63757272656e74000000000000000000000000000000000000000000000000006064820152608401610a1b565b6020810151600090612a5c600186615914565b60ff1681518110612a7d57634e487b7160e01b600052603260045260246000fd5b602002602001015190506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166348fd8e7b8f886040518363ffffffff1660e01b8152600401612af892919063ffffffff92831681529116602082015260400190565b60206040518083038186803b158015612b1057600080fd5b505afa158015612b24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b48919061500c565b9050612b5c8165ffffffffffff841661589b565b612b669088615827565b9650612b728189615827565b97505050508080612b82906159d3565b91505061280b565b505063ffffffff9889166000908152600260208181526040808420338552909152909120805492909a16610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff90921691909117895560018901929092559601959095555050505050565b60005460ff16612c495760405162461bcd60e51b815260206004820152601e60248201527f436f6e74726163742073686f756c6420626520696e697469616c697a656400006044820152606401610a1b565b600284600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357d775f86040518163ffffffff1660e01b815260040160206040518083038186803b158015612cb457600080fd5b505afa158015612cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cec919061517a565b61ffff16612cf981611025565b63ffffffff168263ffffffff1614612d535760405162461bcd60e51b815260206004820152600f60248201527f696e636f72726563742065706f636800000000000000000000000000000000006044820152606401610a1b565b612d5c81611d44565b6004811115612d7b57634e487b7160e01b600052602160045260246000fd5b836004811115612d9b57634e487b7160e01b600052602160045260246000fd5b14612de85760405162461bcd60e51b815260206004820152600f60248201527f696e636f727265637420737461746500000000000000000000000000000000006044820152606401610a1b565b6008546040517f6022a48500000000000000000000000000000000000000000000000000000000815233600482015260009173ffffffffffffffffffffffffffffffffffffffff1690636022a4859060240160206040518083038186803b158015612e5257600080fd5b505afa158015612e66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e8a91906151f9565b9050612e9786868361184d565b612ee35760405162461bcd60e51b815260206004820152600b60248201527f6e6f7420656c65637465640000000000000000000000000000000000000000006044820152606401610a1b565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663375b3c0a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612f4b57600080fd5b505afa158015612f5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f83919061500c565b6008546040517edd998100000000000000000000000000000000000000000000000000000000815263ffffffff8416600482015273ffffffffffffffffffffffffffffffffffffffff9091169062dd99819060240160206040518083038186803b158015612ff057600080fd5b505afa158015613004573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613028919061500c565b10156130765760405162461bcd60e51b815260206004820152601960248201527f7374616b652062656c6f77206d696e696d756d207374616b65000000000000006044820152606401610a1b565b600a546040517f0bb34f5600000000000000000000000000000000000000000000000000000000815263ffffffff83811660048301528a169173ffffffffffffffffffffffffffffffffffffffff1690630bb34f569060240160206040518083038186803b1580156130e757600080fd5b505afa1580156130fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061311f91906151f9565b63ffffffff16146131725760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742070726f706f736520776974686f75742072657665616c696e676044820152606401610a1b565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c0050a116040518163ffffffff1660e01b815260040160206040518083038186803b1580156131da57600080fd5b505afa1580156131ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613212919061500c565b8751146132615760405162461bcd60e51b815260206004820152601660248201527f696e76616c696420626c6f636b2070726f706f736564000000000000000000006044820152606401610a1b565b6008546040517f05065cd400000000000000000000000000000000000000000000000000000000815263ffffffff8716600482015260009173ffffffffffffffffffffffffffffffffffffffff16906305065cd49060240160206040518083038186803b1580156132d157600080fd5b505afa1580156132e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613309919061500c565b63ffffffff8a1660009081526004602052604090205490915061334f57600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b6040805160a08101825263ffffffff848116825260208083018c81528385018c9052606084018690526001608085018190528e841660009081526003845286812060055460ff168252845295909520845181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000169416939093178355518051939492936133e4938501929190910190614d32565b506040820151600282015560608201516003820155608090910151600490910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600554613444908a9060ff168984614571565b6005546134559060ff16600161583f565b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff929092169190911790556040517f60b28e9913876d5cd18aedee156a4b9a83cb2e4661a47a60d5dbe1f6f71f4bf5906134c1908b9085908c908c908c90429061554a565b60405180910390a1505050505050505050565b60005460ff166135265760405162461bcd60e51b815260206004820152601e60248201527f436f6e74726163742073686f756c6420626520696e697469616c697a656400006044820152606401610a1b565b7f18797bc7973e1dadee1895be2f1003818e30eae3b0e7a01eb9b2e66f3ea2771f61355181336142cd565b600754604080517f757991a8000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163757991a8916004808301926020929190829003018186803b1580156135bc57600080fd5b505afa1580156135d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135f491906151f9565b90506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663be7808376040518163ffffffff1660e01b815260040160006040518083038186803b15801561366057600080fd5b505afa158015613674573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526136ba9190810190614f58565b9050600460006136cb6001856158ef565b63ffffffff168152602081019190915260400160002054158061371b57506005546101009004600090810b900b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff145b156137b057600b546040517fbbefc10a00000000000000000000000000000000000000000000000000000000815263ffffffff8416600482015273ffffffffffffffffffffffffffffffffffffffff9091169063bbefc10a906024015b600060405180830381600087803b15801561379257600080fd5b505af11580156137a6573d6000803e3d6000fd5b5050505050505050565b6137c56137be6001846158ef565b8286613bf8565b50505050565b600054610100900460ff16806137e4575060005460ff16155b6138565760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a1b565b600054610100900460ff1615801561389557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b60006138a181336142cd565b50600880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8a811691909117909255600980548216898416179055600a80548216888416179055600b80548216878416179055600780548216868416179055600c8054909116918416919091179055801561395857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50505050505050565b6000828152600160208190526040909120015461397e81336142cd565b6117b38383614444565b63ffffffff8316600081815260036020908152604080832060ff8087168552908352818420600490810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905594845293909152812054600554919290916101009004830b81169085161415613b1457600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661ff001790556000613a3485600161583f565b90505b8160ff168160ff161015613b125763ffffffff86166000908152600460205260408120805460ff8416908110613a7d57634e487b7160e01b600052603260045260246000fd5b60009182526020808320818304015463ffffffff8b16845260038252604080852060ff601f9095166101000a9092048416808652919092529220600401549192501615613aff5750600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010060ff600085900b1602179055613b12565b5080613b0a816159f5565b915050613a37565b505b63ffffffff858116600081815260036020908152604080832060ff89168452909152908190205460085491517f8f764cf40000000000000000000000000000000000000000000000000000000081526004810193909352909216602482018190523360448301529173ffffffffffffffffffffffffffffffffffffffff1690638f764cf490606401602060405180830381600087803b158015613bb657600080fd5b505af1158015613bca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bee91906151f9565b9695505050505050565b63ffffffff831660009081526004602052604081206005548154610100909104830b60ff16908110613c3a57634e487b7160e01b600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff1690506000835190505b60ff811615613f9057600b5460009073ffffffffffffffffffffffffffffffffffffffff16637691265086613c99600186615914565b60ff1681518110613cba57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401613ce7919060ff91909116815260200190565b60206040518083038186803b158015613cff57600080fd5b505afa158015613d13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d37919061539c565b63ffffffff8716600090815260036020908152604080832060ff808916855292529091206001015491925082161415613dfe5763ffffffff8616600090815260036020908152604080832060ff871684529091529020600101805480613dad57634e487b7160e01b600052603160045260246000fd5b60008281526020902060087fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191820401805463ffffffff600460078516026101000a02191690559055613f7d565b63ffffffff8616600090815260036020908152604080832060ff871684529091529020600190810180549091613e33916158d8565b81548110613e5157634e487b7160e01b600052603260045260246000fd5b6000918252602080832060088304015463ffffffff8a8116855260038352604080862060ff8a1687529093529190932060079092166004026101000a90920490911690600190810190613ea49084615914565b60ff1681548110613ec557634e487b7160e01b600052603260045260246000fd5b600091825260208083206008830401805460079093166004026101000a63ffffffff8181021990941695841602949094179093558816815260038252604080822060ff8716835290925220600101805480613f3057634e487b7160e01b600052603160045260246000fd5b60008281526020902060087fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191820401805463ffffffff600460078516026101000a021916905590555b5080613f8881615998565b915050613c63565b5063ffffffff808516600081815260036020908152604080832060ff87168452825280832093835260069091529020815481547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000169316929092178255600180820180549293926140049284019190614de1565b5060028281015490820155600380830154818301556004928301549290910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff938416151517905563ffffffff86811660009081526020928352604080822094861682529390925290829020805492517f736990cb4424cb3b541e24055819082dfdec9a3c74c5b7b771350f0cff7ec195936140b293899391169160019190910190429061558f565b60405180910390a1600b546040517fbbefc10a00000000000000000000000000000000000000000000000000000000815263ffffffff8616600482015273ffffffffffffffffffffffffffffffffffffffff9091169063bbefc10a90602401600060405180830381600087803b15801561412b57600080fd5b505af115801561413f573d6000803e3d6000fd5b50506009546040517f01f47e3800000000000000000000000000000000000000000000000000000000815263ffffffff80871660048301528816602482015273ffffffffffffffffffffffffffffffffffffffff90911692506301f47e389150604401600060405180830381600087803b1580156141bc57600080fd5b505af11580156141d0573d6000803e3d6000fd5b5050600c54600a54604080517fa7a62a10000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416955063ffe87625945089939092169163a7a62a1091600480820192602092909190829003018186803b15801561424e57600080fd5b505afa158015614262573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614286919061500c565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815263ffffffff9290921660048301526024820152604401613778565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16611679576143258173ffffffffffffffffffffffffffffffffffffffff166014614ac3565b614330836020614ac3565b6040516020016143419291906153f8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262461bcd60e51b8252610a1b916004016154a1565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1661167957600082815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff161561167957600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600080838360405160200161451e929190918252602082015260400190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181529190528051602090910120949350505050565b6000816145698482615a15565b949350505050565b63ffffffff841660009081526004602052604090205460ff81166145fb575063ffffffff841660009081526004602090815260408220805460018101825590835291819020908204018054601f9092166101000a60ff02199091169055600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690556137c5565b600754604080517f379597e0000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163379597e0916004808301926020929190829003018186803b15801561466657600080fd5b505afa15801561467a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061469e919061539c565b905060005b8260ff168160ff161015614a535763ffffffff871660009081526003602090815260408083206004909252822080548793919060ff86169081106146f757634e487b7160e01b600052603260045260246000fd5b600091825260208083208183040154601f9092166101000a90910460ff16835282019290925260400190206003015410156147995763ffffffff87166000908152600460205260409020805487919060ff841690811061476757634e487b7160e01b600052603260045260246000fd5b90600052602060002090602091828204019190066101000a81548160ff021916908360ff1602179055505050506137c5565b63ffffffff871660009081526003602090815260408083206004909252822080548893919060ff86169081106147df57634e487b7160e01b600052603260045260246000fd5b600091825260208083208183040154601f9092166101000a90910460ff1683528201929092526040019020600201541115614a415763ffffffff87166000908152600460209081526040822080546001818101835591845292829020918304909101805460ff808b16601f9095166101000a948502940219169290921790915561486a90849061583f565b92506000614879600185615914565b60ff1690505b8160ff168111156149585763ffffffff881660009081526004602052604090206148aa6001836158d8565b815481106148c857634e487b7160e01b600052603260045260246000fd5b60009182526020808320818304015463ffffffff8c168452600490915260409092208054601f9092166101000a90920460ff1691908390811061491b57634e487b7160e01b600052603260045260246000fd5b90600052602060002090602091828204019190066101000a81548160ff021916908360ff160217905550808061495090615963565b91505061487f565b5063ffffffff87166000908152600460205260409020805487919060ff841690811061499457634e487b7160e01b600052603260045260246000fd5b6000918252602080832081830401805460ff958616601f9094166101000a93840293860219169290921790915563ffffffff8a1682526004905260409020549083161015614a395763ffffffff87166000908152600460205260409020805480614a0e57634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002090602091828204019190066101000a81549060ff021916905590555b5050506137c5565b80614a4b816159f5565b9150506146a3565b5063ffffffff861660009081526004602052604090205460ff821611156116745763ffffffff86166000908152600460209081526040822080546001810182559083529181902090820401805460ff808916601f9094166101000a93840293021916919091179055505050505050565b60606000614ad283600261589b565b614add906002615827565b67ffffffffffffffff811115614b0357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015614b2d576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110614b7257634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110614be357634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000614c1f84600261589b565b614c2a906001615827565b90505b6001811115614ce3577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110614c7957634e487b7160e01b600052603260045260246000fd5b1a60f81b828281518110614c9d57634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93614cdc81615963565b9050614c2d565b508315611c225760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a1b565b82805482825590600052602060002090600701600890048101928215614dd15791602002820160005b83821115614d9f57835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302614d5b565b8015614dcf5782816101000a81549063ffffffff0219169055600401602081600301049283019260010302614d9f565b505b50614ddd929150614e2f565b5090565b82805482825590600052602060002090600701600890048101928215614dd1576000526020600020916007016008900482015b82811115614dd1578254825591600101919060010190614e14565b5b80821115614ddd5760008155600101614e30565b803573ffffffffffffffffffffffffffffffffffffffff81168114614e6857600080fd5b919050565b600082601f830112614e7d578081fd5b81356020614e92614e8d83615803565b6157b4565b80838252828201915082860187848660051b8901011115614eb1578586fd5b855b85811015614ed8578135614ec681615a6b565b84529284019290840190600101614eb3565b5090979650505050505050565b60008060008060008060c08789031215614efd578182fd5b614f0687614e44565b9550614f1460208801614e44565b9450614f2260408801614e44565b9350614f3060608801614e44565b9250614f3e60808801614e44565b9150614f4c60a08801614e44565b90509295509295509295565b60006020808385031215614f6a578182fd5b825167ffffffffffffffff811115614f80578283fd5b8301601f81018513614f90578283fd5b8051614f9e614e8d82615803565b80828252848201915084840188868560051b8701011115614fbd578687fd5b8694505b83851015614fe8578051614fd481615a80565b835260019490940193918501918501614fc1565b50979650505050505050565b600060208284031215615005578081fd5b5035919050565b60006020828403121561501d578081fd5b5051919050565b60008060408385031215615036578182fd5b8235915061504660208401614e44565b90509250929050565b600060208284031215615060578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611c22578182fd5b600060208083850312156150a1578182fd5b825167ffffffffffffffff808211156150b8578384fd5b90840190604082870312156150cb578384fd5b6150d361578b565b82516150de81615a6b565b815282840151828111156150f0578586fd5b80840193505086601f840112615104578485fd5b82519150615114614e8d83615803565b80838252858201915085850189878660051b8801011115615133578788fd5b8795505b8486101561516857805165ffffffffffff81168114615154578889fd5b835260019590950194918601918601615137565b50948201949094529695505050505050565b60006020828403121561518b578081fd5b815161ffff81168114611c22578182fd5b6000806000606084860312156151b0578081fd5b8335925060208401356151c281615a6b565b915060408401356151d281615a6b565b809150509250925092565b6000602082840312156151ee578081fd5b8135611c2281615a6b565b60006020828403121561520a578081fd5b8151611c2281615a6b565b60008060408385031215615227578182fd5b823561523281615a6b565b915061504660208401614e44565b60008060008060808587031215615255578182fd5b843561526081615a6b565b9350602085013567ffffffffffffffff81111561527b578283fd5b61528787828801614e6d565b93505060408501359150606085013561529f81615a6b565b939692955090935050565b600080604083850312156152bc578182fd5b82356152c781615a6b565b946020939093013593505050565b600080604083850312156152e7578182fd5b82356152f281615a6b565b9150602083013561530281615a80565b809150509250929050565b600080600060608486031215615321578081fd5b833561532c81615a6b565b9250602084013561533c81615a80565b9150604084013567ffffffffffffffff811115615357578182fd5b61536386828701614e6d565b9150509250925092565b600080600060608486031215615381578081fd5b833561538c81615a6b565b925060208401356151c281615a80565b6000602082840312156153ad578081fd5b8151611c2281615a80565b6000815180845260208085019450808401835b838110156153ed57815163ffffffff16875295820195908201906001016153cb565b509495945050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351615430816017850160208801615937565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161546d816028840160208801615937565b01602801949350505050565b602081016005831061549b57634e487b7160e01b600052602160045260246000fd5b91905290565b60208152600082518060208401526154c0816040850160208701615937565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6020815263ffffffff82511660208201526000602083015160a0604084015261551e60c08401826153b8565b905060408401516060840152606084015160808401526080840151151560a08401528091505092915050565b600063ffffffff8089168352808816602084015260c0604084015261557260c08401886153b8565b606084019690965293909316608082015260a00152509392505050565b6000608080830163ffffffff8089168552602081891681870152604084818801528389546155c1818790815260200190565b60008c81526020902096509150875b8160078201101561567c57865463ffffffff87821616845263ffffffff81871c8816168487015263ffffffff81861c88161684860152606061561d8186018984841c1663ffffffff169052565b5063ffffffff818a1c881616848a015260a06156448186018984841c1663ffffffff169052565b5060c061565c8186018984841c1663ffffffff169052565b5060e090811c9084015260019690960195610100909201916008016155d0565b9554958181101561569a5763ffffffff878716168352918401916001015b818110156156b75763ffffffff87861c8716168352918401916001015b818110156156d45763ffffffff87851c8716168352918401916001015b818110156156f8576156f083878960601c1663ffffffff169052565b918401916001015b818110156157155763ffffffff87891c8716168352918401916001015b818110156157395761573183878960a01c1663ffffffff169052565b918401916001015b8181101561575d5761575583878960c01c1663ffffffff169052565b918401916001015b818110156157715760e087901c8352918401915b505080965050505050505082606083015295945050505050565b6040805190810167ffffffffffffffff811182821017156157ae576157ae615a55565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156157fb576157fb615a55565b604052919050565b600067ffffffffffffffff82111561581d5761581d615a55565b5060051b60200190565b6000821982111561583a5761583a615a29565b500190565b600060ff821660ff84168060ff0382111561585c5761585c615a29565b019392505050565b60008261587357615873615a3f565b500490565b600063ffffffff8084168061588f5761588f615a3f565b92169190910492915050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156158d3576158d3615a29565b500290565b6000828210156158ea576158ea615a29565b500390565b600063ffffffff8381169083168181101561590c5761590c615a29565b039392505050565b600060ff821660ff84168082101561592e5761592e615a29565b90039392505050565b60005b8381101561595257818101518382015260200161593a565b838111156137c55750506000910152565b60008161597257615972615a29565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600060ff8216806159ab576159ab615a29565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b600061ffff808316818114156159eb576159eb615a29565b6001019392505050565b600060ff821660ff811415615a0c57615a0c615a29565b60010192915050565b600082615a2457615a24615a3f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b63ffffffff81168114615a7d57600080fd5b50565b60ff81168114615a7d57600080fdfea264697066735822122024a5c5e3836ba7f002df7d92b0988de1a4ddb8b21092adf46b73358180b2232f64736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102ff5760003560e01c80637a0c2fcc1161019c578063a217fddf116100ee578063c9e99c2511610097578063da98429511610071578063da984295146108ca578063ef8bf684146108f1578063fccc28131461091857600080fd5b8063c9e99c2514610891578063cc2a9a5b146108a4578063d547741f146108b757600080fd5b8063be436df1116100c8578063be436df1146107da578063bf897a9a14610800578063c1a2bab51461082057600080fd5b8063a217fddf146107ac578063a2719868146107b4578063accd8f53146107c757600080fd5b8063890357301161015057806391d148541161012a57806391d148541461073357806392f3d0661461077957806394217ad11461078c57600080fd5b806389035730146106c557806389447125146106e55780638b5b922d1461070c57600080fd5b806381d96db81161018157806381d96db81461067457806385a9777c146106875780638622f3a91461069a57600080fd5b80637a0c2fcc1461060b5780637e8616901461065457600080fd5b80632f50bcc4116102555780634bc68b50116102095780635cd0783e116101e35780635cd0783e1461055c5780637542ff95146105c4578063776076e7146105e457600080fd5b80634bc68b501461050f5780634d4b56bd146105225780635c9521ba1461054957600080fd5b806342a1035f1161023a57806342a1035f146104bb57806342c1e587146104c85780634912b72a146104e857600080fd5b80632f50bcc41461048157806336568abe146104a857600080fd5b806311e29f52116102b7578063248a9ca311610291578063248a9ca3146104155780632d93b9a0146104475780632f2ff15d1461046e57600080fd5b806311e29f52146103c657806316391253146103eb5780631bea14e9146103f557600080fd5b80630cde122a116102e85780630cde122a146103465780630d28df481461036e5780630f4ef8a61461038157600080fd5b806301ffc9a71461030457806305db56df1461032c575b600080fd5b61031761031236600461504f565b610933565b60405190151581526020015b60405180910390f35b610334600581565b60405160ff9091168152602001610323565b6103596103543660046152d5565b6109cc565b60405163ffffffff9091168152602001610323565b61035961037c3660046151dd565b611025565b6009546103a19073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610323565b6005546103d890610100900460000b81565b60405160009190910b8152602001610323565b6103f3611031565b005b6104086104033660046151dd565b61167d565b60405161032391906154f2565b610439610423366004614ff4565b6000908152600160208190526040909120015490565b604051908152602001610323565b6104397fca0fffcc0404933256f3ec63d47233fbb05be25fc0eacc2cfb1a2853993fbbe581565b6103f361047c366004615024565b61178c565b6104397f46aaf8a125792dfff6db03d74f94fe1acaf55c8cab22f65297c15809c364465c81565b6103f36104b6366004615024565b6117b8565b6005546103349060ff1681565b600a546103a19073ffffffffffffffffffffffffffffffffffffffff1681565b6104397f6b7da7a33355c6e035439beb2ac6a052f1558db73f08690b1c9ef5a4e838959781565b61031761051d36600461519c565b61184d565b6104397f4cd3070aaa07d03ab33731cbabd0cb27eb9e074a9430ad006c96941d71b77ece81565b6104086105573660046152d5565b611c29565b61059b61056a3660046151dd565b600660205260009081526040902080546002820154600383015460049093015463ffffffff90921692909160ff1684565b6040805163ffffffff909516855260208501939093529183015215156060820152608001610323565b6008546103a19073ffffffffffffffffffffffffffffffffffffffff1681565b6104397fdbaaaff2c3744aa215ebd99971829e1c1b728703a0bf252f96685d29011fc80481565b61059b6106193660046152d5565b60036020818152600093845260408085209091529183529120805460028201549282015460049092015463ffffffff90911692919060ff1684565b6106676106623660046151dd565b611d44565b6040516103239190615479565b6103f36106823660046151dd565b611d92565b6103346106953660046152aa565b612017565b6103176106a83660046151dd565b63ffffffff90811660009081526006602052604090205416151590565b6007546103a19073ffffffffffffffffffffffffffffffffffffffff1681565b6104397fca0fffcc0404933256f3ec63d47233fbb05be25fc0eacc2cfb1a2853993fbbe481565b6104397fed202a1bc048f9b31cb3937bc52e7c8fe76413f0674b9146ff4bcc15612ccbc281565b610317610741366004615024565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b61035961078736600461536d565b61205a565b600b546103a19073ffffffffffffffffffffffffffffffffffffffff1681565b610439600081565b6103f36107c236600461530d565b612449565b6103f36107d5366004615240565b612bf7565b6103346107e83660046151dd565b63ffffffff1660009081526004602052604090205490565b600c546103a19073ffffffffffffffffffffffffffffffffffffffff1681565b61086861082e366004615215565b6002602081815260009384526040808520909152918352912080546001820154919092015460ff831692610100900463ffffffff16919084565b6040805160ff909516855263ffffffff9093166020850152918301526060820152608001610323565b6103f361089f3660046151dd565b6134d4565b6103f36108b2366004614ee5565b6137cb565b6103f36108c5366004615024565b613961565b6104397f18797bc7973e1dadee1895be2f1003818e30eae3b0e7a01eb9b2e66f3ea2771f81565b6104397fcabcaf259dd9a27f23bd8a92bacd65983c2ebf027c853f89f941715905271a8d81565b6103a173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806109c657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6000805460ff16610a245760405162461bcd60e51b815260206004820152601e60248201527f436f6e74726163742073686f756c6420626520696e697469616c697a6564000060448201526064015b60405180910390fd5b600383600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357d775f86040518163ffffffff1660e01b815260040160206040518083038186803b158015610a8f57600080fd5b505afa158015610aa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac7919061517a565b61ffff16610ad481611025565b63ffffffff168263ffffffff1614610b2e5760405162461bcd60e51b815260206004820152600f60248201527f696e636f72726563742065706f636800000000000000000000000000000000006044820152606401610a1b565b610b3781611d44565b6004811115610b5657634e487b7160e01b600052602160045260246000fd5b836004811115610b7657634e487b7160e01b600052602160045260246000fd5b14610bc35760405162461bcd60e51b815260206004820152600f60248201527f696e636f727265637420737461746500000000000000000000000000000000006044820152606401610a1b565b600a546040517f38e692a900000000000000000000000000000000000000000000000000000000815263ffffffff8816600482015273ffffffffffffffffffffffffffffffffffffffff909116906338e692a99060240160206040518083038186803b158015610c3257600080fd5b505afa158015610c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6a919061500c565b63ffffffff8716600090815260026020908152604080832033845290915290206001015414610d015760405162461bcd60e51b815260206004820152602560248201527f546f74616c20696e666c75656e63652072657665616c656420646f65736e742060448201527f6d617463680000000000000000000000000000000000000000000000000000006064820152608401610a1b565b63ffffffff8616600090815260026020818152604080842033855290915282206001810154910154610d339190615864565b905060008163ffffffff1611610d8b5760405162461bcd60e51b815260206004820152601660248201527f6d656469616e2063616e206e6f74206265207a65726f000000000000000000006044820152606401610a1b565b63ffffffff87166000908152600460205260408120805460ff8916908110610dc357634e487b7160e01b600052603260045260246000fd5b60009182526020808320818304015463ffffffff8c16845260038252604080852060ff601f9095166101000a90920484168086529190925292206004015491925016610e515760405162461bcd60e51b815260206004820152601f60248201527f426c6f636b20616c726561647920686173206265656e206469737075746564006044820152606401610a1b565b63ffffffff8816600090815260026020908152604080832033845290915280822054600b5491517f7691265000000000000000000000000000000000000000000000000000000000815260ff90911660048201819052929173ffffffffffffffffffffffffffffffffffffffff169063769126509060240160206040518083038186803b158015610ee157600080fd5b505afa158015610ef5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f19919061539c565b63ffffffff8b8116600090815260036020908152604080832060ff891684529091529020919250851690600190810190610f539084615914565b60ff1681548110610f7457634e487b7160e01b600052603260045260246000fd5b6000918252602090912060088204015460079091166004026101000a900463ffffffff16141561100c5760405162461bcd60e51b815260206004820152603760248201527f50726f706f73656420416c7465726e61746520626c6f636b206973206964656e60448201527f746963616c20746f2070726f706f73656420626c6f636b0000000000000000006064820152608401610a1b565b6110178a8a85613988565b9a9950505050505050505050565b60006109c68243615878565b60005460ff166110835760405162461bcd60e51b815260206004820152601e60248201527f436f6e74726163742073686f756c6420626520696e697469616c697a656400006044820152606401610a1b565b600754604080517f57d775f8000000000000000000000000000000000000000000000000000000008152905160049273ffffffffffffffffffffffffffffffffffffffff16916357d775f891818501916020919081900386018186803b1580156110ec57600080fd5b505afa158015611100573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611124919061517a565b61ffff1661113181611d44565b600481111561115057634e487b7160e01b600052602160045260246000fd5b82600481111561117057634e487b7160e01b600052602160045260246000fd5b146111bd5760405162461bcd60e51b815260206004820152600f60248201527f696e636f727265637420737461746500000000000000000000000000000000006044820152606401610a1b565b600754604080517f757991a8000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163757991a8916004808301926020929190829003018186803b15801561122857600080fd5b505afa15801561123c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126091906151f9565b6008546040517f6022a48500000000000000000000000000000000000000000000000000000000815233600482015291925060009173ffffffffffffffffffffffffffffffffffffffff90911690636022a4859060240160206040518083038186803b1580156112cf57600080fd5b505afa1580156112e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130791906151f9565b905060008163ffffffff161161135f5760405162461bcd60e51b815260206004820152601d60248201527f537472756374732e5374616b657220646f6573206e6f742065786973740000006044820152606401610a1b565b63ffffffff80831660009081526006602052604090205416156113c45760405162461bcd60e51b815260206004820152601760248201527f426c6f636b20616c726561647920636f6e6669726d65640000000000000000006044820152606401610a1b565b600b54604080517fbe780837000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163be7808379160048083019286929190829003018186803b15801561142e57600080fd5b505afa158015611442573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526114889190810190614f58565b63ffffffff841660009081526004602052604090205490915015806114da57506005546101009004600090810b900b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff145b1561156f57600b546040517fbbefc10a00000000000000000000000000000000000000000000000000000000815263ffffffff8516600482015273ffffffffffffffffffffffffffffffffffffffff9091169063bbefc10a90602401600060405180830381600087803b15801561155057600080fd5b505af1158015611564573d6000803e3d6000fd5b505050505050505050565b63ffffffff831660009081526003602090815260408083206004909252822060055481548492916101009004830b60ff169081106115bd57634e487b7160e01b600052603260045260246000fd5b600091825260208083208183040154601f9092166101000a90910460ff16835282019290925260400190205463ffffffff9081169150831681146116695760405162461bcd60e51b815260206004820152602f60248201527f426c6f636b2063616e20626520636f6e6669726d65642062792070726f706f7360448201527f6572206f662074686520626c6f636b00000000000000000000000000000000006064820152608401610a1b565b611674848383613bf8565b505050505b5050565b6116b76040518060a00160405280600063ffffffff1681526020016060815260200160008152602001600081526020016000151581525090565b63ffffffff808316600090815260066020908152604091829020825160a0810184528154909416845260018101805484518185028101850190955280855291938584019390929083018282801561175957602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff168152602001906004019060208260030104928301926001038202915080841161171c5790505b5050509183525050600282015460208201526003820154604082015260049091015460ff16151560609091015292915050565b600082815260016020819052604090912001546117a981336142cd565b6117b38383614385565b505050565b73ffffffffffffffffffffffffffffffffffffffff811633146118435760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610a1b565b6116798282614444565b6000805460ff166118a05760405162461bcd60e51b815260206004820152601e60248201527f436f6e74726163742073686f756c6420626520696e697469616c697a656400006044820152606401610a1b565b600a54604080517fa7a62a10000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163a7a62a10916004808301926020929190829003018186803b15801561190b57600080fd5b505afa15801561191f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611943919061500c565b90506000611979828760405160200161195e91815260200190565b604051602081830303815290604052805190602001206144ff565b90506000611a2c600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bc788d466040518163ffffffff1660e01b815260040160206040518083038186803b1580156119e857600080fd5b505afa1580156119fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2091906151f9565b63ffffffff168361455c565b905063ffffffff8516611a40826001615827565b14611a515760009350505050611c22565b6040805163ffffffff87166020820152908101889052600090611a7890859060600161195e565b90506000611a8b6401000000008361455c565b6008546040517f05065cd400000000000000000000000000000000000000000000000000000000815263ffffffff8b16600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906305065cd49060240160206040518083038186803b158015611b0057600080fd5b505afa158015611b14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b38919061500c565b6008546040517f05065cd400000000000000000000000000000000000000000000000000000000815263ffffffff8b16600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906305065cd49060240160206040518083038186803b158015611bad57600080fd5b505afa158015611bc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be5919061500c565b9050611bf68164010000000061589b565b611c00838561589b565b1115611c16576000975050505050505050611c22565b60019750505050505050505b9392505050565b611c636040518060a00160405280600063ffffffff1681526020016060815260200160008152602001600081526020016000151581525090565b63ffffffff808416600090815260036020908152604080832060ff87168452825291829020825160a08101845281549094168452600181018054845181850281018501909552808552919385840193909290830182828015611d1057602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411611cd35790505b5050509183525050600282015460208201526003820154604082015260049091015460ff1615156060909101529392505050565b6000806005611d538185615878565b611d639063ffffffff1643615864565b611d6d9190615a15565b90508060ff166004811115611c2257634e487b7160e01b600052602160045260246000fd5b60005460ff16611de45760405162461bcd60e51b815260206004820152601e60248201527f436f6e74726163742073686f756c6420626520696e697469616c697a656400006044820152606401610a1b565b600381600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357d775f86040518163ffffffff1660e01b815260040160206040518083038186803b158015611e4f57600080fd5b505afa158015611e63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e87919061517a565b61ffff16611e9481611025565b63ffffffff168263ffffffff1614611eee5760405162461bcd60e51b815260206004820152600f60248201527f696e636f72726563742065706f636800000000000000000000000000000000006044820152606401610a1b565b611ef781611d44565b6004811115611f1657634e487b7160e01b600052602160045260246000fd5b836004811115611f3657634e487b7160e01b600052602160045260246000fd5b14611f835760405162461bcd60e51b815260206004820152600f60248201527f696e636f727265637420737461746500000000000000000000000000000000006044820152606401610a1b565b505060408051608081018252600080825260208083018281528385018381526060850184815263ffffffff9889168552600280855287862033875290945295909320935184549151909716610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000090911660ff9790971696909617959095178255516001820155905192019190915550565b6004602052816000526040600020818154811061203357600080fd5b9060005260206000209060209182820401919006915091509054906101000a900460ff1681565b6000805460ff166120ad5760405162461bcd60e51b815260206004820152601e60248201527f436f6e74726163742073686f756c6420626520696e697469616c697a656400006044820152606401610a1b565b600384600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357d775f86040518163ffffffff1660e01b815260040160206040518083038186803b15801561211857600080fd5b505afa15801561212c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612150919061517a565b61ffff1661215d81611025565b63ffffffff168263ffffffff16146121b75760405162461bcd60e51b815260206004820152600f60248201527f696e636f72726563742065706f636800000000000000000000000000000000006044820152606401610a1b565b6121c081611d44565b60048111156121df57634e487b7160e01b600052602160045260246000fd5b8360048111156121ff57634e487b7160e01b600052602160045260246000fd5b1461224c5760405162461bcd60e51b815260206004820152600f60248201527f696e636f727265637420737461746500000000000000000000000000000000006044820152606401610a1b565b63ffffffff87166000908152600460205260408120805460ff891690811061228457634e487b7160e01b600052603260045260246000fd5b60009182526020808320818304015463ffffffff8c16845260038252604080852060ff601f9095166101000a909204841680865291909252922060040154919250166123125760405162461bcd60e51b815260206004820152601f60248201527f426c6f636b20616c726561647920686173206265656e206469737075746564006044820152606401610a1b565b6008546040517f05065cd400000000000000000000000000000000000000000000000000000000815263ffffffff8816600482015260009173ffffffffffffffffffffffffffffffffffffffff16906305065cd49060240160206040518083038186803b15801561238257600080fd5b505afa158015612396573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ba919061500c565b63ffffffff8a16600090815260036020818152604080842060ff88168552909152909120015490915081116124315760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642064697370757465203a20496e666c75656e636500000000006044820152606401610a1b565b61243c898984613988565b9998505050505050505050565b60005460ff1661249b5760405162461bcd60e51b815260206004820152601e60248201527f436f6e74726163742073686f756c6420626520696e697469616c697a656400006044820152606401610a1b565b600383600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357d775f86040518163ffffffff1660e01b815260040160206040518083038186803b15801561250657600080fd5b505afa15801561251a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253e919061517a565b61ffff1661254b81611025565b63ffffffff168263ffffffff16146125a55760405162461bcd60e51b815260206004820152600f60248201527f696e636f72726563742065706f636800000000000000000000000000000000006044820152606401610a1b565b6125ae81611d44565b60048111156125cd57634e487b7160e01b600052602160045260246000fd5b8360048111156125ed57634e487b7160e01b600052602160045260246000fd5b1461263a5760405162461bcd60e51b815260206004820152600f60248201527f696e636f727265637420737461746500000000000000000000000000000000006044820152606401610a1b565b63ffffffff86811660009081526002602081815260408084203385529091528083206001810154928101549054600b5492517f7691265000000000000000000000000000000000000000000000000000000000815260ff8c1660048201529395919461010090910490911692909173ffffffffffffffffffffffffffffffffffffffff169063769126509060240160206040518083038186803b1580156126e057600080fd5b505afa1580156126f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612718919061539c565b63ffffffff8b1660009081526002602090815260408083203384529091529020600101549091506127935763ffffffff8a166000908152600260209081526040808320338452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8b16179055612808565b63ffffffff8a16600090815260026020908152604080832033845290915290205460ff8a81169116146128085760405162461bcd60e51b815260206004820152601460248201527f41737365744964206e6f74206d61746368696e670000000000000000000000006044820152606401610a1b565b60005b88518161ffff161015612b8a578263ffffffff16898261ffff168151811061284357634e487b7160e01b600052603260045260246000fd5b602002602001015163ffffffff16116128c45760405162461bcd60e51b815260206004820152602960248201527f736f727465645b695d206973206e6f742067726561746572207468616e206c6160448201527f73745669736974656400000000000000000000000000000000000000000000006064820152608401610a1b565b888161ffff16815181106128e857634e487b7160e01b600052603260045260246000fd5b6020908102919091010151600a546040517fca0652bf00000000000000000000000000000000000000000000000000000000815263ffffffff8316600482015291945060009173ffffffffffffffffffffffffffffffffffffffff9091169063ca0652bf9060240160006040518083038186803b15801561296857600080fd5b505afa15801561297c573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526129c2919081019061508f565b90508b63ffffffff16816000015163ffffffff1614612a495760405162461bcd60e51b815260206004820152602760248201527f65706f636820696e20766f746520646f65736e74206d6174636820776974682060448201527f63757272656e74000000000000000000000000000000000000000000000000006064820152608401610a1b565b6020810151600090612a5c600186615914565b60ff1681518110612a7d57634e487b7160e01b600052603260045260246000fd5b602002602001015190506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166348fd8e7b8f886040518363ffffffff1660e01b8152600401612af892919063ffffffff92831681529116602082015260400190565b60206040518083038186803b158015612b1057600080fd5b505afa158015612b24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b48919061500c565b9050612b5c8165ffffffffffff841661589b565b612b669088615827565b9650612b728189615827565b97505050508080612b82906159d3565b91505061280b565b505063ffffffff9889166000908152600260208181526040808420338552909152909120805492909a16610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff90921691909117895560018901929092559601959095555050505050565b60005460ff16612c495760405162461bcd60e51b815260206004820152601e60248201527f436f6e74726163742073686f756c6420626520696e697469616c697a656400006044820152606401610a1b565b600284600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357d775f86040518163ffffffff1660e01b815260040160206040518083038186803b158015612cb457600080fd5b505afa158015612cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cec919061517a565b61ffff16612cf981611025565b63ffffffff168263ffffffff1614612d535760405162461bcd60e51b815260206004820152600f60248201527f696e636f72726563742065706f636800000000000000000000000000000000006044820152606401610a1b565b612d5c81611d44565b6004811115612d7b57634e487b7160e01b600052602160045260246000fd5b836004811115612d9b57634e487b7160e01b600052602160045260246000fd5b14612de85760405162461bcd60e51b815260206004820152600f60248201527f696e636f727265637420737461746500000000000000000000000000000000006044820152606401610a1b565b6008546040517f6022a48500000000000000000000000000000000000000000000000000000000815233600482015260009173ffffffffffffffffffffffffffffffffffffffff1690636022a4859060240160206040518083038186803b158015612e5257600080fd5b505afa158015612e66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e8a91906151f9565b9050612e9786868361184d565b612ee35760405162461bcd60e51b815260206004820152600b60248201527f6e6f7420656c65637465640000000000000000000000000000000000000000006044820152606401610a1b565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663375b3c0a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612f4b57600080fd5b505afa158015612f5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f83919061500c565b6008546040517edd998100000000000000000000000000000000000000000000000000000000815263ffffffff8416600482015273ffffffffffffffffffffffffffffffffffffffff9091169062dd99819060240160206040518083038186803b158015612ff057600080fd5b505afa158015613004573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613028919061500c565b10156130765760405162461bcd60e51b815260206004820152601960248201527f7374616b652062656c6f77206d696e696d756d207374616b65000000000000006044820152606401610a1b565b600a546040517f0bb34f5600000000000000000000000000000000000000000000000000000000815263ffffffff83811660048301528a169173ffffffffffffffffffffffffffffffffffffffff1690630bb34f569060240160206040518083038186803b1580156130e757600080fd5b505afa1580156130fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061311f91906151f9565b63ffffffff16146131725760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742070726f706f736520776974686f75742072657665616c696e676044820152606401610a1b565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c0050a116040518163ffffffff1660e01b815260040160206040518083038186803b1580156131da57600080fd5b505afa1580156131ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613212919061500c565b8751146132615760405162461bcd60e51b815260206004820152601660248201527f696e76616c696420626c6f636b2070726f706f736564000000000000000000006044820152606401610a1b565b6008546040517f05065cd400000000000000000000000000000000000000000000000000000000815263ffffffff8716600482015260009173ffffffffffffffffffffffffffffffffffffffff16906305065cd49060240160206040518083038186803b1580156132d157600080fd5b505afa1580156132e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613309919061500c565b63ffffffff8a1660009081526004602052604090205490915061334f57600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b6040805160a08101825263ffffffff848116825260208083018c81528385018c9052606084018690526001608085018190528e841660009081526003845286812060055460ff168252845295909520845181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000169416939093178355518051939492936133e4938501929190910190614d32565b506040820151600282015560608201516003820155608090910151600490910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600554613444908a9060ff168984614571565b6005546134559060ff16600161583f565b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff929092169190911790556040517f60b28e9913876d5cd18aedee156a4b9a83cb2e4661a47a60d5dbe1f6f71f4bf5906134c1908b9085908c908c908c90429061554a565b60405180910390a1505050505050505050565b60005460ff166135265760405162461bcd60e51b815260206004820152601e60248201527f436f6e74726163742073686f756c6420626520696e697469616c697a656400006044820152606401610a1b565b7f18797bc7973e1dadee1895be2f1003818e30eae3b0e7a01eb9b2e66f3ea2771f61355181336142cd565b600754604080517f757991a8000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163757991a8916004808301926020929190829003018186803b1580156135bc57600080fd5b505afa1580156135d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135f491906151f9565b90506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663be7808376040518163ffffffff1660e01b815260040160006040518083038186803b15801561366057600080fd5b505afa158015613674573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526136ba9190810190614f58565b9050600460006136cb6001856158ef565b63ffffffff168152602081019190915260400160002054158061371b57506005546101009004600090810b900b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff145b156137b057600b546040517fbbefc10a00000000000000000000000000000000000000000000000000000000815263ffffffff8416600482015273ffffffffffffffffffffffffffffffffffffffff9091169063bbefc10a906024015b600060405180830381600087803b15801561379257600080fd5b505af11580156137a6573d6000803e3d6000fd5b5050505050505050565b6137c56137be6001846158ef565b8286613bf8565b50505050565b600054610100900460ff16806137e4575060005460ff16155b6138565760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a1b565b600054610100900460ff1615801561389557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b60006138a181336142cd565b50600880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8a811691909117909255600980548216898416179055600a80548216888416179055600b80548216878416179055600780548216868416179055600c8054909116918416919091179055801561395857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50505050505050565b6000828152600160208190526040909120015461397e81336142cd565b6117b38383614444565b63ffffffff8316600081815260036020908152604080832060ff8087168552908352818420600490810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905594845293909152812054600554919290916101009004830b81169085161415613b1457600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661ff001790556000613a3485600161583f565b90505b8160ff168160ff161015613b125763ffffffff86166000908152600460205260408120805460ff8416908110613a7d57634e487b7160e01b600052603260045260246000fd5b60009182526020808320818304015463ffffffff8b16845260038252604080852060ff601f9095166101000a9092048416808652919092529220600401549192501615613aff5750600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010060ff600085900b1602179055613b12565b5080613b0a816159f5565b915050613a37565b505b63ffffffff858116600081815260036020908152604080832060ff89168452909152908190205460085491517f8f764cf40000000000000000000000000000000000000000000000000000000081526004810193909352909216602482018190523360448301529173ffffffffffffffffffffffffffffffffffffffff1690638f764cf490606401602060405180830381600087803b158015613bb657600080fd5b505af1158015613bca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bee91906151f9565b9695505050505050565b63ffffffff831660009081526004602052604081206005548154610100909104830b60ff16908110613c3a57634e487b7160e01b600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff1690506000835190505b60ff811615613f9057600b5460009073ffffffffffffffffffffffffffffffffffffffff16637691265086613c99600186615914565b60ff1681518110613cba57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401613ce7919060ff91909116815260200190565b60206040518083038186803b158015613cff57600080fd5b505afa158015613d13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d37919061539c565b63ffffffff8716600090815260036020908152604080832060ff808916855292529091206001015491925082161415613dfe5763ffffffff8616600090815260036020908152604080832060ff871684529091529020600101805480613dad57634e487b7160e01b600052603160045260246000fd5b60008281526020902060087fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191820401805463ffffffff600460078516026101000a02191690559055613f7d565b63ffffffff8616600090815260036020908152604080832060ff871684529091529020600190810180549091613e33916158d8565b81548110613e5157634e487b7160e01b600052603260045260246000fd5b6000918252602080832060088304015463ffffffff8a8116855260038352604080862060ff8a1687529093529190932060079092166004026101000a90920490911690600190810190613ea49084615914565b60ff1681548110613ec557634e487b7160e01b600052603260045260246000fd5b600091825260208083206008830401805460079093166004026101000a63ffffffff8181021990941695841602949094179093558816815260038252604080822060ff8716835290925220600101805480613f3057634e487b7160e01b600052603160045260246000fd5b60008281526020902060087fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191820401805463ffffffff600460078516026101000a021916905590555b5080613f8881615998565b915050613c63565b5063ffffffff808516600081815260036020908152604080832060ff87168452825280832093835260069091529020815481547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000169316929092178255600180820180549293926140049284019190614de1565b5060028281015490820155600380830154818301556004928301549290910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff938416151517905563ffffffff86811660009081526020928352604080822094861682529390925290829020805492517f736990cb4424cb3b541e24055819082dfdec9a3c74c5b7b771350f0cff7ec195936140b293899391169160019190910190429061558f565b60405180910390a1600b546040517fbbefc10a00000000000000000000000000000000000000000000000000000000815263ffffffff8616600482015273ffffffffffffffffffffffffffffffffffffffff9091169063bbefc10a90602401600060405180830381600087803b15801561412b57600080fd5b505af115801561413f573d6000803e3d6000fd5b50506009546040517f01f47e3800000000000000000000000000000000000000000000000000000000815263ffffffff80871660048301528816602482015273ffffffffffffffffffffffffffffffffffffffff90911692506301f47e389150604401600060405180830381600087803b1580156141bc57600080fd5b505af11580156141d0573d6000803e3d6000fd5b5050600c54600a54604080517fa7a62a10000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416955063ffe87625945089939092169163a7a62a1091600480820192602092909190829003018186803b15801561424e57600080fd5b505afa158015614262573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614286919061500c565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815263ffffffff9290921660048301526024820152604401613778565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16611679576143258173ffffffffffffffffffffffffffffffffffffffff166014614ac3565b614330836020614ac3565b6040516020016143419291906153f8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262461bcd60e51b8252610a1b916004016154a1565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1661167957600082815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff161561167957600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600080838360405160200161451e929190918252602082015260400190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181529190528051602090910120949350505050565b6000816145698482615a15565b949350505050565b63ffffffff841660009081526004602052604090205460ff81166145fb575063ffffffff841660009081526004602090815260408220805460018101825590835291819020908204018054601f9092166101000a60ff02199091169055600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690556137c5565b600754604080517f379597e0000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163379597e0916004808301926020929190829003018186803b15801561466657600080fd5b505afa15801561467a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061469e919061539c565b905060005b8260ff168160ff161015614a535763ffffffff871660009081526003602090815260408083206004909252822080548793919060ff86169081106146f757634e487b7160e01b600052603260045260246000fd5b600091825260208083208183040154601f9092166101000a90910460ff16835282019290925260400190206003015410156147995763ffffffff87166000908152600460205260409020805487919060ff841690811061476757634e487b7160e01b600052603260045260246000fd5b90600052602060002090602091828204019190066101000a81548160ff021916908360ff1602179055505050506137c5565b63ffffffff871660009081526003602090815260408083206004909252822080548893919060ff86169081106147df57634e487b7160e01b600052603260045260246000fd5b600091825260208083208183040154601f9092166101000a90910460ff1683528201929092526040019020600201541115614a415763ffffffff87166000908152600460209081526040822080546001818101835591845292829020918304909101805460ff808b16601f9095166101000a948502940219169290921790915561486a90849061583f565b92506000614879600185615914565b60ff1690505b8160ff168111156149585763ffffffff881660009081526004602052604090206148aa6001836158d8565b815481106148c857634e487b7160e01b600052603260045260246000fd5b60009182526020808320818304015463ffffffff8c168452600490915260409092208054601f9092166101000a90920460ff1691908390811061491b57634e487b7160e01b600052603260045260246000fd5b90600052602060002090602091828204019190066101000a81548160ff021916908360ff160217905550808061495090615963565b91505061487f565b5063ffffffff87166000908152600460205260409020805487919060ff841690811061499457634e487b7160e01b600052603260045260246000fd5b6000918252602080832081830401805460ff958616601f9094166101000a93840293860219169290921790915563ffffffff8a1682526004905260409020549083161015614a395763ffffffff87166000908152600460205260409020805480614a0e57634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002090602091828204019190066101000a81549060ff021916905590555b5050506137c5565b80614a4b816159f5565b9150506146a3565b5063ffffffff861660009081526004602052604090205460ff821611156116745763ffffffff86166000908152600460209081526040822080546001810182559083529181902090820401805460ff808916601f9094166101000a93840293021916919091179055505050505050565b60606000614ad283600261589b565b614add906002615827565b67ffffffffffffffff811115614b0357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015614b2d576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110614b7257634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110614be357634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000614c1f84600261589b565b614c2a906001615827565b90505b6001811115614ce3577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110614c7957634e487b7160e01b600052603260045260246000fd5b1a60f81b828281518110614c9d57634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93614cdc81615963565b9050614c2d565b508315611c225760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a1b565b82805482825590600052602060002090600701600890048101928215614dd15791602002820160005b83821115614d9f57835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302614d5b565b8015614dcf5782816101000a81549063ffffffff0219169055600401602081600301049283019260010302614d9f565b505b50614ddd929150614e2f565b5090565b82805482825590600052602060002090600701600890048101928215614dd1576000526020600020916007016008900482015b82811115614dd1578254825591600101919060010190614e14565b5b80821115614ddd5760008155600101614e30565b803573ffffffffffffffffffffffffffffffffffffffff81168114614e6857600080fd5b919050565b600082601f830112614e7d578081fd5b81356020614e92614e8d83615803565b6157b4565b80838252828201915082860187848660051b8901011115614eb1578586fd5b855b85811015614ed8578135614ec681615a6b565b84529284019290840190600101614eb3565b5090979650505050505050565b60008060008060008060c08789031215614efd578182fd5b614f0687614e44565b9550614f1460208801614e44565b9450614f2260408801614e44565b9350614f3060608801614e44565b9250614f3e60808801614e44565b9150614f4c60a08801614e44565b90509295509295509295565b60006020808385031215614f6a578182fd5b825167ffffffffffffffff811115614f80578283fd5b8301601f81018513614f90578283fd5b8051614f9e614e8d82615803565b80828252848201915084840188868560051b8701011115614fbd578687fd5b8694505b83851015614fe8578051614fd481615a80565b835260019490940193918501918501614fc1565b50979650505050505050565b600060208284031215615005578081fd5b5035919050565b60006020828403121561501d578081fd5b5051919050565b60008060408385031215615036578182fd5b8235915061504660208401614e44565b90509250929050565b600060208284031215615060578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611c22578182fd5b600060208083850312156150a1578182fd5b825167ffffffffffffffff808211156150b8578384fd5b90840190604082870312156150cb578384fd5b6150d361578b565b82516150de81615a6b565b815282840151828111156150f0578586fd5b80840193505086601f840112615104578485fd5b82519150615114614e8d83615803565b80838252858201915085850189878660051b8801011115615133578788fd5b8795505b8486101561516857805165ffffffffffff81168114615154578889fd5b835260019590950194918601918601615137565b50948201949094529695505050505050565b60006020828403121561518b578081fd5b815161ffff81168114611c22578182fd5b6000806000606084860312156151b0578081fd5b8335925060208401356151c281615a6b565b915060408401356151d281615a6b565b809150509250925092565b6000602082840312156151ee578081fd5b8135611c2281615a6b565b60006020828403121561520a578081fd5b8151611c2281615a6b565b60008060408385031215615227578182fd5b823561523281615a6b565b915061504660208401614e44565b60008060008060808587031215615255578182fd5b843561526081615a6b565b9350602085013567ffffffffffffffff81111561527b578283fd5b61528787828801614e6d565b93505060408501359150606085013561529f81615a6b565b939692955090935050565b600080604083850312156152bc578182fd5b82356152c781615a6b565b946020939093013593505050565b600080604083850312156152e7578182fd5b82356152f281615a6b565b9150602083013561530281615a80565b809150509250929050565b600080600060608486031215615321578081fd5b833561532c81615a6b565b9250602084013561533c81615a80565b9150604084013567ffffffffffffffff811115615357578182fd5b61536386828701614e6d565b9150509250925092565b600080600060608486031215615381578081fd5b833561538c81615a6b565b925060208401356151c281615a80565b6000602082840312156153ad578081fd5b8151611c2281615a80565b6000815180845260208085019450808401835b838110156153ed57815163ffffffff16875295820195908201906001016153cb565b509495945050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351615430816017850160208801615937565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161546d816028840160208801615937565b01602801949350505050565b602081016005831061549b57634e487b7160e01b600052602160045260246000fd5b91905290565b60208152600082518060208401526154c0816040850160208701615937565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6020815263ffffffff82511660208201526000602083015160a0604084015261551e60c08401826153b8565b905060408401516060840152606084015160808401526080840151151560a08401528091505092915050565b600063ffffffff8089168352808816602084015260c0604084015261557260c08401886153b8565b606084019690965293909316608082015260a00152509392505050565b6000608080830163ffffffff8089168552602081891681870152604084818801528389546155c1818790815260200190565b60008c81526020902096509150875b8160078201101561567c57865463ffffffff87821616845263ffffffff81871c8816168487015263ffffffff81861c88161684860152606061561d8186018984841c1663ffffffff169052565b5063ffffffff818a1c881616848a015260a06156448186018984841c1663ffffffff169052565b5060c061565c8186018984841c1663ffffffff169052565b5060e090811c9084015260019690960195610100909201916008016155d0565b9554958181101561569a5763ffffffff878716168352918401916001015b818110156156b75763ffffffff87861c8716168352918401916001015b818110156156d45763ffffffff87851c8716168352918401916001015b818110156156f8576156f083878960601c1663ffffffff169052565b918401916001015b818110156157155763ffffffff87891c8716168352918401916001015b818110156157395761573183878960a01c1663ffffffff169052565b918401916001015b8181101561575d5761575583878960c01c1663ffffffff169052565b918401916001015b818110156157715760e087901c8352918401915b505080965050505050505082606083015295945050505050565b6040805190810167ffffffffffffffff811182821017156157ae576157ae615a55565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156157fb576157fb615a55565b604052919050565b600067ffffffffffffffff82111561581d5761581d615a55565b5060051b60200190565b6000821982111561583a5761583a615a29565b500190565b600060ff821660ff84168060ff0382111561585c5761585c615a29565b019392505050565b60008261587357615873615a3f565b500490565b600063ffffffff8084168061588f5761588f615a3f565b92169190910492915050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156158d3576158d3615a29565b500290565b6000828210156158ea576158ea615a29565b500390565b600063ffffffff8381169083168181101561590c5761590c615a29565b039392505050565b600060ff821660ff84168082101561592e5761592e615a29565b90039392505050565b60005b8381101561595257818101518382015260200161593a565b838111156137c55750506000910152565b60008161597257615972615a29565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600060ff8216806159ab576159ab615a29565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b600061ffff808316818114156159eb576159eb615a29565b6001019392505050565b600060ff821660ff811415615a0c57615a0c615a29565b60010192915050565b600082615a2457615a24615a3f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b63ffffffff81168114615a7d57600080fd5b50565b60ff81168114615a7d57600080fdfea264697066735822122024a5c5e3836ba7f002df7d92b0988de1a4ddb8b21092adf46b73358180b2232f64736f6c63430008040033
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.