@bitriel/governance
Version:
On-chain DAO governance for Bitriel Protocol
1,148 lines • 150 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "BitrielGovernor",
"sourceName": "contracts/BitrielGovernance.sol",
"abi": [
{
"inputs": [
{
"internalType": "contract IVotes",
"name": "_token",
"type": "address"
},
{
"internalType": "contract TimelockController",
"name": "_timelock",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
}
],
"name": "ProposalCanceled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "proposalId",
"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": "startBlock",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "endBlock",
"type": "uint256"
},
{
"indexed": false,
"internalType": "string",
"name": "description",
"type": "string"
}
],
"name": "ProposalCreated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
}
],
"name": "ProposalExecuted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "eta",
"type": "uint256"
}
],
"name": "ProposalQueued",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "oldProposalThreshold",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "newProposalThreshold",
"type": "uint256"
}
],
"name": "ProposalThresholdSet",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "oldQuorumNumerator",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "newQuorumNumerator",
"type": "uint256"
}
],
"name": "QuorumNumeratorUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "oldTimelock",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "newTimelock",
"type": "address"
}
],
"name": "TimelockChange",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "voter",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint8",
"name": "support",
"type": "uint8"
},
{
"indexed": false,
"internalType": "uint256",
"name": "weight",
"type": "uint256"
},
{
"indexed": false,
"internalType": "string",
"name": "reason",
"type": "string"
}
],
"name": "VoteCast",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "oldVotingDelay",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "newVotingDelay",
"type": "uint256"
}
],
"name": "VotingDelaySet",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "oldVotingPeriod",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "newVotingPeriod",
"type": "uint256"
}
],
"name": "VotingPeriodSet",
"type": "event"
},
{
"inputs": [],
"name": "BALLOT_TYPEHASH",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "COUNTING_MODE",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "pure",
"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": "support",
"type": "uint8"
}
],
"name": "castVote",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
},
{
"internalType": "uint8",
"name": "support",
"type": "uint8"
},
{
"internalType": "uint8",
"name": "v",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "r",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "s",
"type": "bytes32"
}
],
"name": "castVoteBySig",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
},
{
"internalType": "uint8",
"name": "support",
"type": "uint8"
},
{
"internalType": "string",
"name": "reason",
"type": "string"
}
],
"name": "castVoteWithReason",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "targets",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "values",
"type": "uint256[]"
},
{
"internalType": "bytes[]",
"name": "calldatas",
"type": "bytes[]"
},
{
"internalType": "bytes32",
"name": "descriptionHash",
"type": "bytes32"
}
],
"name": "execute",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
}
],
"name": "execute",
"outputs": [],
"stateMutability": "payable",
"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": [
{
"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": "support",
"type": "uint8"
},
{
"internalType": "uint96",
"name": "votes",
"type": "uint96"
}
],
"internalType": "struct IGovernorCompatibilityBravo.Receipt",
"name": "",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "uint256",
"name": "blockNumber",
"type": "uint256"
}
],
"name": "getVotes",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "hasVoted",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "targets",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "values",
"type": "uint256[]"
},
{
"internalType": "bytes[]",
"name": "calldatas",
"type": "bytes[]"
},
{
"internalType": "bytes32",
"name": "descriptionHash",
"type": "bytes32"
}
],
"name": "hashProposal",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "latestProposalIds",
"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": [
{
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
}
],
"name": "proposalDeadline",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
}
],
"name": "proposalEta",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
}
],
"name": "proposalSnapshot",
"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": "proposalId",
"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": "startBlock",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "endBlock",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "forVotes",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "againstVotes",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "abstainVotes",
"type": "uint256"
},
{
"internalType": "bool",
"name": "canceled",
"type": "bool"
},
{
"internalType": "bool",
"name": "executed",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "targets",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "values",
"type": "uint256[]"
},
{
"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": "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": "address[]",
"name": "targets",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "values",
"type": "uint256[]"
},
{
"internalType": "bytes[]",
"name": "calldatas",
"type": "bytes[]"
},
{
"internalType": "bytes32",
"name": "descriptionHash",
"type": "bytes32"
}
],
"name": "queue",
"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": [
{
"internalType": "uint256",
"name": "blockNumber",
"type": "uint256"
}
],
"name": "quorum",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "quorumDenominator",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "quorumNumerator",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "quorumVotes",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "relay",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newProposalThreshold",
"type": "uint256"
}
],
"name": "setProposalThreshold",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newVotingDelay",
"type": "uint256"
}
],
"name": "setVotingDelay",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newVotingPeriod",
"type": "uint256"
}
],
"name": "setVotingPeriod",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "proposalId",
"type": "uint256"
}
],
"name": "state",
"outputs": [
{
"internalType": "enum IGovernor.ProposalState",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes4",
"name": "interfaceId",
"type": "bytes4"
}
],
"name": "supportsInterface",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "timelock",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "token",
"outputs": [
{
"internalType": "contract IVotes",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newQuorumNumerator",
"type": "uint256"
}
],
"name": "updateQuorumNumerator",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract TimelockController",
"name": "newTimelock",
"type": "address"
}
],
"name": "updateTimelock",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "version",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"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"
},
{
"stateMutability": "payable",
"type": "receive"
}
],
"bytecode": "0x6101606040523480156200001257600080fd5b5060405162007f6e38038062007f6e8339818101604052810190620000389190620005b2565b80600483600161627060006040518060400160405280600f81526020017f4269747269656c476f7665726e6f720000000000000000000000000000000000815250806200008a620001f460201b60201c565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000f38184846200023160201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508061012081815250505050505050806000908051906020019062000157929190620004d4565b50506200016a836200026d60201b60201c565b6200017b82620002b460201b60201c565b6200018c816200034160201b60201c565b5050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff1660601b8152505050620001d9816200038860201b60201c565b50620001eb816200042a60201b60201c565b50505062000961565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b600083838346306040516020016200024e959493929190620006a1565b6040516020818303038152906040528051906020012090509392505050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a9360025482604051620002a292919062000742565b60405180910390a18060028190555050565b60008111620002fa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002f19062000720565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828600354826040516200032f92919062000742565b60405180910390a18060038190555050565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461600454826040516200037692919062000742565b60405180910390a18060048190555050565b62000398620004cb60201b60201c565b811115620003dd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003d490620006fe565b60405180910390fd5b60006006549050816006819055507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781836040516200041e92919062000742565b60405180910390a15050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516200047f92919062000674565b60405180910390a180600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006064905090565b828054620004e29062000804565b90600052602060002090601f01602090048101928262000506576000855562000552565b82601f106200052157805160ff191683800117855562000552565b8280016001018555821562000552579182015b828111156200055157825182559160200191906001019062000534565b5b50905062000561919062000565565b5090565b5b808211156200058057600081600090555060010162000566565b5090565b60008151905062000595816200092d565b92915050565b600081519050620005ac8162000947565b92915050565b60008060408385031215620005c657600080fd5b6000620005d68582860162000584565b9250506020620005e9858286016200059b565b9150509250929050565b620005fe8162000780565b82525050565b6200060f81620007a8565b82525050565b6000620006246043836200076f565b9150620006318262000869565b606082019050919050565b60006200064b6027836200076f565b91506200065882620008de565b604082019050919050565b6200066e81620007fa565b82525050565b60006040820190506200068b6000830185620005f3565b6200069a6020830184620005f3565b9392505050565b600060a082019050620006b8600083018862000604565b620006c7602083018762000604565b620006d6604083018662000604565b620006e5606083018562000663565b620006f46080830184620005f3565b9695505050505050565b60006020820190508181036000830152620007198162000615565b9050919050565b600060208201905081810360008301526200073b816200063c565b9050919050565b600060408201905062000759600083018562000663565b62000768602083018462000663565b9392505050565b600082825260208201905092915050565b60006200078d82620007da565b9050919050565b6000620007a182620007da565b9050919050565b6000819050919050565b6000620007bf8262000780565b9050919050565b6000620007d38262000794565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060028204905060018216806200081d57607f821691505b602082108114156200083457620008336200083a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b6200093881620007b2565b81146200094457600080fd5b50565b6200095281620007c6565b81146200095e57600080fd5b50565b60805160a05160c05160601c60e05161010051610120516101405160601c61759e620009d06000396000818161253b01528181613335015261343f015260006136c701526000613709015260006136e80152600061361d015260006136730152600061369c015261759e6000f3fe6080604052600436106102555760003560e01c806397c3d33411610139578063da95691a116100b6578063ea0217cf1161007a578063ea0217cf146109e3578063eb9019d414610a0c578063ece40cc114610a49578063f8ce560a14610a72578063fc0c546a14610aaf578063fe0d94c114610ada5761029b565b8063da95691a146108ea578063dd4e2ba514610927578063ddf0b00914610952578063deaaa7cc1461097b578063e23a9a52146109a65761029b565b8063c01f9e37116100fd578063c01f9e37146107f1578063c28bc2fa1461082e578063c59057e414610857578063d33219b414610894578063da35c664146108bf5761029b565b806397c3d3341461070a578063a7713a7014610735578063a890c91014610760578063ab58fb8e14610789578063b58131b0146107c65761029b565b8063328dd982116101d2578063438596321161019657806343859632146105c257806354fd4d50146105ff578063567813881461062a57806370b0f660146106675780637b3c71d3146106905780637d5e81e2146106cd5761029b565b8063328dd982146104b45780633932abb1146104f45780633bccf4fd1461051f5780633e4f49e61461055c57806340e58ee5146105995761029b565b8063160cbed711610219578063160cbed7146103a257806317977c61146103df57806324bc1a641461041c5780632656227d146104475780632d63f693146104775761029b565b8063013cf08b146102a057806301ffc9a7146102e657806302a251a31461032357806306f3f9e61461034e57806306fdde03146103775761029b565b3661029b573073ffffffffffffffffffffffffffffffffffffffff16610279610af6565b73ffffffffffffffffffffffffffffffffffffffff161461029957600080fd5b005b600080fd5b3480156102ac57600080fd5b506102c760048036038101906102c291906155a5565b610b05565b6040516102dd9a99989796959493929190616612565b60405180910390f35b3480156102f257600080fd5b5061030d60048036038101906103089190615553565b610c92565b60405161031a919061610f565b60405180910390f35b34801561032f57600080fd5b50610338610ca4565b6040516103459190616547565b60405180910390f35b34801561035a57600080fd5b50610375600480360381019061037091906155a5565b610cb3565b005b34801561038357600080fd5b5061038c610d3b565b604051610399919061624a565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c491906152a4565b610dcd565b6040516103d69190616547565b60405180910390f35b3480156103eb57600080fd5b50610406600480360381019061040191906151d3565b6110f1565b6040516104139190616547565b60405180910390f35b34801561042857600080fd5b50610431611109565b60405161043e9190616547565b60405180910390f35b610461600480360381019061045c91906152a4565b611125565b60405161046e9190616547565b60405180910390f35b34801561048357600080fd5b5061049e600480360381019061049991906155a5565b6112f0565b6040516104ab9190616547565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d691906155a5565b61135e565b6040516104eb94939291906160ae565b60405180910390f35b34801561050057600080fd5b5061050961161b565b6040516105169190616547565b60405180910390f35b34801561052b57600080fd5b50610546600480360381019061054191906156db565b61162a565b6040516105539190616547565b60405180910390f35b34801561056857600080fd5b50610583600480360381019061057e91906155a5565b6116b4565b604051610590919061622f565b60405180910390f35b3480156105a557600080fd5b506105c060048036038101906105bb91906155a5565b6116c6565b005b3480156105ce57600080fd5b506105e960048036038101906105e491906155f7565b611a5e565b6040516105f6919061610f565b60405180910390f35b34801561060b57600080fd5b50610614611acc565b604051610621919061624a565b60405180910390f35b34801561063657600080fd5b50610651600480360381019061064c9190615633565b611b09565b60405161065e9190616547565b60405180910390f35b34801561067357600080fd5b5061068e600480360381019061068991906155a5565b611b3a565b005b34801561069c57600080fd5b506106b760048036038101906106b2919061566f565b611bc2565b6040516106c49190616547565b60405180910390f35b3480156106d957600080fd5b506106f460048036038101906106ef919061534f565b611c2a565b6040516107019190616547565b60405180910390f35b34801561071657600080fd5b5061071f611ca0565b60405161072c9190616547565b60405180910390f35b34801561074157600080fd5b5061074a611ca9565b6040516107579190616547565b60405180910390f35b34801561076c57600080fd5b506107876004803603810190610782919061557c565b611cb3565b005b34801561079557600080fd5b506107b060048036038101906107ab91906155a5565b611d3b565b6040516107bd9190616547565b60405180910390f35b3480156107d257600080fd5b506107db611e17565b6040516107e89190616547565b60405180910390f35b3480156107fd57600080fd5b50610818600480360381019061081391906155a5565b611e26565b6040516108259190616547565b60405180910390f35b34801561083a57600080fd5b5061085560048036038101906108509190615238565b611e94565b005b34801561086357600080fd5b5061087e600480360381019061087991906152a4565b611f66565b60405161088b9190616547565b60405180910390f35b3480156108a057600080fd5b506108a9611fa2565b6040516108b69190615f09565b60405180910390f35b3480156108cb57600080fd5b506108d4611fcc565b6040516108e19190616547565b60405180910390f35b3480156108f657600080fd5b50610911600480360381019061090c9190615412565b611fd2565b60405161091e9190616547565b60405180910390f35b34801561093357600080fd5b5061093c612009565b604051610949919061624a565b60405180910390f35b34801561095e57600080fd5b50610979600480360381019061097491906155a5565b612046565b005b34801561098757600080fd5b506109906122fb565b60405161099d919061612a565b60405180910390f35b3480156109b257600080fd5b506109cd60048036038101906109c891906155f7565b61231f565b6040516109da919061652c565b60405180910390f35b3480156109ef57600080fd5b50610a0a6004803603810190610a0591906155a5565b612403565b005b348015610a1857600080fd5b50610a336004803603810190610a2e91906151fc565b61248b565b604051610a409190616547565b60405180910390f35b348015610a5557600080fd5b50610a706004803603810190610a6b91906155a5565b61249f565b005b348015610a7e57600080fd5b50610a996004803603810190610a9491906155a5565b612527565b604051610aa69190616547565b60405180910390f35b348015610abb57600080fd5b50610ac4612539565b604051610ad19190616214565b60405180910390f35b610af46004803603810190610aef91906155a5565b61255d565b005b6000610b00612812565b905090565b6000806000806000806000806000808a9950610b208b611d3b565b9750610b2b8b6112f0565b9650610b368b611e26565b95506000600560008d815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1699508060050154955080600601549450806007015493506000610b968d6116b4565b905060026007811115610bd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816007811115610c0b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b149350600780811115610c47577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816007811115610c80577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14925050509193959799509193959799565b6000610c9d8261283c565b9050919050565b6000610cae6128b6565b905090565b610cbb610af6565b73ffffffffffffffffffffffffffffffffffffffff16610cd96128c0565b73ffffffffffffffffffffffffffffffffffffffff1614610d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d269061628c565b60405180910390fd5b610d38816128c8565b50565b606060008054610d4a90616c8c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7690616c8c565b8015610dc35780601f10610d9857610100808354040283529160200191610dc3565b820191906000526020600020905b815481529060010190602001808311610da657829003601f168201915b5050505050905090565b600080610ddc86868686611f66565b905060046007811115610e18577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b610e21826116b4565b6007811115610e59577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e909061644c565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b815260040160206040518083038186803b158015610f0357600080fd5b505afa158015610f17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3b91906155ce565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b8152600401610fa1959493929190615fd0565b60206040518083038186803b158015610fb957600080fd5b505afa158015610fcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff1919061552a565b6008600084815260200190815260200160002081905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b815260040161106e96959493929190616038565b600060405180830381600087803b15801561108857600080fd5b505af115801561109c573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28928282426110ce919061699d565b6040516110dc9291906166ae565b60405180910390a18192505050949350505050565b600a6020528060005260406000206000915090505481565b600061112060014361111b9190616abc565b612527565b905090565b60008061113486868686611f66565b90506000611141826116b4565b90506004600781111561117d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160078111156111b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14806112325750600560078111156111f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816007811115611230577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b145b611271576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112689061644c565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f826040516112ce9190616547565b60405180910390a16112e3828888888861295d565b8192505050949350505050565b600061134d600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050612971565b67ffffffffffffffff169050919050565b6060806060806000600560008781526020019081526020016000209050806001018160020182600301836004018380548060200260200160405190810160405280929190818152602001828054801561140c57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116113c2575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561145e57602002820191906000526020600020905b81548152602001906001019080831161144a575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b828210156115325783829060005260206000200180546114a590616c8c565b80601f01602080910402602001604051908101604052809291908181526020018280546114d190616c8c565b801561151e5780601f106114f35761010080835404028352916020019161151e565b820191906000526020600020905b81548152906001019060200180831161150157829003601f168201915b505050505081526020019060010190611486565b50505050915080805480602002602001604051908101604052809291908181526020016000905b8282101561160557838290600052602060002001805461157890616c8c565b80601f01602080910402602001604051908101604052809291908181526020018280546115a490616c8c565b80156115f15780601f106115c6576101008083540402835291602001916115f1565b820191906000526020600020905b8154815290600101906020018083116115d457829003601f168201915b505050505081526020019060010190611559565b5050505090509450945094509450509193509193565b600061162561297f565b905090565b60008061168b6116837f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f898960405160200161166893929190616198565b60405160208183030381529060405280519060200120612989565b8686866129a3565b90506116a8878288604051806020016040528060008152506129ce565b91505095945050505050565b60006116bf82612b6e565b9050919050565b60006005600083815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166117206128c0565b73ffffffffffffffffffffffffffffffffffffffff1614806117815750611745611e17565b61177f8260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660014361177a9190616abc565b61248b565b105b6117c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b7906164ec565b60405180910390fd5b611a598160010180548060200260200160405190810160405280929190818152602001828054801561184757602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116117fd575b50505050508260020180548060200260200160405190810160405280929190818152602001828054801561189a57602002820191906000526020600020905b815481526020019060010190808311611886575b5050505050611a4f84600301805480602002602001604051908101604052809291908181526020016000905b828210156119725783829060005260206000200180546118e590616c8c565b80601f016020809104026020016040519081016040528092919081815260200182805461191190616c8c565b801561195e5780601f106119335761010080835404028352916020019161195e565b820191906000526020600020905b81548152906001019060200180831161194157829003601f168201915b5050505050815260200190600101906118c6565b5050505085600401805480602002602001604051908101604052809291908181526020016000905b82821015611a465783829060005260206000200180546119b990616c8c565b80601f01602080910402602001604051908101604052809291908181526020018280546119e590616c8c565b8015611a325780601f10611a0757610100808354040283529160200191611a32565b820191906000526020600020905b815481529060010190602001808311611a1557829003601f168201915b50505050508152602001906001019061199a565b50505050612dac565b8460090154612fcc565b505050565b60006005600084815260200190815260200160002060080160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16905092915050565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b600080611b146128c0565b9050611b31848285604051806020016040528060008152506129ce565b91505092915050565b611b42610af6565b73ffffffffffffffffffffffffffffffffffffffff16611b606128c0565b73ffffffffffffffffffffffffffffffffffffffff1614611bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bad9061628c565b60405180910390fd5b611bbf81612fe4565b50565b600080611bcd6128c0565b9050611c1f86828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506129ce565b915050949350505050565b600060096000815480929190611c3f90616cef565b9190505550600954600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611c9685858585613029565b9050949350505050565b60006064905090565b6000600654905090565b611cbb610af6565b73ffffffffffffffffffffffffffffffffffffffff16611cd96128c0565b73ffffffffffffffffffffffffffffffffffffffff1614611d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d269061628c565b60405180910390fd5b611d38816130ca565b50565b600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c443560086000868152602001908152602001600020546040518263ffffffff1660e01b8152600401611dac919061612a565b60206040518083038186803b158015611dc457600080fd5b505afa158015611dd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfc91906155ce565b905060018114611e0c5780611e0f565b60005b915050919050565b6000611e21613169565b905090565b6000611e83600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050612971565b67ffffffffffffffff169050919050565b611e9c610af6565b73ffffffffffffffffffffffffffffffffffffffff16611eba6128c0565b73ffffffffffffffffffffffffffffffffffffffff1614611f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f079061628c565b60405180910390fd5b611f5f8483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505085613173565b5050505050565b600084848484604051602001611f7f9493929190615f76565b6040516020818303038152906040528051906020012060001c9050949350505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60095481565b6000611fe9611fdf6128c0565b87878787876131a2565b611ffe8686611ff88787612dac565b85611c2a565b905095945050505050565b60606040518060400160405280601a81526020017f737570706f72743d627261766f2671756f72756d3d627261766f000000000000815250905090565b60006005600083815260200190815260200160002090506122f6816001018054806020026020016040519081016040528092919081815260200182805480156120e457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161209a575b50505050508260020180548060200260200160405190810160405280929190818152602001828054801561213757602002820191906000526020600020905b815481526020019060010190808311612123575b50505050506122ec84600301805480602002602001604051908101604052809291908181526020016000905b8282101561220f57838290600052602060002001805461218290616c8c565b80601f01602080910402602001604051908101604052809291908181526020018280546121ae90616c8c565b80156121fb5780601f106121d0576101008083540402835291602001916121fb565b820191906000526020600020905b8154815290600101906020018083116121de57829003601f168201915b505050505081526020019060010190612163565b5050505085600401805480602002602001604051908101604052809291908181526020016000905b828210156122e357838290600052602060002001805461225690616c8c565b80601f016020809104026020016040519081016040528092919081815260200182805461228290616c8c565b80156122cf5780601f106122a4576101008083540402835291602001916122cf565b820191906000526020600020905b8154815290600101906020018083116122b257829003601f168201915b505050505081526020019060010190612237565b50505050612dac565b8460090154610dcd565b505050565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b61232761496a565b6005600084815260200190815260200160002060080160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff1681525050905092915050565b61240b610af6565b73ffffffffffffffffffffffffffffffffffffffff166124296128c0565b73ffffffffffffffffffffffffffffffffffffffff161461247f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124769061628c565b60405180910390fd5b612488816132a9565b50565b60006124978383613331565b905092915050565b6124a7610af6565b73ffffffffffffffffffffffffffffffffffffffff166124c56128c0565b73ffffffffffffffffffffffffffffffffffffffff161461251b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125129061628c565b60405180910390fd5b612524816133e6565b50565b60006125328261342b565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600060056000838152602001908152602001600020905061280d816001018054806020026020016040519081016040528092919081815260200182805480156125fb57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116125b1575b50505050508260020180548060200260200160405190810160405280929190818152602001828054801561264e57602002820191906000526020600020905b81548152602001906001019080831161263a575b505050505061280384600301805480602002602001604051908101604052809291908181526020016000905b8282101561272657838290600052602060002001805461269990616c8c565b80601f01602080910402602001604051908101604052809291908181526020018280546126c590616c8c565b80156127125780601f106126e757610100808354040283529160200191612712565b820191906000526020600020905b8154815290600101906020018083116126f557829003601f168201915b50505050508152602001906001019061267a565b5050505085600401805480602002602001604051908101604052809291908181526020016000905b828210156127fa57838290600052602060002001805461276d90616c8c565b80601f016020809104026020016040519081016040528092919081815260200182805461279990616c8c565b80156127e65780601f106127bb576101008083540402835291602001916127e6565b820191906000526020600020905b8154815290600101906020018083116127c957829003601f168201915b50505050508152602001906001019061274e565b50505050612dac565b8460090154611125565b505050565b6000600760009054906101000a900