Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- AddressUpdater
- Optimization enabled
- true
- Compiler version
- v0.7.6+commit.7338295f
- Optimization runs
- 200
- Verified at
- 2022-02-24T08:44:05.944996Z
Constructor Arguments
000000000000000000000000fe4dbb048428c3583e91a8e8f03bc64f09f54ef8
Arg [0] (address) : 0xfe4dbb048428c3583e91a8e8f03bc64f09f54ef8
./contracts/addressUpdater/implementation/AddressUpdater.sol
// SPDX-License-Identifier: MIT pragma solidity 0.7.6; pragma abicoder v2; import "../../governance/implementation/Governed.sol"; import "../interface/IIAddressUpdatable.sol"; contract AddressUpdater is Governed { string internal constant ERR_ARRAY_LENGTHS = "array lengths do not match"; string internal constant ERR_ADDRESS_ZERO = "address zero"; string[] internal contractNames; mapping(bytes32 => address) internal contractAddresses; constructor(address _governance) Governed(_governance) {} /** * @notice set/update contract names/addresses and then apply changes to other contracts * @param _contractNames contracts names * @param _contractAddresses addresses of corresponding contracts names * @param _contractsToUpdate contracts to be updated */ function update( string[] memory _contractNames, address[] memory _contractAddresses, IIAddressUpdatable[] memory _contractsToUpdate ) external onlyGovernance { _addOrUpdateContractNamesAndAddresses(_contractNames, _contractAddresses); _updateContractAddresses(_contractsToUpdate); } /** * @notice Updates contract addresses on all contracts implementing IIAddressUpdatable interface * @param _contractsToUpdate contracts to be updated */ function updateContractAddresses(IIAddressUpdatable[] memory _contractsToUpdate) external onlyGovernance { _updateContractAddresses(_contractsToUpdate); } /** * @notice Add or update contract names and addreses that are later used in updateContractAddresses calls * @param _contractNames contracts names * @param _contractAddresses addresses of corresponding contracts names */ function addOrUpdateContractNamesAndAddresses( string[] memory _contractNames, address[] memory _contractAddresses ) external onlyGovernance { _addOrUpdateContractNamesAndAddresses(_contractNames, _contractAddresses); } /** * @notice Returns the contract names and the corresponding addresses */ function getContractNamesAndAddresses() external view returns( string[] memory _contractNames, address[] memory _contractAddresses ) { _contractNames = contractNames; uint256 len = _contractNames.length; _contractAddresses = new address[](len); while (len > 0) { len--; _contractAddresses[len] = contractAddresses[_keccak256AbiEncode(_contractNames[len])]; } } /** * @notice Returns contract address for the given name and reverts if address(0) */ function getContractAddress(string memory _name) external view returns(address) { address a = contractAddresses[_keccak256AbiEncode(_name)]; require(a != address(0), ERR_ADDRESS_ZERO); return a; } /** * @notice Add or update contract names and addreses that are later used in updateContractAddresses calls * @param _contractNames contracts names * @param _contractAddresses addresses of corresponding contracts names */ function _addOrUpdateContractNamesAndAddresses( string[] memory _contractNames, address[] memory _contractAddresses ) internal { uint256 len = _contractNames.length; require(len == _contractAddresses.length, ERR_ARRAY_LENGTHS); for (uint256 i = 0; i < len; i++) { require(_contractAddresses[i] != address(0), ERR_ADDRESS_ZERO); bytes32 nameHash = _keccak256AbiEncode(_contractNames[i]); // add new contract name if address is not known yet if (contractAddresses[nameHash] == address(0)) { contractNames.push(_contractNames[i]); } // set or update contract address contractAddresses[nameHash] = _contractAddresses[i]; } } /** * @notice Updates contract addresses on all contracts implementing IIAddressUpdatable interface * @param _contractsToUpdate contracts to be updated */ function _updateContractAddresses(IIAddressUpdatable[] memory _contractsToUpdate) internal { uint256 len = contractNames.length; bytes32[] memory nameHashes = new bytes32[](len); address[] memory addresses = new address[](len); while (len > 0) { len--; nameHashes[len] = _keccak256AbiEncode(contractNames[len]); addresses[len] = contractAddresses[nameHashes[len]]; } for (uint256 i = 0; i < _contractsToUpdate.length; i++) { _contractsToUpdate[i].updateContractAddresses(nameHashes, addresses); } } /** * @notice Returns hash from string value */ function _keccak256AbiEncode(string memory _value) internal pure returns(bytes32) { return keccak256(abi.encode(_value)); } }
./contracts/governance/implementation/GovernedBase.sol
// SPDX-License-Identifier: MIT pragma solidity 0.7.6; /** * @title Governed Base * @notice This abstract base class defines behaviors for a governed contract. * @dev This class is abstract so that specific behaviors can be defined for the constructor. * Contracts should not be left ungoverned, but not all contract will have a constructor * (for example those pre-defined in genesis). **/ abstract contract GovernedBase { address public governance; address public proposedGovernance; bool private initialised; event GovernanceProposed(address proposedGovernance); event GovernanceUpdated (address oldGovernance, address newGoveranance); modifier onlyGovernance () { _checkOnlyGovernance(); _; } constructor(address _governance) { if (_governance != address(0)) { initialise(_governance); } } /** * @notice First of a two step process for turning over governance to another address. * @param _governance The address to propose to receive governance role. * @dev Must hold governance to propose another address. */ function proposeGovernance(address _governance) external onlyGovernance { proposedGovernance = _governance; emit GovernanceProposed(_governance); } /** * @notice Once proposed, claimant can claim the governance role as the second of a two-step process. */ function claimGovernance() external { require(msg.sender == proposedGovernance, "not claimaint"); emit GovernanceUpdated(governance, proposedGovernance); governance = proposedGovernance; proposedGovernance = address(0); } /** * @notice In a one-step process, turn over governance to another address. * @dev Must hold governance to transfer. */ function transferGovernance(address _governance) external onlyGovernance { emit GovernanceUpdated(governance, _governance); governance = _governance; proposedGovernance = address(0); } /** * @notice Initialize the governance address if not first initialized. */ function initialise(address _governance) public virtual { require(initialised == false, "initialised != false"); initialised = true; emit GovernanceUpdated(governance, _governance); governance = _governance; proposedGovernance = address(0); } function _checkOnlyGovernance() internal view { require(msg.sender == governance, "only governance"); } }
./contracts/addressUpdater/interface/IIAddressUpdatable.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; interface IIAddressUpdatable { /** * @notice Updates contract addresses - should be called only from AddressUpdater contract * @param _contractNameHashes list of keccak256(abi.encode(...)) contract names * @param _contractAddresses list of contract addresses corresponding to the contract names */ function updateContractAddresses( bytes32[] memory _contractNameHashes, address[] memory _contractAddresses ) external; }
./contracts/governance/implementation/Governed.sol
// SPDX-License-Identifier: MIT pragma solidity 0.7.6; import { GovernedBase } from "./GovernedBase.sol"; /** * @title Governed * @dev For deployed, governed contracts, enforce a non-zero address at create time. **/ contract Governed is GovernedBase { constructor(address _governance) GovernedBase(_governance) { require(_governance != address(0), "_governance zero"); } }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_governance","internalType":"address"}]},{"type":"event","name":"GovernanceProposed","inputs":[{"type":"address","name":"proposedGovernance","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"GovernanceUpdated","inputs":[{"type":"address","name":"oldGovernance","internalType":"address","indexed":false},{"type":"address","name":"newGoveranance","internalType":"address","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addOrUpdateContractNamesAndAddresses","inputs":[{"type":"string[]","name":"_contractNames","internalType":"string[]"},{"type":"address[]","name":"_contractAddresses","internalType":"address[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimGovernance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getContractAddress","inputs":[{"type":"string","name":"_name","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string[]","name":"_contractNames","internalType":"string[]"},{"type":"address[]","name":"_contractAddresses","internalType":"address[]"}],"name":"getContractNamesAndAddresses","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"governance","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialise","inputs":[{"type":"address","name":"_governance","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"proposeGovernance","inputs":[{"type":"address","name":"_governance","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"proposedGovernance","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferGovernance","inputs":[{"type":"address","name":"_governance","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"update","inputs":[{"type":"string[]","name":"_contractNames","internalType":"string[]"},{"type":"address[]","name":"_contractAddresses","internalType":"address[]"},{"type":"address[]","name":"_contractsToUpdate","internalType":"contract IIAddressUpdatable[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateContractAddresses","inputs":[{"type":"address[]","name":"_contractsToUpdate","internalType":"contract IIAddressUpdatable[]"}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b5060405161126438038061126483398101604081905261002f91610182565b80806001600160a01b03811615610049576100498161009f565b506001600160a01b038116610098576040805162461bcd60e51b815260206004820152601060248201526f5f676f7665726e616e6365207a65726f60801b604482015290519081900360640190fd5b50506101b0565b600154600160a01b900460ff16156100fe576040805162461bcd60e51b815260206004820152601460248201527f696e697469616c6973656420213d2066616c7365000000000000000000000000604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b179055600054604080516001600160a01b039283168152918316602083015280517f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d9281900390910190a1600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b600060208284031215610193578081fd5b81516001600160a01b03811681146101a9578182fd5b9392505050565b6110a5806101bf6000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c806360f7ac971161007157806360f7ac97146101125780638246e4671461011a5780639933dba61461012d5780639d6a890f14610140578063c373a08e14610153578063d38bfff414610166576100a9565b806304433bbc146100ae5780631b0e2960146100d75780632f26c5c3146100ec5780635aa6e675146101025780635d36b1901461010a575b600080fd5b6100c16100bc366004610e65565b610179565b6040516100ce9190610f26565b60405180910390f35b6100ea6100e5366004610d45565b6101fb565b005b6100f461020f565b6040516100ce929190610f91565b6100c16103b5565b6100ea6103c4565b6100c1610486565b6100ea610128366004610d80565b610495565b6100ea61013b366004610de1565b6104ab565b6100ea61014e366004610d22565b6104cb565b6100ea610161366004610d22565b6105a5565b6100ea610174366004610d22565b610601565b600080600360006101898561067a565b81526020808201929092526040908101600020548151808301909252600c82526b61646472657373207a65726f60a01b928201929092526001600160a01b039091169150816101f45760405162461bcd60e51b81526004016101eb9190611005565b60405180910390fd5b5092915050565b6102036106aa565b61020c816106fd565b50565b6060806002805480602002602001604051908101604052809291908181526020016000905b828210156102df5760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156102cb5780601f106102a0576101008083540402835291602001916102cb565b820191906000526020600020905b8154815290600101906020018083116102ae57829003601f168201915b505050505081526020019060010190610234565b505082519294508291505067ffffffffffffffff8111801561030057600080fd5b5060405190808252806020026020018201604052801561032a578160200160208202803683370190505b5091505b80156103b0578080600190039150506003600061035d85848151811061035057fe5b602002602001015161067a565b815260200190815260200160002060009054906101000a90046001600160a01b031682828151811061038b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505061032e565b509091565b6000546001600160a01b031681565b6001546001600160a01b03163314610413576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd0818db185a5b585a5b9d609a1b604482015290519081900360640190fd5b600054600154604080516001600160a01b03938416815292909116602083015280517f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d9281900390910190a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6001546001600160a01b031681565b61049d6106aa565b6104a78282610959565b5050565b6104b36106aa565b6104bd8383610959565b6104c6816106fd565b505050565b600154600160a01b900460ff1615610521576040805162461bcd60e51b8152602060048201526014602482015273696e697469616c6973656420213d2066616c736560601b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b179055600054604080516001600160a01b039283168152918316602083015280517f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d9281900390910190a1600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b6105ad6106aa565b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f1f95fb40be3a947982072902a887b521248d1d8931a39eb38f84f4d6fd758b699181900360200190a150565b6106096106aa565b600054604080516001600160a01b039283168152918316602083015280517f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d9281900390910190a1600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b60008160405160200161068d9190611005565b604051602081830303815290604052805190602001209050919050565b6000546001600160a01b031633146106fb576040805162461bcd60e51b815260206004820152600f60248201526e6f6e6c7920676f7665726e616e636560881b604482015290519081900360640190fd5b565b60025460008167ffffffffffffffff8111801561071957600080fd5b50604051908082528060200260200182016040528015610743578160200160208202803683370190505b50905060008267ffffffffffffffff8111801561075f57600080fd5b50604051908082528060200260200182016040528015610789578160200160208202803683370190505b5090505b82156108c757828060019003935050610844600284815481106107ac57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561083a5780601f1061080f5761010080835404028352916020019161083a565b820191906000526020600020905b81548152906001019060200180831161081d57829003601f168201915b505050505061067a565b82848151811061085057fe5b6020026020010181815250506003600083858151811061086c57fe5b6020026020010151815260200190815260200160002060009054906101000a90046001600160a01b03168184815181106108a257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505061078d565b60005b8451811015610952578481815181106108df57fe5b60200260200101516001600160a01b031663b00c0b7684846040518363ffffffff1660e01b8152600401610914929190610f3a565b600060405180830381600087803b15801561092e57600080fd5b505af1158015610942573d6000803e3d6000fd5b5050600190920191506108ca9050565b5050505050565b8151815160408051808201909152601a81527f6172726179206c656e6774687320646f206e6f74206d6174636800000000000060208201529082146109b15760405162461bcd60e51b81526004016101eb9190611005565b5060005b81811015610ae95760006001600160a01b03168382815181106109d457fe5b60200260200101516001600160a01b031614156040518060400160405280600c81526020016b61646472657373207a65726f60a01b81525090610a2a5760405162461bcd60e51b81526004016101eb9190611005565b506000610a3c85838151811061035057fe5b6000818152600360205260409020549091506001600160a01b0316610a9d576002858381518110610a6957fe5b60209081029190910181015182546001810184556000938452928290208151610a9b9491909101929190910190610aef565b505b838281518110610aa957fe5b60209081029190910181015160009283526003909152604090912080546001600160a01b0319166001600160a01b039092169190911790556001016109b5565b50505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282610b255760008555610b6b565b82601f10610b3e57805160ff1916838001178555610b6b565b82800160010185558215610b6b579182015b82811115610b6b578251825591602001919060010190610b50565b50610b77929150610b7b565b5090565b5b80821115610b775760008155600101610b7c565b600082601f830112610ba0578081fd5b81356020610bb5610bb08361103c565b611018565b8281528181019085830183850287018401881015610bd1578586fd5b855b85811015610bf8578135610be68161105a565b84529284019290840190600101610bd3565b5090979650505050505050565b600082601f830112610c15578081fd5b81356020610c25610bb08361103c565b8281528181019085830183850287018401881015610c41578586fd5b855b85811015610bf8578135610c568161105a565b84529284019290840190600101610c43565b600082601f830112610c78578081fd5b81356020610c88610bb08361103c565b82815281810190858301855b85811015610bf857610cab898684358b0101610cbd565b84529284019290840190600101610c94565b600082601f830112610ccd578081fd5b813567ffffffffffffffff811115610ce157fe5b610cf4601f8201601f1916602001611018565b818152846020838601011115610d08578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215610d33578081fd5b8135610d3e8161105a565b9392505050565b600060208284031215610d56578081fd5b813567ffffffffffffffff811115610d6c578182fd5b610d7884828501610c05565b949350505050565b60008060408385031215610d92578081fd5b823567ffffffffffffffff80821115610da9578283fd5b610db586838701610c68565b93506020850135915080821115610dca578283fd5b50610dd785828601610b90565b9150509250929050565b600080600060608486031215610df5578081fd5b833567ffffffffffffffff80821115610e0c578283fd5b610e1887838801610c68565b94506020860135915080821115610e2d578283fd5b610e3987838801610b90565b93506040860135915080821115610e4e578283fd5b50610e5b86828701610c05565b9150509250925092565b600060208284031215610e76578081fd5b813567ffffffffffffffff811115610e8c578182fd5b610d7884828501610cbd565b6000815180845260208085019450808401835b83811015610ed05781516001600160a01b031687529582019590820190600101610eab565b509495945050505050565b60008151808452815b81811015610f0057602081850181015186830182015201610ee4565b81811115610f115782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b604080825283519082018190526000906020906060840190828701845b82811015610f7357815184529284019290840190600101610f57565b50505083810382850152610f878186610e98565b9695505050505050565b60006040820160408352808551808352606085019150602092506060838202860101838801855b83811015610fe657605f19888403018552610fd4838351610edb565b94860194925090850190600101610fb8565b505085810384870152610ff98188610e98565b98975050505050505050565b600060208252610d3e6020830184610edb565b60405181810167ffffffffffffffff8111828210171561103457fe5b604052919050565b600067ffffffffffffffff82111561105057fe5b5060209081020190565b6001600160a01b038116811461020c57600080fdfea2646970667358221220fd68d41b161b9ba2c884aee3f81172cbd6e15339503e9a4754918556146c97a064736f6c63430007060033000000000000000000000000fe4dbb048428c3583e91a8e8f03bc64f09f54ef8
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100a95760003560e01c806360f7ac971161007157806360f7ac97146101125780638246e4671461011a5780639933dba61461012d5780639d6a890f14610140578063c373a08e14610153578063d38bfff414610166576100a9565b806304433bbc146100ae5780631b0e2960146100d75780632f26c5c3146100ec5780635aa6e675146101025780635d36b1901461010a575b600080fd5b6100c16100bc366004610e65565b610179565b6040516100ce9190610f26565b60405180910390f35b6100ea6100e5366004610d45565b6101fb565b005b6100f461020f565b6040516100ce929190610f91565b6100c16103b5565b6100ea6103c4565b6100c1610486565b6100ea610128366004610d80565b610495565b6100ea61013b366004610de1565b6104ab565b6100ea61014e366004610d22565b6104cb565b6100ea610161366004610d22565b6105a5565b6100ea610174366004610d22565b610601565b600080600360006101898561067a565b81526020808201929092526040908101600020548151808301909252600c82526b61646472657373207a65726f60a01b928201929092526001600160a01b039091169150816101f45760405162461bcd60e51b81526004016101eb9190611005565b60405180910390fd5b5092915050565b6102036106aa565b61020c816106fd565b50565b6060806002805480602002602001604051908101604052809291908181526020016000905b828210156102df5760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156102cb5780601f106102a0576101008083540402835291602001916102cb565b820191906000526020600020905b8154815290600101906020018083116102ae57829003601f168201915b505050505081526020019060010190610234565b505082519294508291505067ffffffffffffffff8111801561030057600080fd5b5060405190808252806020026020018201604052801561032a578160200160208202803683370190505b5091505b80156103b0578080600190039150506003600061035d85848151811061035057fe5b602002602001015161067a565b815260200190815260200160002060009054906101000a90046001600160a01b031682828151811061038b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505061032e565b509091565b6000546001600160a01b031681565b6001546001600160a01b03163314610413576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd0818db185a5b585a5b9d609a1b604482015290519081900360640190fd5b600054600154604080516001600160a01b03938416815292909116602083015280517f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d9281900390910190a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6001546001600160a01b031681565b61049d6106aa565b6104a78282610959565b5050565b6104b36106aa565b6104bd8383610959565b6104c6816106fd565b505050565b600154600160a01b900460ff1615610521576040805162461bcd60e51b8152602060048201526014602482015273696e697469616c6973656420213d2066616c736560601b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b179055600054604080516001600160a01b039283168152918316602083015280517f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d9281900390910190a1600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b6105ad6106aa565b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f1f95fb40be3a947982072902a887b521248d1d8931a39eb38f84f4d6fd758b699181900360200190a150565b6106096106aa565b600054604080516001600160a01b039283168152918316602083015280517f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d9281900390910190a1600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b60008160405160200161068d9190611005565b604051602081830303815290604052805190602001209050919050565b6000546001600160a01b031633146106fb576040805162461bcd60e51b815260206004820152600f60248201526e6f6e6c7920676f7665726e616e636560881b604482015290519081900360640190fd5b565b60025460008167ffffffffffffffff8111801561071957600080fd5b50604051908082528060200260200182016040528015610743578160200160208202803683370190505b50905060008267ffffffffffffffff8111801561075f57600080fd5b50604051908082528060200260200182016040528015610789578160200160208202803683370190505b5090505b82156108c757828060019003935050610844600284815481106107ac57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561083a5780601f1061080f5761010080835404028352916020019161083a565b820191906000526020600020905b81548152906001019060200180831161081d57829003601f168201915b505050505061067a565b82848151811061085057fe5b6020026020010181815250506003600083858151811061086c57fe5b6020026020010151815260200190815260200160002060009054906101000a90046001600160a01b03168184815181106108a257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505061078d565b60005b8451811015610952578481815181106108df57fe5b60200260200101516001600160a01b031663b00c0b7684846040518363ffffffff1660e01b8152600401610914929190610f3a565b600060405180830381600087803b15801561092e57600080fd5b505af1158015610942573d6000803e3d6000fd5b5050600190920191506108ca9050565b5050505050565b8151815160408051808201909152601a81527f6172726179206c656e6774687320646f206e6f74206d6174636800000000000060208201529082146109b15760405162461bcd60e51b81526004016101eb9190611005565b5060005b81811015610ae95760006001600160a01b03168382815181106109d457fe5b60200260200101516001600160a01b031614156040518060400160405280600c81526020016b61646472657373207a65726f60a01b81525090610a2a5760405162461bcd60e51b81526004016101eb9190611005565b506000610a3c85838151811061035057fe5b6000818152600360205260409020549091506001600160a01b0316610a9d576002858381518110610a6957fe5b60209081029190910181015182546001810184556000938452928290208151610a9b9491909101929190910190610aef565b505b838281518110610aa957fe5b60209081029190910181015160009283526003909152604090912080546001600160a01b0319166001600160a01b039092169190911790556001016109b5565b50505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282610b255760008555610b6b565b82601f10610b3e57805160ff1916838001178555610b6b565b82800160010185558215610b6b579182015b82811115610b6b578251825591602001919060010190610b50565b50610b77929150610b7b565b5090565b5b80821115610b775760008155600101610b7c565b600082601f830112610ba0578081fd5b81356020610bb5610bb08361103c565b611018565b8281528181019085830183850287018401881015610bd1578586fd5b855b85811015610bf8578135610be68161105a565b84529284019290840190600101610bd3565b5090979650505050505050565b600082601f830112610c15578081fd5b81356020610c25610bb08361103c565b8281528181019085830183850287018401881015610c41578586fd5b855b85811015610bf8578135610c568161105a565b84529284019290840190600101610c43565b600082601f830112610c78578081fd5b81356020610c88610bb08361103c565b82815281810190858301855b85811015610bf857610cab898684358b0101610cbd565b84529284019290840190600101610c94565b600082601f830112610ccd578081fd5b813567ffffffffffffffff811115610ce157fe5b610cf4601f8201601f1916602001611018565b818152846020838601011115610d08578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215610d33578081fd5b8135610d3e8161105a565b9392505050565b600060208284031215610d56578081fd5b813567ffffffffffffffff811115610d6c578182fd5b610d7884828501610c05565b949350505050565b60008060408385031215610d92578081fd5b823567ffffffffffffffff80821115610da9578283fd5b610db586838701610c68565b93506020850135915080821115610dca578283fd5b50610dd785828601610b90565b9150509250929050565b600080600060608486031215610df5578081fd5b833567ffffffffffffffff80821115610e0c578283fd5b610e1887838801610c68565b94506020860135915080821115610e2d578283fd5b610e3987838801610b90565b93506040860135915080821115610e4e578283fd5b50610e5b86828701610c05565b9150509250925092565b600060208284031215610e76578081fd5b813567ffffffffffffffff811115610e8c578182fd5b610d7884828501610cbd565b6000815180845260208085019450808401835b83811015610ed05781516001600160a01b031687529582019590820190600101610eab565b509495945050505050565b60008151808452815b81811015610f0057602081850181015186830182015201610ee4565b81811115610f115782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b604080825283519082018190526000906020906060840190828701845b82811015610f7357815184529284019290840190600101610f57565b50505083810382850152610f878186610e98565b9695505050505050565b60006040820160408352808551808352606085019150602092506060838202860101838801855b83811015610fe657605f19888403018552610fd4838351610edb565b94860194925090850190600101610fb8565b505085810384870152610ff98188610e98565b98975050505050505050565b600060208252610d3e6020830184610edb565b60405181810167ffffffffffffffff8111828210171561103457fe5b604052919050565b600067ffffffffffffffff82111561105057fe5b5060209081020190565b6001600160a01b038116811461020c57600080fdfea2646970667358221220fd68d41b161b9ba2c884aee3f81172cbd6e15339503e9a4754918556146c97a064736f6c63430007060033