Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- GovernorPACT
- Optimization enabled
- true
- Compiler version
- v0.6.12+commit.27d51765
- Optimization runs
- 200
- EVM Version
- istanbul
- Verified at
- 2026-04-22T10:13:08.844389Z
Constructor Arguments
00000000000000000000000066e7ce35578a37209d01f99f3d2ff271f981f581000000000000000000000000000000000000000000000000000000000000000f
Arg [0] (address) : 0x66e7ce35578a37209d01f99f3d2ff271f981f581
Arg [1] (uint256) : 15
/app/contracts/GovernorPACT.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
import "./vendors/contracts/AbstractGovernor.sol";
import "./vendors/contracts/access/GovernanceOwnable.sol";
import "./vendors/libraries/SafeMath.sol";
contract GovernorPACT is AbstractGovernor, GovernanceOwnable {
enum VotingSettingsKeys {
DefaultPropose,
FastPropose,
MultiExecutable
}
// etherium - block_generation_frequency_ ~ 15s
// binance smart chain - block_generation_frequency_ ~ 4s
constructor(
address pact_,
uint256 block_generation_frequency_
) AbstractGovernor("Governor PACT", pact_) GovernanceOwnable(address(this)) public {
_addAllowedTarget(address(this));
_addAllowedTarget(pact_);
_setVotingSettings(
uint(VotingSettingsKeys.DefaultPropose), // votingSettingsId
SafeMath.div(3 days, block_generation_frequency_),// votingPeriod
SafeMath.div(15 days, block_generation_frequency_),// expirationPeriod
10,// proposalMaxOperations
25,// quorumVotesDelimiter 4% of total PACTs
100// proposalThresholdDelimiter 1% of total PACTs
);
_setVotingSettings(
uint(VotingSettingsKeys.FastPropose), // votingSettingsId
SafeMath.div(1 hours, block_generation_frequency_),// votingPeriod
SafeMath.div(2 hours, block_generation_frequency_),// expirationPeriod
40,// proposalMaxOperations
5,// quorumVotesDelimiter 20% of total PACTs
20// proposalThresholdDelimiter 5% of total PACTs
);
_setVotingSettings(
uint(VotingSettingsKeys.MultiExecutable), // votingSettingsId
SafeMath.div(1 hours, block_generation_frequency_),// votingPeriod
SafeMath.div(365 days, block_generation_frequency_),// expirationPeriod
2,// proposalMaxOperations
5,// quorumVotesDelimiter 20% of total PACTs
20// proposalThresholdDelimiter 5% of total PACTs
);
}
function createDefaultPropose(
address[] memory targets,
uint[] memory values,
string[] memory signatures,
bytes[] memory calldatas,
string memory description
) public returns (uint) {
for (uint i = 0; i < targets.length; i++) {
require(allowedTargets[targets[i]], "GovernorPACT::createFastPropose: targets - supports only allowedTargets");
}
return _propose(
uint(VotingSettingsKeys.DefaultPropose),
targets,
values,
signatures,
calldatas,
description,
false
);
}
function createFastPropose(
address[] memory targets,
uint[] memory values,
string[] memory signatures,
bytes[] memory calldatas,
string memory description
) public returns (uint) {
for (uint i = 0; i < targets.length; i++) {
require(allowedTargets[targets[i]], "GovernorPACT::createFastPropose: targets - supports only allowedTargets");
}
return _propose(
uint(VotingSettingsKeys.FastPropose),
targets,
values,
signatures,
calldatas,
description,
false
);
}
function createMultiExecutablePropose(
address[] memory targets,
uint[] memory values,
string[] memory signatures,
bytes[] memory calldatas,
string memory description
) public returns (uint) {
for (uint i = 0; i < targets.length; i++) {
require(allowedTargets[targets[i]], "GovernorPACT::createMultiExecutablePropose: targets - supports only allowedTargets");
}
return _propose(
uint(VotingSettingsKeys.MultiExecutable),
targets,
values,
signatures,
calldatas,
description,
true
);
}
address[] internal allowedTargetsList;
mapping (address => bool) public allowedTargets;
function addAllowedTarget(address target) public onlyGovernance {
_addAllowedTarget(target);
}
function _addAllowedTarget(address target) internal {
if (allowedTargets[target] == false) {
allowedTargets[target] = true;
allowedTargetsList.push(target);
}
}
function getAllowedTargets() public view returns(address[] memory) {
return allowedTargetsList;
}
}
/IERC20WithMaxTotalSupply.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
import "./IERC20.sol";
interface IERC20WithMaxTotalSupply is IERC20 {
event Transfer(address indexed from, address indexed to, uint tokens);
event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
event Mint(address indexed account, uint tokens);
event Burn(address indexed account, uint tokens);
function maxTotalSupply() external view returns (uint);
}
/IGovernanceOwnable.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IGovernanceOwnable {
event GovernanceSetTransferred(address indexed previousGovernance, address indexed newGovernance);
function governance() external view returns (address);
function setGovernance(address newGovernance) external;
}
/IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address tokenOwner) external view returns (uint balance);
function allowance(address tokenOwner, address spender) external view returns (uint remaining);
function approve(address spender, uint tokens) external returns (bool success);
function transfer(address to, uint tokens) external returns (bool success);
function transferFrom(address from, address to, uint tokens) external returns (bool success);
event Transfer(address indexed from, address indexed to, uint tokens);
event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}
/utils/Context.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
// Copied from OpenZeppelin code:
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
/SafeMath.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return add(a, b, "SafeMath: Add Overflow");
}
function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, errorMessage);// "SafeMath: Add Overflow"
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: Underflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;// "SafeMath: Underflow"
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return mul(a, b, "SafeMath: Mul Overflow");
}
function mul(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, errorMessage);// "SafeMath: Mul Overflow"
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b != 0, "SafeMath: division by zero");
uint256 c = a / b;
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b != 0, "SafeMath: modulo by zero");
return a % b;
}
}
/IDelegableERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
import "./IDelegable.sol";
import "./IERC20WithMaxTotalSupply.sol";
interface IDelegableERC20 is IDelegable, IERC20WithMaxTotalSupply {}
/IDelegable.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IDelegable {
function delegate(address delegatee) external;
function delegateBySig(address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s) external;
function getCurrentVotes(address account) external view returns (uint256);
function getPriorVotes(address account, uint blockNumber) external view returns (uint256);
event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);
event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);
}
/access/GovernanceOwnable.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
import "../../interfaces/IGovernanceOwnable.sol";
abstract contract GovernanceOwnable is IGovernanceOwnable {
address private _governanceAddress;
event GovernanceSetTransferred(address indexed previousGovernance, address indexed newGovernance);
constructor (address governance_) public {
require(governance_ != address(0), "Governance address should be not null");
_governanceAddress = governance_;
emit GovernanceSetTransferred(address(0), governance_);
}
/**
* @dev Returns the address of the current governanceAddress.
*/
function governance() public view override returns (address) {
return _governanceAddress;
}
/**
* @dev Throws if called by any account other than the governanceAddress.
*/
modifier onlyGovernance() {
require(_governanceAddress == msg.sender, "Governance: caller is not the governance");
_;
}
/**
* @dev SetGovernance of the contract to a new account (`newGovernance`).
* Can only be called by the current onlyGovernance.
*/
function setGovernance(address newGovernance) public virtual override onlyGovernance {
require(newGovernance != address(0), "GovernanceOwnable: new governance is the zero address");
emit GovernanceSetTransferred(_governanceAddress, newGovernance);
_governanceAddress = newGovernance;
}
}
/AbstractGovernor.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
import "../interfaces/IDelegableERC20.sol";
import "./utils/Context.sol";
import "../libraries/SafeMath.sol";
// Copied and modified from Compound code:
// https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/GovernorAlpha.sol
abstract contract AbstractGovernor is Context {
using SafeMath for uint256;
string _name;
IDelegableERC20 public _token;
constructor(
string memory name_,
address token_
) public {
_name = name_;
_token = IDelegableERC20(token_);
}
function name() public view returns (string memory) {
return _name;
}
/// @notice all VotingSettings
mapping (uint => VotingSettings) public _votingSettings;
/// @notice votingPeriod - The duration of voting on a proposal, in blocks
/// @notice expirationPeriod - The duration of execution on a proposal after voting, in blocks
/// @notice proposalMaxOperations - The maximum number of actions that can be included in a proposal
/// @notice quorumVotesDelimiter - Number for calculate count of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed
/// @notice proposalThresholdDelimiter - Number for calculate count of votes required in order for a voter to become a proposer
struct VotingSettings {
bool isValue;
uint256 votingPeriod;
uint256 expirationPeriod;
uint256 proposalMaxOperations;
uint256 quorumVotesDelimiter;
uint256 proposalThresholdDelimiter;
}
/// @notice The number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed
function quorumVotes(uint256 votingSettingsId) public view returns (uint) {
VotingSettings storage votingSettings = _votingSettings[votingSettingsId];
require(votingSettings.isValue, "Governor::quorumVotes: incorrect votingSettingsId");
return _token.totalSupply() / votingSettings.quorumVotesDelimiter;
}
/// @notice The number of votes required in order for a voter to become a proposer
function proposalThreshold(uint256 votingSettingsId) public view returns (uint) {
VotingSettings storage votingSettings = _votingSettings[votingSettingsId];
require(votingSettings.isValue, "Governor::proposalThreshold: incorrect votingSettingsId");
return _token.totalSupply() / votingSettings.proposalThresholdDelimiter;
}
/// @notice The delay before voting on a proposal may take place, once proposed
function _setVotingSettings(
uint256 votingSettingsId,
uint256 votingPeriod,
uint256 expirationPeriod,
uint256 proposalMaxOperations,
uint256 quorumVotesDelimiter,
uint256 proposalThresholdDelimiter
) internal {
VotingSettings storage votingSettings = _votingSettings[votingSettingsId];
require(votingSettings.isValue == false, "Governor::setVotingSettings: incorrect votingSettingsId");
require(votingPeriod > 0, "Governor::setVotingSettings: shoud be more then 0");
require(expirationPeriod > 0, "Governor::setVotingSettings: shoud be more then 0");
require(proposalMaxOperations > 0, "Governor::setVotingSettings: shoud be more then 0");
require(quorumVotesDelimiter > 0, "Governor::setVotingSettings: shoud be more then 0");
require(proposalThresholdDelimiter > 0, "Governor::setVotingSettings: shoud be more then 0");
VotingSettings memory newVotingSettings = VotingSettings({
isValue: true,
votingPeriod: votingPeriod,
expirationPeriod: expirationPeriod,
proposalMaxOperations: proposalMaxOperations,
quorumVotesDelimiter: quorumVotesDelimiter,
proposalThresholdDelimiter: proposalThresholdDelimiter
});
_votingSettings[votingSettingsId] = newVotingSettings;
}
function getVotingSettings(uint256 votingSettingsId) public view returns (VotingSettings memory) {
return _votingSettings[votingSettingsId];
}
/// @notice The total number of proposals
uint public _proposalCount;
/// @notice id - Unique id for looking up a proposal
/// @notice proposer - Creator of the proposal
/// @notice targets - the ordered list of target addresses for calls to be made
/// @notice values - The ordered list of values (i.e. msg.value) to be passed to the calls to be made
/// @notice signatures - The ordered list of function signatures to be called
/// @notice calldatas - The ordered list of calldata to be passed to each call
/// @notice startBlock - The block at which voting begins: holders must delegate their votes prior to this block
/// @notice endBlock - The block at which voting ends: votes must be cast prior to this block
/// @notice expiredBlock - The block at which successful, but not executed transactions is expired
/// @notice forVotes - Current number of votes in favor of this proposal
/// @notice againstVotes - Current number of votes in opposition to this proposal
/// @notice canceled - Flag marking whether the proposal has been canceled
/// @notice executed - Flag marking whether the proposal has been executed
/// @notice receipts - Receipts of ballots for the entire set of voters
struct Proposal {
uint256 votingSettingsId;
uint id;
address proposer;
address[] targets;
uint[] values;
string[] signatures;
bytes[] calldatas;
uint startBlock;
uint endBlock;
uint expiredBlock;
uint forVotes;
uint againstVotes;
bool canceled;
bool executed;
mapping (address => Receipt) receipts;
bool isMultiExecutable;
}
/// @notice Ballot receipt record for a voter
/// @notice hasVoted - Whether or not a vote has been cast
/// @notice support - Whether or not the voter supports the proposal
/// @notice votes - The number of votes the voter had, which were cast
struct Receipt {
bool hasVoted;
bool support;
uint256 votes;
}
/// @notice Possible states that a proposal may be in
enum ProposalState {
Active,
Canceled,
Defeated,
Succeeded,
Expired,
Executed
}
/// @notice The official record of all proposals ever proposed
mapping (uint => Proposal) public _proposals;
/// @notice The official records of all proposals executions
mapping (uint => uint[]) public _proposalsExecutionBlocks;
/// @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,bool support)");
/// @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 startBlock, uint endBlock, string description);
/// @notice An event emitted when a vote has been cast on a proposal
event VoteCast(address voter, uint proposalId, bool support, 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 executed
event ProposalExecuted(uint id);
/// @notice An event emitted when a some proposals transaction has been executed
event ExecuteTransaction(address indexed target, uint value, string signature, bytes data);
/// @notice The delay before voting on a proposal may take place, once proposed
function _propose(
uint256 votingSettingsId,
address[] memory targets,
uint[] memory values,
string[] memory signatures,
bytes[] memory calldatas,
string memory description,
bool isMultiExecutable
) internal returns (uint) {
VotingSettings storage votingSettings = _votingSettings[votingSettingsId];
require(votingSettings.isValue, "Governor::propose: incorrect votingSettingsId");
require(
_token.getPriorVotes(
_msgSender(),
block.number.sub(1, "Governor::propose: block.number - Underflow")
) > proposalThreshold(votingSettingsId),
"Governor::propose: proposer votes below proposal threshold"
);
require(
targets.length == values.length && targets.length == signatures.length && targets.length == calldatas.length,
"Governor::propose: proposal function information arity mismatch"
);
require(
targets.length != 0,
"Governor::propose: must provide actions"
);
require(
targets.length <= votingSettings.proposalMaxOperations,
"Governor::propose: too many actions"
);
uint startBlock = block.number;
uint endBlock = startBlock.add(votingSettings.votingPeriod, "Governor::propose: endBlock - Add Overflow");
_proposalCount++;
Proposal memory newProposal = Proposal({
votingSettingsId: votingSettingsId,
id: _proposalCount,
proposer: _msgSender(),
targets: targets,
values: values,
signatures: signatures,
calldatas: calldatas,
startBlock: startBlock,
endBlock: endBlock,
expiredBlock: endBlock.add(votingSettings.expirationPeriod, "Governor::propose: expiredBlock - Add Overflow"),
//forVotes: _token.getPriorVotes(_msgSender(), 0),
forVotes: 0,
againstVotes: 0,
canceled: false,
executed: false,
isMultiExecutable: isMultiExecutable
});
_proposals[newProposal.id] = newProposal;
_latestProposalIds[newProposal.proposer] = newProposal.id;
_castVote(newProposal.proposer, newProposal.id, true);
emit ProposalCreated(newProposal.id, _msgSender(), targets, values, signatures, calldatas, startBlock, endBlock, description);
return newProposal.id;
}
function execute(uint proposalId) public payable {
require(
state(proposalId) == ProposalState.Succeeded,
"Governor::execute: proposal can only be executed if it is Succeeded"
);
Proposal storage proposal = _proposals[proposalId];
_proposalsExecutionBlocks[proposalId].push(block.number);
if (!proposal.isMultiExecutable) {
proposal.executed = true;
}
for (uint i = 0; i < proposal.targets.length; i++) {
_executeTransaction(
proposal.targets[i],
proposal.values[i],
proposal.signatures[i],
proposal.calldatas[i]
);
}
emit ProposalExecuted(proposalId);
}
function _executeTransaction(
address target,
uint value,
string memory signature,
bytes memory data
) internal returns (
bytes memory
) {
bytes memory callData;
if (bytes(signature).length == 0) {
callData = data;
} else {
callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data);
}
// solium-disable-next-line security/no-call-value
(bool success, bytes memory returnData) = target.call{value: value}(callData);
require(success, "Governor::_executeTransaction: Transaction execution reverted.");
emit ExecuteTransaction(target, value, signature, data);
return returnData;
}
function cancel(uint proposalId) public {
ProposalState state = state(proposalId);
require(state != ProposalState.Executed, "Governor::cancel: cannot cancel executed proposal");
Proposal storage proposal = _proposals[proposalId];
require(
_token.getPriorVotes(
proposal.proposer,
block.number.sub(1, "Governor::cancel: block.number - Underflow")
) < proposalThreshold(proposal.votingSettingsId),
"Governor::cancel: proposer above threshold"
);
proposal.canceled = true;
emit ProposalCanceled(proposalId);
}
function getActions(
uint proposalId
) public 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);
}
function getReceipt(uint proposalId, address voter) public view returns (Receipt memory) {
return _proposals[proposalId].receipts[voter];
}
function state(uint proposalId) public view returns (ProposalState) {
require(
_proposalCount >= proposalId && proposalId > 0,
"Governor::state: invalid proposal id"
);
Proposal storage proposal = _proposals[proposalId];
if (proposal.canceled) {
return ProposalState.Canceled;
} else if (proposal.executed) {
return ProposalState.Executed;
} else if (block.number <= proposal.endBlock) {
return ProposalState.Active;
} else if (proposal.forVotes <= proposal.againstVotes || proposal.forVotes < quorumVotes(proposal.votingSettingsId)) {
return ProposalState.Defeated;
} else if (block.number < proposal.expiredBlock) {
return ProposalState.Succeeded;
} else {
return ProposalState.Expired;
}
}
function castVote(uint proposalId, bool support) public {
return _castVote(_msgSender(), proposalId, support);
}
function castVoteBySig(uint proposalId, bool support, uint8 v, bytes32 r, bytes32 s) public {
bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(_name)), getChainId(), address(this)));
bytes32 structHash = keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support));
bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
address signatory = ecrecover(digest, v, r, s);
require(signatory != address(0), "Governor::castVoteBySig: invalid signature");
return _castVote(signatory, proposalId, support);
}
function _castVote(address voter, uint proposalId, bool support) internal {
require(state(proposalId) == ProposalState.Active, "Governor::_castVote: voting is closed");
Proposal storage proposal = _proposals[proposalId];
Receipt storage receipt = proposal.receipts[voter];
require(receipt.hasVoted == false, "Governor::_castVote: voter already voted");
uint256 votes = _token.getPriorVotes(voter, proposal.startBlock);
if (support) {
proposal.forVotes = proposal.forVotes.add(votes, "Governor::_castVote: votes - Add Overflow");
} else {
proposal.againstVotes = proposal.againstVotes.add(votes, "Governor::_castVote: votes - Add Overflow");
}
receipt.hasVoted = true;
receipt.support = support;
receipt.votes = votes;
emit VoteCast(voter, proposalId, support, votes);
}
function getChainId() internal pure returns (uint) {
uint chainId;
assembly { chainId := chainid() }
return chainId;
}
}
Compiler Settings
{"remappings":[],"optimizer":{"runs":200,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"istanbul","compilationTarget":{"/app/contracts/GovernorPACT.sol":"GovernorPACT"}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"pact_","internalType":"address"},{"type":"uint256","name":"block_generation_frequency_","internalType":"uint256"}]},{"type":"event","name":"ExecuteTransaction","inputs":[{"type":"address","name":"target","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false},{"type":"string","name":"signature","internalType":"string","indexed":false},{"type":"bytes","name":"data","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"GovernanceSetTransferred","inputs":[{"type":"address","name":"previousGovernance","internalType":"address","indexed":true},{"type":"address","name":"newGovernance","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"ProposalCanceled","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ProposalCreated","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false},{"type":"address","name":"proposer","internalType":"address","indexed":false},{"type":"address[]","name":"targets","internalType":"address[]","indexed":false},{"type":"uint256[]","name":"values","internalType":"uint256[]","indexed":false},{"type":"string[]","name":"signatures","internalType":"string[]","indexed":false},{"type":"bytes[]","name":"calldatas","internalType":"bytes[]","indexed":false},{"type":"uint256","name":"startBlock","internalType":"uint256","indexed":false},{"type":"uint256","name":"endBlock","internalType":"uint256","indexed":false},{"type":"string","name":"description","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"ProposalExecuted","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"VoteCast","inputs":[{"type":"address","name":"voter","internalType":"address","indexed":false},{"type":"uint256","name":"proposalId","internalType":"uint256","indexed":false},{"type":"bool","name":"support","internalType":"bool","indexed":false},{"type":"uint256","name":"votes","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"BALLOT_TYPEHASH","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DOMAIN_TYPEHASH","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_latestProposalIds","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_proposalCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"votingSettingsId","internalType":"uint256"},{"type":"uint256","name":"id","internalType":"uint256"},{"type":"address","name":"proposer","internalType":"address"},{"type":"uint256","name":"startBlock","internalType":"uint256"},{"type":"uint256","name":"endBlock","internalType":"uint256"},{"type":"uint256","name":"expiredBlock","internalType":"uint256"},{"type":"uint256","name":"forVotes","internalType":"uint256"},{"type":"uint256","name":"againstVotes","internalType":"uint256"},{"type":"bool","name":"canceled","internalType":"bool"},{"type":"bool","name":"executed","internalType":"bool"},{"type":"bool","name":"isMultiExecutable","internalType":"bool"}],"name":"_proposals","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_proposalsExecutionBlocks","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDelegableERC20"}],"name":"_token","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"isValue","internalType":"bool"},{"type":"uint256","name":"votingPeriod","internalType":"uint256"},{"type":"uint256","name":"expirationPeriod","internalType":"uint256"},{"type":"uint256","name":"proposalMaxOperations","internalType":"uint256"},{"type":"uint256","name":"quorumVotesDelimiter","internalType":"uint256"},{"type":"uint256","name":"proposalThresholdDelimiter","internalType":"uint256"}],"name":"_votingSettings","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addAllowedTarget","inputs":[{"type":"address","name":"target","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"allowedTargets","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cancel","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"castVote","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"},{"type":"bool","name":"support","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"castVoteBySig","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"},{"type":"bool","name":"support","internalType":"bool"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"createDefaultPropose","inputs":[{"type":"address[]","name":"targets","internalType":"address[]"},{"type":"uint256[]","name":"values","internalType":"uint256[]"},{"type":"string[]","name":"signatures","internalType":"string[]"},{"type":"bytes[]","name":"calldatas","internalType":"bytes[]"},{"type":"string","name":"description","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"createFastPropose","inputs":[{"type":"address[]","name":"targets","internalType":"address[]"},{"type":"uint256[]","name":"values","internalType":"uint256[]"},{"type":"string[]","name":"signatures","internalType":"string[]"},{"type":"bytes[]","name":"calldatas","internalType":"bytes[]"},{"type":"string","name":"description","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"createMultiExecutablePropose","inputs":[{"type":"address[]","name":"targets","internalType":"address[]"},{"type":"uint256[]","name":"values","internalType":"uint256[]"},{"type":"string[]","name":"signatures","internalType":"string[]"},{"type":"bytes[]","name":"calldatas","internalType":"bytes[]"},{"type":"string","name":"description","internalType":"string"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"execute","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"targets","internalType":"address[]"},{"type":"uint256[]","name":"values","internalType":"uint256[]"},{"type":"string[]","name":"signatures","internalType":"string[]"},{"type":"bytes[]","name":"calldatas","internalType":"bytes[]"}],"name":"getActions","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"address[]"}],"name":"getAllowedTargets","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct AbstractGovernor.Receipt","components":[{"type":"bool","name":"hasVoted","internalType":"bool"},{"type":"bool","name":"support","internalType":"bool"},{"type":"uint256","name":"votes","internalType":"uint256"}]}],"name":"getReceipt","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"},{"type":"address","name":"voter","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct AbstractGovernor.VotingSettings","components":[{"type":"bool","name":"isValue","internalType":"bool"},{"type":"uint256","name":"votingPeriod","internalType":"uint256"},{"type":"uint256","name":"expirationPeriod","internalType":"uint256"},{"type":"uint256","name":"proposalMaxOperations","internalType":"uint256"},{"type":"uint256","name":"quorumVotesDelimiter","internalType":"uint256"},{"type":"uint256","name":"proposalThresholdDelimiter","internalType":"uint256"}]}],"name":"getVotingSettings","inputs":[{"type":"uint256","name":"votingSettingsId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"governance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"proposalThreshold","inputs":[{"type":"uint256","name":"votingSettingsId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"quorumVotes","inputs":[{"type":"uint256","name":"votingSettingsId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setGovernance","inputs":[{"type":"address","name":"newGovernance","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"enum AbstractGovernor.ProposalState"}],"name":"state","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]}]
Contract Creation Code
0x60806040523480156200001157600080fd5b50604051620037a2380380620037a28339810160408190526200003491620004ed565b60408051808201909152600d8082526c11dbdd995c9b9bdc88141050d5609a1b6020830190815230929185916200006f916000919062000419565b50600180546001600160a01b0319166001600160a01b03928316179055821615159050620000ba5760405162461bcd60e51b8152600401620000b1906200060c565b60405180910390fd5b600780546001600160a01b0319166001600160a01b0383169081179091556040516000907ff5b58f4b82655edcd8644d0e54fd6d2d37321f54f4755e4e67fd6af851c43fec908290a3506200010f30620001f2565b6200011a82620001f2565b6200016060006200013a6203f480846200027c60201b620014e41760201c565b620001546213c680856200027c60201b620014e41760201c565b600a60196064620002b3565b620001a460016200017f610e10846200027c60201b620014e41760201c565b62000198611c20856200027c60201b620014e41760201c565b602860056014620002b3565b620001ea6002620001c3610e10846200027c60201b620014e41760201c565b620001de6301e13380856200027c60201b620014e41760201c565b600260056014620002b3565b505062000651565b6001600160a01b03811660009081526009602052604090205460ff1662000279576001600160a01b0381166000818152600960205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b03191690911790555b50565b6000816200029e5760405162461bcd60e51b8152600401620000b19062000584565b6000828481620002aa57fe5b04949350505050565b6000868152600260205260409020805460ff1615620002e65760405162461bcd60e51b8152600401620000b19062000527565b60008611620003095760405162461bcd60e51b8152600401620000b190620005bb565b600085116200032c5760405162461bcd60e51b8152600401620000b190620005bb565b600084116200034f5760405162461bcd60e51b8152600401620000b190620005bb565b60008311620003725760405162461bcd60e51b8152600401620000b190620005bb565b60008211620003955760405162461bcd60e51b8152600401620000b190620005bb565b6200039f6200049e565b50506040805160c08101825260018082526020808301988952828401978852606083019687526080830195865260a083019485526000998a52600290819052929098209051815460ff1916901515178155955196860196909655925194840194909455516003830155915160048201559051600590910155565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200045c57805160ff19168380011785556200048c565b828001600101855582156200048c579182015b828111156200048c5782518255916020019190600101906200046f565b506200049a929150620004d6565b5090565b6040518060c0016040528060001515815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b808211156200049a5760008155600101620004d7565b6000806040838503121562000500578182fd5b82516001600160a01b038116811462000517578283fd5b6020939093015192949293505050565b60208082526037908201527f476f7665726e6f723a3a736574566f74696e6753657474696e67733a20696e6360408201527f6f727265637420766f74696e6753657474696e67734964000000000000000000606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526031908201527f476f7665726e6f723a3a736574566f74696e6753657474696e67733a2073686f60408201527007564206265206d6f7265207468656e203607c1b606082015260800190565b60208082526025908201527f476f7665726e616e636520616464726573732073686f756c64206265206e6f74604082015264081b9d5b1b60da1b606082015260800190565b61314180620006616000396000f3fe60806040526004361061019c5760003560e01c80635d7fe398116100ec578063ccf0e6d81161008a578063e2c4abe811610064578063e2c4abe8146104e9578063ecd0c0c31461050b578063edd7456914610520578063fe0d94c1146105405761019c565b8063ccf0e6d814610487578063deaaa7cc146104a7578063e23a9a52146104bc5761019c565b806381e94e8d116100c657806381e94e8d146103e8578063ab033ea914610408578063b638571814610428578063b8fe8d5f1461045a5761019c565b80635d7fe398146103935780636f2904cc146103b35780637629a4ac146103c85761019c565b8063328dd98211610159578063409ae08911610133578063409ae0891461030457806340e58ee5146103315780634634c61f146103515780635aa6e675146103715761019c565b8063328dd9821461028757806333834ca4146102b75780633e4f49e6146102d75761019c565b806306fdde03146101a15780630a494840146101cc5780630f7b1f081461020357806315373e3d14610230578063182562b31461025257806320606b7014610272575b600080fd5b3480156101ad57600080fd5b506101b6610553565b6040516101c3919061279e565b60405180910390f35b3480156101d857600080fd5b506101ec6101e7366004612367565b6105e9565b6040516101c39b9a99989796959493929190612f53565b34801561020f57600080fd5b5061022361021e366004612367565b610653565b6040516101c39190612727565b34801561023c57600080fd5b5061025061024b3660046123c3565b610727565b005b34801561025e57600080fd5b5061025061026d366004612279565b61073d565b34801561027e57600080fd5b50610223610773565b34801561029357600080fd5b506102a76102a2366004612367565b610797565b6040516101c3949392919061269a565b3480156102c357600080fd5b506102236102d236600461229b565b610a26565b3480156102e357600080fd5b506102f76102f2366004612367565b610aab565b6040516101c3919061278a565b34801561031057600080fd5b5061032461031f366004612367565b610b84565b6040516101c39190612e4a565b34801561033d57600080fd5b5061025061034c366004612367565b610be7565b34801561035d57600080fd5b5061025061036c3660046123f2565b610d54565b34801561037d57600080fd5b50610386610ece565b6040516101c39190612632565b34801561039f57600080fd5b506102236103ae36600461229b565b610edd565b3480156103bf57600080fd5b50610223610f50565b3480156103d457600080fd5b506102236103e3366004612367565b610f56565b3480156103f457600080fd5b50610223610403366004612448565b610fd8565b34801561041457600080fd5b50610250610423366004612279565b611006565b34801561043457600080fd5b50610448610443366004612367565b6110b2565b6040516101c3969594939291906126fd565b34801561046657600080fd5b5061047a610475366004612279565b6110ed565b6040516101c391906126f2565b34801561049357600080fd5b506102236104a236600461229b565b611102565b3480156104b357600080fd5b5061022361117c565b3480156104c857600080fd5b506104dc6104d7366004612397565b6111a0565b6040516101c39190612e25565b3480156104f557600080fd5b506104fe611204565b6040516101c39190612687565b34801561051757600080fd5b50610386611265565b34801561052c57600080fd5b5061022361053b366004612279565b611274565b61025061054e366004612367565b611286565b60008054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105df5780601f106105b4576101008083540402835291602001916105df565b820191906000526020600020905b8154815290600101906020018083116105c257829003601f168201915b5050505050905090565b6004602052600090815260409020805460018201546002830154600784015460088501546009860154600a870154600b880154600c890154600e90990154979896976001600160a01b03909616969495939492939192909160ff808316926101009004811691168b565b6000818152600260205260408120805460ff1661068b5760405162461bcd60e51b815260040161068290612ce8565b60405180910390fd5b8060040154600160009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156106de57600080fd5b505afa1580156106f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610716919061237f565b8161071d57fe5b049150505b919050565b610739610732611517565b838361151b565b5050565b6007546001600160a01b031633146107675760405162461bcd60e51b8152600401610682906129af565b610770816116ed565b50565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6060806060806000600460008781526020019081526020016000209050806003018160040182600501836006018380548060200260200160405190810160405280929190818152602001828054801561081957602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116107fb575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561086b57602002820191906000526020600020905b815481526020019060010190808311610857575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b8282101561093e5760008481526020908190208301805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561092a5780601f106108ff5761010080835404028352916020019161092a565b820191906000526020600020905b81548152906001019060200180831161090d57829003601f168201915b505050505081526020019060010190610893565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015610a105760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156109fc5780601f106109d1576101008083540402835291602001916109fc565b820191906000526020600020905b8154815290600101906020018083116109df57829003601f168201915b505050505081526020019060010190610965565b5050505090509450945094509450509193509193565b6000805b8651811015610a8e5760096000888381518110610a4357fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16610a865760405162461bcd60e51b815260040161068290612b8c565b600101610a2a565b50610aa160015b87878787876000611773565b9695505050505050565b60008160035410158015610abf5750600082115b610adb5760405162461bcd60e51b815260040161068290612b48565b6000828152600460205260409020600c81015460ff1615610b00576001915050610722565b600c810154610100900460ff1615610b1c576005915050610722565b80600801544311610b31576000915050610722565b80600b015481600a0154111580610b5557508054610b4e90610653565b81600a0154105b15610b64576002915050610722565b8060090154431015610b7a576003915050610722565b6004915050610722565b610b8c611d1b565b50600090815260026020818152604092839020835160c081018552815460ff1615158152600182015492810192909252918201549281019290925260038101546060830152600481015460808301526005015460a082015290565b6000610bf282610aab565b90506005816005811115610c0257fe5b1415610c205760405162461bcd60e51b8152600401610682906128ae565b60008281526004602052604090208054610c3990610f56565b6001805460028401546040805160608101909152602a8082526001600160a01b039384169463782d6fe19490931692610c7e9290916130366020830139439190611baa565b6040518363ffffffff1660e01b8152600401610c9b929190612646565b60206040518083038186803b158015610cb357600080fd5b505afa158015610cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ceb919061237f565b10610d085760405162461bcd60e51b815260040161068290612c9e565b600c8101805460ff191660011790556040517f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90610d47908590612727565b60405180910390a1505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666000604051610d8691906125a7565b6040518091039020610d96611bd6565b30604051602001610daa9493929190612730565b60405160208183030381529060405280519060200120905060007f8e25870c07e0b0b3884c78da52790939a455c275406c44ae8b434b692fb916ee8787604051602001610df993929190612754565b60405160208183030381529060405280519060200120905060008282604051602001610e26929190612617565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051610e63949392919061276c565b6020604051602081039080840390855afa158015610e85573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610eb85760405162461bcd60e51b815260040161068290612ddb565b610ec3818a8a61151b565b505050505050505050565b6007546001600160a01b031690565b6000805b8651811015610f455760096000888381518110610efa57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16610f3d5760405162461bcd60e51b815260040161068290612b8c565b600101610ee1565b50610aa16000610a95565b60035481565b6000818152600260205260408120805460ff16610f855760405162461bcd60e51b815260040161068290612c41565b8060050154600160009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156106de57600080fd5b60056020528160005260406000208181548110610ff157fe5b90600052602060002001600091509150505481565b6007546001600160a01b031633146110305760405162461bcd60e51b8152600401610682906129af565b6001600160a01b0381166110565760405162461bcd60e51b8152600401610682906129f7565b6007546040516001600160a01b038084169216907ff5b58f4b82655edcd8644d0e54fd6d2d37321f54f4755e4e67fd6af851c43fec90600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b600260208190526000918252604090912080546001820154928201546003830154600484015460059094015460ff9093169493919290919086565b60096020526000908152604090205460ff1681565b6000805b865181101561116a576009600088838151811061111f57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff166111625760405162461bcd60e51b815260040161068290612a4c565b600101611106565b50610aa1600287878787876001611773565b7f8e25870c07e0b0b3884c78da52790939a455c275406c44ae8b434b692fb916ee81565b6111a8611d53565b5060008281526004602090815260408083206001600160a01b0385168452600d018252918290208251606081018452815460ff808216151583526101009091041615159281019290925260010154918101919091525b92915050565b606060088054806020026020016040519081016040528092919081815260200182805480156105df57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161123e575050505050905090565b6001546001600160a01b031681565b60066020526000908152604090205481565b600361129182610aab565b600581111561129c57fe5b146112b95760405162461bcd60e51b8152600401610682906128ff565b60008181526004602090815260408083206005835290832080546001810182559084529190922043910155600e81015460ff1661130257600c8101805461ff0019166101001790555b60005b60038201548110156114a85761149f82600301828154811061132357fe5b6000918252602090912001546004840180546001600160a01b03909216918490811061134b57fe5b906000526020600020015484600501848154811061136557fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156113f35780601f106113c8576101008083540402835291602001916113f3565b820191906000526020600020905b8154815290600101906020018083116113d657829003601f168201915b505050505085600601858154811061140757fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156114955780601f1061146a57610100808354040283529160200191611495565b820191906000526020600020905b81548152906001019060200180831161147857829003601f168201915b5050505050611bda565b50600101611305565b507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f826040516114d89190612727565b60405180910390a15050565b6000816115035760405162461bcd60e51b815260040161068290612b11565b600082848161150e57fe5b04949350505050565b3390565b600061152683610aab565b600581111561153157fe5b1461154e5760405162461bcd60e51b815260040161068290612d96565b60008281526004602090815260408083206001600160a01b0387168452600d8101909252909120805460ff16156115975760405162461bcd60e51b815260040161068290612bf9565b600154600783015460405163782d6fe160e01b81526000926001600160a01b03169163782d6fe1916115cd918a91600401612646565b60206040518083038186803b1580156115e557600080fd5b505afa1580156115f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161d919061237f565b905083156116585761164e816040518060600160405280602981526020016130e360299139600a8601549190611ceb565b600a840155611687565b611681816040518060600160405280602981526020016130e360299139600b8601549190611ceb565b600b8401555b8154600160ff19909116811761ff0019166101008615150217835582018190556040517f877856338e13f63d0c36822ff0ef736b80934cd90574a3a5bc9262c39d217c46906116dd90889088908890869061265f565b60405180910390a1505050505050565b6001600160a01b03811660009081526009602052604090205460ff16610770576001600160a01b03166000818152600960205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b6000878152600260205260408120805460ff166117a25760405162461bcd60e51b815260040161068290612ac4565b6117ab89610f56565b6001546001600160a01b031663782d6fe16117c4611517565b6117ea60016040518060600160405280602b81526020016130b8602b9139439190611baa565b6040518363ffffffff1660e01b8152600401611807929190612646565b60206040518083038186803b15801561181f57600080fd5b505afa158015611833573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611857919061237f565b116118745760405162461bcd60e51b8152600401610682906127b1565b86518851148015611886575085518851145b8015611893575084518851145b6118af5760405162461bcd60e51b81526004016106829061280e565b87516118cd5760405162461bcd60e51b815260040161068290612968565b8060030154885111156118f25760405162461bcd60e51b81526004016106829061286b565b6000439050600061192283600101546040518060600160405280602a8152602001613060602a9139849190611ceb565b6003805460010190559050611935611d73565b604051806101e001604052808d81526020016003548152602001611957611517565b6001600160a01b031681526020018c81526020018b81526020018a81526020018981526020018481526020018381526020016119b286600201546040518060600160405280602e815260200161308a602e9139869190611ceb565b81526000602080830182905260408084018390526060808501849052608085018490528b151560a09095019490945284820180518452600483529281902085518155925160018401558401516002830180546001600160a01b0319166001600160a01b0390921691909117905591830151805193945084939192611a3e92600385019290910190611df8565b5060808201518051611a5a916004840191602090910190611e5d565b5060a08201518051611a76916005840191602090910190611ea4565b5060c08201518051611a92916006840191602090910190611efd565b5060e082015160078201556101008083015160088301556101208301516009830155610140830151600a830155610160830151600b830155610180830151600c830180546101a0860151151590930261ff001992151560ff1994851617929092169190911790556101c090920151600e90910180549115159190921617905560208082018051604080850180516001600160a01b03166000908152600690955293205590519051611b459190600161151b565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e08160200151611b73611517565b8d8d8d8d89898f604051611b8f99989796959493929190612e90565b60405180910390a1602001519b9a5050505050505050505050565b60008184841115611bce5760405162461bcd60e51b8152600401610682919061279e565b505050900390565b4690565b606080835160001415611bee575081611c1a565b838051906020012083604051602001611c0892919061255a565b60405160208183030381529060405290505b60006060876001600160a01b03168784604051611c37919061258b565b60006040518083038185875af1925050503d8060008114611c74576040519150601f19603f3d011682016040523d82523d6000602084013e611c79565b606091505b509150915081611c9b5760405162461bcd60e51b815260040161068290612d39565b876001600160a01b03167f88405ca50016c636e025868e263efe5a9f63bf11cc45404f7616394c7dc389d0888888604051611cd893929190612f28565b60405180910390a2979650505050505050565b60008383018285821015611d125760405162461bcd60e51b8152600401610682919061279e565b50949350505050565b6040518060c0016040528060001515815260200160008152602001600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b604051806101e00160405280600081526020016000815260200160006001600160a01b031681526020016060815260200160608152602001606081526020016060815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581526020016000151581525090565b828054828255906000526020600020908101928215611e4d579160200282015b82811115611e4d57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611e18565b50611e59929150611f56565b5090565b828054828255906000526020600020908101928215611e98579160200282015b82811115611e98578251825591602001919060010190611e7d565b50611e59929150611f75565b828054828255906000526020600020908101928215611ef1579160200282015b82811115611ef15782518051611ee1918491602090910190611f8a565b5091602001919060010190611ec4565b50611e59929150611ff7565b828054828255906000526020600020908101928215611f4a579160200282015b82811115611f4a5782518051611f3a918491602090910190611f8a565b5091602001919060010190611f1d565b50611e59929150612014565b5b80821115611e595780546001600160a01b0319168155600101611f57565b5b80821115611e595760008155600101611f76565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611fcb57805160ff1916838001178555611e98565b82800160010185558215611e985791820182811115611e98578251825591602001919060010190611e7d565b80821115611e5957600061200b8282612031565b50600101611ff7565b80821115611e595760006120288282612031565b50600101612014565b50805460018160011615610100020316600290046000825580601f106120575750610770565b601f0160209004906000526020600020908101906107709190611f75565b80356001600160a01b03811681146111fe57600080fd5b600082601f83011261209c578081fd5b81356120af6120aa82612fd7565b612fb0565b8181529150602080830190848101818402860182018710156120d057600080fd5b60005b848110156120f7576120e58883612075565b845292820192908201906001016120d3565b505050505092915050565b600082601f830112612112578081fd5b81356121206120aa82612fd7565b818152915060208083019084810160005b848110156120f757612148888484358a0101612210565b84529282019290820190600101612131565b600082601f83011261216a578081fd5b81356121786120aa82612fd7565b818152915060208083019084810160005b848110156120f7576121a0888484358a0101612210565b84529282019290820190600101612189565b600082601f8301126121c2578081fd5b81356121d06120aa82612fd7565b8181529150602080830190848101818402860182018710156121f157600080fd5b60005b848110156120f7578135845292820192908201906001016121f4565b600082601f830112612220578081fd5b813567ffffffffffffffff811115612236578182fd5b612249601f8201601f1916602001612fb0565b915080825283602082850101111561226057600080fd5b8060208401602084013760009082016020015292915050565b60006020828403121561228a578081fd5b6122948383612075565b9392505050565b600080600080600060a086880312156122b2578081fd5b853567ffffffffffffffff808211156122c9578283fd5b6122d589838a0161208c565b965060208801359150808211156122ea578283fd5b6122f689838a016121b2565b9550604088013591508082111561230b578283fd5b61231789838a0161215a565b9450606088013591508082111561232c578283fd5b61233889838a01612102565b9350608088013591508082111561234d578283fd5b5061235a88828901612210565b9150509295509295909350565b600060208284031215612378578081fd5b5035919050565b600060208284031215612390578081fd5b5051919050565b600080604083850312156123a9578182fd5b823591506123ba8460208501612075565b90509250929050565b600080604083850312156123d5578182fd5b8235915060208301356123e781613027565b809150509250929050565b600080600080600060a08688031215612409578081fd5b85359450602086013561241b81613027565b9350604086013560ff81168114612430578182fd5b94979396509394606081013594506080013592915050565b6000806040838503121561245a578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b838110156124a15781516001600160a01b03168752958201959082019060010161247c565b509495945050505050565b6000815180845260208085018081965082840281019150828601855b858110156124f25782840389526124e084835161252e565b988501989350908401906001016124c8565b5091979650505050505050565b6000815180845260208085019450808401835b838110156124a157815187529582019590820190600101612512565b60008151808452612546816020860160208601612ff7565b601f01601f19169290920160200192915050565b6001600160e01b031983168152815160009061257d816004850160208701612ff7565b919091016004019392505050565b6000825161259d818460208701612ff7565b9190910192915050565b60008083546001808216600081146125c657600181146125dd5761260c565b60ff198316865260028304607f168601935061260c565b600283048786526020808720875b838110156126045781548a8201529085019082016125eb565b505050860193505b509195945050505050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03949094168452602084019290925215156040830152606082015260800190565b6000602082526122946020830184612469565b6000608082526126ad6080830187612469565b82810360208401526126bf81876124ff565b905082810360408401526126d381866124ac565b905082810360608401526126e781856124ac565b979650505050505050565b901515815260200190565b9515158652602086019490945260408501929092526060840152608083015260a082015260c00190565b90815260200190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b92835260208301919091521515604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b602081016006831061279857fe5b91905290565b600060208252612294602083018461252e565b6020808252603a908201527f476f7665726e6f723a3a70726f706f73653a2070726f706f73657220766f746560408201527f732062656c6f772070726f706f73616c207468726573686f6c64000000000000606082015260800190565b6020808252603f908201527f476f7665726e6f723a3a70726f706f73653a2070726f706f73616c2066756e6360408201527f74696f6e20696e666f726d6174696f6e206172697479206d69736d6174636800606082015260800190565b60208082526023908201527f476f7665726e6f723a3a70726f706f73653a20746f6f206d616e7920616374696040820152626f6e7360e81b606082015260800190565b60208082526031908201527f476f7665726e6f723a3a63616e63656c3a2063616e6e6f742063616e63656c20604082015270195e1958dd5d1959081c1c9bdc1bdcd85b607a1b606082015260800190565b60208082526043908201527f476f7665726e6f723a3a657865637574653a2070726f706f73616c2063616e2060408201527f6f6e6c792062652065786563757465642069662069742069732053756363656560608201526219195960ea1b608082015260a00190565b60208082526027908201527f476f7665726e6f723a3a70726f706f73653a206d7573742070726f7669646520604082015266616374696f6e7360c81b606082015260800190565b60208082526028908201527f476f7665726e616e63653a2063616c6c6572206973206e6f742074686520676f6040820152677665726e616e636560c01b606082015260800190565b60208082526035908201527f476f7665726e616e63654f776e61626c653a206e657720676f7665726e616e636040820152746520697320746865207a65726f206164647265737360581b606082015260800190565b60208082526052908201527f476f7665726e6f72504143543a3a6372656174654d756c74694578656375746160408201527f626c6550726f706f73653a2074617267657473202d20737570706f727473206f6060820152716e6c7920616c6c6f7765645461726765747360701b608082015260a00190565b6020808252602d908201527f476f7665726e6f723a3a70726f706f73653a20696e636f727265637420766f7460408201526c1a5b99d4d95d1d1a5b99dcd259609a1b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526024908201527f476f7665726e6f723a3a73746174653a20696e76616c69642070726f706f73616040820152631b081a5960e21b606082015260800190565b60208082526047908201527f476f7665726e6f72504143543a3a6372656174654661737450726f706f73653a60408201527f2074617267657473202d20737570706f727473206f6e6c7920616c6c6f7765646060820152665461726765747360c81b608082015260a00190565b60208082526028908201527f476f7665726e6f723a3a5f63617374566f74653a20766f74657220616c726561604082015267191e481d9bdd195960c21b606082015260800190565b60208082526037908201527f476f7665726e6f723a3a70726f706f73616c5468726573686f6c643a20696e6360408201527f6f727265637420766f74696e6753657474696e67734964000000000000000000606082015260800190565b6020808252602a908201527f476f7665726e6f723a3a63616e63656c3a2070726f706f7365722061626f7665604082015269081d1a1c995cda1bdb1960b21b606082015260800190565b60208082526031908201527f476f7665726e6f723a3a71756f72756d566f7465733a20696e636f7272656374604082015270081d9bdd1a5b99d4d95d1d1a5b99dcd259607a1b606082015260800190565b6020808252603e908201527f476f7665726e6f723a3a5f657865637574655472616e73616374696f6e3a205460408201527f72616e73616374696f6e20657865637574696f6e2072657665727465642e0000606082015260800190565b60208082526025908201527f476f7665726e6f723a3a5f63617374566f74653a20766f74696e6720697320636040820152641b1bdcd95960da1b606082015260800190565b6020808252602a908201527f476f7665726e6f723a3a63617374566f746542795369673a20696e76616c6964604082015269207369676e617475726560b01b606082015260800190565b8151151581526020808301511515908201526040918201519181019190915260600190565b600060c0820190508251151582526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b8981526001600160a01b038916602082015261012060408201819052600090612ebb8382018b612469565b90508281036060840152612ecf818a6124ff565b90508281036080840152612ee381896124ac565b905082810360a0840152612ef781886124ac565b90508560c08401528460e0840152828103610100840152612f18818561252e565b9c9b505050505050505050505050565b600084825260606020830152612f41606083018561252e565b8281036040840152610aa1818561252e565b9a8b5260208b01999099526001600160a01b039790971660408a01526060890195909552608088019390935260a087019190915260c086015260e08501521515610100840152151561012083015215156101408201526101600190565b60405181810167ffffffffffffffff81118282101715612fcf57600080fd5b604052919050565b600067ffffffffffffffff821115612fed578081fd5b5060209081020190565b60005b83811015613012578181015183820152602001612ffa565b83811115613021576000848401525b50505050565b801515811461077057600080fdfe476f7665726e6f723a3a63616e63656c3a20626c6f636b2e6e756d626572202d20556e646572666c6f77476f7665726e6f723a3a70726f706f73653a20656e64426c6f636b202d20416464204f766572666c6f77476f7665726e6f723a3a70726f706f73653a2065787069726564426c6f636b202d20416464204f766572666c6f77476f7665726e6f723a3a70726f706f73653a20626c6f636b2e6e756d626572202d20556e646572666c6f77476f7665726e6f723a3a5f63617374566f74653a20766f746573202d20416464204f766572666c6f77a2646970667358221220acc23c35515c77cf1f8445679556dc50ae71bda89c95ffcf6f42c008b4dfc61264736f6c634300060c003300000000000000000000000066e7ce35578a37209d01f99f3d2ff271f981f581000000000000000000000000000000000000000000000000000000000000000f
Deployed ByteCode
0x60806040526004361061019c5760003560e01c80635d7fe398116100ec578063ccf0e6d81161008a578063e2c4abe811610064578063e2c4abe8146104e9578063ecd0c0c31461050b578063edd7456914610520578063fe0d94c1146105405761019c565b8063ccf0e6d814610487578063deaaa7cc146104a7578063e23a9a52146104bc5761019c565b806381e94e8d116100c657806381e94e8d146103e8578063ab033ea914610408578063b638571814610428578063b8fe8d5f1461045a5761019c565b80635d7fe398146103935780636f2904cc146103b35780637629a4ac146103c85761019c565b8063328dd98211610159578063409ae08911610133578063409ae0891461030457806340e58ee5146103315780634634c61f146103515780635aa6e675146103715761019c565b8063328dd9821461028757806333834ca4146102b75780633e4f49e6146102d75761019c565b806306fdde03146101a15780630a494840146101cc5780630f7b1f081461020357806315373e3d14610230578063182562b31461025257806320606b7014610272575b600080fd5b3480156101ad57600080fd5b506101b6610553565b6040516101c3919061279e565b60405180910390f35b3480156101d857600080fd5b506101ec6101e7366004612367565b6105e9565b6040516101c39b9a99989796959493929190612f53565b34801561020f57600080fd5b5061022361021e366004612367565b610653565b6040516101c39190612727565b34801561023c57600080fd5b5061025061024b3660046123c3565b610727565b005b34801561025e57600080fd5b5061025061026d366004612279565b61073d565b34801561027e57600080fd5b50610223610773565b34801561029357600080fd5b506102a76102a2366004612367565b610797565b6040516101c3949392919061269a565b3480156102c357600080fd5b506102236102d236600461229b565b610a26565b3480156102e357600080fd5b506102f76102f2366004612367565b610aab565b6040516101c3919061278a565b34801561031057600080fd5b5061032461031f366004612367565b610b84565b6040516101c39190612e4a565b34801561033d57600080fd5b5061025061034c366004612367565b610be7565b34801561035d57600080fd5b5061025061036c3660046123f2565b610d54565b34801561037d57600080fd5b50610386610ece565b6040516101c39190612632565b34801561039f57600080fd5b506102236103ae36600461229b565b610edd565b3480156103bf57600080fd5b50610223610f50565b3480156103d457600080fd5b506102236103e3366004612367565b610f56565b3480156103f457600080fd5b50610223610403366004612448565b610fd8565b34801561041457600080fd5b50610250610423366004612279565b611006565b34801561043457600080fd5b50610448610443366004612367565b6110b2565b6040516101c3969594939291906126fd565b34801561046657600080fd5b5061047a610475366004612279565b6110ed565b6040516101c391906126f2565b34801561049357600080fd5b506102236104a236600461229b565b611102565b3480156104b357600080fd5b5061022361117c565b3480156104c857600080fd5b506104dc6104d7366004612397565b6111a0565b6040516101c39190612e25565b3480156104f557600080fd5b506104fe611204565b6040516101c39190612687565b34801561051757600080fd5b50610386611265565b34801561052c57600080fd5b5061022361053b366004612279565b611274565b61025061054e366004612367565b611286565b60008054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105df5780601f106105b4576101008083540402835291602001916105df565b820191906000526020600020905b8154815290600101906020018083116105c257829003601f168201915b5050505050905090565b6004602052600090815260409020805460018201546002830154600784015460088501546009860154600a870154600b880154600c890154600e90990154979896976001600160a01b03909616969495939492939192909160ff808316926101009004811691168b565b6000818152600260205260408120805460ff1661068b5760405162461bcd60e51b815260040161068290612ce8565b60405180910390fd5b8060040154600160009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156106de57600080fd5b505afa1580156106f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610716919061237f565b8161071d57fe5b049150505b919050565b610739610732611517565b838361151b565b5050565b6007546001600160a01b031633146107675760405162461bcd60e51b8152600401610682906129af565b610770816116ed565b50565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6060806060806000600460008781526020019081526020016000209050806003018160040182600501836006018380548060200260200160405190810160405280929190818152602001828054801561081957602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116107fb575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561086b57602002820191906000526020600020905b815481526020019060010190808311610857575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b8282101561093e5760008481526020908190208301805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561092a5780601f106108ff5761010080835404028352916020019161092a565b820191906000526020600020905b81548152906001019060200180831161090d57829003601f168201915b505050505081526020019060010190610893565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015610a105760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156109fc5780601f106109d1576101008083540402835291602001916109fc565b820191906000526020600020905b8154815290600101906020018083116109df57829003601f168201915b505050505081526020019060010190610965565b5050505090509450945094509450509193509193565b6000805b8651811015610a8e5760096000888381518110610a4357fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16610a865760405162461bcd60e51b815260040161068290612b8c565b600101610a2a565b50610aa160015b87878787876000611773565b9695505050505050565b60008160035410158015610abf5750600082115b610adb5760405162461bcd60e51b815260040161068290612b48565b6000828152600460205260409020600c81015460ff1615610b00576001915050610722565b600c810154610100900460ff1615610b1c576005915050610722565b80600801544311610b31576000915050610722565b80600b015481600a0154111580610b5557508054610b4e90610653565b81600a0154105b15610b64576002915050610722565b8060090154431015610b7a576003915050610722565b6004915050610722565b610b8c611d1b565b50600090815260026020818152604092839020835160c081018552815460ff1615158152600182015492810192909252918201549281019290925260038101546060830152600481015460808301526005015460a082015290565b6000610bf282610aab565b90506005816005811115610c0257fe5b1415610c205760405162461bcd60e51b8152600401610682906128ae565b60008281526004602052604090208054610c3990610f56565b6001805460028401546040805160608101909152602a8082526001600160a01b039384169463782d6fe19490931692610c7e9290916130366020830139439190611baa565b6040518363ffffffff1660e01b8152600401610c9b929190612646565b60206040518083038186803b158015610cb357600080fd5b505afa158015610cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ceb919061237f565b10610d085760405162461bcd60e51b815260040161068290612c9e565b600c8101805460ff191660011790556040517f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90610d47908590612727565b60405180910390a1505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666000604051610d8691906125a7565b6040518091039020610d96611bd6565b30604051602001610daa9493929190612730565b60405160208183030381529060405280519060200120905060007f8e25870c07e0b0b3884c78da52790939a455c275406c44ae8b434b692fb916ee8787604051602001610df993929190612754565b60405160208183030381529060405280519060200120905060008282604051602001610e26929190612617565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051610e63949392919061276c565b6020604051602081039080840390855afa158015610e85573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610eb85760405162461bcd60e51b815260040161068290612ddb565b610ec3818a8a61151b565b505050505050505050565b6007546001600160a01b031690565b6000805b8651811015610f455760096000888381518110610efa57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16610f3d5760405162461bcd60e51b815260040161068290612b8c565b600101610ee1565b50610aa16000610a95565b60035481565b6000818152600260205260408120805460ff16610f855760405162461bcd60e51b815260040161068290612c41565b8060050154600160009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156106de57600080fd5b60056020528160005260406000208181548110610ff157fe5b90600052602060002001600091509150505481565b6007546001600160a01b031633146110305760405162461bcd60e51b8152600401610682906129af565b6001600160a01b0381166110565760405162461bcd60e51b8152600401610682906129f7565b6007546040516001600160a01b038084169216907ff5b58f4b82655edcd8644d0e54fd6d2d37321f54f4755e4e67fd6af851c43fec90600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b600260208190526000918252604090912080546001820154928201546003830154600484015460059094015460ff9093169493919290919086565b60096020526000908152604090205460ff1681565b6000805b865181101561116a576009600088838151811061111f57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff166111625760405162461bcd60e51b815260040161068290612a4c565b600101611106565b50610aa1600287878787876001611773565b7f8e25870c07e0b0b3884c78da52790939a455c275406c44ae8b434b692fb916ee81565b6111a8611d53565b5060008281526004602090815260408083206001600160a01b0385168452600d018252918290208251606081018452815460ff808216151583526101009091041615159281019290925260010154918101919091525b92915050565b606060088054806020026020016040519081016040528092919081815260200182805480156105df57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161123e575050505050905090565b6001546001600160a01b031681565b60066020526000908152604090205481565b600361129182610aab565b600581111561129c57fe5b146112b95760405162461bcd60e51b8152600401610682906128ff565b60008181526004602090815260408083206005835290832080546001810182559084529190922043910155600e81015460ff1661130257600c8101805461ff0019166101001790555b60005b60038201548110156114a85761149f82600301828154811061132357fe5b6000918252602090912001546004840180546001600160a01b03909216918490811061134b57fe5b906000526020600020015484600501848154811061136557fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156113f35780601f106113c8576101008083540402835291602001916113f3565b820191906000526020600020905b8154815290600101906020018083116113d657829003601f168201915b505050505085600601858154811061140757fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156114955780601f1061146a57610100808354040283529160200191611495565b820191906000526020600020905b81548152906001019060200180831161147857829003601f168201915b5050505050611bda565b50600101611305565b507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f826040516114d89190612727565b60405180910390a15050565b6000816115035760405162461bcd60e51b815260040161068290612b11565b600082848161150e57fe5b04949350505050565b3390565b600061152683610aab565b600581111561153157fe5b1461154e5760405162461bcd60e51b815260040161068290612d96565b60008281526004602090815260408083206001600160a01b0387168452600d8101909252909120805460ff16156115975760405162461bcd60e51b815260040161068290612bf9565b600154600783015460405163782d6fe160e01b81526000926001600160a01b03169163782d6fe1916115cd918a91600401612646565b60206040518083038186803b1580156115e557600080fd5b505afa1580156115f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161d919061237f565b905083156116585761164e816040518060600160405280602981526020016130e360299139600a8601549190611ceb565b600a840155611687565b611681816040518060600160405280602981526020016130e360299139600b8601549190611ceb565b600b8401555b8154600160ff19909116811761ff0019166101008615150217835582018190556040517f877856338e13f63d0c36822ff0ef736b80934cd90574a3a5bc9262c39d217c46906116dd90889088908890869061265f565b60405180910390a1505050505050565b6001600160a01b03811660009081526009602052604090205460ff16610770576001600160a01b03166000818152600960205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b6000878152600260205260408120805460ff166117a25760405162461bcd60e51b815260040161068290612ac4565b6117ab89610f56565b6001546001600160a01b031663782d6fe16117c4611517565b6117ea60016040518060600160405280602b81526020016130b8602b9139439190611baa565b6040518363ffffffff1660e01b8152600401611807929190612646565b60206040518083038186803b15801561181f57600080fd5b505afa158015611833573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611857919061237f565b116118745760405162461bcd60e51b8152600401610682906127b1565b86518851148015611886575085518851145b8015611893575084518851145b6118af5760405162461bcd60e51b81526004016106829061280e565b87516118cd5760405162461bcd60e51b815260040161068290612968565b8060030154885111156118f25760405162461bcd60e51b81526004016106829061286b565b6000439050600061192283600101546040518060600160405280602a8152602001613060602a9139849190611ceb565b6003805460010190559050611935611d73565b604051806101e001604052808d81526020016003548152602001611957611517565b6001600160a01b031681526020018c81526020018b81526020018a81526020018981526020018481526020018381526020016119b286600201546040518060600160405280602e815260200161308a602e9139869190611ceb565b81526000602080830182905260408084018390526060808501849052608085018490528b151560a09095019490945284820180518452600483529281902085518155925160018401558401516002830180546001600160a01b0319166001600160a01b0390921691909117905591830151805193945084939192611a3e92600385019290910190611df8565b5060808201518051611a5a916004840191602090910190611e5d565b5060a08201518051611a76916005840191602090910190611ea4565b5060c08201518051611a92916006840191602090910190611efd565b5060e082015160078201556101008083015160088301556101208301516009830155610140830151600a830155610160830151600b830155610180830151600c830180546101a0860151151590930261ff001992151560ff1994851617929092169190911790556101c090920151600e90910180549115159190921617905560208082018051604080850180516001600160a01b03166000908152600690955293205590519051611b459190600161151b565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e08160200151611b73611517565b8d8d8d8d89898f604051611b8f99989796959493929190612e90565b60405180910390a1602001519b9a5050505050505050505050565b60008184841115611bce5760405162461bcd60e51b8152600401610682919061279e565b505050900390565b4690565b606080835160001415611bee575081611c1a565b838051906020012083604051602001611c0892919061255a565b60405160208183030381529060405290505b60006060876001600160a01b03168784604051611c37919061258b565b60006040518083038185875af1925050503d8060008114611c74576040519150601f19603f3d011682016040523d82523d6000602084013e611c79565b606091505b509150915081611c9b5760405162461bcd60e51b815260040161068290612d39565b876001600160a01b03167f88405ca50016c636e025868e263efe5a9f63bf11cc45404f7616394c7dc389d0888888604051611cd893929190612f28565b60405180910390a2979650505050505050565b60008383018285821015611d125760405162461bcd60e51b8152600401610682919061279e565b50949350505050565b6040518060c0016040528060001515815260200160008152602001600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b604051806101e00160405280600081526020016000815260200160006001600160a01b031681526020016060815260200160608152602001606081526020016060815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581526020016000151581525090565b828054828255906000526020600020908101928215611e4d579160200282015b82811115611e4d57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611e18565b50611e59929150611f56565b5090565b828054828255906000526020600020908101928215611e98579160200282015b82811115611e98578251825591602001919060010190611e7d565b50611e59929150611f75565b828054828255906000526020600020908101928215611ef1579160200282015b82811115611ef15782518051611ee1918491602090910190611f8a565b5091602001919060010190611ec4565b50611e59929150611ff7565b828054828255906000526020600020908101928215611f4a579160200282015b82811115611f4a5782518051611f3a918491602090910190611f8a565b5091602001919060010190611f1d565b50611e59929150612014565b5b80821115611e595780546001600160a01b0319168155600101611f57565b5b80821115611e595760008155600101611f76565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611fcb57805160ff1916838001178555611e98565b82800160010185558215611e985791820182811115611e98578251825591602001919060010190611e7d565b80821115611e5957600061200b8282612031565b50600101611ff7565b80821115611e595760006120288282612031565b50600101612014565b50805460018160011615610100020316600290046000825580601f106120575750610770565b601f0160209004906000526020600020908101906107709190611f75565b80356001600160a01b03811681146111fe57600080fd5b600082601f83011261209c578081fd5b81356120af6120aa82612fd7565b612fb0565b8181529150602080830190848101818402860182018710156120d057600080fd5b60005b848110156120f7576120e58883612075565b845292820192908201906001016120d3565b505050505092915050565b600082601f830112612112578081fd5b81356121206120aa82612fd7565b818152915060208083019084810160005b848110156120f757612148888484358a0101612210565b84529282019290820190600101612131565b600082601f83011261216a578081fd5b81356121786120aa82612fd7565b818152915060208083019084810160005b848110156120f7576121a0888484358a0101612210565b84529282019290820190600101612189565b600082601f8301126121c2578081fd5b81356121d06120aa82612fd7565b8181529150602080830190848101818402860182018710156121f157600080fd5b60005b848110156120f7578135845292820192908201906001016121f4565b600082601f830112612220578081fd5b813567ffffffffffffffff811115612236578182fd5b612249601f8201601f1916602001612fb0565b915080825283602082850101111561226057600080fd5b8060208401602084013760009082016020015292915050565b60006020828403121561228a578081fd5b6122948383612075565b9392505050565b600080600080600060a086880312156122b2578081fd5b853567ffffffffffffffff808211156122c9578283fd5b6122d589838a0161208c565b965060208801359150808211156122ea578283fd5b6122f689838a016121b2565b9550604088013591508082111561230b578283fd5b61231789838a0161215a565b9450606088013591508082111561232c578283fd5b61233889838a01612102565b9350608088013591508082111561234d578283fd5b5061235a88828901612210565b9150509295509295909350565b600060208284031215612378578081fd5b5035919050565b600060208284031215612390578081fd5b5051919050565b600080604083850312156123a9578182fd5b823591506123ba8460208501612075565b90509250929050565b600080604083850312156123d5578182fd5b8235915060208301356123e781613027565b809150509250929050565b600080600080600060a08688031215612409578081fd5b85359450602086013561241b81613027565b9350604086013560ff81168114612430578182fd5b94979396509394606081013594506080013592915050565b6000806040838503121561245a578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b838110156124a15781516001600160a01b03168752958201959082019060010161247c565b509495945050505050565b6000815180845260208085018081965082840281019150828601855b858110156124f25782840389526124e084835161252e565b988501989350908401906001016124c8565b5091979650505050505050565b6000815180845260208085019450808401835b838110156124a157815187529582019590820190600101612512565b60008151808452612546816020860160208601612ff7565b601f01601f19169290920160200192915050565b6001600160e01b031983168152815160009061257d816004850160208701612ff7565b919091016004019392505050565b6000825161259d818460208701612ff7565b9190910192915050565b60008083546001808216600081146125c657600181146125dd5761260c565b60ff198316865260028304607f168601935061260c565b600283048786526020808720875b838110156126045781548a8201529085019082016125eb565b505050860193505b509195945050505050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03949094168452602084019290925215156040830152606082015260800190565b6000602082526122946020830184612469565b6000608082526126ad6080830187612469565b82810360208401526126bf81876124ff565b905082810360408401526126d381866124ac565b905082810360608401526126e781856124ac565b979650505050505050565b901515815260200190565b9515158652602086019490945260408501929092526060840152608083015260a082015260c00190565b90815260200190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b92835260208301919091521515604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b602081016006831061279857fe5b91905290565b600060208252612294602083018461252e565b6020808252603a908201527f476f7665726e6f723a3a70726f706f73653a2070726f706f73657220766f746560408201527f732062656c6f772070726f706f73616c207468726573686f6c64000000000000606082015260800190565b6020808252603f908201527f476f7665726e6f723a3a70726f706f73653a2070726f706f73616c2066756e6360408201527f74696f6e20696e666f726d6174696f6e206172697479206d69736d6174636800606082015260800190565b60208082526023908201527f476f7665726e6f723a3a70726f706f73653a20746f6f206d616e7920616374696040820152626f6e7360e81b606082015260800190565b60208082526031908201527f476f7665726e6f723a3a63616e63656c3a2063616e6e6f742063616e63656c20604082015270195e1958dd5d1959081c1c9bdc1bdcd85b607a1b606082015260800190565b60208082526043908201527f476f7665726e6f723a3a657865637574653a2070726f706f73616c2063616e2060408201527f6f6e6c792062652065786563757465642069662069742069732053756363656560608201526219195960ea1b608082015260a00190565b60208082526027908201527f476f7665726e6f723a3a70726f706f73653a206d7573742070726f7669646520604082015266616374696f6e7360c81b606082015260800190565b60208082526028908201527f476f7665726e616e63653a2063616c6c6572206973206e6f742074686520676f6040820152677665726e616e636560c01b606082015260800190565b60208082526035908201527f476f7665726e616e63654f776e61626c653a206e657720676f7665726e616e636040820152746520697320746865207a65726f206164647265737360581b606082015260800190565b60208082526052908201527f476f7665726e6f72504143543a3a6372656174654d756c74694578656375746160408201527f626c6550726f706f73653a2074617267657473202d20737570706f727473206f6060820152716e6c7920616c6c6f7765645461726765747360701b608082015260a00190565b6020808252602d908201527f476f7665726e6f723a3a70726f706f73653a20696e636f727265637420766f7460408201526c1a5b99d4d95d1d1a5b99dcd259609a1b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526024908201527f476f7665726e6f723a3a73746174653a20696e76616c69642070726f706f73616040820152631b081a5960e21b606082015260800190565b60208082526047908201527f476f7665726e6f72504143543a3a6372656174654661737450726f706f73653a60408201527f2074617267657473202d20737570706f727473206f6e6c7920616c6c6f7765646060820152665461726765747360c81b608082015260a00190565b60208082526028908201527f476f7665726e6f723a3a5f63617374566f74653a20766f74657220616c726561604082015267191e481d9bdd195960c21b606082015260800190565b60208082526037908201527f476f7665726e6f723a3a70726f706f73616c5468726573686f6c643a20696e6360408201527f6f727265637420766f74696e6753657474696e67734964000000000000000000606082015260800190565b6020808252602a908201527f476f7665726e6f723a3a63616e63656c3a2070726f706f7365722061626f7665604082015269081d1a1c995cda1bdb1960b21b606082015260800190565b60208082526031908201527f476f7665726e6f723a3a71756f72756d566f7465733a20696e636f7272656374604082015270081d9bdd1a5b99d4d95d1d1a5b99dcd259607a1b606082015260800190565b6020808252603e908201527f476f7665726e6f723a3a5f657865637574655472616e73616374696f6e3a205460408201527f72616e73616374696f6e20657865637574696f6e2072657665727465642e0000606082015260800190565b60208082526025908201527f476f7665726e6f723a3a5f63617374566f74653a20766f74696e6720697320636040820152641b1bdcd95960da1b606082015260800190565b6020808252602a908201527f476f7665726e6f723a3a63617374566f746542795369673a20696e76616c6964604082015269207369676e617475726560b01b606082015260800190565b8151151581526020808301511515908201526040918201519181019190915260600190565b600060c0820190508251151582526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b8981526001600160a01b038916602082015261012060408201819052600090612ebb8382018b612469565b90508281036060840152612ecf818a6124ff565b90508281036080840152612ee381896124ac565b905082810360a0840152612ef781886124ac565b90508560c08401528460e0840152828103610100840152612f18818561252e565b9c9b505050505050505050505050565b600084825260606020830152612f41606083018561252e565b8281036040840152610aa1818561252e565b9a8b5260208b01999099526001600160a01b039790971660408a01526060890195909552608088019390935260a087019190915260c086015260e08501521515610100840152151561012083015215156101408201526101600190565b60405181810167ffffffffffffffff81118282101715612fcf57600080fd5b604052919050565b600067ffffffffffffffff821115612fed578081fd5b5060209081020190565b60005b83811015613012578181015183820152602001612ffa565b83811115613021576000848401525b50505050565b801515811461077057600080fdfe476f7665726e6f723a3a63616e63656c3a20626c6f636b2e6e756d626572202d20556e646572666c6f77476f7665726e6f723a3a70726f706f73653a20656e64426c6f636b202d20416464204f766572666c6f77476f7665726e6f723a3a70726f706f73653a2065787069726564426c6f636b202d20416464204f766572666c6f77476f7665726e6f723a3a70726f706f73653a20626c6f636b2e6e756d626572202d20556e646572666c6f77476f7665726e6f723a3a5f63617374566f74653a20766f746573202d20416464204f766572666c6f77a2646970667358221220acc23c35515c77cf1f8445679556dc50ae71bda89c95ffcf6f42c008b4dfc61264736f6c634300060c0033