Overview
MOVR Balance
0 MOVR
MOVR Value
$0.00More Info
Private Name Tags
ContractCreator:
TokenTracker
Latest 25 from a total of 2,165 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Execute | 6356405 | 11 days ago | IN | 0 MOVR | 0.00310482 | ||||
Queue | 6348950 | 13 days ago | IN | 0 MOVR | 0.00261199 | ||||
Cast Vote | 6346740 | 13 days ago | IN | 0 MOVR | 0.00085818 | ||||
Cast Vote | 6345072 | 13 days ago | IN | 0 MOVR | 0.00031626 | ||||
Cast Vote | 6340711 | 14 days ago | IN | 0 MOVR | 0.00081936 | ||||
Cast Vote | 6340349 | 14 days ago | IN | 0 MOVR | 0.00083294 | ||||
Cast Vote | 6338501 | 14 days ago | IN | 0 MOVR | 0.00081936 | ||||
Cast Vote | 6335635 | 15 days ago | IN | 0 MOVR | 0.00083289 | ||||
Cast Vote | 6335553 | 15 days ago | IN | 0 MOVR | 0.00081936 | ||||
Cast Vote | 6334195 | 15 days ago | IN | 0 MOVR | 0.00031667 | ||||
Cast Vote | 6334097 | 15 days ago | IN | 0 MOVR | 0.00081786 | ||||
Cast Vote | 6333054 | 15 days ago | IN | 0 MOVR | 0.00081786 | ||||
Cast Vote | 6332969 | 15 days ago | IN | 0 MOVR | 0.00081936 | ||||
Cast Vote | 6330994 | 15 days ago | IN | 0 MOVR | 0.00069832 | ||||
Cast Vote | 6328661 | 16 days ago | IN | 0 MOVR | 0.00080675 | ||||
Propose | 6328646 | 16 days ago | IN | 0 MOVR | 0.01470105 | ||||
Execute | 6170205 | 39 days ago | IN | 0 MOVR | 0.00315269 | ||||
Queue | 6160748 | 41 days ago | IN | 0 MOVR | 0.00217666 | ||||
Cast Vote | 6158701 | 41 days ago | IN | 0 MOVR | 0.00031626 | ||||
Cast Vote | 6156496 | 41 days ago | IN | 0 MOVR | 0.00081786 | ||||
Cast Vote | 6155827 | 42 days ago | IN | 0 MOVR | 0.0007098 | ||||
Cast Vote | 6155812 | 42 days ago | IN | 0 MOVR | 0.00069449 | ||||
Cast Vote | 6154522 | 42 days ago | IN | 0 MOVR | 0.00069704 | ||||
Cast Vote | 6154274 | 42 days ago | IN | 0 MOVR | 0.00069577 | ||||
Cast Vote | 6153999 | 42 days ago | IN | 0 MOVR | 0.00070853 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MoonwellGovernorApollo
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 999999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity 0.8.17; import "./IERC20.sol"; contract MoonwellGovernorApollo { /// @notice The name of this contract string public constant name = "Moonwell Apollo Governor"; /// @notice Values for votes uint8 public constant voteValueYes = 0; uint8 public constant voteValueNo = 1; uint8 public constant voteValueAbstain = 2; /// @notice The number of votes for a proposal required in order for a quorum to be reached and for a vote to succeed uint public currentQuorum; /// @notice The upper limit on quorum. uint public upperQuorumCap; /// @notice The lower limit on quorum. uint public lowerQuorumCap; /// @notice The high water mark for proposals which have adjusted quorum. When adjusting quorum, this is the /// starting proposal to search for completed proposals that will change quorum. uint public lastQuorumAdjustment; /// @notice The number of votes required in order for a voter to become a proposer uint public proposalThreshold = 500000e18; // 500,000 MFAM /// @notice The maximum number of actions that can be included in a proposal uint public proposalMaxOperations = 25; // 25 actions /// @notice The delay before voting on a proposal may take place, once proposed uint public votingDelay = 60 seconds; /// @notice The duration of voting on a proposal, in blocks uint public votingPeriod = 3 days; /// @notice The address of the Protocol Timelock TimelockInterface public timelock; /// @notice The address of the MFAM governance token GovTokenInterface public govToken; /// @notice The address of the Distributor contract SnapshotInterface public distributor; /// @notice The address of the Safety Module contract SnapshotInterface public safetyModule; /// @notice The total number of proposals uint public proposalCount; /// @notice The address of the Break Glass Guardian /// This address can opt to call '_executeBreakGlass*' which will execute an operation to return governance to /// the governance return addres in the event a bug is found in governnce. address public breakGlassGuardian; /// @notice An address that can set the governance return address. address public governanceReturnGuardian; /// @notice The address that will receive control of governance when glass is broken. address public governanceReturnAddress; /// @notice The timestamp when guardians may be stripped of their power through a vote. uint256 public guardianSunset; struct Proposal { /// @notice Unique id for looking up a proposal uint id; /// @notice Creator of the proposal address proposer; /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds uint eta; /// @notice the ordered list of target addresses for calls to be made address[] targets; /// @notice The ordered list of values (i.e. msg.value) to be passed to the calls to be made uint[] values; /// @notice The ordered list of function signatures to be called string[] signatures; /// @notice The ordered list of calldata to be passed to each call bytes[] calldatas; /// @notice The timestamp at which voting begins: holders must delegate their votes prior to this time uint startTimestamp; /// @notice The timestamp at which voting ends: votes must be cast prior to this time uint endTimestamp; /// @notice The block at which voting began: holders must have delegated their votes prior to this block uint startBlock; /// @notice Current number of votes in favor of this proposal uint forVotes; /// @notice Current number of votes in opposition to this proposal uint againstVotes; /// @notice Current number of votes in abstention to this proposal uint abstainVotes; /// @notice The total votes on a proposal. uint totalVotes; /// @notice Flag marking whether the proposal has been canceled bool canceled; /// @notice Flag marking whether the proposal has been executed bool executed; /// @notice The quorum required for the proposal to pass. uint256 quorum; /// @notice Whether this proposal has been taken into account for floating quorum adjustments. bool quorumAdjusted; /// @notice Receipts of ballots for the entire set of voters mapping (address => Receipt) receipts; } /// @notice Ballot receipt record for a voter struct Receipt { /// @notice Whether or not a vote has been cast bool hasVoted; /// @notice The value of the vote. uint8 voteValue; /// @notice The number of votes the voter had, which were cast uint votes; } /// @notice Possible states that a proposal may be in enum ProposalState { Pending, Active, Canceled, Defeated, Succeeded, Queued, Expired, Executed } /// @notice The official record of all proposals ever proposed mapping (uint => Proposal) public proposals; /// @notice The latest proposal for each proposer mapping (address => uint) public latestProposalIds; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); /// @notice The EIP-712 typehash for the ballot struct used by the contract bytes32 public constant BALLOT_TYPEHASH = keccak256("Ballot(uint256 proposalId,uint8 voteValue)"); /// @notice An event emitted when a new proposal is created event ProposalCreated(uint id, address proposer, address[] targets, uint[] values, string[] signatures, bytes[] calldatas, uint startTimestamp, uint endTimestamp, string description, uint quorum); /// @notice An event emitted when the first vote is cast in a proposal event StartBlockSet(uint proposalId, uint startBlock); /// @notice An event emitted when a vote has been cast on a proposal event VoteCast(address voter, uint proposalId, uint8 voteValue, uint votes); /// @notice An event emitted when a proposal has been canceled event ProposalCanceled(uint id); /// @notice An event emitted when a proposal has been queued in the Timelock event ProposalQueued(uint id, uint eta); /// @notice An event emitted when a proposal has been executed in the Timelock event ProposalExecuted(uint id); /// @notice An event emitted when thee quorum votes is changed. event QuroumVotesChanged(uint256 oldValue, uint256 newValue); /// @notice An event emitted when the proposal threshold is changed. event ProposalThresholdChanged(uint256 oldValue, uint256 newValue); /// @notice An event emitted when the proposal max operations is changed. event ProposalMaxOperationsChanged(uint256 oldValue, uint256 newValue); /// @notice An event emitted when the voting delay is changed. event VotingDelayChanged(uint256 oldValue, uint256 newValue); /// @notice An event emitted when the voting period is changed. event VotingPeriodChanged(uint256 oldValue, uint256 newValue); /// @notice An event emitted when the break glass guardian is changed. event BreakGlassGuardianChanged(address oldValue, address newValue); /// @notice An event emitted when the governance return address is changed. event GovernanceReturnAddressChanged(address oldValue, address newValue); /// @notice The lower quorum cap was changed. event LowerQuorumCapChanged(uint oldValue, uint newValue); /// @notice The upper quorum cap was changed. event UpperQuorumCapChanged(uint oldValue, uint newValue); /// @notice Construct a new Governor. /// @param timelock_ The address of the timelock /// @param govToken_ The address of the governance token. /// @param distributor_ The address of the token distributor contract used for vesting. /// @param safetyModule_ The address of the safety module used for staking governance tokens. /// @param breakGlassGuardian_ The address of the break glass guardian. /// @param governanceReturnAddress_ The address to return governance to in case of emergency. /// @param governanceReturnGuardian_ The address of the governance return guardian. /// @param guardianSunset_ The time that governance guardians become eligible to be removed. /// @param currentQuorum_ The initial value to use for quorum. /// @param lowerQuorumCap_ The initial lower value to bound quorum to. /// @param upperQuorumCap_ The initial upper value to bound quorum to. constructor( address timelock_, address govToken_, address distributor_, address safetyModule_, address breakGlassGuardian_, address governanceReturnAddress_, address governanceReturnGuardian_, uint guardianSunset_, uint currentQuorum_, uint lowerQuorumCap_, uint upperQuorumCap_ ) { timelock = TimelockInterface(timelock_); govToken = GovTokenInterface(govToken_); distributor = SnapshotInterface(distributor_); safetyModule = SnapshotInterface(safetyModule_); breakGlassGuardian = breakGlassGuardian_; governanceReturnAddress = governanceReturnAddress_; governanceReturnGuardian = governanceReturnGuardian_; guardianSunset = guardianSunset_; lastQuorumAdjustment = 0; currentQuorum = currentQuorum_; lowerQuorumCap = lowerQuorumCap_; upperQuorumCap = upperQuorumCap_; } /// @notice Create a new governance proposal. /// @param targets Addresses of target contracts. /// @param values The amount of native asset to send to each target with the call. /// @param signatures Function signatures to call on the targets. /// @param calldatas Call data to to pass to calls on the targets. /// @param description A non-empty string that describes the proposal. function propose(address[] memory targets, uint[] memory values, string[] memory signatures, bytes[] memory calldatas, string memory description) public returns (uint) { require(_getVotingPower(msg.sender, block.number - 1) > proposalThreshold, "GovernorApollo::propose: proposer votes below proposal threshold"); require(targets.length == values.length && targets.length == signatures.length && targets.length == calldatas.length, "GovernorApollo::propose: proposal function information arity mismatch"); require(targets.length != 0, "GovernorApollo::propose: must provide actions"); require(targets.length <= proposalMaxOperations, "GovernorApollo::propose: too many actions"); require(bytes(description).length > 0, "description can not be empty"); uint latestProposalId = latestProposalIds[msg.sender]; if (latestProposalId != 0) { ProposalState proposersLatestProposalState = state(latestProposalId); require(proposersLatestProposalState != ProposalState.Active, "GovernorApollo::propose: one live proposal per proposer, found an already active proposal"); require(proposersLatestProposalState != ProposalState.Pending, "GovernorApollo::propose: one live proposal per proposer, found an already pending proposal"); } uint startTimestamp = block.timestamp + votingDelay; uint endTimestamp = block.timestamp + votingPeriod + votingDelay; // Increment proposal count. This is important to do before quorum is adjusted, so that the for loop will // execute. ++proposalCount; // Adjust quorum. _adjustQuorum(); Proposal storage newProposal = proposals[proposalCount]; newProposal.id = proposalCount; newProposal.proposer = msg.sender; newProposal.targets = targets; newProposal.values = values; newProposal.signatures = signatures; newProposal.calldatas = calldatas; newProposal.startTimestamp = startTimestamp; newProposal.endTimestamp = endTimestamp; newProposal.quorum = currentQuorum; latestProposalIds[newProposal.proposer] = proposalCount; emit ProposalCreated(newProposal.id, msg.sender, targets, values, signatures, calldatas, startTimestamp, endTimestamp, description, currentQuorum); return newProposal.id; } /// @notice Gets the quorum value for a new proposal. /// @return newQuorum The quorum value that will be assigned to a new proposal. function getQuorum() external view returns (uint) { uint newQuorum = currentQuorum; // Start at the high water mark for (uint i = lastQuorumAdjustment + 1; i < proposalCount; ++i) { // Pull state and ignore in flight proposals ProposalState proposalState = state(i); if (proposalState == ProposalState.Pending || proposalState == ProposalState.Active) { continue; } // Get the proposal Proposal storage proposal = proposals[i]; // Only proceed if quorum for this proposal is not yet taken into account. if (!proposal.quorumAdjusted) { // If a proposal is canceled, ignore it in quorum calculations. if (proposalState == ProposalState.Canceled) { continue; } // Adjust quorum in accordance with the proposal. newQuorum = _calculateNewQuorum(newQuorum, proposal.totalVotes); } } return newQuorum; } /// @notice Queues a succeeded proposal in the timelock for execution. /// @param proposalId The ID of the succeeded proposal to queue. function queue(uint proposalId) external { require(state(proposalId) == ProposalState.Succeeded, "GovernorApollo::queue: proposal can only be queued if it is succeeded"); Proposal storage proposal = proposals[proposalId]; uint eta = block.timestamp + timelock.delay(); for (uint i = 0; i < proposal.targets.length; ++i) { _queueOrRevert(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], eta); } proposal.eta = eta; emit ProposalQueued(proposalId, eta); } /// @notice Queues a single action in a proposal for execution. /// @param target The target address. /// @param value The amount of native asset to pass with the call. /// @param signature The function signature to call on the target. /// @param data The calldata to pass to function calls on the target. /// @param eta A timestamp of when the action may be executed. function _queueOrRevert(address target, uint value, string memory signature, bytes memory data, uint eta) internal { require(!timelock.queuedTransactions(keccak256(abi.encode(target, value, signature, data, eta))), "GovernorApollo::_queueOrRevert: proposal action already queued at eta"); timelock.queueTransaction(target, value, signature, data, eta); } /// @notice Execute a queued proposal from the timelock after the timelock delay has been passed. /// @param proposalId The ID of the queued proposal to execute. function execute(uint proposalId) external { require(state(proposalId) == ProposalState.Queued, "GovernorApollo::execute: proposal can only be executed if it is queued"); Proposal storage proposal = proposals[proposalId]; proposal.executed = true; for (uint i = 0; i < proposal.targets.length; ++i) { timelock.executeTransaction(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta); } emit ProposalExecuted(proposalId); } /// @notice Cancel a proposal that is in flight. /// @param proposalId The ID of the proposal ot cancel. function cancel(uint proposalId) external { ProposalState proposalState = state(proposalId); require(proposalState != ProposalState.Executed, "GovernorApollo::cancel: cannot cancel executed proposal"); Proposal storage proposal = proposals[proposalId]; require(_getVotingPower(proposal.proposer, block.number - 1) < proposalThreshold, "GovernorApollo::cancel: proposer above threshold"); proposal.canceled = true; for (uint i = 0; i < proposal.targets.length; ++i) { timelock.cancelTransaction(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta); } emit ProposalCanceled(proposalId); } /// @notice Get a list of actions in a proposal. /// @param proposalId The ID of the proposal to inspect. /// @return targets Targets in the proposal. /// @return values Values in the proposal. /// @return signatures Signatures in the proposal. /// @return calldatas Calldatas in the proposal. function getActions(uint proposalId) external view returns (address[] memory targets, uint[] memory values, string[] memory signatures, bytes[] memory calldatas) { Proposal storage p = proposals[proposalId]; return (p.targets, p.values, p.signatures, p.calldatas); } /// @notice Get a receipt for a voter for the given proposal. /// @param proposalId The ID of the desired proposal. /// @param voter The address of the desired voter. /// @return A receipt for the voter if one exists. function getReceipt(uint proposalId, address voter) external view returns (Receipt memory) { return proposals[proposalId].receipts[voter]; } /// @notice Get the state of a proposal. /// @param proposalId The ID of the desired proposal. /// @return The state of the given proposal. function state(uint proposalId) public view returns (ProposalState) { require(proposalCount >= proposalId && proposalId > 0, "GovernorApollo::state: invalid proposal id"); Proposal storage proposal = proposals[proposalId]; // First check if the proposal cancelled. if (proposal.canceled) { return ProposalState.Canceled; // Then check if the proposal is pending or active, in which case nothing else can be determined at this time. } else if (block.timestamp <= proposal.startTimestamp) { return ProposalState.Pending; } else if (block.timestamp <= proposal.endTimestamp) { return ProposalState.Active; // Then, check if the proposal is defeated. To hit this case, either (1) majority of yay/nay votes were nay or // (2) total votes was less than the quorum amount. } else if (proposal.forVotes <= proposal.againstVotes || proposal.totalVotes < proposal.quorum) { return ProposalState.Defeated; } else if (proposal.eta == 0) { return ProposalState.Succeeded; } else if (proposal.executed) { return ProposalState.Executed; } else if (block.timestamp >= proposal.eta + timelock.GRACE_PERIOD()) { return ProposalState.Expired; } else { return ProposalState.Queued; } } /// @notice Cast a vote for the given proposal with the given value. /// @param proposalId The ID of proposal to cast a vote on. /// @param voteValue A constant representing 'yay', 'nay', or 'abstain'. function castVote(uint proposalId, uint8 voteValue) external { return _castVote(msg.sender, proposalId, voteValue); } /// @notice Cast a vote for the given proposal with an EIP 712 signature. /// @param proposalId The ID of proposal to cast a vote on. /// @param voteValue A constant representing 'yay', 'nay', or 'abstain'. /// @param v The 'v' value of the signature. /// @param r The 'r' value of the signature. /// @param s The 's' value of the signature. function castVoteBySig(uint256 proposalId, uint8 voteValue, uint8 v, bytes32 r, bytes32 s) external { bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this))); bytes32 structHash = keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, voteValue)); bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "GovernorApollo::castVoteBySig: invalid signature"); return _castVote(signatory, proposalId, voteValue); } /// @notice Internal function to cast a vote. /// @param voter The address who is casting a vote. /// @param proposalId The ID of the proposal a vote is being cast on. /// @param voteValue A constant representing 'yay', 'nay', or 'abstain'. function _castVote(address voter, uint proposalId, uint8 voteValue) internal { require(state(proposalId) == ProposalState.Active, "GovernorApollo::_castVote: voting is closed"); Proposal storage proposal = proposals[proposalId]; if (proposal.startBlock == 0) { proposal.startBlock = block.number - 1; emit StartBlockSet(proposalId, block.number); } Receipt storage receipt = proposal.receipts[voter]; require(receipt.hasVoted == false, "GovernorApollo::_castVote: voter already voted"); uint votes = _getVotingPower(voter, proposal.startBlock); if (voteValue == voteValueYes) { proposal.forVotes = proposal.forVotes + votes; } else if (voteValue == voteValueNo) { proposal.againstVotes = proposal.againstVotes + votes; } else if (voteValue == voteValueAbstain) { proposal.abstainVotes = proposal.abstainVotes + votes; } else { // Catch all. If an above case isn't matched then the value is not valid. revert("GovernorApollo::_castVote: invalid vote value"); } // Increase total votes proposal.totalVotes = proposal.totalVotes + votes; receipt.hasVoted = true; receipt.voteValue = voteValue; receipt.votes = votes; emit VoteCast(voter, proposalId, voteValue, votes); } /// @notice Get the given voter's voting power at the given block number. /// @param voter The voter to inspect. /// @param blockNumber The block number to get voting power at. /// @return The voter's voting power at the given block number. function _getVotingPower(address voter, uint blockNumber) internal view returns (uint) { // Get votes from the MFAM contract, the distributor contract, and the safety module contact. uint96 govTokenVotes = govToken.getPriorVotes(voter, blockNumber); uint distibutorVotes = distributor.getPriorVotes(voter, blockNumber); uint safetyModuleVotes = safetyModule.getPriorVotes(voter, blockNumber); return uint(govTokenVotes) + distibutorVotes + safetyModuleVotes; } /// @notice Searches proposals that have settled in order to adjust the floating quorum. function _adjustQuorum() internal { uint newQuorum = currentQuorum; uint newHighWaterMark = lastQuorumAdjustment; // Start at the high water mark for (uint i = lastQuorumAdjustment + 1; i < proposalCount; ++i) { // Pull state and ignore in flight proposals ProposalState proposalState = state(i); if (proposalState == ProposalState.Pending || proposalState == ProposalState.Active) { continue; } // Get the proposal Proposal storage proposal = proposals[i]; // If this proposal is sequential to the old high water mark, adjust the high water mark. if (proposal.id == newHighWaterMark + 1) { newHighWaterMark = proposal.id; } // Only proceed if quorum for this proposal is not yet taken into account. if (!proposal.quorumAdjusted) { // Mark it as adjusted, and update the high water mark. proposal.quorumAdjusted = true; // If a proposal is canceled, ignore it in quorum calculations. if (proposalState == ProposalState.Canceled) { continue; } // Adjust quorum in accordance with the proposal. newQuorum = _calculateNewQuorum(newQuorum, proposal.totalVotes); } } // Emit an event if quorum was adjusted if (newQuorum != currentQuorum) { emit QuroumVotesChanged(currentQuorum, newQuorum); } // Save back to storage from memory currentQuorum = newQuorum; lastQuorumAdjustment = newHighWaterMark; } /// @notice Calculates a new quorum value by weighting the old quorum value and a new proposal's quorum value. The /// newly calculated value is bounded to the quorum caps. /// @param oldQuorum The value of quorum before this adjustment is made. /// @param newAmount The amount of votes on a proposal that is used to adjust quorum. /// @return An adjusted quorum value. function _calculateNewQuorum(uint oldQuorum, uint newAmount) internal view returns (uint) { // Weight new quorum as 80% of old quorum and 20% of new quorum. uint oldQuorumWeight = (oldQuorum * 80) / 100; uint newQuorumWeight = (newAmount * 20) / 100; uint newQuorum = oldQuorumWeight + newQuorumWeight; // Bound on caps; if (newQuorum > upperQuorumCap) { return upperQuorumCap; } if (newQuorum < lowerQuorumCap) { return lowerQuorumCap; } return newQuorum; } /// @notice Sweeps all tokens owned by Governor alpha to the given destination address. /// @param tokenAddress The address of the token to move. /// @param destinationAddress The address to move tokens to. function sweepTokens(address tokenAddress, address destinationAddress) external { require(msg.sender == address(timelock), "GovernorApollo::sweepTokens: sender must be timelock"); IERC20 token = IERC20(tokenAddress); uint balance = token.balanceOf(address(this)); token.transfer(destinationAddress, balance); } /// Governance Introspection /// @notice Sets quorum caps for the governor. Only allowed to be changed via a governance proposal. /// @dev This call will revert if called by anyone other than the timelock, which prevents anyone other than a /// governance proposal from adjusting the parameters. /// @param newLowerQuorumCap The new lower quorum cap. /// @param newUpperQuorumCap The new upper quorum cap. function setQuorumCaps(uint newLowerQuorumCap, uint newUpperQuorumCap) external { require(msg.sender == address(timelock), "only timelock"); require(newUpperQuorumCap > newLowerQuorumCap, "bad cap ordering"); if (newLowerQuorumCap != lowerQuorumCap) { uint oldLowerQuorumCap = lowerQuorumCap; lowerQuorumCap = newLowerQuorumCap; emit LowerQuorumCapChanged(oldLowerQuorumCap, newLowerQuorumCap); } if (newUpperQuorumCap != upperQuorumCap) { uint oldUpperQuorumCap = upperQuorumCap; upperQuorumCap = newUpperQuorumCap; emit UpperQuorumCapChanged(oldUpperQuorumCap, newUpperQuorumCap); } } /// @notice Sets a proposal threshold for the governor. Only allowed to be changed via a governance proposal. /// @dev This call will revert if called by anyone other than the timelock, which prevents anyone other than a /// governance proposal from adjusting the parameters. /// @param newValue The new proposal threshold. function setProposalThreshold(uint newValue) external { require(msg.sender == address(timelock), "only timelock"); uint256 oldValue = proposalThreshold; proposalThreshold = newValue; emit ProposalThresholdChanged(oldValue, newValue); } /// @notice Sets a voting delay for the governor. Only allowed to be changed via a governance proposal. /// @dev This call will revert if called by anyone other than the timelock, which prevents anyone other than a /// governance proposal from adjusting the parameters. /// @param newValue The new voting delay in seconds. function setVotingDelay(uint newValue) external { require(msg.sender == address(timelock), "only timelock"); uint256 oldValue = votingDelay; votingDelay = newValue; emit VotingDelayChanged(oldValue, newValue); } /// @notice Sets the max operations in a proposal for the governor. Only allowed to be changed via a governance /// proposal. /// @dev This call will revert if called by anyone other than the timelock, which prevents anyone other than a /// governance proposal from adjusting the parameters. /// @param newValue The new max operations. function setProposalMaxOperations(uint newValue) external { require(msg.sender == address(timelock), "only timelock"); uint256 oldValue = proposalMaxOperations; proposalMaxOperations = newValue; emit ProposalMaxOperationsChanged(oldValue, newValue); } /// @notice Sets a period delay for the governor. Only allowed to be changed via a governance proposal. /// @dev This call will revert if called by anyone other than the timelock, which prevents anyone other than a /// governance proposal from adjusting the parameters. /// @param newValue The new voting period in seconds. function setVotingPeriod(uint newValue) external { require(msg.sender == address(timelock), "only timelock"); uint256 oldValue = votingPeriod; votingPeriod = newValue; emit VotingPeriodChanged(oldValue, newValue); } /// @notice Sets a new break glass guardian for the governor. Only allowed to be changed via a governance proposal. /// @dev This call will revert if called by anyone other than the timelock, which prevents anyone other than a /// governance proposal from adjusting the parameters. /// @param newGuardian The address of the new break grlass guardian. function setBreakGlassGuardian(address newGuardian) external { require(msg.sender == breakGlassGuardian, "only break glass guardian"); address oldValue = breakGlassGuardian; breakGlassGuardian = newGuardian; emit BreakGlassGuardianChanged(oldValue, newGuardian); } /// Governance Return Guardian /// @notice Sets the address that governance will be returned to in an emergency. Only callable by the governance return guardian. /// @param governanceReturnAddress_ The new governance return address. function __setGovernanceReturnAddress(address governanceReturnAddress_) external { require(msg.sender == governanceReturnGuardian, "GovernorApollo::__setGovernanceReturnAddress: sender must be gov return guardian"); address oldValue = governanceReturnAddress; governanceReturnAddress = governanceReturnAddress_; emit GovernanceReturnAddressChanged(oldValue, governanceReturnAddress_); } /// Break Glass Guardian - Emergency Declarations /// @notice Fast tracks calling _setPendingAdmin on the given contracts through the timelock. Only callable by the break glass guardian. /// @param addresses The addresses to call on. function __executeBreakGlassOnCompound(CompoundSetPendingAdminInterface[] calldata addresses) external { require(msg.sender == breakGlassGuardian, "GovernorApollo::__breakglass: sender must be bg guardian"); uint length = addresses.length; for (uint i = 0; i < length; ++i) { timelock.fastTrackExecuteTransaction(address(addresses[i]), 0, "_setPendingAdmin(address)", abi.encode(governanceReturnAddress)); } } /// @notice Fast tracks calling setAdmin on the given contracts through the timelock. Only callable by the break glass guardian. /// @param addresses The addresses to call on. function __executeBreakGlassOnSetAdmin(SetAdminInterface[] calldata addresses) external { require(msg.sender == breakGlassGuardian, "GovernorApollo::__breakglass: sender must be bg guardian"); uint length = addresses.length; for (uint i = 0; i < length; ++i) { timelock.fastTrackExecuteTransaction(address(addresses[i]), 0, "setAdmin(address)", abi.encode(governanceReturnAddress)); } } /// @notice Fast tracks calling setPendingAdmin on the given contracts through the timelock. Only callable by the break glass guardian. /// @param addresses The addresses to call on. function __executeBreakGlassOnSetPendingAdmin(SetPendingAdminInterface[] calldata addresses) external { require(msg.sender == breakGlassGuardian, "GovernorApollo::__breakglass: sender must be bg guardian"); uint length = addresses.length; for (uint i = 0; i < length; ++i) { timelock.fastTrackExecuteTransaction(address(addresses[i]), 0, "setPendingAdmin(address)", abi.encode(governanceReturnAddress)); } } /// @notice Fast tracks calling changeAdmin on the given contracts through the timelock. Only callable by the break glass guardian. /// @param addresses The addresses to call on. function __executeBreakGlassOnChangeAdmin(ChangeAdminInterface[] calldata addresses) external { require(msg.sender == breakGlassGuardian, "GovernorApollo::__breakglass: sender must be bg guardian"); uint length = addresses.length; for (uint i = 0; i < length; ++i) { timelock.fastTrackExecuteTransaction(address(addresses[i]), 0, "changeAdmin(address)", abi.encode(governanceReturnAddress)); } } /// @notice Fast tracks calling transferOwnership on the given contracts through the timelock. Only callable by the break glass guardian. /// @param addresses The addresses to call on. function __executeBreakGlassOnOwnable(OwnableInterface[] calldata addresses) external { require(msg.sender == breakGlassGuardian, "GovernorApollo::__breakglass: sender must be bg guardian"); uint length = addresses.length; for (uint i = 0; i < length; ++i) { timelock.fastTrackExecuteTransaction(address(addresses[i]), 0, "transferOwnership(address)", abi.encode(governanceReturnAddress)); } } /// @notice Fast tracks setting an emissions manager on the given contracts through the timelock. Only callable by the break glass guardian. /// @param addresses The addresses to call on. function __executeBreakGlassOnEmissionsManager(SetEmissionsManagerInterface[] calldata addresses) external { require(msg.sender == breakGlassGuardian, "GovernorApollo::__breakglass: sender must be bg guardian"); uint length = addresses.length; for (uint i = 0; i < length; ++i) { timelock.fastTrackExecuteTransaction(address(addresses[i]), 0, "setEmissionsManager(address)", abi.encode(governanceReturnAddress)); } } /// Break Glass Guardian - Recovery Operations /// @notice Fast tracks calling _acceptAdmin through the timelock for the given targets. /// @param addresses The addresses to call on. function __executeCompoundAcceptAdminOnContract(address[] calldata addresses) external { require(msg.sender == breakGlassGuardian, "GovernorApollo::__executeCompoundAcceptAdminOnContract: sender must be bg guardian"); uint length = addresses.length; for (uint i = 0; i < length; ++i) { timelock.fastTrackExecuteTransaction(addresses[i], 0, "_acceptAdmin()", abi.encode()); } } /// @notice Fast tracks calling acceptPendingAdmin through the timelock for the given targets. /// @param addresses The addresses to call on. function __executeAcceptAdminOnContract(address[] calldata addresses) external { require(msg.sender == breakGlassGuardian, "GovernorApollo::__executeAcceptAdminOnContract: sender must be bg guardian"); uint length = addresses.length; for (uint i = 0; i < length; ++i) { timelock.fastTrackExecuteTransaction(addresses[i], 0, "acceptPendingAdmin()", abi.encode()); } } /// Break Glass Guardian - Timelock Management /// @notice Calls accept admin on the timelock. Only callable by the break glass guardian. function __acceptAdminOnTimelock() external { require(msg.sender == breakGlassGuardian, "GovernorApollo::__acceptAdmin: sender must be bg guardian"); timelock.acceptAdmin(); } /// Guardian Removeal /// @notice Removes Guardians from the governance process. Can only be called by the timelock. This is an irreversible operation. function __removeGuardians() external { // Removing power can only come via a governance vote, which will be executed from the timelock. require(msg.sender == address(timelock), "GovernorApollo::__removeGuardians: sender must be the timelock"); // Removing the governance guardian can only occur after the sunset. require(block.timestamp >= guardianSunset, "GovernorApollo::__removeGuardians cannot remove before sunset"); // Set both guardians to the zero address. breakGlassGuardian = address(0); governanceReturnGuardian = address(0); } /// @notice Get the chain ID this contract is deployed on. /// @return The chain ID. function getChainId() internal view returns (uint) { uint chainId; assembly { chainId := chainid() } return chainId; } } interface TimelockInterface { function delay() external view returns (uint); function GRACE_PERIOD() external view returns (uint); function acceptAdmin() external; function queuedTransactions(bytes32 hash) external view returns (bool); function queueTransaction(address target, uint value, string calldata signature, bytes calldata data, uint eta) external returns (bytes32); function cancelTransaction(address target, uint value, string calldata signature, bytes calldata data, uint eta) external; function executeTransaction(address target, uint value, string calldata signature, bytes calldata data, uint eta) external payable returns (bytes memory); function fastTrackExecuteTransaction(address target, uint value, string calldata signature, bytes calldata data) external payable returns (bytes memory); } interface GovTokenInterface { function getPriorVotes(address account, uint blockNumber) external view returns (uint96); } interface SnapshotInterface { function getPriorVotes(address account, uint blockNumber) external view returns (uint256); } // Used on Compound Contracts - Unitroller, MTokens interface CompoundSetPendingAdminInterface { function _setPendingAdmin(address newPendingAdmin) external; } // Used on Chainlink Oracle interface SetAdminInterface { function setAdmin(address newAdmin) external; } // Used on TokenSaleDistributor interface SetPendingAdminInterface { function setPendingAdmin(address newAdmin) external; } // Used on safety ProxyAdmin interface SetEmissionsManagerInterface { function setEmissionsManager(address newEmissionsManager) external; } // Used on safety module ProxyAdmin interface ChangeAdminInterface { function changeAdmin(address newAdmin) external; } // Used on Ownable contracts - EcoystemReserveController interface OwnableInterface { function transferOwnership(address newOwner) external; }
// SPDX-License-Identifier: agpl-3.0 pragma solidity 0.8.17; /** * @dev Interface of the ERC20 standard as defined in the EIP. * From https://github.com/OpenZeppelin/openzeppelin-contracts */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
{ "optimizer": { "enabled": true, "runs": 999999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"timelock_","type":"address"},{"internalType":"address","name":"govToken_","type":"address"},{"internalType":"address","name":"distributor_","type":"address"},{"internalType":"address","name":"safetyModule_","type":"address"},{"internalType":"address","name":"breakGlassGuardian_","type":"address"},{"internalType":"address","name":"governanceReturnAddress_","type":"address"},{"internalType":"address","name":"governanceReturnGuardian_","type":"address"},{"internalType":"uint256","name":"guardianSunset_","type":"uint256"},{"internalType":"uint256","name":"currentQuorum_","type":"uint256"},{"internalType":"uint256","name":"lowerQuorumCap_","type":"uint256"},{"internalType":"uint256","name":"upperQuorumCap_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldValue","type":"address"},{"indexed":false,"internalType":"address","name":"newValue","type":"address"}],"name":"BreakGlassGuardianChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldValue","type":"address"},{"indexed":false,"internalType":"address","name":"newValue","type":"address"}],"name":"GovernanceReturnAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"LowerQuorumCapChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ProposalCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"proposer","type":"address"},{"indexed":false,"internalType":"address[]","name":"targets","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"},{"indexed":false,"internalType":"string[]","name":"signatures","type":"string[]"},{"indexed":false,"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"indexed":false,"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTimestamp","type":"uint256"},{"indexed":false,"internalType":"string","name":"description","type":"string"},{"indexed":false,"internalType":"uint256","name":"quorum","type":"uint256"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"ProposalMaxOperationsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"ProposalQueued","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"ProposalThresholdChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"QuroumVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"}],"name":"StartBlockSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"UpperQuorumCapChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"voteValue","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"votes","type":"uint256"}],"name":"VoteCast","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"VotingDelayChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"VotingPeriodChanged","type":"event"},{"inputs":[],"name":"BALLOT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__acceptAdminOnTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"__executeAcceptAdminOnContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ChangeAdminInterface[]","name":"addresses","type":"address[]"}],"name":"__executeBreakGlassOnChangeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract CompoundSetPendingAdminInterface[]","name":"addresses","type":"address[]"}],"name":"__executeBreakGlassOnCompound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract SetEmissionsManagerInterface[]","name":"addresses","type":"address[]"}],"name":"__executeBreakGlassOnEmissionsManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract OwnableInterface[]","name":"addresses","type":"address[]"}],"name":"__executeBreakGlassOnOwnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract SetAdminInterface[]","name":"addresses","type":"address[]"}],"name":"__executeBreakGlassOnSetAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract SetPendingAdminInterface[]","name":"addresses","type":"address[]"}],"name":"__executeBreakGlassOnSetPendingAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"__executeCompoundAcceptAdminOnContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"__removeGuardians","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"governanceReturnAddress_","type":"address"}],"name":"__setGovernanceReturnAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"breakGlassGuardian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"cancel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint8","name":"voteValue","type":"uint8"}],"name":"castVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint8","name":"voteValue","type":"uint8"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"castVoteBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentQuorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributor","outputs":[{"internalType":"contract SnapshotInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getActions","outputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"string[]","name":"signatures","type":"string[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getQuorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"voter","type":"address"}],"name":"getReceipt","outputs":[{"components":[{"internalType":"bool","name":"hasVoted","type":"bool"},{"internalType":"uint8","name":"voteValue","type":"uint8"},{"internalType":"uint256","name":"votes","type":"uint256"}],"internalType":"struct MoonwellGovernorApollo.Receipt","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"govToken","outputs":[{"internalType":"contract GovTokenInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceReturnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceReturnGuardian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guardianSunset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastQuorumAdjustment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"latestProposalIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lowerQuorumCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalMaxOperations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposals","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"uint256","name":"eta","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"endTimestamp","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"forVotes","type":"uint256"},{"internalType":"uint256","name":"againstVotes","type":"uint256"},{"internalType":"uint256","name":"abstainVotes","type":"uint256"},{"internalType":"uint256","name":"totalVotes","type":"uint256"},{"internalType":"bool","name":"canceled","type":"bool"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"uint256","name":"quorum","type":"uint256"},{"internalType":"bool","name":"quorumAdjusted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"string[]","name":"signatures","type":"string[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"string","name":"description","type":"string"}],"name":"propose","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"queue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"safetyModule","outputs":[{"internalType":"contract SnapshotInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newGuardian","type":"address"}],"name":"setBreakGlassGuardian","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setProposalMaxOperations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setProposalThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLowerQuorumCap","type":"uint256"},{"internalType":"uint256","name":"newUpperQuorumCap","type":"uint256"}],"name":"setQuorumCaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setVotingDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setVotingPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"state","outputs":[{"internalType":"enum MoonwellGovernorApollo.ProposalState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"destinationAddress","type":"address"}],"name":"sweepTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timelock","outputs":[{"internalType":"contract TimelockInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"upperQuorumCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voteValueAbstain","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voteValueNo","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voteValueYes","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votingDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votingPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526969e10de76676d08000006004556019600555603c6006556203f4806007553480156200003057600080fd5b50604051620059d7380380620059d783398101604081905262000053916200010f565b600880546001600160a01b03199081166001600160a01b039d8e16179091556009805482169b8d169b909b17909a55600a80548b16998c1699909917909855600b80548a16978b1697909717909655600d80548916958a1695909517909455600f8054881693891693909317909255600e80549096169616959095179093556010939093556000600381905591909155600291909155600155620001ce565b80516001600160a01b03811681146200010a57600080fd5b919050565b60008060008060008060008060008060006101608c8e0312156200013257600080fd5b6200013d8c620000f2565b9a506200014d60208d01620000f2565b99506200015d60408d01620000f2565b98506200016d60608d01620000f2565b97506200017d60808d01620000f2565b96506200018d60a08d01620000f2565b95506200019d60c08d01620000f2565b945060e08c015193506101008c015192506101208c015191506101408c015190509295989b509295989b9093969950565b6157f980620001de6000396000f3fe608060405234801561001057600080fd5b50600436106103575760003560e01c806377f386cf116101c8578063c8e21e1a11610104578063dd66f168116100a2578063e23a9a521161007c578063e23a9a521461082d578063ea0217cf14610867578063ece40cc11461087a578063fe0d94c11461088d57600080fd5b8063dd66f168146107e0578063ddf0b009146107f3578063deaaa7cc1461080657600080fd5b8063cf95c702116100de578063cf95c7021461079b578063d33219b4146107a4578063da35c664146107c4578063da95691a146107cd57600080fd5b8063c8e21e1a1461076c578063c9ba036b14610775578063cbfcc4dc1461078857600080fd5b8063b58131b011610171578063bef3a06f1161014b578063bef3a06f1461071b578063bfe109281461073b578063c26c12eb1461075b578063c5f62ca21461076357600080fd5b8063b58131b0146106f6578063bb3da091146106ff578063bd0119b61461070857600080fd5b80638ad84491116101a25780638ad84491146106bb5780638f71120b146106db578063912ae9fa146106e357600080fd5b806377f386cf146106a2578063795c8180146106aa5780637bdbe4d0146106b257600080fd5b80633932abb11161029757806358656baa116102405780636fe3db211161021a5780636fe3db211461064f57806370b0f6601461066257806370da93371461067557806375fe572e1461068f57600080fd5b806358656baa1461061e5780635a0c0da71461063e5780636a23651c1461064757600080fd5b806340e58ee51161027157806340e58ee5146105e557806342c9ad23146105f8578063567813881461060b57600080fd5b80633932abb1146105a95780633bccf4fd146105b25780633e4f49e6146105c557600080fd5b806317977c611161030457806320606b70116102de57806320606b701461053957806323a56b1714610560578063241dcdbc14610573578063328dd9821461058657600080fd5b806317977c61146104f3578063198800e2146105135780631d314f761461052657600080fd5b806306fdde031161033557806306fdde03146104755780630fbc82b8146104be5780631609be1d146104de57600080fd5b8063013cf08b1461035c57806302a251a31461041957806305268cff14610430575b600080fd5b6103f661036a36600461464e565b6011602052600090815260409020805460018201546002830154600784015460088501546009860154600a870154600b880154600c890154600d8a0154600e8b0154600f8c01546010909c01549a9b73ffffffffffffffffffffffffffffffffffffffff909a169a9899979896979596949593949293919260ff8083169361010090930481169291168e565b6040516104109e9d9c9b9a99989796959493929190614667565b60405180910390f35b61042260075481565b604051908152602001610410565b6009546104509073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610410565b6104b16040518060400160405280601881526020017f4d6f6f6e77656c6c2041706f6c6c6f20476f7665726e6f72000000000000000081525081565b6040516104109190614770565b600d546104509073ffffffffffffffffffffffffffffffffffffffff1681565b6104f16104ec3660046147ac565b6108a0565b005b6104226105013660046147e5565b60126020526000908152604090205481565b6104f1610521366004614802565b610a83565b6104f1610534366004614870565b610c0a565b6104227f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6104f161056e3660046147e5565b610dd3565b6104f1610581366004614870565b610f27565b61059961059436600461464e565b6110ea565b6040516104109493929190614988565b61042260065481565b6104f16105c03660046149f6565b611388565b6105d86105d336600461464e565b611632565b6040516104109190614a73565b6104f16105f336600461464e565b611838565b6104f161060636600461464e565b611b48565b6104f1610619366004614ab4565b611c07565b600f546104509073ffffffffffffffffffffffffffffffffffffffff1681565b61042260025481565b6104f1611c12565b6104f161065d366004614870565b611d81565b6104f161067036600461464e565b611f44565b61067d600181565b60405160ff9091168152602001610410565b6104f161069d366004614870565b612003565b6104f16121c6565b61067d600281565b61042260055481565b600e546104509073ffffffffffffffffffffffffffffffffffffffff1681565b61067d600081565b6104f16106f1366004614870565b6122eb565b61042260045481565b61042260005481565b6104f1610716366004614870565b6124ae565b600b546104509073ffffffffffffffffffffffffffffffffffffffff1681565b600a546104509073ffffffffffffffffffffffffffffffffffffffff1681565b610422612671565b61042260105481565b61042260035481565b6104f16107833660046147e5565b612739565b6104f1610796366004614870565b612839565b61042260015481565b6008546104509073ffffffffffffffffffffffffffffffffffffffff1681565b610422600c5481565b6104226107db366004614e05565b612a17565b6104f16107ee366004614870565b613098565b6104f161080136600461464e565b613276565b6104227f37670881f0d73587a809febdc7019f9c5e67a68a0881607e05c87023968d496181565b61084061083b366004614ed7565b613603565b6040805182511515815260208084015160ff16908201529181015190820152606001610410565b6104f161087536600461464e565b61367f565b6104f161088836600461464e565b61373e565b6104f161089b36600461464e565b6137fd565b60085473ffffffffffffffffffffffffffffffffffffffff16331461094c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f476f7665726e6f7241706f6c6c6f3a3a7377656570546f6b656e733a2073656e60448201527f646572206d7573742062652074696d656c6f636b00000000000000000000000060648201526084015b60405180910390fd5b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa1580156109bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109df9190614efc565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018390529192509083169063a9059cbb906044016020604051808303816000875af1158015610a58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7c9190614f15565b5050505050565b60085473ffffffffffffffffffffffffffffffffffffffff163314610b04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6f6e6c792074696d656c6f636b000000000000000000000000000000000000006044820152606401610943565b818111610b6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f62616420636170206f72646572696e67000000000000000000000000000000006044820152606401610943565b6002548214610bb957600280549083905560408051828152602081018590527ff69ea23a386a36953122b83cf3c296014bec3aea0679d18ad6a41219e22255d3910160405180910390a1505b6001548114610c0657600180549082905560408051828152602081018490527ff458086c6e4238e15af3fc8e94c03aae93b8feeee5e360705fbe8728a026137e91015b60405180910390a1505b5050565b600d5473ffffffffffffffffffffffffffffffffffffffff163314610cb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f627265616b676c6173733a20736560448201527f6e646572206d75737420626520626720677561726469616e00000000000000006064820152608401610943565b8060005b81811015610dcd5760085473ffffffffffffffffffffffffffffffffffffffff1663ae2ba3c4858584818110610ced57610ced614f37565b9050602002016020810190610d0291906147e5565b600f546040805173ffffffffffffffffffffffffffffffffffffffff9092166020830152600091016040516020818303038152906040526040518463ffffffff1660e01b8152600401610d5793929190614f66565b6000604051808303816000875af1158015610d76573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610dbc9190810190614fcf565b50610dc68161506c565b9050610cb5565b50505050565b600e5473ffffffffffffffffffffffffffffffffffffffff163314610ea0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f736574476f7665726e616e63655260448201527f657475726e416464726573733a2073656e646572206d75737420626520676f7660648201527f2072657475726e20677561726469616e00000000000000000000000000000000608482015260a401610943565b600f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f37276f7ac42bca4e34ce7e35e0c714561034815f69bd9b5156226a0ac779d09891015b60405180910390a15050565b600d5473ffffffffffffffffffffffffffffffffffffffff163314610fce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f627265616b676c6173733a20736560448201527f6e646572206d75737420626520626720677561726469616e00000000000000006064820152608401610943565b8060005b81811015610dcd5760085473ffffffffffffffffffffffffffffffffffffffff1663ae2ba3c485858481811061100a5761100a614f37565b905060200201602081019061101f91906147e5565b600f546040805173ffffffffffffffffffffffffffffffffffffffff9092166020830152600091016040516020818303038152906040526040518463ffffffff1660e01b8152600401611074939291906150a4565b6000604051808303816000875af1158015611093573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526110d99190810190614fcf565b506110e38161506c565b9050610fd2565b6060806060806000601160008781526020019081526020016000209050806003018160040182600501836006018380548060200260200160405190810160405280929190818152602001828054801561117957602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161114e575b50505050509350828054806020026020016040519081016040528092919081815260200182805480156111cb57602002820191906000526020600020905b8154815260200190600101908083116111b7575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b8282101561129f5783829060005260206000200180546112129061510d565b80601f016020809104026020016040519081016040528092919081815260200182805461123e9061510d565b801561128b5780601f106112605761010080835404028352916020019161128b565b820191906000526020600020905b81548152906001019060200180831161126e57829003601f168201915b5050505050815260200190600101906111f3565b50505050915080805480602002602001604051908101604052809291908181526020016000905b828210156113725783829060005260206000200180546112e59061510d565b80601f01602080910402602001604051908101604052809291908181526020018280546113119061510d565b801561135e5780601f106113335761010080835404028352916020019161135e565b820191906000526020600020905b81548152906001019060200180831161134157829003601f168201915b5050505050815260200190600101906112c6565b5050505090509450945094509450509193509193565b604080518082018252601881527f4d6f6f6e77656c6c2041706f6c6c6f20476f7665726e6f72000000000000000060209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f91674ca1ab934b574143f10caf08384dec7f2b02f64cf9ae3497ce271a9d2e9b81840152466060820152306080808301919091528351808303909101815260a0820184528051908301207f37670881f0d73587a809febdc7019f9c5e67a68a0881607e05c87023968d496160c083015260e0820189905260ff881661010080840191909152845180840390910181526101208301909452835193909201929092207f190100000000000000000000000000000000000000000000000000000000000061014084015261014283018290526101628301819052909160009061018201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa15801561154e573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661161c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f476f7665726e6f7241706f6c6c6f3a3a63617374566f746542795369673a206960448201527f6e76616c6964207369676e6174757265000000000000000000000000000000006064820152608401610943565b611627818a8a613a9f565b505050505050505050565b600081600c54101580156116465750600082115b6116d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f476f7665726e6f7241706f6c6c6f3a3a73746174653a20696e76616c6964207060448201527f726f706f73616c206964000000000000000000000000000000000000000000006064820152608401610943565b6000828152601160205260409020600e81015460ff16156116f65750600292915050565b8060070154421161170a5750600092915050565b8060080154421161171e5750600192915050565b80600b015481600a015411158061173c575080600f015481600d0154105b1561174a5750600392915050565b806002015460000361175f5750600492915050565b600e810154610100900460ff161561177a5750600792915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c1a287e26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180b9190614efc565b816002015461181a919061515a565b42106118295750600692915050565b50600592915050565b50919050565b600061184382611632565b9050600781600781111561185957611859614a44565b036118e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f476f7665726e6f7241706f6c6c6f3a3a63616e63656c3a2063616e6e6f74206360448201527f616e63656c2065786563757465642070726f706f73616c0000000000000000006064820152608401610943565b60008281526011602052604090206004546001808301546119299173ffffffffffffffffffffffffffffffffffffffff90911690611924904361516d565b613e63565b106119b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f476f7665726e6f7241706f6c6c6f3a3a63616e63656c3a2070726f706f73657260448201527f2061626f7665207468726573686f6c64000000000000000000000000000000006064820152608401610943565b600e810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560005b6003820154811015611b175760085460038301805473ffffffffffffffffffffffffffffffffffffffff9092169163591fcdfe919084908110611a2b57611a2b614f37565b60009182526020909120015460048501805473ffffffffffffffffffffffffffffffffffffffff9092169185908110611a6657611a66614f37565b9060005260206000200154856005018581548110611a8657611a86614f37565b90600052602060002001866006018681548110611aa557611aa5614f37565b9060005260206000200187600201546040518663ffffffff1660e01b8152600401611ad495949392919061521b565b600060405180830381600087803b158015611aee57600080fd5b505af1158015611b02573d6000803e3d6000fd5b5050505080611b109061506c565b90506119e6565b506040518381527f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90602001610bfc565b60085473ffffffffffffffffffffffffffffffffffffffff163314611bc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6f6e6c792074696d656c6f636b000000000000000000000000000000000000006044820152606401610943565b600580549082905560408051828152602081018490527fb01232ed22dbb40f1dfb4eb71b12bfd12a322ee2ceeeaa85fffbad30771d64ab9101610f1b565b610c06338383613a9f565b60085473ffffffffffffffffffffffffffffffffffffffff163314611cb9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f72656d6f7665477561726469616e60448201527f733a2073656e646572206d757374206265207468652074696d656c6f636b00006064820152608401610943565b601054421015611d4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f72656d6f7665477561726469616e60448201527f732063616e6e6f742072656d6f7665206265666f72652073756e7365740000006064820152608401610943565b600d80547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116909155600e80549091169055565b600d5473ffffffffffffffffffffffffffffffffffffffff163314611e28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f627265616b676c6173733a20736560448201527f6e646572206d75737420626520626720677561726469616e00000000000000006064820152608401610943565b8060005b81811015610dcd5760085473ffffffffffffffffffffffffffffffffffffffff1663ae2ba3c4858584818110611e6457611e64614f37565b9050602002016020810190611e7991906147e5565b600f546040805173ffffffffffffffffffffffffffffffffffffffff9092166020830152600091016040516020818303038152906040526040518463ffffffff1660e01b8152600401611ece93929190615275565b6000604051808303816000875af1158015611eed573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611f339190810190614fcf565b50611f3d8161506c565b9050611e2c565b60085473ffffffffffffffffffffffffffffffffffffffff163314611fc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6f6e6c792074696d656c6f636b000000000000000000000000000000000000006044820152606401610943565b600680549082905560408051828152602081018490527fbf1c009bdea70c22e4944ae8ac92b5f100449ab6f2fdedd0f7c991d3a6e29d259101610f1b565b600d5473ffffffffffffffffffffffffffffffffffffffff1633146120aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f627265616b676c6173733a20736560448201527f6e646572206d75737420626520626720677561726469616e00000000000000006064820152608401610943565b8060005b81811015610dcd5760085473ffffffffffffffffffffffffffffffffffffffff1663ae2ba3c48585848181106120e6576120e6614f37565b90506020020160208101906120fb91906147e5565b600f546040805173ffffffffffffffffffffffffffffffffffffffff9092166020830152600091016040516020818303038152906040526040518463ffffffff1660e01b8152600401612150939291906152de565b6000604051808303816000875af115801561216f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526121b59190810190614fcf565b506121bf8161506c565b90506120ae565b600d5473ffffffffffffffffffffffffffffffffffffffff16331461226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f61636365707441646d696e3a207360448201527f656e646572206d75737420626520626720677561726469616e000000000000006064820152608401610943565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e18b6816040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156122d757600080fd5b505af1158015610dcd573d6000803e3d6000fd5b600d5473ffffffffffffffffffffffffffffffffffffffff163314612392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f627265616b676c6173733a20736560448201527f6e646572206d75737420626520626720677561726469616e00000000000000006064820152608401610943565b8060005b81811015610dcd5760085473ffffffffffffffffffffffffffffffffffffffff1663ae2ba3c48585848181106123ce576123ce614f37565b90506020020160208101906123e391906147e5565b600f546040805173ffffffffffffffffffffffffffffffffffffffff9092166020830152600091016040516020818303038152906040526040518463ffffffff1660e01b815260040161243893929190615347565b6000604051808303816000875af1158015612457573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261249d9190810190614fcf565b506124a78161506c565b9050612396565b600d5473ffffffffffffffffffffffffffffffffffffffff163314612555576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f627265616b676c6173733a20736560448201527f6e646572206d75737420626520626720677561726469616e00000000000000006064820152608401610943565b8060005b81811015610dcd5760085473ffffffffffffffffffffffffffffffffffffffff1663ae2ba3c485858481811061259157612591614f37565b90506020020160208101906125a691906147e5565b600f546040805173ffffffffffffffffffffffffffffffffffffffff9092166020830152600091016040516020818303038152906040526040518463ffffffff1660e01b81526004016125fb939291906153b0565b6000604051808303816000875af115801561261a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526126609190810190614fcf565b5061266a8161506c565b9050612559565b60008054600354829061268590600161515a565b90505b600c5481101561183257600061269d82611632565b905060008160078111156126b3576126b3614a44565b14806126d0575060018160078111156126ce576126ce614a44565b145b156126db5750612729565b6000828152601160205260409020601081015460ff1661272657600282600781111561270957612709614a44565b03612715575050612729565b6127238482600d0154614073565b93505b50505b6127328161506c565b9050612688565b600d5473ffffffffffffffffffffffffffffffffffffffff1633146127ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6f6e6c7920627265616b20676c61737320677561726469616e000000000000006044820152606401610943565b600d805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f19be0cefd4235c57b29c828297a3e160306f359677ce5dc07f5b4f546fc29de69101610f1b565b600d5473ffffffffffffffffffffffffffffffffffffffff163314612906576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605260248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f65786563757465436f6d706f756e60448201527f6441636365707441646d696e4f6e436f6e74726163743a2073656e646572206d60648201527f75737420626520626720677561726469616e0000000000000000000000000000608482015260a401610943565b8060005b81811015610dcd5760085473ffffffffffffffffffffffffffffffffffffffff1663ae2ba3c485858481811061294257612942614f37565b905060200201602081019061295791906147e5565b60408051600080825260208201928390527fffffffff0000000000000000000000000000000000000000000000000000000060e086901b169092526129a192919060248101615419565b6000604051808303816000875af11580156129c0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612a069190810190614fcf565b50612a108161506c565b905061290a565b600454600090612a2c3361192460014361516d565b11612abb57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f476f7665726e6f7241706f6c6c6f3a3a70726f706f73653a2070726f706f736560448201527f7220766f7465732062656c6f772070726f706f73616c207468726573686f6c646064820152608401610943565b84518651148015612acd575083518651145b8015612ada575082518651145b612b8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f476f7665726e6f7241706f6c6c6f3a3a70726f706f73653a2070726f706f736160448201527f6c2066756e6374696f6e20696e666f726d6174696f6e206172697479206d697360648201527f6d61746368000000000000000000000000000000000000000000000000000000608482015260a401610943565b8551600003612c1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f476f7665726e6f7241706f6c6c6f3a3a70726f706f73653a206d75737420707260448201527f6f7669646520616374696f6e73000000000000000000000000000000000000006064820152608401610943565b60055486511115612cb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f476f7665726e6f7241706f6c6c6f3a3a70726f706f73653a20746f6f206d616e60448201527f7920616374696f6e7300000000000000000000000000000000000000000000006064820152608401610943565b6000825111612d1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6465736372697074696f6e2063616e206e6f7420626520656d707479000000006044820152606401610943565b336000908152601260205260409020548015612ece576000612d3c82611632565b90506001816007811115612d5257612d52614a44565b03612e05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605960248201527f476f7665726e6f7241706f6c6c6f3a3a70726f706f73653a206f6e65206c697660448201527f652070726f706f73616c207065722070726f706f7365722c20666f756e64206160648201527f6e20616c7265616479206163746976652070726f706f73616c00000000000000608482015260a401610943565b6000816007811115612e1957612e19614a44565b03612ecc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605a60248201527f476f7665726e6f7241706f6c6c6f3a3a70726f706f73653a206f6e65206c697660448201527f652070726f706f73616c207065722070726f706f7365722c20666f756e64206160648201527f6e20616c72656164792070656e64696e672070726f706f73616c000000000000608482015260a401610943565b505b600060065442612ede919061515a565b9050600060065460075442612ef3919061515a565b612efd919061515a565b9050600c60008154612f0e9061506c565b90915550612f1a6140ef565b600c5460008181526011602090815260409091209182556001820180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790558a51612f71916003840191908d0190614459565b508851612f8790600483019060208c01906144e3565b508751612f9d90600583019060208b019061451e565b508651612fb390600683019060208a0190614570565b5082816007018190555081816008018190555060005481600f0181905550600c54601260008360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507fb822896d940636d634030a124c95006ad3a3008e5734f511df0d5c418b20c9d08160000154338c8c8c8c89898e6000546040516130829a99989796959493929190615482565b60405180910390a1549998505050505050505050565b600d5473ffffffffffffffffffffffffffffffffffffffff163314613165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f657865637574654163636570744160448201527f646d696e4f6e436f6e74726163743a2073656e646572206d757374206265206260648201527f6720677561726469616e00000000000000000000000000000000000000000000608482015260a401610943565b8060005b81811015610dcd5760085473ffffffffffffffffffffffffffffffffffffffff1663ae2ba3c48585848181106131a1576131a1614f37565b90506020020160208101906131b691906147e5565b60408051600080825260208201928390527fffffffff0000000000000000000000000000000000000000000000000000000060e086901b169092526132009291906024810161552e565b6000604051808303816000875af115801561321f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526132659190810190614fcf565b5061326f8161506c565b9050613169565b600461328182611632565b600781111561329257613292614a44565b14613345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f476f7665726e6f7241706f6c6c6f3a3a71756575653a2070726f706f73616c2060448201527f63616e206f6e6c7920626520717565756564206966206974206973207375636360648201527f6565646564000000000000000000000000000000000000000000000000000000608482015260a401610943565b600081815260116020908152604080832060085482517f6a42b8f8000000000000000000000000000000000000000000000000000000008152925191949373ffffffffffffffffffffffffffffffffffffffff90911692636a42b8f892600480830193928290030181865afa1580156133c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e69190614efc565b6133f0904261515a565b905060005b60038301548110156135c5576135b583600301828154811061341957613419614f37565b60009182526020909120015460048501805473ffffffffffffffffffffffffffffffffffffffff909216918490811061345457613454614f37565b906000526020600020015485600501848154811061347457613474614f37565b9060005260206000200180546134899061510d565b80601f01602080910402602001604051908101604052809291908181526020018280546134b59061510d565b80156135025780601f106134d757610100808354040283529160200191613502565b820191906000526020600020905b8154815290600101906020018083116134e557829003601f168201915b505050505086600601858154811061351c5761351c614f37565b9060005260206000200180546135319061510d565b80601f016020809104026020016040519081016040528092919081815260200182805461355d9061510d565b80156135aa5780601f1061357f576101008083540402835291602001916135aa565b820191906000526020600020905b81548152906001019060200180831161358d57829003601f168201915b50505050508661424d565b6135be8161506c565b90506133f5565b506002820181905560408051848152602081018390527f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28929101610bfc565b604080516060808201835260008083526020808401829052928401819052858152601180845284822073ffffffffffffffffffffffffffffffffffffffff8716835201835283902083519182018452805460ff808216151584526101009091041692820192909252600190910154918101919091525b92915050565b60085473ffffffffffffffffffffffffffffffffffffffff163314613700576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6f6e6c792074696d656c6f636b000000000000000000000000000000000000006044820152606401610943565b600780549082905560408051828152602081018490527f0157f874643e34dea2d71607bde6378f09880b59546f9e2386608eb7154b89759101610f1b565b60085473ffffffffffffffffffffffffffffffffffffffff1633146137bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6f6e6c792074696d656c6f636b000000000000000000000000000000000000006044820152606401610943565b600480549082905560408051828152602081018490527f9b772ef27711c872f217a0c52a72ba00d7552f2d6c3b3d0f0593fc2549359df39101610f1b565b600561380882611632565b600781111561381957613819614a44565b146138cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f476f7665726e6f7241706f6c6c6f3a3a657865637574653a2070726f706f736160448201527f6c2063616e206f6e6c792062652065786563757465642069662069742069732060648201527f7175657565640000000000000000000000000000000000000000000000000000608482015260a401610943565b6000818152601160205260408120600e810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055905b6003820154811015613a6e5760085460038301805473ffffffffffffffffffffffffffffffffffffffff90921691630825f38f91908490811061394f5761394f614f37565b60009182526020909120015460048501805473ffffffffffffffffffffffffffffffffffffffff909216918590811061398a5761398a614f37565b90600052602060002001548560050185815481106139aa576139aa614f37565b906000526020600020018660060186815481106139c9576139c9614f37565b9060005260206000200187600201546040518663ffffffff1660e01b81526004016139f895949392919061521b565b6000604051808303816000875af1158015613a17573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052613a5d9190810190614fcf565b50613a678161506c565b905061390a565b506040518281527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f90602001610f1b565b6001613aaa83611632565b6007811115613abb57613abb614a44565b14613b48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f476f7665726e6f7241706f6c6c6f3a3a5f63617374566f74653a20766f74696e60448201527f6720697320636c6f7365640000000000000000000000000000000000000000006064820152608401610943565b60008281526011602052604081206009810154909103613bab57613b6d60014361516d565b6009820155604080518481524360208201527f0d1e02ccd52fe49c19093261ba25ca959463e72ed10577de6069a95c14cd04ee910160405180910390a15b73ffffffffffffffffffffffffffffffffffffffff841660009081526011820160205260409020805460ff1615613c64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f476f7665726e6f7241706f6c6c6f3a3a5f63617374566f74653a20766f74657260448201527f20616c726561647920766f7465640000000000000000000000000000000000006064820152608401610943565b6000613c74868460090154613e63565b905060ff8416613c98578083600a0154613c8e919061515a565b600a840155613da8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff851601613cdc578083600b0154613cd2919061515a565b600b840155613da8565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe60ff851601613d20578083600c0154613d16919061515a565b600c840155613da8565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f476f7665726e6f7241706f6c6c6f3a3a5f63617374566f74653a20696e76616c60448201527f696420766f74652076616c7565000000000000000000000000000000000000006064820152608401610943565b8083600d0154613db8919061515a565b600d840155815460ff851661010081027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216919091176001908117845583018290556040805173ffffffffffffffffffffffffffffffffffffffff891681526020810188905290810191909152606081018290527f2c9deb38f462962eadbd85a9d3a4120503ee091f1582eaaa10aa8c6797651d299060800160405180910390a1505050505050565b6009546040517f782d6fe100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052600092839291169063782d6fe190604401602060405180830381865afa158015613ede573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f029190615597565b600a546040517f782d6fe100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790529293506000929091169063782d6fe190604401602060405180830381865afa158015613f7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fa39190614efc565b600b546040517f782d6fe100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152602482018890529293506000929091169063782d6fe190604401602060405180830381865afa158015614020573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140449190614efc565b90508061405f836bffffffffffffffffffffffff861661515a565b614069919061515a565b9695505050505050565b60008060646140838560506155c5565b61408d91906155dc565b90506000606461409e8560146155c5565b6140a891906155dc565b905060006140b6828461515a565b90506001548111156140cf576001549350505050613679565b6002548110156140e6576002549350505050613679565b95945050505050565b60008054600354909161410382600161515a565b90505b600c548110156141fb57600061411b82611632565b9050600081600781111561413157614131614a44565b148061414e5750600181600781111561414c5761414c614a44565b145b1561415957506141eb565b600082815260116020526040902061417284600161515a565b81540361417e57805493505b601081015460ff166141e8576010810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560028260078111156141cb576141cb614a44565b036141d75750506141eb565b6141e58582600d0154614073565b94505b50505b6141f48161506c565b9050614106565b5060005482146142425760005460408051918252602082018490527f881e29202a36aa27b2e7dbd1086b0679e9212ac38029ba9959623b58d66a56b2910160405180910390a15b600091909155600355565b60085460405173ffffffffffffffffffffffffffffffffffffffff9091169063f2b06537906142889088908890889088908890602001615617565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004016142bc91815260200190565b602060405180830381865afa1580156142d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142fd9190614f15565b156143b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f476f7665726e6f7241706f6c6c6f3a3a5f71756575654f725265766572743a2060448201527f70726f706f73616c20616374696f6e20616c726561647920717565756564206160648201527f7420657461000000000000000000000000000000000000000000000000000000608482015260a401610943565b6008546040517f3a66f90100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633a66f9019061440e9088908890889088908890600401615617565b6020604051808303816000875af115801561442d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144519190614efc565b505050505050565b8280548282559060005260206000209081019282156144d3579160200282015b828111156144d357825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190614479565b506144df9291506145c2565b5090565b8280548282559060005260206000209081019282156144d3579160200282015b828111156144d3578251825591602001919060010190614503565b828054828255906000526020600020908101928215614564579160200282015b82811115614564578251829061455490826156a9565b509160200191906001019061453e565b506144df9291506145d7565b8280548282559060005260206000209081019282156145b6579160200282015b828111156145b657825182906145a690826156a9565b5091602001919060010190614590565b506144df9291506145f4565b5b808211156144df57600081556001016145c3565b808211156144df5760006145eb8282614611565b506001016145d7565b808211156144df5760006146088282614611565b506001016145f4565b50805461461d9061510d565b6000825580601f1061462d575050565b601f01602090049060005260206000209081019061464b91906145c2565b50565b60006020828403121561466057600080fd5b5035919050565b60006101c0820190508f825273ffffffffffffffffffffffffffffffffffffffff8f1660208301528d60408301528c60608301528b60808301528a60a08301528960c08301528860e083015287610100830152866101208301528515156101408301526146d961016083018615159052565b836101808301526146ef6101a083018415159052565b9f9e505050505050505050505050505050565b60005b8381101561471d578181015183820152602001614705565b50506000910152565b6000815180845261473e816020860160208601614702565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006147836020830184614726565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461464b57600080fd5b600080604083850312156147bf57600080fd5b82356147ca8161478a565b915060208301356147da8161478a565b809150509250929050565b6000602082840312156147f757600080fd5b81356147838161478a565b6000806040838503121561481557600080fd5b50508035926020909101359150565b60008083601f84011261483657600080fd5b50813567ffffffffffffffff81111561484e57600080fd5b6020830191508360208260051b850101111561486957600080fd5b9250929050565b6000806020838503121561488357600080fd5b823567ffffffffffffffff81111561489a57600080fd5b6148a685828601614824565b90969095509350505050565b600081518084526020808501945080840160005b838110156148f857815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016148c6565b509495945050505050565b600081518084526020808501945080840160005b838110156148f857815187529582019590820190600101614917565b600081518084526020808501808196508360051b8101915082860160005b8581101561497b578284038952614969848351614726565b98850198935090840190600101614951565b5091979650505050505050565b60808152600061499b60808301876148b2565b82810360208401526149ad8187614903565b905082810360408401526149c18186614933565b905082810360608401526149d58185614933565b979650505050505050565b803560ff811681146149f157600080fd5b919050565b600080600080600060a08688031215614a0e57600080fd5b85359450614a1e602087016149e0565b9350614a2c604087016149e0565b94979396509394606081013594506080013592915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160088310614aae577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060408385031215614ac757600080fd5b82359150614ad7602084016149e0565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614b5657614b56614ae0565b604052919050565b600067ffffffffffffffff821115614b7857614b78614ae0565b5060051b60200190565b600082601f830112614b9357600080fd5b81356020614ba8614ba383614b5e565b614b0f565b82815260059290921b84018101918181019086841115614bc757600080fd5b8286015b84811015614beb578035614bde8161478a565b8352918301918301614bcb565b509695505050505050565b600082601f830112614c0757600080fd5b81356020614c17614ba383614b5e565b82815260059290921b84018101918181019086841115614c3657600080fd5b8286015b84811015614beb5780358352918301918301614c3a565b600067ffffffffffffffff821115614c6b57614c6b614ae0565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b6000614ca5614ba384614c51565b9050828152838383011115614cb957600080fd5b828260208301376000602084830101529392505050565b600082601f830112614ce157600080fd5b61478383833560208501614c97565b600082601f830112614d0157600080fd5b81356020614d11614ba383614b5e565b82815260059290921b84018101918181019086841115614d3057600080fd5b8286015b84811015614beb57803567ffffffffffffffff811115614d545760008081fd5b614d628986838b0101614cd0565b845250918301918301614d34565b600082601f830112614d8157600080fd5b81356020614d91614ba383614b5e565b82815260059290921b84018101918181019086841115614db057600080fd5b8286015b84811015614beb57803567ffffffffffffffff811115614dd45760008081fd5b8701603f81018913614de65760008081fd5b614df7898683013560408401614c97565b845250918301918301614db4565b600080600080600060a08688031215614e1d57600080fd5b853567ffffffffffffffff80821115614e3557600080fd5b614e4189838a01614b82565b96506020880135915080821115614e5757600080fd5b614e6389838a01614bf6565b95506040880135915080821115614e7957600080fd5b614e8589838a01614cf0565b94506060880135915080821115614e9b57600080fd5b614ea789838a01614d70565b93506080880135915080821115614ebd57600080fd5b50614eca88828901614cd0565b9150509295509295909350565b60008060408385031215614eea57600080fd5b8235915060208301356147da8161478a565b600060208284031215614f0e57600080fd5b5051919050565b600060208284031215614f2757600080fd5b8151801515811461478357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8416815282602082015260806040820152601960808201527f5f73657450656e64696e6741646d696e2861646472657373290000000000000060a082015260c0606082015260006140e660c0830184614726565b600060208284031215614fe157600080fd5b815167ffffffffffffffff811115614ff857600080fd5b8201601f8101841361500957600080fd5b8051615017614ba382614c51565b81815285602083850101111561502c57600080fd5b6140e6826020830160208601614702565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361509d5761509d61503d565b5060010190565b73ffffffffffffffffffffffffffffffffffffffff8416815282602082015260806040820152601c60808201527f736574456d697373696f6e734d616e616765722861646472657373290000000060a082015260c0606082015260006140e660c0830184614726565b600181811c9082168061512157607f821691505b602082108103611832577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b808201808211156136795761367961503d565b818103818111156136795761367961503d565b6000815461518d8161510d565b8085526020600183811680156151aa57600181146151e257615210565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838901528284151560051b8901019550615210565b866000528260002060005b858110156152085781548a82018601529083019084016151ed565b890184019650505b505050505092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015260a06040820152600061525060a0830186615180565b82810360608401526152628186615180565b9150508260808301529695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8416815282602082015260806040820152601160808201527f73657441646d696e28616464726573732900000000000000000000000000000060a082015260c0606082015260006140e660c0830184614726565b73ffffffffffffffffffffffffffffffffffffffff8416815282602082015260806040820152601460808201527f6368616e676541646d696e28616464726573732900000000000000000000000060a082015260c0606082015260006140e660c0830184614726565b73ffffffffffffffffffffffffffffffffffffffff8416815282602082015260806040820152601860808201527f73657450656e64696e6741646d696e286164647265737329000000000000000060a082015260c0606082015260006140e660c0830184614726565b73ffffffffffffffffffffffffffffffffffffffff8416815282602082015260806040820152601a60808201527f7472616e736665724f776e65727368697028616464726573732900000000000060a082015260c0606082015260006140e660c0830184614726565b73ffffffffffffffffffffffffffffffffffffffff8416815282602082015260806040820152600e60808201527f5f61636365707441646d696e282900000000000000000000000000000000000060a082015260c0606082015260006140e660c0830184614726565b60006101408c835273ffffffffffffffffffffffffffffffffffffffff8c1660208401528060408401526154b88184018c6148b2565b905082810360608401526154cc818b614903565b905082810360808401526154e0818a614933565b905082810360a08401526154f48189614933565b90508660c08401528560e08401528281036101008401526155158186614726565b915050826101208301529b9a5050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8416815282602082015260806040820152601460808201527f61636365707450656e64696e6741646d696e282900000000000000000000000060a082015260c0606082015260006140e660c0830184614726565b6000602082840312156155a957600080fd5b81516bffffffffffffffffffffffff8116811461478357600080fd5b80820281158282048414176136795761367961503d565b600082615612577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015260a06040820152600061564c60a0830186614726565b82810360608401526152628186614726565b601f8211156156a457600081815260208120601f850160051c810160208610156156855750805b601f850160051c820191505b8181101561445157828155600101615691565b505050565b815167ffffffffffffffff8111156156c3576156c3614ae0565b6156d7816156d1845461510d565b8461565e565b602080601f83116001811461572a57600084156156f45750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614451565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561577757888601518255948401946001909101908401615758565b50858210156157b357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fea2646970667358221220f3a486f5d08a266e30525bd1c6bdb29eecee5927508041b417c6f82ff30bb76564736f6c6343000811003300000000000000000000000004e6322d196e0e4ccbb2610dd8b8f2871e160bd7000000000000000000000000bb8d88bcd9749636bc4d2be22aac4bb3b01a58f10000000000000000000000008568a675384d761f36ec269d695d6ce4423cfab1000000000000000000000000cd76e63f3abfa864c53b4b98f57c1aa6539fda3a000000000000000000000000ddbf679d6332d9e5b409865b9671d1927255b52a000000000000000000000000017efffd8abea3b1891f81e7c0e5166458b3584d000000000000000000000000017efffd8abea3b1891f81e7c0e5166458b3584d000000000000000000000000000000000000000000000000000000006434e177000000000000000000000000000000000000000000108b2a2c28029094000000000000000000000000000000000000000000000000084595161401484a000000000000000000000000000000000000000000000002e87669c308736a04000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103575760003560e01c806377f386cf116101c8578063c8e21e1a11610104578063dd66f168116100a2578063e23a9a521161007c578063e23a9a521461082d578063ea0217cf14610867578063ece40cc11461087a578063fe0d94c11461088d57600080fd5b8063dd66f168146107e0578063ddf0b009146107f3578063deaaa7cc1461080657600080fd5b8063cf95c702116100de578063cf95c7021461079b578063d33219b4146107a4578063da35c664146107c4578063da95691a146107cd57600080fd5b8063c8e21e1a1461076c578063c9ba036b14610775578063cbfcc4dc1461078857600080fd5b8063b58131b011610171578063bef3a06f1161014b578063bef3a06f1461071b578063bfe109281461073b578063c26c12eb1461075b578063c5f62ca21461076357600080fd5b8063b58131b0146106f6578063bb3da091146106ff578063bd0119b61461070857600080fd5b80638ad84491116101a25780638ad84491146106bb5780638f71120b146106db578063912ae9fa146106e357600080fd5b806377f386cf146106a2578063795c8180146106aa5780637bdbe4d0146106b257600080fd5b80633932abb11161029757806358656baa116102405780636fe3db211161021a5780636fe3db211461064f57806370b0f6601461066257806370da93371461067557806375fe572e1461068f57600080fd5b806358656baa1461061e5780635a0c0da71461063e5780636a23651c1461064757600080fd5b806340e58ee51161027157806340e58ee5146105e557806342c9ad23146105f8578063567813881461060b57600080fd5b80633932abb1146105a95780633bccf4fd146105b25780633e4f49e6146105c557600080fd5b806317977c611161030457806320606b70116102de57806320606b701461053957806323a56b1714610560578063241dcdbc14610573578063328dd9821461058657600080fd5b806317977c61146104f3578063198800e2146105135780631d314f761461052657600080fd5b806306fdde031161033557806306fdde03146104755780630fbc82b8146104be5780631609be1d146104de57600080fd5b8063013cf08b1461035c57806302a251a31461041957806305268cff14610430575b600080fd5b6103f661036a36600461464e565b6011602052600090815260409020805460018201546002830154600784015460088501546009860154600a870154600b880154600c890154600d8a0154600e8b0154600f8c01546010909c01549a9b73ffffffffffffffffffffffffffffffffffffffff909a169a9899979896979596949593949293919260ff8083169361010090930481169291168e565b6040516104109e9d9c9b9a99989796959493929190614667565b60405180910390f35b61042260075481565b604051908152602001610410565b6009546104509073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610410565b6104b16040518060400160405280601881526020017f4d6f6f6e77656c6c2041706f6c6c6f20476f7665726e6f72000000000000000081525081565b6040516104109190614770565b600d546104509073ffffffffffffffffffffffffffffffffffffffff1681565b6104f16104ec3660046147ac565b6108a0565b005b6104226105013660046147e5565b60126020526000908152604090205481565b6104f1610521366004614802565b610a83565b6104f1610534366004614870565b610c0a565b6104227f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6104f161056e3660046147e5565b610dd3565b6104f1610581366004614870565b610f27565b61059961059436600461464e565b6110ea565b6040516104109493929190614988565b61042260065481565b6104f16105c03660046149f6565b611388565b6105d86105d336600461464e565b611632565b6040516104109190614a73565b6104f16105f336600461464e565b611838565b6104f161060636600461464e565b611b48565b6104f1610619366004614ab4565b611c07565b600f546104509073ffffffffffffffffffffffffffffffffffffffff1681565b61042260025481565b6104f1611c12565b6104f161065d366004614870565b611d81565b6104f161067036600461464e565b611f44565b61067d600181565b60405160ff9091168152602001610410565b6104f161069d366004614870565b612003565b6104f16121c6565b61067d600281565b61042260055481565b600e546104509073ffffffffffffffffffffffffffffffffffffffff1681565b61067d600081565b6104f16106f1366004614870565b6122eb565b61042260045481565b61042260005481565b6104f1610716366004614870565b6124ae565b600b546104509073ffffffffffffffffffffffffffffffffffffffff1681565b600a546104509073ffffffffffffffffffffffffffffffffffffffff1681565b610422612671565b61042260105481565b61042260035481565b6104f16107833660046147e5565b612739565b6104f1610796366004614870565b612839565b61042260015481565b6008546104509073ffffffffffffffffffffffffffffffffffffffff1681565b610422600c5481565b6104226107db366004614e05565b612a17565b6104f16107ee366004614870565b613098565b6104f161080136600461464e565b613276565b6104227f37670881f0d73587a809febdc7019f9c5e67a68a0881607e05c87023968d496181565b61084061083b366004614ed7565b613603565b6040805182511515815260208084015160ff16908201529181015190820152606001610410565b6104f161087536600461464e565b61367f565b6104f161088836600461464e565b61373e565b6104f161089b36600461464e565b6137fd565b60085473ffffffffffffffffffffffffffffffffffffffff16331461094c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f476f7665726e6f7241706f6c6c6f3a3a7377656570546f6b656e733a2073656e60448201527f646572206d7573742062652074696d656c6f636b00000000000000000000000060648201526084015b60405180910390fd5b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa1580156109bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109df9190614efc565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018390529192509083169063a9059cbb906044016020604051808303816000875af1158015610a58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7c9190614f15565b5050505050565b60085473ffffffffffffffffffffffffffffffffffffffff163314610b04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6f6e6c792074696d656c6f636b000000000000000000000000000000000000006044820152606401610943565b818111610b6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f62616420636170206f72646572696e67000000000000000000000000000000006044820152606401610943565b6002548214610bb957600280549083905560408051828152602081018590527ff69ea23a386a36953122b83cf3c296014bec3aea0679d18ad6a41219e22255d3910160405180910390a1505b6001548114610c0657600180549082905560408051828152602081018490527ff458086c6e4238e15af3fc8e94c03aae93b8feeee5e360705fbe8728a026137e91015b60405180910390a1505b5050565b600d5473ffffffffffffffffffffffffffffffffffffffff163314610cb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f627265616b676c6173733a20736560448201527f6e646572206d75737420626520626720677561726469616e00000000000000006064820152608401610943565b8060005b81811015610dcd5760085473ffffffffffffffffffffffffffffffffffffffff1663ae2ba3c4858584818110610ced57610ced614f37565b9050602002016020810190610d0291906147e5565b600f546040805173ffffffffffffffffffffffffffffffffffffffff9092166020830152600091016040516020818303038152906040526040518463ffffffff1660e01b8152600401610d5793929190614f66565b6000604051808303816000875af1158015610d76573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610dbc9190810190614fcf565b50610dc68161506c565b9050610cb5565b50505050565b600e5473ffffffffffffffffffffffffffffffffffffffff163314610ea0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f736574476f7665726e616e63655260448201527f657475726e416464726573733a2073656e646572206d75737420626520676f7660648201527f2072657475726e20677561726469616e00000000000000000000000000000000608482015260a401610943565b600f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f37276f7ac42bca4e34ce7e35e0c714561034815f69bd9b5156226a0ac779d09891015b60405180910390a15050565b600d5473ffffffffffffffffffffffffffffffffffffffff163314610fce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f627265616b676c6173733a20736560448201527f6e646572206d75737420626520626720677561726469616e00000000000000006064820152608401610943565b8060005b81811015610dcd5760085473ffffffffffffffffffffffffffffffffffffffff1663ae2ba3c485858481811061100a5761100a614f37565b905060200201602081019061101f91906147e5565b600f546040805173ffffffffffffffffffffffffffffffffffffffff9092166020830152600091016040516020818303038152906040526040518463ffffffff1660e01b8152600401611074939291906150a4565b6000604051808303816000875af1158015611093573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526110d99190810190614fcf565b506110e38161506c565b9050610fd2565b6060806060806000601160008781526020019081526020016000209050806003018160040182600501836006018380548060200260200160405190810160405280929190818152602001828054801561117957602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161114e575b50505050509350828054806020026020016040519081016040528092919081815260200182805480156111cb57602002820191906000526020600020905b8154815260200190600101908083116111b7575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b8282101561129f5783829060005260206000200180546112129061510d565b80601f016020809104026020016040519081016040528092919081815260200182805461123e9061510d565b801561128b5780601f106112605761010080835404028352916020019161128b565b820191906000526020600020905b81548152906001019060200180831161126e57829003601f168201915b5050505050815260200190600101906111f3565b50505050915080805480602002602001604051908101604052809291908181526020016000905b828210156113725783829060005260206000200180546112e59061510d565b80601f01602080910402602001604051908101604052809291908181526020018280546113119061510d565b801561135e5780601f106113335761010080835404028352916020019161135e565b820191906000526020600020905b81548152906001019060200180831161134157829003601f168201915b5050505050815260200190600101906112c6565b5050505090509450945094509450509193509193565b604080518082018252601881527f4d6f6f6e77656c6c2041706f6c6c6f20476f7665726e6f72000000000000000060209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f91674ca1ab934b574143f10caf08384dec7f2b02f64cf9ae3497ce271a9d2e9b81840152466060820152306080808301919091528351808303909101815260a0820184528051908301207f37670881f0d73587a809febdc7019f9c5e67a68a0881607e05c87023968d496160c083015260e0820189905260ff881661010080840191909152845180840390910181526101208301909452835193909201929092207f190100000000000000000000000000000000000000000000000000000000000061014084015261014283018290526101628301819052909160009061018201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa15801561154e573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661161c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f476f7665726e6f7241706f6c6c6f3a3a63617374566f746542795369673a206960448201527f6e76616c6964207369676e6174757265000000000000000000000000000000006064820152608401610943565b611627818a8a613a9f565b505050505050505050565b600081600c54101580156116465750600082115b6116d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f476f7665726e6f7241706f6c6c6f3a3a73746174653a20696e76616c6964207060448201527f726f706f73616c206964000000000000000000000000000000000000000000006064820152608401610943565b6000828152601160205260409020600e81015460ff16156116f65750600292915050565b8060070154421161170a5750600092915050565b8060080154421161171e5750600192915050565b80600b015481600a015411158061173c575080600f015481600d0154105b1561174a5750600392915050565b806002015460000361175f5750600492915050565b600e810154610100900460ff161561177a5750600792915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c1a287e26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180b9190614efc565b816002015461181a919061515a565b42106118295750600692915050565b50600592915050565b50919050565b600061184382611632565b9050600781600781111561185957611859614a44565b036118e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f476f7665726e6f7241706f6c6c6f3a3a63616e63656c3a2063616e6e6f74206360448201527f616e63656c2065786563757465642070726f706f73616c0000000000000000006064820152608401610943565b60008281526011602052604090206004546001808301546119299173ffffffffffffffffffffffffffffffffffffffff90911690611924904361516d565b613e63565b106119b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f476f7665726e6f7241706f6c6c6f3a3a63616e63656c3a2070726f706f73657260448201527f2061626f7665207468726573686f6c64000000000000000000000000000000006064820152608401610943565b600e810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560005b6003820154811015611b175760085460038301805473ffffffffffffffffffffffffffffffffffffffff9092169163591fcdfe919084908110611a2b57611a2b614f37565b60009182526020909120015460048501805473ffffffffffffffffffffffffffffffffffffffff9092169185908110611a6657611a66614f37565b9060005260206000200154856005018581548110611a8657611a86614f37565b90600052602060002001866006018681548110611aa557611aa5614f37565b9060005260206000200187600201546040518663ffffffff1660e01b8152600401611ad495949392919061521b565b600060405180830381600087803b158015611aee57600080fd5b505af1158015611b02573d6000803e3d6000fd5b5050505080611b109061506c565b90506119e6565b506040518381527f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90602001610bfc565b60085473ffffffffffffffffffffffffffffffffffffffff163314611bc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6f6e6c792074696d656c6f636b000000000000000000000000000000000000006044820152606401610943565b600580549082905560408051828152602081018490527fb01232ed22dbb40f1dfb4eb71b12bfd12a322ee2ceeeaa85fffbad30771d64ab9101610f1b565b610c06338383613a9f565b60085473ffffffffffffffffffffffffffffffffffffffff163314611cb9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f72656d6f7665477561726469616e60448201527f733a2073656e646572206d757374206265207468652074696d656c6f636b00006064820152608401610943565b601054421015611d4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f72656d6f7665477561726469616e60448201527f732063616e6e6f742072656d6f7665206265666f72652073756e7365740000006064820152608401610943565b600d80547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116909155600e80549091169055565b600d5473ffffffffffffffffffffffffffffffffffffffff163314611e28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f627265616b676c6173733a20736560448201527f6e646572206d75737420626520626720677561726469616e00000000000000006064820152608401610943565b8060005b81811015610dcd5760085473ffffffffffffffffffffffffffffffffffffffff1663ae2ba3c4858584818110611e6457611e64614f37565b9050602002016020810190611e7991906147e5565b600f546040805173ffffffffffffffffffffffffffffffffffffffff9092166020830152600091016040516020818303038152906040526040518463ffffffff1660e01b8152600401611ece93929190615275565b6000604051808303816000875af1158015611eed573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611f339190810190614fcf565b50611f3d8161506c565b9050611e2c565b60085473ffffffffffffffffffffffffffffffffffffffff163314611fc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6f6e6c792074696d656c6f636b000000000000000000000000000000000000006044820152606401610943565b600680549082905560408051828152602081018490527fbf1c009bdea70c22e4944ae8ac92b5f100449ab6f2fdedd0f7c991d3a6e29d259101610f1b565b600d5473ffffffffffffffffffffffffffffffffffffffff1633146120aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f627265616b676c6173733a20736560448201527f6e646572206d75737420626520626720677561726469616e00000000000000006064820152608401610943565b8060005b81811015610dcd5760085473ffffffffffffffffffffffffffffffffffffffff1663ae2ba3c48585848181106120e6576120e6614f37565b90506020020160208101906120fb91906147e5565b600f546040805173ffffffffffffffffffffffffffffffffffffffff9092166020830152600091016040516020818303038152906040526040518463ffffffff1660e01b8152600401612150939291906152de565b6000604051808303816000875af115801561216f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526121b59190810190614fcf565b506121bf8161506c565b90506120ae565b600d5473ffffffffffffffffffffffffffffffffffffffff16331461226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f61636365707441646d696e3a207360448201527f656e646572206d75737420626520626720677561726469616e000000000000006064820152608401610943565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e18b6816040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156122d757600080fd5b505af1158015610dcd573d6000803e3d6000fd5b600d5473ffffffffffffffffffffffffffffffffffffffff163314612392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f627265616b676c6173733a20736560448201527f6e646572206d75737420626520626720677561726469616e00000000000000006064820152608401610943565b8060005b81811015610dcd5760085473ffffffffffffffffffffffffffffffffffffffff1663ae2ba3c48585848181106123ce576123ce614f37565b90506020020160208101906123e391906147e5565b600f546040805173ffffffffffffffffffffffffffffffffffffffff9092166020830152600091016040516020818303038152906040526040518463ffffffff1660e01b815260040161243893929190615347565b6000604051808303816000875af1158015612457573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261249d9190810190614fcf565b506124a78161506c565b9050612396565b600d5473ffffffffffffffffffffffffffffffffffffffff163314612555576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f627265616b676c6173733a20736560448201527f6e646572206d75737420626520626720677561726469616e00000000000000006064820152608401610943565b8060005b81811015610dcd5760085473ffffffffffffffffffffffffffffffffffffffff1663ae2ba3c485858481811061259157612591614f37565b90506020020160208101906125a691906147e5565b600f546040805173ffffffffffffffffffffffffffffffffffffffff9092166020830152600091016040516020818303038152906040526040518463ffffffff1660e01b81526004016125fb939291906153b0565b6000604051808303816000875af115801561261a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526126609190810190614fcf565b5061266a8161506c565b9050612559565b60008054600354829061268590600161515a565b90505b600c5481101561183257600061269d82611632565b905060008160078111156126b3576126b3614a44565b14806126d0575060018160078111156126ce576126ce614a44565b145b156126db5750612729565b6000828152601160205260409020601081015460ff1661272657600282600781111561270957612709614a44565b03612715575050612729565b6127238482600d0154614073565b93505b50505b6127328161506c565b9050612688565b600d5473ffffffffffffffffffffffffffffffffffffffff1633146127ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6f6e6c7920627265616b20676c61737320677561726469616e000000000000006044820152606401610943565b600d805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f19be0cefd4235c57b29c828297a3e160306f359677ce5dc07f5b4f546fc29de69101610f1b565b600d5473ffffffffffffffffffffffffffffffffffffffff163314612906576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605260248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f65786563757465436f6d706f756e60448201527f6441636365707441646d696e4f6e436f6e74726163743a2073656e646572206d60648201527f75737420626520626720677561726469616e0000000000000000000000000000608482015260a401610943565b8060005b81811015610dcd5760085473ffffffffffffffffffffffffffffffffffffffff1663ae2ba3c485858481811061294257612942614f37565b905060200201602081019061295791906147e5565b60408051600080825260208201928390527fffffffff0000000000000000000000000000000000000000000000000000000060e086901b169092526129a192919060248101615419565b6000604051808303816000875af11580156129c0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612a069190810190614fcf565b50612a108161506c565b905061290a565b600454600090612a2c3361192460014361516d565b11612abb57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f476f7665726e6f7241706f6c6c6f3a3a70726f706f73653a2070726f706f736560448201527f7220766f7465732062656c6f772070726f706f73616c207468726573686f6c646064820152608401610943565b84518651148015612acd575083518651145b8015612ada575082518651145b612b8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f476f7665726e6f7241706f6c6c6f3a3a70726f706f73653a2070726f706f736160448201527f6c2066756e6374696f6e20696e666f726d6174696f6e206172697479206d697360648201527f6d61746368000000000000000000000000000000000000000000000000000000608482015260a401610943565b8551600003612c1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f476f7665726e6f7241706f6c6c6f3a3a70726f706f73653a206d75737420707260448201527f6f7669646520616374696f6e73000000000000000000000000000000000000006064820152608401610943565b60055486511115612cb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f476f7665726e6f7241706f6c6c6f3a3a70726f706f73653a20746f6f206d616e60448201527f7920616374696f6e7300000000000000000000000000000000000000000000006064820152608401610943565b6000825111612d1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6465736372697074696f6e2063616e206e6f7420626520656d707479000000006044820152606401610943565b336000908152601260205260409020548015612ece576000612d3c82611632565b90506001816007811115612d5257612d52614a44565b03612e05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605960248201527f476f7665726e6f7241706f6c6c6f3a3a70726f706f73653a206f6e65206c697660448201527f652070726f706f73616c207065722070726f706f7365722c20666f756e64206160648201527f6e20616c7265616479206163746976652070726f706f73616c00000000000000608482015260a401610943565b6000816007811115612e1957612e19614a44565b03612ecc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605a60248201527f476f7665726e6f7241706f6c6c6f3a3a70726f706f73653a206f6e65206c697660448201527f652070726f706f73616c207065722070726f706f7365722c20666f756e64206160648201527f6e20616c72656164792070656e64696e672070726f706f73616c000000000000608482015260a401610943565b505b600060065442612ede919061515a565b9050600060065460075442612ef3919061515a565b612efd919061515a565b9050600c60008154612f0e9061506c565b90915550612f1a6140ef565b600c5460008181526011602090815260409091209182556001820180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790558a51612f71916003840191908d0190614459565b508851612f8790600483019060208c01906144e3565b508751612f9d90600583019060208b019061451e565b508651612fb390600683019060208a0190614570565b5082816007018190555081816008018190555060005481600f0181905550600c54601260008360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507fb822896d940636d634030a124c95006ad3a3008e5734f511df0d5c418b20c9d08160000154338c8c8c8c89898e6000546040516130829a99989796959493929190615482565b60405180910390a1549998505050505050505050565b600d5473ffffffffffffffffffffffffffffffffffffffff163314613165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f476f7665726e6f7241706f6c6c6f3a3a5f5f657865637574654163636570744160448201527f646d696e4f6e436f6e74726163743a2073656e646572206d757374206265206260648201527f6720677561726469616e00000000000000000000000000000000000000000000608482015260a401610943565b8060005b81811015610dcd5760085473ffffffffffffffffffffffffffffffffffffffff1663ae2ba3c48585848181106131a1576131a1614f37565b90506020020160208101906131b691906147e5565b60408051600080825260208201928390527fffffffff0000000000000000000000000000000000000000000000000000000060e086901b169092526132009291906024810161552e565b6000604051808303816000875af115801561321f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526132659190810190614fcf565b5061326f8161506c565b9050613169565b600461328182611632565b600781111561329257613292614a44565b14613345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f476f7665726e6f7241706f6c6c6f3a3a71756575653a2070726f706f73616c2060448201527f63616e206f6e6c7920626520717565756564206966206974206973207375636360648201527f6565646564000000000000000000000000000000000000000000000000000000608482015260a401610943565b600081815260116020908152604080832060085482517f6a42b8f8000000000000000000000000000000000000000000000000000000008152925191949373ffffffffffffffffffffffffffffffffffffffff90911692636a42b8f892600480830193928290030181865afa1580156133c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e69190614efc565b6133f0904261515a565b905060005b60038301548110156135c5576135b583600301828154811061341957613419614f37565b60009182526020909120015460048501805473ffffffffffffffffffffffffffffffffffffffff909216918490811061345457613454614f37565b906000526020600020015485600501848154811061347457613474614f37565b9060005260206000200180546134899061510d565b80601f01602080910402602001604051908101604052809291908181526020018280546134b59061510d565b80156135025780601f106134d757610100808354040283529160200191613502565b820191906000526020600020905b8154815290600101906020018083116134e557829003601f168201915b505050505086600601858154811061351c5761351c614f37565b9060005260206000200180546135319061510d565b80601f016020809104026020016040519081016040528092919081815260200182805461355d9061510d565b80156135aa5780601f1061357f576101008083540402835291602001916135aa565b820191906000526020600020905b81548152906001019060200180831161358d57829003601f168201915b50505050508661424d565b6135be8161506c565b90506133f5565b506002820181905560408051848152602081018390527f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28929101610bfc565b604080516060808201835260008083526020808401829052928401819052858152601180845284822073ffffffffffffffffffffffffffffffffffffffff8716835201835283902083519182018452805460ff808216151584526101009091041692820192909252600190910154918101919091525b92915050565b60085473ffffffffffffffffffffffffffffffffffffffff163314613700576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6f6e6c792074696d656c6f636b000000000000000000000000000000000000006044820152606401610943565b600780549082905560408051828152602081018490527f0157f874643e34dea2d71607bde6378f09880b59546f9e2386608eb7154b89759101610f1b565b60085473ffffffffffffffffffffffffffffffffffffffff1633146137bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6f6e6c792074696d656c6f636b000000000000000000000000000000000000006044820152606401610943565b600480549082905560408051828152602081018490527f9b772ef27711c872f217a0c52a72ba00d7552f2d6c3b3d0f0593fc2549359df39101610f1b565b600561380882611632565b600781111561381957613819614a44565b146138cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f476f7665726e6f7241706f6c6c6f3a3a657865637574653a2070726f706f736160448201527f6c2063616e206f6e6c792062652065786563757465642069662069742069732060648201527f7175657565640000000000000000000000000000000000000000000000000000608482015260a401610943565b6000818152601160205260408120600e810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055905b6003820154811015613a6e5760085460038301805473ffffffffffffffffffffffffffffffffffffffff90921691630825f38f91908490811061394f5761394f614f37565b60009182526020909120015460048501805473ffffffffffffffffffffffffffffffffffffffff909216918590811061398a5761398a614f37565b90600052602060002001548560050185815481106139aa576139aa614f37565b906000526020600020018660060186815481106139c9576139c9614f37565b9060005260206000200187600201546040518663ffffffff1660e01b81526004016139f895949392919061521b565b6000604051808303816000875af1158015613a17573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052613a5d9190810190614fcf565b50613a678161506c565b905061390a565b506040518281527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f90602001610f1b565b6001613aaa83611632565b6007811115613abb57613abb614a44565b14613b48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f476f7665726e6f7241706f6c6c6f3a3a5f63617374566f74653a20766f74696e60448201527f6720697320636c6f7365640000000000000000000000000000000000000000006064820152608401610943565b60008281526011602052604081206009810154909103613bab57613b6d60014361516d565b6009820155604080518481524360208201527f0d1e02ccd52fe49c19093261ba25ca959463e72ed10577de6069a95c14cd04ee910160405180910390a15b73ffffffffffffffffffffffffffffffffffffffff841660009081526011820160205260409020805460ff1615613c64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f476f7665726e6f7241706f6c6c6f3a3a5f63617374566f74653a20766f74657260448201527f20616c726561647920766f7465640000000000000000000000000000000000006064820152608401610943565b6000613c74868460090154613e63565b905060ff8416613c98578083600a0154613c8e919061515a565b600a840155613da8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff851601613cdc578083600b0154613cd2919061515a565b600b840155613da8565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe60ff851601613d20578083600c0154613d16919061515a565b600c840155613da8565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f476f7665726e6f7241706f6c6c6f3a3a5f63617374566f74653a20696e76616c60448201527f696420766f74652076616c7565000000000000000000000000000000000000006064820152608401610943565b8083600d0154613db8919061515a565b600d840155815460ff851661010081027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216919091176001908117845583018290556040805173ffffffffffffffffffffffffffffffffffffffff891681526020810188905290810191909152606081018290527f2c9deb38f462962eadbd85a9d3a4120503ee091f1582eaaa10aa8c6797651d299060800160405180910390a1505050505050565b6009546040517f782d6fe100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052600092839291169063782d6fe190604401602060405180830381865afa158015613ede573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f029190615597565b600a546040517f782d6fe100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790529293506000929091169063782d6fe190604401602060405180830381865afa158015613f7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fa39190614efc565b600b546040517f782d6fe100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152602482018890529293506000929091169063782d6fe190604401602060405180830381865afa158015614020573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140449190614efc565b90508061405f836bffffffffffffffffffffffff861661515a565b614069919061515a565b9695505050505050565b60008060646140838560506155c5565b61408d91906155dc565b90506000606461409e8560146155c5565b6140a891906155dc565b905060006140b6828461515a565b90506001548111156140cf576001549350505050613679565b6002548110156140e6576002549350505050613679565b95945050505050565b60008054600354909161410382600161515a565b90505b600c548110156141fb57600061411b82611632565b9050600081600781111561413157614131614a44565b148061414e5750600181600781111561414c5761414c614a44565b145b1561415957506141eb565b600082815260116020526040902061417284600161515a565b81540361417e57805493505b601081015460ff166141e8576010810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560028260078111156141cb576141cb614a44565b036141d75750506141eb565b6141e58582600d0154614073565b94505b50505b6141f48161506c565b9050614106565b5060005482146142425760005460408051918252602082018490527f881e29202a36aa27b2e7dbd1086b0679e9212ac38029ba9959623b58d66a56b2910160405180910390a15b600091909155600355565b60085460405173ffffffffffffffffffffffffffffffffffffffff9091169063f2b06537906142889088908890889088908890602001615617565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004016142bc91815260200190565b602060405180830381865afa1580156142d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142fd9190614f15565b156143b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f476f7665726e6f7241706f6c6c6f3a3a5f71756575654f725265766572743a2060448201527f70726f706f73616c20616374696f6e20616c726561647920717565756564206160648201527f7420657461000000000000000000000000000000000000000000000000000000608482015260a401610943565b6008546040517f3a66f90100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633a66f9019061440e9088908890889088908890600401615617565b6020604051808303816000875af115801561442d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144519190614efc565b505050505050565b8280548282559060005260206000209081019282156144d3579160200282015b828111156144d357825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190614479565b506144df9291506145c2565b5090565b8280548282559060005260206000209081019282156144d3579160200282015b828111156144d3578251825591602001919060010190614503565b828054828255906000526020600020908101928215614564579160200282015b82811115614564578251829061455490826156a9565b509160200191906001019061453e565b506144df9291506145d7565b8280548282559060005260206000209081019282156145b6579160200282015b828111156145b657825182906145a690826156a9565b5091602001919060010190614590565b506144df9291506145f4565b5b808211156144df57600081556001016145c3565b808211156144df5760006145eb8282614611565b506001016145d7565b808211156144df5760006146088282614611565b506001016145f4565b50805461461d9061510d565b6000825580601f1061462d575050565b601f01602090049060005260206000209081019061464b91906145c2565b50565b60006020828403121561466057600080fd5b5035919050565b60006101c0820190508f825273ffffffffffffffffffffffffffffffffffffffff8f1660208301528d60408301528c60608301528b60808301528a60a08301528960c08301528860e083015287610100830152866101208301528515156101408301526146d961016083018615159052565b836101808301526146ef6101a083018415159052565b9f9e505050505050505050505050505050565b60005b8381101561471d578181015183820152602001614705565b50506000910152565b6000815180845261473e816020860160208601614702565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006147836020830184614726565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461464b57600080fd5b600080604083850312156147bf57600080fd5b82356147ca8161478a565b915060208301356147da8161478a565b809150509250929050565b6000602082840312156147f757600080fd5b81356147838161478a565b6000806040838503121561481557600080fd5b50508035926020909101359150565b60008083601f84011261483657600080fd5b50813567ffffffffffffffff81111561484e57600080fd5b6020830191508360208260051b850101111561486957600080fd5b9250929050565b6000806020838503121561488357600080fd5b823567ffffffffffffffff81111561489a57600080fd5b6148a685828601614824565b90969095509350505050565b600081518084526020808501945080840160005b838110156148f857815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016148c6565b509495945050505050565b600081518084526020808501945080840160005b838110156148f857815187529582019590820190600101614917565b600081518084526020808501808196508360051b8101915082860160005b8581101561497b578284038952614969848351614726565b98850198935090840190600101614951565b5091979650505050505050565b60808152600061499b60808301876148b2565b82810360208401526149ad8187614903565b905082810360408401526149c18186614933565b905082810360608401526149d58185614933565b979650505050505050565b803560ff811681146149f157600080fd5b919050565b600080600080600060a08688031215614a0e57600080fd5b85359450614a1e602087016149e0565b9350614a2c604087016149e0565b94979396509394606081013594506080013592915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160088310614aae577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060408385031215614ac757600080fd5b82359150614ad7602084016149e0565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614b5657614b56614ae0565b604052919050565b600067ffffffffffffffff821115614b7857614b78614ae0565b5060051b60200190565b600082601f830112614b9357600080fd5b81356020614ba8614ba383614b5e565b614b0f565b82815260059290921b84018101918181019086841115614bc757600080fd5b8286015b84811015614beb578035614bde8161478a565b8352918301918301614bcb565b509695505050505050565b600082601f830112614c0757600080fd5b81356020614c17614ba383614b5e565b82815260059290921b84018101918181019086841115614c3657600080fd5b8286015b84811015614beb5780358352918301918301614c3a565b600067ffffffffffffffff821115614c6b57614c6b614ae0565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b6000614ca5614ba384614c51565b9050828152838383011115614cb957600080fd5b828260208301376000602084830101529392505050565b600082601f830112614ce157600080fd5b61478383833560208501614c97565b600082601f830112614d0157600080fd5b81356020614d11614ba383614b5e565b82815260059290921b84018101918181019086841115614d3057600080fd5b8286015b84811015614beb57803567ffffffffffffffff811115614d545760008081fd5b614d628986838b0101614cd0565b845250918301918301614d34565b600082601f830112614d8157600080fd5b81356020614d91614ba383614b5e565b82815260059290921b84018101918181019086841115614db057600080fd5b8286015b84811015614beb57803567ffffffffffffffff811115614dd45760008081fd5b8701603f81018913614de65760008081fd5b614df7898683013560408401614c97565b845250918301918301614db4565b600080600080600060a08688031215614e1d57600080fd5b853567ffffffffffffffff80821115614e3557600080fd5b614e4189838a01614b82565b96506020880135915080821115614e5757600080fd5b614e6389838a01614bf6565b95506040880135915080821115614e7957600080fd5b614e8589838a01614cf0565b94506060880135915080821115614e9b57600080fd5b614ea789838a01614d70565b93506080880135915080821115614ebd57600080fd5b50614eca88828901614cd0565b9150509295509295909350565b60008060408385031215614eea57600080fd5b8235915060208301356147da8161478a565b600060208284031215614f0e57600080fd5b5051919050565b600060208284031215614f2757600080fd5b8151801515811461478357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8416815282602082015260806040820152601960808201527f5f73657450656e64696e6741646d696e2861646472657373290000000000000060a082015260c0606082015260006140e660c0830184614726565b600060208284031215614fe157600080fd5b815167ffffffffffffffff811115614ff857600080fd5b8201601f8101841361500957600080fd5b8051615017614ba382614c51565b81815285602083850101111561502c57600080fd5b6140e6826020830160208601614702565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361509d5761509d61503d565b5060010190565b73ffffffffffffffffffffffffffffffffffffffff8416815282602082015260806040820152601c60808201527f736574456d697373696f6e734d616e616765722861646472657373290000000060a082015260c0606082015260006140e660c0830184614726565b600181811c9082168061512157607f821691505b602082108103611832577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b808201808211156136795761367961503d565b818103818111156136795761367961503d565b6000815461518d8161510d565b8085526020600183811680156151aa57600181146151e257615210565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838901528284151560051b8901019550615210565b866000528260002060005b858110156152085781548a82018601529083019084016151ed565b890184019650505b505050505092915050565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015260a06040820152600061525060a0830186615180565b82810360608401526152628186615180565b9150508260808301529695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8416815282602082015260806040820152601160808201527f73657441646d696e28616464726573732900000000000000000000000000000060a082015260c0606082015260006140e660c0830184614726565b73ffffffffffffffffffffffffffffffffffffffff8416815282602082015260806040820152601460808201527f6368616e676541646d696e28616464726573732900000000000000000000000060a082015260c0606082015260006140e660c0830184614726565b73ffffffffffffffffffffffffffffffffffffffff8416815282602082015260806040820152601860808201527f73657450656e64696e6741646d696e286164647265737329000000000000000060a082015260c0606082015260006140e660c0830184614726565b73ffffffffffffffffffffffffffffffffffffffff8416815282602082015260806040820152601a60808201527f7472616e736665724f776e65727368697028616464726573732900000000000060a082015260c0606082015260006140e660c0830184614726565b73ffffffffffffffffffffffffffffffffffffffff8416815282602082015260806040820152600e60808201527f5f61636365707441646d696e282900000000000000000000000000000000000060a082015260c0606082015260006140e660c0830184614726565b60006101408c835273ffffffffffffffffffffffffffffffffffffffff8c1660208401528060408401526154b88184018c6148b2565b905082810360608401526154cc818b614903565b905082810360808401526154e0818a614933565b905082810360a08401526154f48189614933565b90508660c08401528560e08401528281036101008401526155158186614726565b915050826101208301529b9a5050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8416815282602082015260806040820152601460808201527f61636365707450656e64696e6741646d696e282900000000000000000000000060a082015260c0606082015260006140e660c0830184614726565b6000602082840312156155a957600080fd5b81516bffffffffffffffffffffffff8116811461478357600080fd5b80820281158282048414176136795761367961503d565b600082615612577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015260a06040820152600061564c60a0830186614726565b82810360608401526152628186614726565b601f8211156156a457600081815260208120601f850160051c810160208610156156855750805b601f850160051c820191505b8181101561445157828155600101615691565b505050565b815167ffffffffffffffff8111156156c3576156c3614ae0565b6156d7816156d1845461510d565b8461565e565b602080601f83116001811461572a57600084156156f45750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614451565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561577757888601518255948401946001909101908401615758565b50858210156157b357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fea2646970667358221220f3a486f5d08a266e30525bd1c6bdb29eecee5927508041b417c6f82ff30bb76564736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000004e6322d196e0e4ccbb2610dd8b8f2871e160bd7000000000000000000000000bb8d88bcd9749636bc4d2be22aac4bb3b01a58f10000000000000000000000008568a675384d761f36ec269d695d6ce4423cfab1000000000000000000000000cd76e63f3abfa864c53b4b98f57c1aa6539fda3a000000000000000000000000ddbf679d6332d9e5b409865b9671d1927255b52a000000000000000000000000017efffd8abea3b1891f81e7c0e5166458b3584d000000000000000000000000017efffd8abea3b1891f81e7c0e5166458b3584d000000000000000000000000000000000000000000000000000000006434e177000000000000000000000000000000000000000000108b2a2c28029094000000000000000000000000000000000000000000000000084595161401484a000000000000000000000000000000000000000000000002e87669c308736a04000000
-----Decoded View---------------
Arg [0] : timelock_ (address): 0x04e6322D196E0E4cCBb2610dd8B8f2871E160bd7
Arg [1] : govToken_ (address): 0xBb8d88bcD9749636BC4D2bE22aaC4Bb3B01A58F1
Arg [2] : distributor_ (address): 0x8568A675384d761f36eC269D695d6Ce4423cfaB1
Arg [3] : safetyModule_ (address): 0xCd76e63f3AbFA864c53b4B98F57c1aA6539FDa3a
Arg [4] : breakGlassGuardian_ (address): 0xdDbf679d6332d9E5b409865b9671d1927255B52A
Arg [5] : governanceReturnAddress_ (address): 0x017eFfFd8ABea3B1891f81e7c0E5166458B3584D
Arg [6] : governanceReturnGuardian_ (address): 0x017eFfFd8ABea3B1891f81e7c0E5166458B3584D
Arg [7] : guardianSunset_ (uint256): 1681187191
Arg [8] : currentQuorum_ (uint256): 20000000000000000000000000
Arg [9] : lowerQuorumCap_ (uint256): 10000000000000000000000000
Arg [10] : upperQuorumCap_ (uint256): 900000000000000000000000000
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 00000000000000000000000004e6322d196e0e4ccbb2610dd8b8f2871e160bd7
Arg [1] : 000000000000000000000000bb8d88bcd9749636bc4d2be22aac4bb3b01a58f1
Arg [2] : 0000000000000000000000008568a675384d761f36ec269d695d6ce4423cfab1
Arg [3] : 000000000000000000000000cd76e63f3abfa864c53b4b98f57c1aa6539fda3a
Arg [4] : 000000000000000000000000ddbf679d6332d9e5b409865b9671d1927255b52a
Arg [5] : 000000000000000000000000017efffd8abea3b1891f81e7c0e5166458b3584d
Arg [6] : 000000000000000000000000017efffd8abea3b1891f81e7c0e5166458b3584d
Arg [7] : 000000000000000000000000000000000000000000000000000000006434e177
Arg [8] : 000000000000000000000000000000000000000000108b2a2c28029094000000
Arg [9] : 000000000000000000000000000000000000000000084595161401484a000000
Arg [10] : 000000000000000000000000000000000000000002e87669c308736a04000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 24 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.