diff --git a/contracts/solidity/GovRewardV2.sol b/contracts/solidity/GovRewardV2.sol new file mode 100644 index 0000000000..fd32447008 --- /dev/null +++ b/contracts/solidity/GovRewardV2.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library TransferHelper { + function safeTransfer(address token, address to, uint256 value) internal { + // bytes4(keccak256(bytes('transfer(address,uint256)'))); + (bool success, bytes memory data) = token.call( + abi.encodeWithSelector(0xa9059cbb, to, value) + ); + require( + success && (data.length == 0 || abi.decode(data, (bool))), + "safeTransfer: transfer failed" + ); + } + + function safeTransferETH(address to, uint256 value) internal { + (bool success, ) = to.call{value: value}(new bytes(0)); + require(success, "safeTransferETH: ETH transfer failed"); + } +} + +interface IGovernance { + // get current consensus group + function getCurrentConsensus() external view returns (address[] memory); +} + +interface IGovReward { + function getMiners() external view returns (address[] memory); + + function withdraw() external; +} + +contract GovReward is IGovReward { + // governance contact + address public constant governance = + 0x1212000000000000000000000000000000000001; + + receive() external payable {} + + modifier onlyGov() { + require(msg.sender == governance, "Not governance"); + _; + } + + function getMiners() external view override returns (address[] memory) { + return IGovernance(governance).getCurrentConsensus(); + } + + function withdraw() external onlyGov { + if (address(this).balance > 0) { + TransferHelper.safeTransferETH(governance, address(this).balance); + } + } +} diff --git a/contracts/solidity/GovernanceV2.sol b/contracts/solidity/GovernanceV2.sol new file mode 100644 index 0000000000..6c02a8c945 --- /dev/null +++ b/contracts/solidity/GovernanceV2.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; + +interface IGovernanceV2 { + event Register(address candidate); + event Exit(address candidate); + event Vote(address voter, address to, uint amount); + event Revoke(address voter, address from, uint amount); + event VoterClaim(address voter, uint reward); + event CandidateWithdraw(address candidate, uint amount); + event Persist(address[] validators); + + // register to be a candidate with gas + function registerCandidate(uint shareRate) external payable; + + // exit candidates and wait for withdraw + function exitCandidate() external; + + // withdraw register fee after 2 epoch + function withdrawRegisterFee() external; + + // vote with gas, only 1 target is allowed + function vote(address to) external payable; + + // revoke votes and claim rewards + function revokeVote() external; + + // only claim rewards + function claimReward() external; + + // get consensus group members + function getCurrentConsensus() external view returns (address[] memory); + + // compute and update cached consensus group + function onPersist() external; +} + +interface IGovReward { + function withdraw() external; +} + +contract GovernanceV2 is IGovernanceV2 { + using EnumerableSet for EnumerableSet.AddressSet; + + // GovReward contract + address public constant govReward = + 0x1212000000000000000000000000000000000003; + address public constant sysCall = + 0xffffFFFfFFffffffffffffffFfFFFfffFFFfFFfE; + uint public constant scaleFactor = 10 ** 18; + + uint public consensusSize; + // the min balance for voting + uint public minVoteAmount; + // register fee + uint public registerFee; + // duration of an epoch (in blocks) + uint public epochDuration; + + // candidate list + EnumerableSet.AddressSet internal candidateList; + // settings about how much reward given to voter + mapping(address => uint) public shareRateOf; + // the height when exit happens + mapping(address => uint) public exitHeightOf; + // the left register fee to exit + mapping(address => uint) public candidateBalanceOf; + + // candidate=>amount + mapping(address => uint) public receivedVotes; + // voter=>candidate + mapping(address => address) public votedTo; + // voter=>amount + mapping(address => uint) public votedAmount; + + // the block height when current epoch starts + uint public currentEpochStartHeight; + // the current group of block validators + address[] public currentConsensus; + + // candidate=>total + mapping(address => uint) public candidateGasPerVote; + // voter=>number + mapping(address => uint) public voterGasPerVote; + // voter=>height + mapping(address => uint) public voteHeight; + // candidate=>height=>number + mapping(address => mapping(uint => uint)) public epochStartGasPerVote; + + receive() external payable { + require(msg.sender == govReward, "side call not allowed"); + address[] memory validators = currentConsensus; + uint length = validators.length; + for (uint i = 0; i < length; i++) { + candidateGasPerVote[validators[i]] += + (msg.value * shareRateOf[validators[i]] * scaleFactor) / + consensusSize / + 1000 / + receivedVotes[validators[i]]; + _safeTransferETH( + validators[i], + (msg.value * (1000 - shareRateOf[validators[i]])) / + consensusSize / + 1000 + ); + } + } + + function getCandidates() public view returns (address[] memory) { + return candidateList.values(); + } + + function registerCandidate(uint shareRate) external payable { + require(msg.value >= registerFee, "insufficient amount"); + require(shareRate < 1000, "invalid rate"); + require(!candidateList.contains(msg.sender), "candidate exists"); + require(exitHeightOf[msg.sender] == 0, "left not claimed"); + candidateList.add(msg.sender); + + // record share rate and balance + shareRateOf[msg.sender] = shareRate; + candidateBalanceOf[msg.sender] = msg.value; + emit Register(msg.sender); + } + + function exitCandidate() external { + require(candidateList.contains(msg.sender), "candidate not exists"); + // remove candidate list, balance still locked + candidateList.remove(msg.sender); + exitHeightOf[msg.sender] = block.number; + emit Exit(msg.sender); + } + + function withdrawRegisterFee() external { + // require 2 epochs to exit candidate list + // NOTE: suppose epoch change always happens in time + require( + exitHeightOf[msg.sender] > 0 && + block.number > exitHeightOf[msg.sender] + 2 * epochDuration, + "withdraw not allowed" + ); + + // send back balance + uint amount = candidateBalanceOf[msg.sender]; + delete candidateBalanceOf[msg.sender]; + delete exitHeightOf[msg.sender]; + delete shareRateOf[msg.sender]; + _safeTransferETH(msg.sender, amount); + emit CandidateWithdraw(msg.sender, amount); + } + + function vote(address candidateTo) external payable { + require(msg.value >= minVoteAmount, "insufficient amount"); + require(candidateList.contains(candidateTo), "candidate not allowed"); + address votedCandidate = votedTo[msg.sender]; + require( + votedCandidate == candidateTo || votedCandidate == address(0), + "only one choice is allowed" + ); + + // settle reward here + if (votedCandidate != address(0)) { + _settleReward(msg.sender, votedCandidate); + } else { + // record tag value + votedTo[msg.sender] = candidateTo; + voterGasPerVote[msg.sender] = candidateGasPerVote[candidateTo]; + } + + // update votes + votedAmount[msg.sender] += msg.value; + receivedVotes[candidateTo] += msg.value; + // NOTE: the left reward in the first epoch of first vote will be unclaimable. + if (votedCandidate == address(0)) { + voteHeight[msg.sender] = block.number; + } + + emit Vote(msg.sender, candidateTo, msg.value); + } + + function revokeVote() external { + address candidateFrom = votedTo[msg.sender]; + uint amount = votedAmount[msg.sender]; + require( + candidateFrom != address(0) && amount > 0, + "revoke not allowed" + ); + + // settle reward here + _settleReward(msg.sender, candidateFrom); + + // update votes + receivedVotes[candidateFrom] -= amount; + delete votedTo[msg.sender]; + delete votedAmount[msg.sender]; + + // delete tag value + delete voterGasPerVote[msg.sender]; + delete voteHeight[msg.sender]; + + _safeTransferETH(msg.sender, amount); + emit Revoke(msg.sender, candidateFrom, amount); + } + + function claimReward() external { + address votedCandidate = votedTo[msg.sender]; + require(votedCandidate != address(0), "claim not allowed"); + _settleReward(msg.sender, votedCandidate); + } + + function onPersist() external { + // NOTE: suppose onPersist always happens at the beginning of every block + require(msg.sender == sysCall, "side call not allowed"); + // only settle validator reward if there is no epoch change + IGovReward(govReward).withdraw(); + if (block.number < currentEpochStartHeight + epochDuration) return; + + // update tag values + address[] memory candidates = candidateList.values(); + uint length = candidates.length; + for (uint i = 0; i < length; i++) { + epochStartGasPerVote[candidates[i]][ + currentEpochStartHeight / epochDuration + ] = candidateGasPerVote[candidates[i]]; + } + + // compute and update consensus + currentEpochStartHeight = block.number; + currentConsensus = _computeConsensus(); + emit Persist(currentConsensus); + } + + function getCurrentConsensus() public view returns (address[] memory) { + return currentConsensus; + } + + function _settleReward(address voter, address candidate) internal { + // NOTE: suppose onPersist always happens at the beginning of every block, then latestGasPerVote is always the latest + uint height = voteHeight[voter]; + uint lastGasPerVote = voterGasPerVote[voter]; + uint latestGasPerVote = candidateGasPerVote[candidate]; + if (currentEpochStartHeight <= height) return; + + // NOTE: suppose epoch change always happens at the beginning of a block, then vote in that block should wait another epoch to farm reward + uint voteEpochEndGasPerVote = epochStartGasPerVote[candidate][ + (height - 1) / epochDuration + 1 + ]; + if (voteEpochEndGasPerVote > lastGasPerVote) { + lastGasPerVote = voteEpochEndGasPerVote; + } + + uint reward = (votedAmount[voter] * + (latestGasPerVote - lastGasPerVote)) / scaleFactor; + voterGasPerVote[voter] = latestGasPerVote; + _safeTransferETH(voter, reward); + emit VoterClaim(voter, reward); + } + + function _safeTransferETH(address to, uint value) internal { + (bool success, ) = to.call{value: value}(new bytes(0)); + require(success, "safeTransferETH: ETH transfer failed"); + } + + function _computeConsensus() internal view returns (address[] memory) { + // build up a votes array + address[] memory candidates = getCandidates(); + uint length = candidates.length; + uint[] memory votes = new uint[](length); + for (uint i = 0; i < length; i++) { + votes[i] = receivedVotes[candidates[i]]; + } + + // sort top consensusSize based on votes + _topK(candidates, votes, consensusSize); + + // return the first consensusSize candidates as consensus list + address[] memory consensus = new address[](consensusSize); + for (uint i = 0; i < consensusSize; i++) { + consensus[i] = candidates[i]; + } + return consensus; + } + + function _topK( + address[] memory candidates, + uint[] memory votes, + uint k + ) internal pure { + uint length = candidates.length; + for (int j = int(k) / 2 - 1; j >= 0; j--) { + _heapDown(candidates, votes, uint(j), k); + } + for (uint i = k; i < length; i++) { + if (votes[i] > votes[0]) { + votes[0] = votes[i]; + candidates[0] = candidates[i]; + _heapDown(candidates, votes, 0, k); + } + } + } + + function _heapDown( + address[] memory candidates, + uint[] memory votes, + uint j, + uint k + ) internal pure { + uint i = 2 * j + 1; + while (i < k) { + if (i + 1 < k && votes[i] > votes[i + 1]) { + i += 1; + } + if (votes[i] > votes[j]) { + break; + } + (votes[i], votes[j]) = (votes[j], votes[i]); + (candidates[i], candidates[j]) = (candidates[j], candidates[i]); + j = i; + i = i * 2 + 1; + } + } +} diff --git a/genesis.json b/genesis.json index 0f2cbe7a1e..646f38f812 100644 --- a/genesis.json +++ b/genesis.json @@ -25,7 +25,7 @@ "0xnode6", "0xnode7" ], - "coinbase": "0x1212100000000000000000000000000000000001" + "coinbase": "0x1212000000000000000000000000000000000003" } }, "difficulty": "1", @@ -34,19 +34,24 @@ "alloc": { "0x1212000000000000000000000000000000000000": { "balance": "0", - "code": "0x6080604052600436106100705760003560e01c806389dc5c841161004e57806389dc5c84146101045780639623609d1461012057806399a88ec414610133578063f3b7dead1461015357600080fd5b8063204e1c7a14610075578063701b70ac146100b25780637eff275e146100e2575b600080fd5b34801561008157600080fd5b506100956100903660046108bd565b610173565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100be57600080fd5b506100d26100cd3660046108bd565b610204565b60405190151581526020016100a9565b3480156100ee57600080fd5b506101026100fd3660046108e1565b6102db565b005b34801561011057600080fd5b50610095600361090960911b0181565b61010261012e366004610961565b61041f565b34801561013f57600080fd5b5061010261014e3660046108e1565b61055b565b34801561015f57600080fd5b5061009561016e3660046108bd565b61061e565b6000806000836001600160a01b031660405161019990635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101d4576040519150601f19603f3d011682016040523d82523d6000602084013e6101d9565b606091505b5091509150816101e857600080fd5b808060200190518101906101fc9190610a1b565b949350505050565b600080600361090960911b016001600160a01b0316631633da6e6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561024d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526102759190810190610a38565b905060005b81518110156102d15781818151811061029557610295610aea565b60200260200101516001600160a01b0316846001600160a01b0316036102bf575060019392505050565b806102c981610b16565b91505061027a565b5060009392505050565b604080516001600160a01b0380851660208301528316918101919091527f1336f249f9818d347c2448357332e4151be15f64340d7021eac363d7e04f1084906060016040516020818303038152906040528051906020012061033c33610204565b6103615760405162461bcd60e51b815260040161035890610b2f565b60405180910390fd5b61036b8282610644565b61037582826106a2565b15610419576040516308f2839760e41b81526001600160a01b038481166004830152851690638f283970906024015b600060405180830381600087803b1580156103be57600080fd5b505af11580156103d2573d6000803e3d6000fd5b505060408051858152602081018590527ff5aa3d6492eaf1a4d6787c5bd36e8ec61c245d4af2fd1fd387e387a50de9f8c5935001905060405180910390a1610419826107bd565b50505050565b7fe739b9109d83c1c6d0d640fe9ed476fc5862a6de5483b00678a3fffa7a2be2f683838360405160200161045593929190610b98565b6040516020818303038152906040528051906020012061047433610204565b6104905760405162461bcd60e51b815260040161035890610b2f565b61049a8282610644565b6104a482826106a2565b156105545760405163278f794360e11b81526001600160a01b03861690634f1ef2869034906104d99088908890600401610bcd565b6000604051808303818588803b1580156104f257600080fd5b505af1158015610506573d6000803e3d6000fd5b505060408051868152602081018690527ff5aa3d6492eaf1a4d6787c5bd36e8ec61c245d4af2fd1fd387e387a50de9f8c594500191506105439050565b60405180910390a1610554826107bd565b5050505050565b604080516001600160a01b0380851660208301528316918101919091527ef2f7c15cbe06c8d94597cd91fd7f3369eae842359235712def5584f8d270cd90606001604051602081830303815290604052805190602001206105bb33610204565b6105d75760405162461bcd60e51b815260040161035890610b2f565b6105e18282610644565b6105eb82826106a2565b1561041957604051631b2ce7f360e11b81526001600160a01b038481166004830152851690633659cfe6906024016103a4565b6000806000836001600160a01b0316604051610199906303e1469160e61b815260040190565b6000828152602081815260408083203380855290835292819020849055805192835290820184905281018290527f61699483e2a58589628399a22e34da872b583143ab99b3245ba6dacf4974d2e39060600160405180910390a15050565b600080600361090960911b016001600160a01b0316631633da6e6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156106eb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107139190810190610a38565b90506000805b82518110156107975784600080888152602001908152602001600020600085848151811061074957610749610aea565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205403610785578161078181610b16565b9250505b8061078f81610b16565b915050610719565b506003825160026107a89190610bf1565b6107b29190610c08565b109150505b92915050565b6000600361090960911b016001600160a01b0316631633da6e6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610805573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261082d9190810190610a38565b905060005b81518110156108a057600080848152602001908152602001600020600083838151811061086157610861610aea565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060009055808061089890610b16565b915050610832565b505050565b6001600160a01b03811681146108ba57600080fd5b50565b6000602082840312156108cf57600080fd5b81356108da816108a5565b9392505050565b600080604083850312156108f457600080fd5b82356108ff816108a5565b9150602083013561090f816108a5565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156109595761095961091a565b604052919050565b60008060006060848603121561097657600080fd5b8335610981816108a5565b9250602084810135610992816108a5565b9250604085013567ffffffffffffffff808211156109af57600080fd5b818701915087601f8301126109c357600080fd5b8135818111156109d5576109d561091a565b6109e7601f8201601f19168501610930565b915080825288848285010111156109fd57600080fd5b80848401858401376000848284010152508093505050509250925092565b600060208284031215610a2d57600080fd5b81516108da816108a5565b60006020808385031215610a4b57600080fd5b825167ffffffffffffffff80821115610a6357600080fd5b818501915085601f830112610a7757600080fd5b815181811115610a8957610a8961091a565b8060051b9150610a9a848301610930565b8181529183018401918481019088841115610ab457600080fd5b938501935b83851015610ade5784519250610ace836108a5565b8282529385019390850190610ab9565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201610b2857610b28610b00565b5060010190565b6020808252600990820152682737ba1026b4b732b960b91b604082015260600190565b6000815180845260005b81811015610b7857602081850181015186830182015201610b5c565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b03848116825283166020820152606060408201819052600090610bc490830184610b52565b95945050505050565b6001600160a01b03831681526040602082018190526000906101fc90830184610b52565b80820281158282048414176107b7576107b7610b00565b600082610c2557634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220ded2ab488883403c3d775d09a6cb9303b9690144976a78d1bd50a51d43b7e4e064736f6c63430008120033" + "code": "0x608060405260043610610212575f3560e01c806370c647d5116101175780639f9d7f811161009f578063cb924df61161006e578063cb924df6146107f1578063ccd668e51461082d578063d8a05cec14610857578063e406fd2a14610881578063ec52fd5c1461089757610246565b80639f9d7f8114610725578063a70b9f0c1461074f578063bad69ad014610779578063c19eb73e146107b557610246565b806379885fd1116100e657806379885fd114610643578063829965cc1461067f57806389dc5c84146106a9578063902bdc26146106d35780639690293b1461070f57610246565b806370c647d51461058957806371785ab9146105c557806374a6b278146105ef578063776892611461061957610246565b806337409c6a1161019a5780634d21e426116101695780634d21e426146104a35780634dc47d34146104df5780635750af771461051b5780636bed4df5146105575780636dd7d8ea1461056d57610246565b806337409c6a146103ff5780633b4866c71461043b578063403b09931461045157806343c14b221461048d57610246565b80630b2a85ea116101e15780630b2a85ea1461030457806319e6e158146103205780631f26f2561461035c578063312ec75c14610386578063347b06d8146103c257610246565b8063038a35381461024a57806306a49fce14610274578063090248641461029e5780630ac1cc20146102da57610246565b36610246573460095f6102236108d3565b81526020019081526020015f205f82825461023e9190612e16565b925050819055005b5f80fd5b348015610255575f80fd5b5061025e6108e8565b60405161026b9190612e58565b60405180910390f35b34801561027f575f80fd5b506102886108ee565b6040516102959190612f58565b60405180910390f35b3480156102a9575f80fd5b506102c460048036038101906102bf9190612fa6565b6108ff565b6040516102d19190612e58565b60405180910390f35b3480156102e5575f80fd5b506102ee610914565b6040516102fb9190612e58565b60405180910390f35b61031e60048036038101906103199190612ffb565b61091a565b005b34801561032b575f80fd5b5061034660048036038101906103419190612ffb565b610ba8565b6040516103539190612e58565b60405180910390f35b348015610367575f80fd5b50610370610bbd565b60405161037d9190612e58565b60405180910390f35b348015610391575f80fd5b506103ac60048036038101906103a79190613026565b610bc3565b6040516103b99190612e58565b60405180910390f35b3480156103cd575f80fd5b506103e860048036038101906103e39190613026565b610bee565b6040516103f6929190613073565b60405180910390f35b34801561040a575f80fd5b5061042560048036038101906104209190613026565b610cb4565b6040516104329190612e58565b60405180910390f35b348015610446575f80fd5b5061044f610d0a565b005b34801561045c575f80fd5b5061047760048036038101906104729190613026565b61125a565b6040516104849190612e58565b60405180910390f35b348015610498575f80fd5b506104a161127a565b005b3480156104ae575f80fd5b506104c960048036038101906104c49190612fa6565b6115e0565b6040516104d69190612e58565b60405180910390f35b3480156104ea575f80fd5b5061050560048036038101906105009190612ffb565b6115f5565b6040516105129190612e58565b60405180910390f35b348015610526575f80fd5b50610541600480360381019061053c9190612ffb565b61160a565b60405161054e9190612e58565b60405180910390f35b348015610562575f80fd5b5061056b61161f565b005b61058760048036038101906105829190612fa6565b6118ff565b005b348015610594575f80fd5b506105af60048036038101906105aa9190612fa6565b611e46565b6040516105bc9190612e58565b60405180910390f35b3480156105d0575f80fd5b506105d9611e5b565b6040516105e69190612e58565b60405180910390f35b3480156105fa575f80fd5b50610603611ed3565b6040516106109190612e58565b60405180910390f35b348015610624575f80fd5b5061062d611ed8565b60405161063a9190612e58565b60405180910390f35b34801561064e575f80fd5b5061066960048036038101906106649190613026565b611ede565b604051610676919061309a565b60405180910390f35b34801561068a575f80fd5b50610693611f1b565b6040516106a09190612e58565b60405180910390f35b3480156106b4575f80fd5b506106bd611f21565b6040516106ca919061309a565b60405180910390f35b3480156106de575f80fd5b506106f960048036038101906106f49190612fa6565b611f39565b6040516107069190612e58565b60405180910390f35b34801561071a575f80fd5b50610723611f4e565b005b348015610730575f80fd5b5061073961208f565b6040516107469190612f58565b60405180910390f35b34801561075a575f80fd5b50610763612130565b6040516107709190612e58565b60405180910390f35b348015610784575f80fd5b5061079f600480360381019061079a9190612fa6565b612136565b6040516107ac9190612e58565b60405180910390f35b3480156107c0575f80fd5b506107db60048036038101906107d691906130b3565b61214b565b6040516107e8919061309a565b60405180910390f35b3480156107fc575f80fd5b5061081760048036038101906108129190613026565b612193565b6040516108249190612e58565b60405180910390f35b348015610838575f80fd5b506108416121b3565b60405161084e9190612e58565b60405180910390f35b348015610862575f80fd5b5061086b6108d3565b6040516108789190612e58565b60405180910390f35b34801561088c575f80fd5b506108956121bc565b005b3480156108a2575f80fd5b506108bd60048036038101906108b89190613026565b6122f6565b6040516108ca9190612e58565b60405180910390f35b5f60016005546108e391906130f1565b905090565b60015481565b60606108fa6007612316565b905090565b600e602052805f5260405f205f915090505481565b60025481565b600254341461095e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109559061317e565b60405180910390fd5b6103e881106109a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610999906131e6565b60405180910390fd5b6109b633600761233590919063ffffffff16565b156109f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ed9061324e565b60405180910390fd5b610a0a33600761236290919063ffffffff16565b50600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90555f610a5461238f565b905080600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555081600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055503460105f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060018111610b2a575f610b2c565b805b60115f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055507feeda149c76076b34d4b9d8896c2f7efc0d33d1c7b53ea3c5db490d64613f603a33604051610b9c919061309a565b60405180910390a15050565b600a602052805f5260405f205f915090505481565b60065481565b6016602052815f5260405f208181548110610bdc575f80fd5b905f5260205f20015f91509150505481565b5f8060135f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f2054915091509250929050565b5f60125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f2054905092915050565b5f610d1361238f565b90505f805f60165f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015610d9d57602002820191905f5260205f20905b815481526020019060010190808311610d89575b505050505090505f8151905060165f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610df19190612d20565b5f5b81811015611202575f838281518110610e0f57610e0e61326c565b5b60200260200101519050600187610e2691906130f1565b81101561117e5760145f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8281526020019081526020015f205486610e859190612e16565b955060145f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8281526020019081526020015f205f90555f60135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f600c5f8481526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015610fd457602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610f8b575b505050505090505f805b5f54811015611046578373ffffffffffffffffffffffffffffffffffffffff168382815181106110115761101061326c565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361103957600191505b8080600101915050610fde565b508015611127575f5460125f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8681526020019081526020015f205460095f8781526020019081526020015f205460155f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8881526020019081526020015f20546111059190613299565b61110f9190613307565b6111199190613307565b886111249190612e16565b97505b60155f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f205f90555050506111f4565b60018761118b91906130f1565b81106111f35760165f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f90919091909150555b5b508080600101915050610df3565b506112183384866112139190612e16565b6124ac565b7f703edbfbdca027dbf1185701b17f150b2c280a8f25b570a0a0bab84d72cf347433858560405161124b93929190613337565b60405180910390a15050505050565b6012602052815f5260405f20602052805f5260405f205f91509150505481565b5f611283611e5b565b90505f60135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f60145f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f205490505f8111611386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137d9061317e565b60405180910390fd5b5f60125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f20549050818103611406576001600b5f8681526020019081526020015f205f8282546113fe91906130f1565b925050819055505b818161141291906130f1565b60125f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8681526020019081526020015f208190555081600a5f8681526020019081526020015f205f82825461148291906130f1565b9250508190555060135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560145f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f205f905560155f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f205f905561159f33836124ac565b7f6ddfb4877cf7f45a590719822a3ae2d41e7a4dc9aeadca0532a85abae1c6ad7f3384846040516115d29392919061336c565b60405180910390a150505050565b6010602052805f5260405f205f915090505481565b6009602052805f5260405f205f915090505481565b600b602052805f5260405f205f915090505481565b5f61162861238f565b90506001811161166d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611664906133eb565b60405180910390fd5b5f8060115f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505b6001836116bd91906130f1565b811015611869575f600c5f8381526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561175357602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161170a575b505050505090505f805b5f548110156117c5573373ffffffffffffffffffffffffffffffffffffffff168382815181106117905761178f61326c565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036117b857600191505b808060010191505061175d565b50801561185a576103e85f54600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546103e861181c91906130f1565b60095f8781526020019081526020015f20546118389190613299565b6118429190613307565b61184c9190613307565b846118579190612e16565b93505b505080806001019150506116b0565b5060018261187791906130f1565b60115f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506118c233826124ac565b7fe3ce84385ab3d4dac3d7a146f1f394969d88408c293159506eb6f885a1f6788633826040516118f3929190613073565b60405180910390a15050565b600154341015611944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193b9061317e565b60405180910390fd5b5f600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054116119c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ba90613453565b60405180910390fd5b5f6119cc61238f565b90505f60145f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205490505f8103611b15578260135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060165f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f9091909190915055611bef565b8273ffffffffffffffffffffffffffffffffffffffff1660135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be5906134bb565b60405180910390fd5b5b3481611bfb9190612e16565b60145f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f20819055506103e8600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205434611c979190613299565b611ca19190613307565b60155f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f205f828254611cfb9190612e16565b925050819055505f60125f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f205490505f8103611d82576001600b5f8581526020019081526020015f205f828254611d7a9190612e16565b925050819055505b3481611d8e9190612e16565b60125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f208190555034600a5f8581526020019081526020015f205f828254611dfe9190612e16565b925050819055507f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc338534604051611e389392919061336c565b60405180910390a150505050565b6011602052805f5260405f205f915090505481565b5f806005549050600454600654611e729190612e16565b43118015611e935750600354600a5f8381526020019081526020015f205410155b8015611eb157505f54600b5f8381526020019081526020015f205410155b15611ecb57600181611ec39190612e16565b915050611ed0565b809150505b90565b5f5481565b60035481565b6013602052815f5260405f20602052805f5260405f205f915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b73121200000000000000000000000000000000000381565b600d602052805f5260405f205f915090505481565b5f600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205411611fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc490613523565b60405180910390fd5b600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f905561201561238f565b600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055507f7c79e6e24ed041d1072d54523b53956f01b91b835f0490856370594d9d14470e33604051612085919061309a565b60405180910390a1565b6060600c5f61209c6108d3565b81526020019081526020015f2080548060200260200160405190810160405280929190818152602001828054801561212657602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116120dd575b5050505050905090565b60045481565b600f602052805f5260405f205f915090505481565b600c602052815f5260405f208181548110612164575f80fd5b905f5260205f20015f915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6015602052815f5260405f20602052805f5260405f205f91509150505481565b5f600554905090565b5f6121c561238f565b90506001600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546122119190612e16565b8111612252576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122499061358b565b60405180910390fd5b6122663360076125a790919063ffffffff16565b505f60105f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905060105f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90556122f233826124ac565b5050565b6014602052815f5260405f20602052805f5260405f205f91509150505481565b60605f612324835f016125d4565b905060608190508092505050919050565b5f61235a835f018373ffffffffffffffffffffffffffffffffffffffff165f1b61262d565b905092915050565b5f612387835f018373ffffffffffffffffffffffffffffffffffffffff165f1b61264d565b905092915050565b5f8060055490506004546006546123a69190612e16565b431180156123c75750600354600a5f8381526020019081526020015f205410155b80156123e557505f54600b5f8381526020019081526020015f205410155b156124a55773121200000000000000000000000000000000000373ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612443575f80fd5b505af1158015612455573d5f803e3d5ffd5b50505050612462816126b4565b600c5f8381526020019081526020015f209080519060200190612486929190612d3e565b506001816124949190612e16565b905080600581905550436006819055505b8091505090565b5f8273ffffffffffffffffffffffffffffffffffffffff16825f67ffffffffffffffff8111156124df576124de6135a9565b5b6040519080825280601f01601f1916602001820160405280156125115781602001600182028036833780820191505090505b5060405161251f9190613642565b5f6040518083038185875af1925050503d805f8114612559576040519150601f19603f3d011682016040523d82523d5f602084013e61255e565b606091505b50509050806125a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612599906136c8565b60405180910390fd5b505050565b5f6125cc835f018373ffffffffffffffffffffffffffffffffffffffff165f1b612896565b905092915050565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561262157602002820191905f5260205f20905b81548152602001906001019080831161260d575b50505050509050919050565b5f80836001015f8481526020019081526020015f20541415905092915050565b5f612658838361262d565b6126aa57825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f2081905550600190506126ae565b5f90505b92915050565b60605f6126bf6108ee565b90505f815190505f8167ffffffffffffffff8111156126e1576126e06135a9565b5b60405190808252806020026020018201604052801561270f5781602001602082028036833780820191505090505b5090505f5b828110156127af5760125f8583815181106127325761273161326c565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8781526020019081526020015f20548282815181106127965761279561326c565b5b6020026020010181815250508080600101915050612714565b506127bc83825f54612992565b5f805467ffffffffffffffff8111156127d8576127d76135a9565b5b6040519080825280602002602001820160405280156128065781602001602082028036833780820191505090505b5090505f5b5f54811015612889578481815181106128275761282661326c565b5b60200260200101518282815181106128425761284161326c565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808060010191505061280b565b5080945050505050919050565b5f80836001015f8481526020019081526020015f205490505f8114612987575f6001826128c391906130f1565b90505f6001865f01805490506128d991906130f1565b905080821461293f575f865f0182815481106128f8576128f761326c565b5b905f5260205f200154905080875f0184815481106129195761291861326c565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f01805480612952576129516136e6565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061298c565b5f9150505b92915050565b5f835190505f60016002846129a7919061371c565b6129b19190613784565b90505b5f81126129da576129c785858386612ae7565b80806129d2906137c4565b9150506129b4565b505f8290505b81811015612ae057835f815181106129fb576129fa61326c565b5b6020026020010151848281518110612a1657612a1561326c565b5b60200260200101511115612ad357838181518110612a3757612a3661326c565b5b6020026020010151845f81518110612a5257612a5161326c565b5b602002602001018181525050848181518110612a7157612a7061326c565b5b6020026020010151855f81518110612a8c57612a8b61326c565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612ad285855f86612ae7565b5b80806001019150506129e0565b5050505050565b5f6001836002612af79190613299565b612b019190612e16565b90505b81811015612d195781600182612b1a9190612e16565b108015612b66575083600182612b309190612e16565b81518110612b4157612b4061326c565b5b6020026020010151848281518110612b5c57612b5b61326c565b5b6020026020010151115b15612b7b57600181612b789190612e16565b90505b838381518110612b8e57612b8d61326c565b5b6020026020010151848281518110612ba957612ba861326c565b5b602002602001015111612d1957838381518110612bc957612bc861326c565b5b6020026020010151848281518110612be457612be361326c565b5b6020026020010151858381518110612bff57612bfe61326c565b5b60200260200101868681518110612c1957612c1861326c565b5b6020026020010182815250828152505050848381518110612c3d57612c3c61326c565b5b6020026020010151858281518110612c5857612c5761326c565b5b6020026020010151868381518110612c7357612c7261326c565b5b60200260200101878681518110612c8d57612c8c61326c565b5b602002602001018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152508273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050508092506001600282612d089190613299565b612d129190612e16565b9050612b04565b5050505050565b5080545f8255905f5260205f2090810190612d3b9190612dc5565b50565b828054828255905f5260205f20908101928215612db4579160200282015b82811115612db3578251825f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612d5c565b5b509050612dc19190612dc5565b5090565b5b80821115612ddc575f815f905550600101612dc6565b5090565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612e2082612de0565b9150612e2b83612de0565b9250828201905080821115612e4357612e42612de9565b5b92915050565b612e5281612de0565b82525050565b5f602082019050612e6b5f830184612e49565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612ec382612e9a565b9050919050565b612ed381612eb9565b82525050565b5f612ee48383612eca565b60208301905092915050565b5f602082019050919050565b5f612f0682612e71565b612f108185612e7b565b9350612f1b83612e8b565b805f5b83811015612f4b578151612f328882612ed9565b9750612f3d83612ef0565b925050600181019050612f1e565b5085935050505092915050565b5f6020820190508181035f830152612f708184612efc565b905092915050565b5f80fd5b612f8581612eb9565b8114612f8f575f80fd5b50565b5f81359050612fa081612f7c565b92915050565b5f60208284031215612fbb57612fba612f78565b5b5f612fc884828501612f92565b91505092915050565b612fda81612de0565b8114612fe4575f80fd5b50565b5f81359050612ff581612fd1565b92915050565b5f602082840312156130105761300f612f78565b5b5f61301d84828501612fe7565b91505092915050565b5f806040838503121561303c5761303b612f78565b5b5f61304985828601612f92565b925050602061305a85828601612fe7565b9150509250929050565b61306d81612eb9565b82525050565b5f6040820190506130865f830185613064565b6130936020830184612e49565b9392505050565b5f6020820190506130ad5f830184613064565b92915050565b5f80604083850312156130c9576130c8612f78565b5b5f6130d685828601612fe7565b92505060206130e785828601612fe7565b9150509250929050565b5f6130fb82612de0565b915061310683612de0565b925082820390508181111561311e5761311d612de9565b5b92915050565b5f82825260208201905092915050565b7f696e73756666696369656e7420616d6f756e74000000000000000000000000005f82015250565b5f613168601383613124565b915061317382613134565b602082019050919050565b5f6020820190508181035f8301526131958161315c565b9050919050565b7f696e76616c6964207261746500000000000000000000000000000000000000005f82015250565b5f6131d0600c83613124565b91506131db8261319c565b602082019050919050565b5f6020820190508181035f8301526131fd816131c4565b9050919050565b7f63616e64696461746520657869737473000000000000000000000000000000005f82015250565b5f613238601083613124565b915061324382613204565b602082019050919050565b5f6020820190508181035f8301526132658161322c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6132a382612de0565b91506132ae83612de0565b92508282026132bc81612de0565b915082820484148315176132d3576132d2612de9565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61331182612de0565b915061331c83612de0565b92508261332c5761332b6132da565b5b828204905092915050565b5f60608201905061334a5f830186613064565b6133576020830185612e49565b6133646040830184612e49565b949350505050565b5f60608201905061337f5f830186613064565b61338c6020830185613064565b6133996040830184612e49565b949350505050565b7f636c61696d206e6f7420737461727465640000000000000000000000000000005f82015250565b5f6133d5601183613124565b91506133e0826133a1565b602082019050919050565b5f6020820190508181035f830152613402816133c9565b9050919050565b7f63616e646964617465206e6f7420616c6c6f77656400000000000000000000005f82015250565b5f61343d601583613124565b915061344882613409565b602082019050919050565b5f6020820190508181035f83015261346a81613431565b9050919050565b7f6f6e6c79206f6e652063686f69636520697320616c6c6f7765640000000000005f82015250565b5f6134a5601a83613124565b91506134b082613471565b602082019050919050565b5f6020820190508181035f8301526134d281613499565b9050919050565b7f63616e646964617465206e6f74206578697374730000000000000000000000005f82015250565b5f61350d601483613124565b9150613518826134d9565b602082019050919050565b5f6020820190508181035f83015261353a81613501565b9050919050565b7f636c61696d206e6f7420616c6c6f7765640000000000000000000000000000005f82015250565b5f613575601183613124565b915061358082613541565b602082019050919050565b5f6020820190508181035f8301526135a281613569565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f81519050919050565b5f81905092915050565b5f5b838110156136075780820151818401526020810190506135ec565b5f8484015250505050565b5f61361c826135d6565b61362681856135e0565b93506136368185602086016135ea565b80840191505092915050565b5f61364d8284613612565b915081905092915050565b7f736166655472616e736665724554483a20455448207472616e736665722066615f8201527f696c656400000000000000000000000000000000000000000000000000000000602082015250565b5f6136b2602483613124565b91506136bd82613658565b604082019050919050565b5f6020820190508181035f8301526136df816136a6565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f819050919050565b5f61372682613713565b915061373183613713565b925082613741576137406132da565b5b60015f0383147f80000000000000000000000000000000000000000000000000000000000000008314161561377957613778612de9565b5b828205905092915050565b5f61378e82613713565b915061379983613713565b925082820390508181125f8412168282135f8512151617156137be576137bd612de9565b5b92915050565b5f6137ce82613713565b91507f80000000000000000000000000000000000000000000000000000000000000008203613800576137ff612de9565b5b60018203905091905056fea2646970667358221220bc140edffe3d516441820d2e50897d8c7e71254ff08490f53e22023a3e0e990764736f6c63430008180033" }, "0x1212000000000000000000000000000000000001": { "balance": "0", "code": "0x60806040523661001357610011610017565b005b6100115b61001f6101a7565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a576100536101da565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a57610053610231565b63070d7c6960e41b6001600160e01b031982160161009a57610053610277565b621eb96f60e61b6001600160e01b03198216016100b9576100536102a8565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102e8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102fc565b565b606061018e83836040518060600160405280602781526020016108426027913961030c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101e4610384565b60006101f33660048184610695565b81019061020091906106db565b905061021d8160405180602001604052806000815250600061038f565b505060408051602081019091526000815290565b60606000806102433660048184610695565b810190610250919061070c565b915091506102608282600161038f565b604051806020016040528060008152509250505090565b6060610281610384565b60006102903660048184610695565b81019061029d91906106db565b905061021d816103bb565b60606102b2610384565b60006102bc6101a7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102f2610384565b60006102bc610412565b610167610307610412565b610421565b6060600080856001600160a01b03168560405161032991906107f2565b600060405180830381855af49150503d8060008114610364576040519150601f19603f3d011682016040523d82523d6000602084013e610369565b606091505b509150915061037a86838387610445565b9695505050505050565b341561016757600080fd5b610398836104c6565b6000825111806103a55750805b156103b6576103b48383610169565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103e46101a7565b604080516001600160a01b03928316815291841660208301520160405180910390a161040f81610506565b50565b600061041c6105af565b905090565b3660008037600080366000845af43d6000803e808015610440573d6000f35b3d6000fd5b606083156104b45782516000036104ad576001600160a01b0385163b6104ad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b50816104be565b6104be83836105d7565b949350505050565b6104cf81610601565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b03811661056b5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101cb565b8151156105e75781518083602001fd5b8060405162461bcd60e51b815260040161014e919061080e565b6001600160a01b0381163b61066e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61058e565b600080858511156106a557600080fd5b838611156106b257600080fd5b5050820193919092039150565b80356001600160a01b03811681146106d657600080fd5b919050565b6000602082840312156106ed57600080fd5b61018e826106bf565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561071f57600080fd5b610728836106bf565b9150602083013567ffffffffffffffff8082111561074557600080fd5b818501915085601f83011261075957600080fd5b81358181111561076b5761076b6106f6565b604051601f8201601f19908116603f01168101908382118183101715610793576107936106f6565b816040528281528860208487010111156107ac57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107e95781810151838201526020016107d1565b50506000910152565b600082516108048184602087016107ce565b9190910192915050565b602081526000825180602084015261082d8160408501602087016107ce565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122060cf01d0d0c15c838abecad7eebb680cda1dbe3d5984e7b64b6962b3134b4d8c64736f6c63430008120033", "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x01", - "0x0000000000000000000000000000000000000000000000000000000000000001": "0x01", - "0x000000000000000000000000000000000000000000000000000000000000000b": "0x01", - "0xa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c": "0x01", - "0xa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054d": "0x02", - "0xd7023ab55818fbdf8325d14db80f1669b44f5ea7af40c6c5612a77bc2207602c": "0x745c8f1af649651f46dcaec2c6eb94068843ae96", - "0xd7023ab55818fbdf8325d14db80f1669b44f5ea7af40c6c5612a77bc2207602d": "0x625eafa3473492007c0dd331e23b1035f6a7fb64", + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x07", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0de0b6b3a7640000", + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x3635c9adc5dea00000", + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x01d880", + "0x000000000000000000000000000000000000000000000000000000000000000d": "0x07", + "0xd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5": "0x74f4effb0b538baec703346b03b6d9292f53a4cd", + "0xd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb6": "0x910ad1641b7125eff746accdca1f11148b22f472", + "0xd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb7": "0xfef5f250af14df73f983caab7b1f5002189c42e0", + "0xd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb8": "0xc51964013acbc6b271feecb0febd9e7a01202930", + "0xd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb9": "0xc5bbd9652546bc96be3dec97a38ee335f7873dfa", + "0xd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eba": "0x26f1794b81df2b832545b8b6bbca196b82e4feb1", + "0xd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1ebb": "0x0b51369d02e47ee3f143391b837aa08c31aaa19b", "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x1212100000000000000000000000000000000001", "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x1212000000000000000000000000000000000000" } @@ -62,11 +67,11 @@ }, "0x1212000000000000000000000000000000000003": { "balance": "0", - "code": "0x6080604052600436106100435760003560e01c80631633da6e1461004f57806344004cc11461007a5780635aa6e6751461009c578063f3fef3a3146100d057600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b506100646100f0565b6040516100719190610400565b60405180910390f35b34801561008657600080fd5b5061009a610095366004610465565b610169565b005b3480156100a857600080fd5b506100b8600161090960911b0181565b6040516001600160a01b039091168152602001610071565b3480156100dc57600080fd5b5061009a6100eb3660046104a6565b6101c6565b6060600161090960911b016001600160a01b031663a3a40ea56040518163ffffffff1660e01b8152600401600060405180830381865afa158015610138573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526101609190810190610542565b60200151905090565b33600161090960911b01146101b65760405162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b60448201526064015b60405180910390fd5b6101c182848361021c565b505050565b33600161090960911b011461020e5760405162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b60448201526064016101ad565b6102188282610337565b5050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691610278919061064a565b6000604051808303816000865af19150503d80600081146102b5576040519150601f19603f3d011682016040523d82523d6000602084013e6102ba565b606091505b50915091508180156102e45750805115806102e45750808060200190518101906102e49190610679565b6103305760405162461bcd60e51b815260206004820152601d60248201527f736166655472616e736665723a207472616e73666572206661696c656400000060448201526064016101ad565b5050505050565b604080516000808252602082019092526001600160a01b038416908390604051610361919061064a565b60006040518083038185875af1925050503d806000811461039e576040519150601f19603f3d011682016040523d82523d6000602084013e6103a3565b606091505b50509050806101c15760405162461bcd60e51b8152602060048201526024808201527f736166655472616e736665724554483a20455448207472616e736665722066616044820152631a5b195960e21b60648201526084016101ad565b6020808252825182820181905260009190848201906040850190845b818110156104415783516001600160a01b03168352928401929184019160010161041c565b50909695505050505050565b6001600160a01b038116811461046257600080fd5b50565b60008060006060848603121561047a57600080fd5b83356104858161044d565b925060208401356104958161044d565b929592945050506040919091013590565b600080604083850312156104b957600080fd5b82356104c48161044d565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561050b5761050b6104d2565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561053a5761053a6104d2565b604052919050565b6000602080838503121561055557600080fd5b825167ffffffffffffffff8082111561056d57600080fd5b9084019060a0828703121561058157600080fd5b6105896104e8565b82518152838301518281111561059e57600080fd5b8301601f810188136105af57600080fd5b8051838111156105c1576105c16104d2565b8060051b93506105d2868501610511565b818152938201860193868101908a8611156105ec57600080fd5b928701925b8584101561061657835192506106068361044d565b82825292870192908701906105f1565b8088860152505050506040830151604082015260608301516060820152608083015160808201528094505050505092915050565b6000825160005b8181101561066b5760208186018101518583015201610651565b506000920191825250919050565b60006020828403121561068b57600080fd5b8151801515811461069b57600080fd5b939250505056fea2646970667358221220443685d5efb142dbb193ede991aecc9a71f330539073ee1686ee5024f6adde7364736f6c63430008120033" + "code": "0x608060405260043610610036575f3560e01c80631633da6e146100415780633ccfd60b1461006b5780635aa6e67514610081575f80fd5b3661003d57005b5f80fd5b34801561004c575f80fd5b506100556100cd565b6040516100629190610327565b60405180910390f35b348015610076575f80fd5b5061007f610175565b005b34801561008c575f80fd5b506100a873121200000000000000000000000000000000000181565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610062565b606073121200000000000000000000000000000000000173ffffffffffffffffffffffffffffffffffffffff16639f9d7f816040518163ffffffff1660e01b81526004015f60405180830381865afa15801561012b573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261017091908101906103d5565b905090565b33731212000000000000000000000000000000000001146101f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420676f7665726e616e636500000000000000000000000000000000000060448201526064015b60405180910390fd5b471561021b5761021b7312120000000000000000000000000000000000014761021d565b565b604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff841690839060405161025391906104b3565b5f6040518083038185875af1925050503d805f811461028d576040519150601f19603f3d011682016040523d82523d5f602084013e610292565b606091505b5050905080610322576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f736166655472616e736665724554483a20455448207472616e7366657220666160448201527f696c65640000000000000000000000000000000000000000000000000000000060648201526084016101ee565b505050565b602080825282518282018190525f9190848201906040850190845b8181101561037457835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101610342565b50909695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b805173ffffffffffffffffffffffffffffffffffffffff811681146103d0575f80fd5b919050565b5f60208083850312156103e6575f80fd5b825167ffffffffffffffff808211156103fd575f80fd5b818501915085601f830112610410575f80fd5b81518181111561042257610422610380565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110858211171561046557610465610380565b604052918252848201925083810185019188831115610482575f80fd5b938501935b828510156104a757610498856103ad565b84529385019392850192610487565b98975050505050505050565b5f82515f5b818110156104d257602081860181015185830152016104b8565b505f92019182525091905056fea2646970667358221220bf0616af90ea4545d17e405fa3ba4df3062321a9a535fe45876c3962cc8f2f8c64736f6c63430008180033" }, "0x1212100000000000000000000000000000000001": { "balance": "0", - "code": "0x6080604052600436106100f75760003560e01c806389dc5c841161008a578063b384abef11610059578063b384abef1461029d578063c885bc58146102b0578063ecd88a86146102c5578063f73a8b4a146102db57600080fd5b806389dc5c8414610205578063958d686e1461023957806395a772ff14610266578063a3a40ea51461028857600080fd5b8063701b70ac116100c6578063701b70ac1461018a57806375ea3a6d146101ba5780637765f548146101d05780637bb71bcf146101ef57600080fd5b8063038a35381461010357806310de6573146101325780633980663d1461014857806344a040f51461016a57600080fd5b366100fe57005b600080fd5b34801561010f57600080fd5b5061011f670de0b6b3a764000081565b6040519081526020015b60405180910390f35b34801561013e57600080fd5b5061011f60005481565b34801561015457600080fd5b5061015d6102fb565b604051610129919061146a565b34801561017657600080fd5b5061011f610185366004611505565b610473565b34801561019657600080fd5b506101aa6101a5366004611505565b61076d565b6040519015158152602001610129565b3480156101c657600080fd5b5061011f60025481565b3480156101dc57600080fd5b5061011f6a027b46536c66c8e300000081565b3480156101fb57600080fd5b5061011f600a5481565b34801561021157600080fd5b50610221600361090960911b0181565b6040516001600160a01b039091168152602001610129565b34801561024557600080fd5b50610259610254366004611527565b6107e6565b6040516101299190611540565b34801561027257600080fd5b506102866102813660046115a6565b61098e565b005b34801561029457600080fd5b50610259610c3b565b6102866102ab366004611677565b610c7b565b3480156102bc57600080fd5b50610286611087565b3480156102d157600080fd5b5061011f60015481565b3480156102e757600080fd5b506102866102f6366004611527565b611166565b60606000600154600254600161031191906116af565b61031b91906116c8565b905060008167ffffffffffffffff81111561033857610338611590565b60405190808252806020026020018201604052801561038d57816020015b61037a60405180606001604052806000815260200160008152602001606081525090565b8152602001906001900390816103565790505b50905060005b8281101561046c5760046000826001546103ad91906116af565b815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820180548060200260200160405190810160405280929190818152602001828054801561043357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610415575b50505050508152505082828151811061044e5761044e6116db565b60200260200101819052508080610464906116f1565b915050610393565b5092915050565b600080548152600360209081526040808320815160a081018352815481526001820180548451818702810187019095528085528695929485840193909291908301828280156104eb57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116104cd575b5050505050815260200160028201548152602001600382015481526020016004820154815250509050600060036000836040015181526020019081526020016000206040518060a0016040529081600082015481526020016001820180548060200260200160405190810160405280929190818152602001828054801561059b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161057d575b50505050508152602001600282015481526020016003820154815260200160048201548152505090506000805b83516001101561074057606084015160009081526007602090815260408083206001600160a01b038a168452909152812054905485510361063b578451600090815260086020526040902054600a5461062a90600361090960911b01316116af565b61063491906116c8565b925061063f565b8192505b608085015161064e828561170a565b6106589190611721565b61066290876116af565b84516000908152600860205260408082205488518352912054919750610687916116c8565b915083945060036000866040015181526020019081526020016000206040518060a0016040529081600082015481526020016001820180548060200260200160405190810160405280929190818152602001828054801561071157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116106f3575b5050505050815260200160028201548152602001600382015481526020016004820154815250509350506105c8565b6001600160a01b03861660009081526009602052604090205461076390866116c8565b9695505050505050565b600080610778610c3b565b905060005b8160200151518110156107dc57816020015181815181106107a0576107a06116db565b60200260200101516001600160a01b0316846001600160a01b0316036107ca575060019392505050565b806107d4816116f1565b91505061077d565b5060009392505050565b6108186040518060a0016040528060008152602001606081526020016000815260200160008152602001600081525090565b60005482106108c65760008054815260036020908152604091829020825160a081018452815481526001820180548551818602810186019096528086529194929385810193929083018282801561089857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161087a575b5050505050815260200160028201548152602001600382015481526020016004820154815250509050919050565b6000545b808310156108e9576000908152600360205260409020600201546108ca565b600081815260036020908152604091829020825160a081018452815481526001820180548551818602810186019096528086529194929385810193929083018282801561095f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610941575b505050505081526020016002820154815260200160038201548152602001600482015481525050915050919050565b6109973361076d565b6109d85760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420436f6e73656e73757360981b60448201526064015b60405180910390fd5b438211610a1d5760405162461bcd60e51b81526020600482015260136024820152721a5b9d985b1a59081cdd185c9d12195a59da1d606a1b60448201526064016109cf565b6000815111610a665760405162461bcd60e51b81526020600482015260156024820152741a5b9d985b1a59081b5a5b995c9cc81b195b99da1d605a1b60448201526064016109cf565b600181511115610b305760005b60018251610a8191906116c8565b811015610b2e5781610a948260016116af565b81518110610aa457610aa46116db565b60200260200101516001600160a01b0316828281518110610ac757610ac76116db565b60200260200101516001600160a01b031610610b1c5760405162461bcd60e51b815260206004820152601460248201527334b73b30b634b21036b4b732b9399037b93232b960611b60448201526064016109cf565b80610b26816116f1565b915050610a73565b505b6000544311610b905760405162461bcd60e51b815260206004820152602660248201527f70726f706f73652073686f756c64206166746572206c6173742070686173652060448201526561637469766560d01b60648201526084016109cf565b60028054906000610ba0836116f1565b9091555050604080516060810182526002805480835260208084018781528486018781526000938452600483529590922084518155915160018301559351805193949193610bf59385019291909101906113ac565b50506002546040517ff38d9003e16b18afebcec1c73fd3f4d644825e76e36c4326af56aaddadd5545f9250610c2f91339186908690611743565b60405180910390a15050565b610c6d6040518060a0016040528060008152602001606081526020016000815260200160008152602001600081525090565b610c76436107e6565b905090565b6002600b5403610c9d5760405162461bcd60e51b81526004016109cf90611770565b6002600b556001548210801590610cb657506002548211155b610cf45760405162461bcd60e51b815260206004820152600f60248201526e1a5b9d985b1a5908191c98599d1259608a1b60448201526064016109cf565b6000828152600460205260409020600101544310610d545760405162461bcd60e51b815260206004820152601a60248201527f696e76616c69642064726166742073746172742068656967687400000000000060448201526064016109cf565b670de0b6b3a7640000811015610da25760405162461bcd60e51b81526020600482015260136024820152721a5b9cdd59999a58da595b9d08185b5bdd5b9d606a1b60448201526064016109cf565b80341015610de75760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742076616c756560701b60448201526064016109cf565b600082815260056020908152604080832033845290915281208054839290610e109084906116af565b9091555050600082815260076020908152604080832033845290915281208054839290610e3e9084906116af565b909155505060008281526006602052604081208054839290610e619084906116af565b909155505060408051338152602081018490529081018290527fafd3f234c1f8e944129b26b206d98e5752ad3336a4059938b4a3e990e95885309060600160405180910390a16000828152600660205260409020546a027b46536c66c8e30000008110611062576000838152600460209081526040808320815160608101835281548152600182015481850152600282018054845181870281018701865281815292959394860193830182828015610f4257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610f24575b5050509190925250506040805160a081018252602080850180518352838601518284019081526000805485870152606085018c9052608085018a9052915182526003835293902082518155925180519596509194859450610fa992600185019201906113ac565b50604082015160028083019190915560608301516003830155608090920151600490910155602083015160005554610fe29060016116af565b600155600a54610ffb90600361090960911b01316116af565b6008600084602001518152602001908152602001600020819055507f5606b7fb750b4fb80525cd923da18033c8a8b8e99a2923bd13eae424a615742f8382600001518360200151846040015160405161105794939291906117a7565b60405180910390a150505b8134111561107d5761107d3361107884346116c8565b6112de565b50506001600b5550565b6002600b54036110a95760405162461bcd60e51b81526004016109cf90611770565b6002600b5560006110b933610473565b9050801561115e5733600090815260096020526040812080548392906110e09084906116af565b9250508190555080600a60008282546110f991906116af565b909155505060405163f3fef3a360e01b815233600482015260248101829052600361090960911b019063f3fef3a390604401600060405180830381600087803b15801561114557600080fd5b505af1158015611159573d6000803e3d6000fd5b505050505b506001600b55565b6002600b54036111885760405162461bcd60e51b81526004016109cf90611770565b6002600b819055548111156111d15760405162461bcd60e51b815260206004820152600f60248201526e1a5b9d985b1a5908191c98599d1259608a1b60448201526064016109cf565b60008181526005602090815260408083203384529091529020548061122b5760405162461bcd60e51b815260206004820152601060248201526f656d70747920766f74652076616c756560801b60448201526064016109cf565b600082815260056020908152604080832033845282528083208390558483526006909152812080548392906112619084906116c8565b9091555050600154821061128a5760008281526007602090815260408083203384529091528120555b61129433826112de565b60408051338152602081018490529081018290527f7beea58284fafba3a35fa25c68eed786c8c83e3ebb2cfa48238aed72e1fe7dbd9060600160405180910390a150506001600b55565b604080516000808252602082019092526001600160a01b03841690839060405161130891906117d7565b60006040518083038185875af1925050503d8060008114611345576040519150601f19603f3d011682016040523d82523d6000602084013e61134a565b606091505b50509050806113a75760405162461bcd60e51b8152602060048201526024808201527f736166655472616e736665724554483a20455448207472616e736665722066616044820152631a5b195960e21b60648201526084016109cf565b505050565b828054828255906000526020600020908101928215611401579160200282015b8281111561140157825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906113cc565b5061140d929150611411565b5090565b5b8082111561140d5760008155600101611412565b600081518084526020808501945080840160005b8381101561145f5781516001600160a01b03168752958201959082019060010161143a565b509495945050505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156114db57888303603f19018552815180518452878101518885015286015160608785018190526114c781860183611426565b968901969450505090860190600101611491565b509098975050505050505050565b80356001600160a01b038116811461150057600080fd5b919050565b60006020828403121561151757600080fd5b611520826114e9565b9392505050565b60006020828403121561153957600080fd5b5035919050565b60208152815160208201526000602083015160a0604084015261156660c0840182611426565b90506040840151606084015260608401516080840152608084015160a08401528091505092915050565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156115b957600080fd5b8235915060208084013567ffffffffffffffff808211156115d957600080fd5b818601915086601f8301126115ed57600080fd5b8135818111156115ff576115ff611590565b8060051b604051601f19603f8301168101818110858211171561162457611624611590565b60405291825284820192508381018501918983111561164257600080fd5b938501935b8285101561166757611658856114e9565b84529385019392850192611647565b8096505050505050509250929050565b6000806040838503121561168a57600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b808201808211156116c2576116c2611699565b92915050565b818103818111156116c2576116c2611699565b634e487b7160e01b600052603260045260246000fd5b60006001820161170357611703611699565b5060010190565b80820281158282048414176116c2576116c2611699565b60008261173e57634e487b7160e01b600052601260045260246000fd5b500490565b60018060a01b03851681528360208201528260408201526080606082015260006107636080830184611426565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b8481528360208201526080604082015260006117c66080830185611426565b905082606083015295945050505050565b6000825160005b818110156117f857602081860181015185830152016117de565b50600092019182525091905056fea26469706673582212206c395a19a9e4583bfaeb2ed6e0bdbb178ae9330eb7e55cca7937fd9bd450a57f64736f6c63430008120033" + "code": "0x6080604052600436106101b2575f3560e01c806389dc5c84116100e75780639f9d7f8111610087578063b88a802f11610062578063b88a802f146107e2578063d8ce95ab146107f6578063da0b331714610821578063db069ba51461084c575f80fd5b80639f9d7f81146107a6578063a6580de8146107ba578063a681dfec146107ce575f80fd5b8063902bdc26116100c2578063902bdc26146107155780639690293b1461074057806398ca58df146107545780639e40cdac1461077f575f80fd5b806389dc5c84146106ae5780638e1900a8146106d55780638f1b321914610700575f80fd5b80634d21e42611610152578063683dd1911161012d578063683dd191146106095780636db504e7146106245780636dd7d8ea14610665578063786255f114610678575f80fd5b80634d21e426146105b55780634ff0876a146105e057806361190533146105f5575f80fd5b80630ea6a0411161018d5780630ea6a0411461051d5780631f26f2561461056157806343c14b22146105765780634c569c251461058a575f80fd5b806303f187ea146104c157806306a49fce146104e95780630b2a85ea1461050a575f80fd5b366104bd573373121200000000000000000000000000000000000314610239576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f736964652063616c6c206e6f7420616c6c6f776564000000000000000000000060448201526064015b60405180910390fd5b5f600d80548060200260200160405190810160405280929190818152602001828054801561029b57602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610270575b505083519394505f925050505b818110156104bb5760095f8483815181106102c5576102c5611ea4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546103e85f54670de0b6b3a764000060065f88878151811061032a5761032a611ea4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054346103779190611efe565b6103819190611efe565b61038b9190611f42565b6103959190611f42565b61039f9190611f42565b600e5f8584815181106103b4576103b4611ea4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546104039190611f55565b925050819055506104b383828151811061041f5761041f611ea4565b60200260200101516103e85f5460065f88878151811061044157610441611ea4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546103e86104909190611f68565b61049a9034611efe565b6104a49190611f42565b6104ae9190611f42565b610877565b6001016102a8565b005b5f80fd5b3480156104cc575f80fd5b506104d660025481565b6040519081526020015b60405180910390f35b3480156104f4575f80fd5b506104fd610981565b6040516104e09190611f7b565b6104bb610518366004611fd4565b610992565b348015610528575f80fd5b5061053c610537366004611fd4565b610bb0565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104e0565b34801561056c575f80fd5b506104d6600c5481565b348015610581575f80fd5b506104bb610be5565b348015610595575f80fd5b506104d66105a4366004612013565b600e6020525f908152604090205481565b3480156105c0575f80fd5b506104d66105cf366004612013565b60086020525f908152604090205481565b3480156105eb575f80fd5b506104d660035481565b348015610600575f80fd5b506104bb610d88565b348015610614575f80fd5b506104d6670de0b6b3a764000081565b34801561062f575f80fd5b5061053c61063e366004612013565b600a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6104bb610673366004612013565b610e9d565b348015610683575f80fd5b506104d661069236600461202c565b601160209081525f928352604080842090915290825290205481565b3480156106b9575f80fd5b5061053c73121200000000000000000000000000000000000381565b3480156106e0575f80fd5b506104d66106ef366004612013565b600f6020525f908152604090205481565b34801561070b575f80fd5b506104d660015481565b348015610720575f80fd5b506104d661072f366004612013565b60066020525f908152604090205481565b34801561074b575f80fd5b506104bb61119c565b34801561075f575f80fd5b506104d661076e366004612013565b60106020525f908152604090205481565b34801561078a575f80fd5b5061053c73fffffffffffffffffffffffffffffffffffffffe81565b3480156107b1575f80fd5b506104fd611260565b3480156107c5575f80fd5b506104d65f5481565b3480156107d9575f80fd5b506104bb6112cd565b3480156107ed575f80fd5b506104bb611514565b348015610801575f80fd5b506104d6610810366004612013565b60096020525f908152604090205481565b34801561082c575f80fd5b506104d661083b366004612013565b60076020525f908152604090205481565b348015610857575f80fd5b506104d6610866366004612013565b600b6020525f908152604090205481565b604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040516108ad9190612081565b5f6040518083038185875af1925050503d805f81146108e7576040519150601f19603f3d011682016040523d82523d5f602084013e6108ec565b606091505b505090508061097c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f736166655472616e736665724554483a20455448207472616e7366657220666160448201527f696c6564000000000000000000000000000000000000000000000000000000006064820152608401610230565b505050565b606061098d60046115ad565b905090565b6002543410156109fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e73756666696369656e7420616d6f756e74000000000000000000000000006044820152606401610230565b6103e88110610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f696e76616c6964207261746500000000000000000000000000000000000000006044820152606401610230565b610a746004336115c0565b15610adb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f63616e64696461746520657869737473000000000000000000000000000000006044820152606401610230565b335f9081526007602052604090205415610b51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6c656674206e6f7420636c61696d6564000000000000000000000000000000006044820152606401610230565b610b5c6004336115f3565b50335f818152600660209081526040808320859055600882529182902034905590519182527feeda149c76076b34d4b9d8896c2f7efc0d33d1c7b53ea3c5db490d64613f603a91015b60405180910390a150565b600d8181548110610bbf575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b335f908152600a6020908152604080832054600b9092529091205473ffffffffffffffffffffffffffffffffffffffff909116908115801590610c2757505f81115b610c8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f7265766f6b65206e6f7420616c6c6f77656400000000000000000000000000006044820152606401610230565b610c973383611614565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526009602052604081208054839290610ccb908490611f68565b9091555050335f818152600a6020908152604080832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600b8252808320839055600f82528083208390556010909152812055610d2d9082610877565b6040805133815273ffffffffffffffffffffffffffffffffffffffff841660208201529081018290527fb698e31a2abee5824d0d7bcfd2339aead7f9e9ae413fba50bf554ff3fa470b7b906060015b60405180910390a15050565b335f9081526007602052604090205415801590610dca5750600354610dae906002611efe565b335f90815260076020526040902054610dc79190611f55565b43115b610e30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f7769746864726177206e6f7420616c6c6f7765640000000000000000000000006044820152606401610230565b335f81815260086020908152604080832080549084905560078352818420849055600690925282209190915590610e679082610877565b60408051338152602081018390527f142e26dcca50281d2c46d90446bfc1c9bc260cef355ce917a52f1fec7c54b5bf9101610ba5565b600154341015610f09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e73756666696369656e7420616d6f756e74000000000000000000000000006044820152606401610230565b610f146004826115c0565b610f7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f63616e646964617465206e6f7420616c6c6f77656400000000000000000000006044820152606401610230565b335f908152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff908116908216811480610fc5575073ffffffffffffffffffffffffffffffffffffffff8116155b61102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6f6e6c79206f6e652063686f69636520697320616c6c6f7765640000000000006044820152606401610230565b73ffffffffffffffffffffffffffffffffffffffff811615611056576110513382611614565b6110be565b335f818152600a6020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88169081179091558352600e825280832054938352600f9091529020555b335f908152600b6020526040812080543492906110dc908490611f55565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f9081526009602052604081208054349290611115908490611f55565b909155505073ffffffffffffffffffffffffffffffffffffffff811661114757335f9081526010602052604090204390555b6040805133815273ffffffffffffffffffffffffffffffffffffffff8416602082015234918101919091527f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc90606001610d7c565b6111a76004336115c0565b61120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f63616e646964617465206e6f74206578697374730000000000000000000000006044820152606401610230565b6112186004336117a3565b50335f8181526007602090815260409182902043905590519182527f7c79e6e24ed041d1072d54523b53956f01b91b835f0490856370594d9d14470e910160405180910390a1565b6060600d8054806020026020016040519081016040528092919081815260200182805480156112c357602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611298575b5050505050905090565b3373fffffffffffffffffffffffffffffffffffffffe1461134a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f736964652063616c6c206e6f7420616c6c6f77656400000000000000000000006044820152606401610230565b73121200000000000000000000000000000000000373ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156113a3575f80fd5b505af11580156113b5573d5f803e3d5ffd5b50505050600354600c546113c99190611f55565b4310156113d257565b5f6113dd60046115ad565b80519091505f5b818110156114c257600e5f84838151811061140157611401611ea4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460115f85848151811061145857611458611ea4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f600354600c546114aa9190611f42565b815260208101919091526040015f20556001016113e4565b5043600c556114cf6117c4565b80516114e391600d91602090910190611e08565b507fe59e3b36b5c97b419925b60c92f5a4324c993934eb9cfe5232def67c1739337c600d604051610d7c91906120ad565b335f908152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff16806115a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f636c61696d206e6f7420616c6c6f7765640000000000000000000000000000006044820152606401610230565b6115aa3382611614565b50565b60605f6115b983611961565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260018301602052604081205415155b90505b92915050565b5f6115ea8373ffffffffffffffffffffffffffffffffffffffff84166119ba565b73ffffffffffffffffffffffffffffffffffffffff8083165f90815260106020908152604080832054600f8352818420549486168452600e90925290912054600c549192918310611666575050505050565b73ffffffffffffffffffffffffffffffffffffffff84165f908152601160205260408120600354829061169a600188611f68565b6116a49190611f42565b6116af906001611f55565b81526020019081526020015f20549050828111156116cb578092505b5f670de0b6b3a76400006116df8585611f68565b73ffffffffffffffffffffffffffffffffffffffff89165f908152600b602052604090205461170e9190611efe565b6117189190611f42565b73ffffffffffffffffffffffffffffffffffffffff88165f908152600f60205260409020849055905061174b8782610877565b6040805173ffffffffffffffffffffffffffffffffffffffff89168152602081018390527fbeceb521ccd2816457290c3d1cb70cc1537f14307f2d9ac26a5093a38ea40948910160405180910390a150505050505050565b5f6115ea8373ffffffffffffffffffffffffffffffffffffffff8416611a06565b60605f6117cf610981565b80519091505f8167ffffffffffffffff8111156117ee576117ee612054565b604051908082528060200260200182016040528015611817578160200160208202803683370190505b5090505f5b828110156118a05760095f85838151811061183957611839611ea4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205482828151811061188d5761188d611ea4565b602090810291909101015260010161181c565b506118ad83825f54611af0565b5f805467ffffffffffffffff8111156118c8576118c8612054565b6040519080825280602002602001820160405280156118f1578160200160208202803683370190505b5090505f5b5f548110156119585784818151811061191157611911611ea4565b602002602001015182828151811061192b5761192b611ea4565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526001016118f6565b50949350505050565b6060815f018054806020026020016040519081016040528092919081815260200182805480156119ae57602002820191905f5260205f20905b81548152602001906001019080831161199a575b50505050509050919050565b5f8181526001830160205260408120546119ff57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556115ed565b505f6115ed565b5f8181526001830160205260408120548015611ae0575f611a28600183611f68565b85549091505f90611a3b90600190611f68565b9050808214611a9a575f865f018281548110611a5957611a59611ea4565b905f5260205f200154905080875f018481548110611a7957611a79611ea4565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080611aab57611aab6120fd565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506115ed565b5f9150506115ed565b5092915050565b82515f6001611b0060028561212a565b611b0a9190612191565b90505b5f8112611b3257611b2085858386611c30565b80611b2a816121b0565b915050611b0d565b50815b81811015611c2957835f81518110611b4f57611b4f611ea4565b6020026020010151848281518110611b6957611b69611ea4565b60200260200101511115611c2157838181518110611b8957611b89611ea4565b6020026020010151845f81518110611ba357611ba3611ea4565b602002602001018181525050848181518110611bc157611bc1611ea4565b6020026020010151855f81518110611bdb57611bdb611ea4565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611c2185855f86611c30565b600101611b35565b5050505050565b5f611c3c836002611efe565b611c47906001611f55565b90505b81811015611c295781611c5e826001611f55565b108015611ca6575083611c72826001611f55565b81518110611c8257611c82611ea4565b6020026020010151848281518110611c9c57611c9c611ea4565b6020026020010151115b15611cb957611cb6600182611f55565b90505b838381518110611ccb57611ccb611ea4565b6020026020010151848281518110611ce557611ce5611ea4565b602002602001015111611c2957838381518110611d0457611d04611ea4565b6020026020010151848281518110611d1e57611d1e611ea4565b6020026020010151858381518110611d3857611d38611ea4565b60200260200101868681518110611d5157611d51611ea4565b6020026020010182815250828152505050848381518110611d7457611d74611ea4565b6020026020010151858281518110611d8e57611d8e611ea4565b6020026020010151868381518110611da857611da8611ea4565b60200260200101878681518110611dc157611dc1611ea4565b73ffffffffffffffffffffffffffffffffffffffff938416602091820292909201015291169052915081611df6816002611efe565b611e01906001611f55565b9050611c4a565b828054828255905f5260205f20908101928215611e80579160200282015b82811115611e8057825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190611e26565b50611e8c929150611e90565b5090565b5b80821115611e8c575f8155600101611e91565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820281158282048414176115ed576115ed611ed1565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82611f5057611f50611f15565b500490565b808201808211156115ed576115ed611ed1565b818103818111156115ed576115ed611ed1565b602080825282518282018190525f9190848201906040850190845b81811015611fc857835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611f96565b50909695505050505050565b5f60208284031215611fe4575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461200e575f80fd5b919050565b5f60208284031215612023575f80fd5b6115ea82611feb565b5f806040838503121561203d575f80fd5b61204683611feb565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82515f5b818110156120a05760208186018101518583015201612086565b505f920191825250919050565b602080825282548282018190525f8481528281209092916040850190845b81811015611fc857835473ffffffffffffffffffffffffffffffffffffffff16835260019384019392850192016120cb565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f8261213857612138611f15565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f80000000000000000000000000000000000000000000000000000000000000008314161561218c5761218c611ed1565b500590565b8181035f831280158383131683831282161715611ae957611ae9611ed1565b5f7f800000000000000000000000000000000000000000000000000000000000000082036121e0576121e0611ed1565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220be030c978d41bf189a496211a49a065d8172632668166ae46e11aefab15d3ab864736f6c63430008180033" }, "0x1212100000000000000000000000000000000002": { "balance": "0",