- Contract name:
- HomeMediator
- Optimization enabled
- true
- Compiler version
- v0.4.24+commit.e67f0147
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2019-10-04T15:04:35.800245Z
Contract source code
// File: bridge-contracts/contracts/upgradeability/EternalStorage.sol pragma solidity 0.4.24; /** * @title EternalStorage * @dev This contract holds all the necessary state variables to carry out the storage of any contract. */ contract EternalStorage { mapping(bytes32 => uint256) internal uintStorage; mapping(bytes32 => string) internal stringStorage; mapping(bytes32 => address) internal addressStorage; mapping(bytes32 => bytes) internal bytesStorage; mapping(bytes32 => bool) internal boolStorage; mapping(bytes32 => int256) internal intStorage; } // File: bridge-contracts/contracts/upgradeable_contracts/Initializable.sol pragma solidity 0.4.24; contract Initializable is EternalStorage { bytes32 internal constant INITIALIZED = keccak256(abi.encodePacked("isInitialized")); bytes32 internal constant DEPLOYED_AT_BLOCK = keccak256(abi.encodePacked("deployedAtBlock")); function setInitialize() internal { boolStorage[INITIALIZED] = true; } function isInitialized() public view returns (bool) { return boolStorage[INITIALIZED]; } function deployedAtBlock() external view returns (uint256) { return uintStorage[DEPLOYED_AT_BLOCK]; } } // File: openzeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol pragma solidity ^0.4.24; /** * @title ERC20Basic * @dev Simpler version of ERC20 interface * See https://github.com/ethereum/EIPs/issues/179 */ contract ERC20Basic { function totalSupply() public view returns (uint256); function balanceOf(address _who) public view returns (uint256); function transfer(address _to, uint256 _value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } // File: bridge-contracts/contracts/upgradeable_contracts/Sacrifice.sol pragma solidity 0.4.24; contract Sacrifice { constructor(address _recipient) public payable { selfdestruct(_recipient); } } // File: bridge-contracts/contracts/upgradeable_contracts/Claimable.sol pragma solidity 0.4.24; contract Claimable { bytes4 internal constant TRANSFER = 0xa9059cbb; // transfer(address,uint256) modifier validAddress(address _to) { require(_to != address(0)); /* solcov ignore next */ _; } function claimValues(address _token, address _to) internal { if (_token == address(0)) { claimNativeCoins(_to); } else { claimErc20Tokens(_token, _to); } } function claimNativeCoins(address _to) internal { uint256 value = address(this).balance; if (!_to.send(value)) { (new Sacrifice).value(value)(_to); } } function claimErc20Tokens(address _token, address _to) internal { ERC20Basic token = ERC20Basic(_token); uint256 balance = token.balanceOf(this); safeTransfer(_token, _to, balance); } function safeTransfer(address _token, address _to, uint256 _value) internal { bytes memory returnData; bool returnDataResult; bytes memory callData = abi.encodeWithSelector(TRANSFER, _to, _value); assembly { let result := call(gas, _token, 0x0, add(callData, 0x20), mload(callData), 0, 32) returnData := mload(0) returnDataResult := mload(0) switch result case 0 { revert(0, 0) } } // Return data is optional if (returnData.length > 0) { require(returnDataResult); } } } // File: bridge-contracts/contracts/interfaces/IUpgradeabilityOwnerStorage.sol pragma solidity 0.4.24; interface IUpgradeabilityOwnerStorage { function upgradeabilityOwner() external view returns (address); } // File: bridge-contracts/contracts/upgradeable_contracts/Upgradeable.sol pragma solidity 0.4.24; contract Upgradeable { // Avoid using onlyUpgradeabilityOwner name to prevent issues with implementation from proxy contract modifier onlyIfUpgradeabilityOwner() { require(msg.sender == IUpgradeabilityOwnerStorage(this).upgradeabilityOwner()); /* solcov ignore next */ _; } } // File: bridge-contracts/contracts/libraries/Bytes.sol pragma solidity 0.4.24; library Bytes { function bytesToBytes32(bytes _bytes) internal pure returns (bytes32 result) { assembly { result := mload(add(_bytes, 32)) } } } // File: bridge-contracts/contracts/interfaces/IAMB.sol pragma solidity 0.4.24; interface IAMB { function messageSender() external view returns (address); function maxGasPerTx() external view returns (uint256); function transactionHash() external view returns (bytes32); function messageCallStatus(bytes32 _txHash) external view returns (bool); function failedMessageDataHash(bytes32 _txHash) external view returns (bytes32); function failedMessageReceiver(bytes32 _txHash) external view returns (address); function failedMessageSender(bytes32 _txHash) external view returns (address); function requireToPassMessage(address _contract, bytes _data, uint256 _gas) external; } // File: bridge-contracts/contracts/upgradeable_contracts/Ownable.sol pragma solidity 0.4.24; /** * @title Ownable * @dev This contract has an owner address providing basic authorization control */ contract Ownable is EternalStorage { /** * @dev Event to show ownership has been transferred * @param previousOwner representing the address of the previous owner * @param newOwner representing the address of the new owner */ event OwnershipTransferred(address previousOwner, address newOwner); /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner()); /* solcov ignore next */ _; } /** * @dev Tells the address of the owner * @return the address of the owner */ function owner() public view returns (address) { return addressStorage[keccak256(abi.encodePacked("owner"))]; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner the address to transfer ownership to. */ function transferOwnership(address newOwner) external onlyOwner { require(newOwner != address(0)); setOwner(newOwner); } /** * @dev Sets a new owner address */ function setOwner(address newOwner) internal { emit OwnershipTransferred(owner(), newOwner); addressStorage[keccak256(abi.encodePacked("owner"))] = newOwner; } } // File: openzeppelin-solidity/contracts/AddressUtils.sol pragma solidity ^0.4.24; /** * Utility library of inline functions on addresses */ library AddressUtils { /** * Returns whether the target address is a contract * @dev This function will return false if invoked during the constructor of a contract, * as the code is not actually created until after the constructor finishes. * @param _addr address to check * @return whether the target address is a contract */ function isContract(address _addr) internal view returns (bool) { uint256 size; // XXX Currently there is no better way to check if there is a contract in an address // than to check the size of the code at that address. // See https://ethereum.stackexchange.com/a/14016/36603 // for more details about how this works. // TODO Check this again before the Serenity release, because all addresses will be // contracts then. // solium-disable-next-line security/no-inline-assembly assembly { size := extcodesize(_addr) } return size > 0; } } // File: contracts/mediator/AMBMediator.sol pragma solidity 0.4.24; contract AMBMediator is EternalStorage, Ownable { bytes32 internal constant BRIDGE_CONTRACT = keccak256(abi.encodePacked("bridgeContract")); bytes32 internal constant MEDIATOR_CONTRACT = keccak256(abi.encodePacked("mediatorContract")); bytes32 internal constant REQUEST_GAS_LIMIT = keccak256(abi.encodePacked("requestGasLimit")); function setBridgeContract(address _bridgeContract) external onlyOwner { _setBridgeContract(_bridgeContract); } function _setBridgeContract(address _bridgeContract) internal { require(AddressUtils.isContract(_bridgeContract)); addressStorage[BRIDGE_CONTRACT] = _bridgeContract; } function bridgeContract() public view returns (IAMB) { return IAMB(addressStorage[BRIDGE_CONTRACT]); } function setMediatorContractOnOtherSide(address _mediatorContract) external onlyOwner { _setMediatorContractOnOtherSide(_mediatorContract); } function _setMediatorContractOnOtherSide(address _mediatorContract) internal { addressStorage[MEDIATOR_CONTRACT] = _mediatorContract; } function mediatorContractOnOtherSide() public view returns (address) { return addressStorage[MEDIATOR_CONTRACT]; } function setRequestGasLimit(uint256 _requestGasLimit) external onlyOwner { _setRequestGasLimit(_requestGasLimit); } function _setRequestGasLimit(uint256 _requestGasLimit) internal { require(_requestGasLimit <= bridgeContract().maxGasPerTx()); uintStorage[REQUEST_GAS_LIMIT] = _requestGasLimit; } function requestGasLimit() public view returns (uint256) { return uintStorage[REQUEST_GAS_LIMIT]; } } // File: contracts/kitty/ERC721.sol pragma solidity 0.4.24; /// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens /// @author Dieter Shirley <[email protected]> (https://github.com/dete) contract ERC721 { // Required methods function totalSupply() public view returns (uint256 total); function balanceOf(address _owner) public view returns (uint256 balance); function ownerOf(uint256 _tokenId) external view returns (address owner); function approve(address _to, uint256 _tokenId) external; function transfer(address _to, uint256 _tokenId) external; function transferFrom(address _from, address _to, uint256 _tokenId) external; // Events event Transfer(address from, address to, uint256 tokenId); event Approval(address owner, address approved, uint256 tokenId); // Optional // function name() public view returns (string name); // function symbol() public view returns (string symbol); // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds); // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl); // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165) function supportsInterface(bytes4 _interfaceID) external view returns (bool); } // File: contracts/mediator/ERC721Bridge.sol pragma solidity 0.4.24; contract ERC721Bridge is EternalStorage { bytes32 internal constant ERC721_TOKEN = keccak256(abi.encodePacked("erc721token")); function erc721token() public view returns (ERC721) { return ERC721(addressStorage[ERC721_TOKEN]); } function setErc721token(address _token) internal { require(AddressUtils.isContract(_token)); addressStorage[ERC721_TOKEN] = _token; } } // File: contracts/mediator/BasicMediator.sol pragma solidity 0.4.24; contract BasicMediator is Initializable, AMBMediator, ERC721Bridge, Upgradeable, Claimable { event FailedMessageFixed(bytes32 indexed dataHash, address recipient, uint256 tokenId); bytes32 internal constant NONCE = keccak256(abi.encodePacked("nonce")); bytes4 internal constant GET_KITTY = 0xe98b7f4d; // getKitty(uint256) function initialize( address _bridgeContract, address _mediatorContract, address _erc721token, uint256 _requestGasLimit, address _owner ) external returns (bool) { require(!isInitialized()); _setBridgeContract(_bridgeContract); _setMediatorContractOnOtherSide(_mediatorContract); setErc721token(_erc721token); _setRequestGasLimit(_requestGasLimit); setOwner(_owner); setNonce(keccak256(abi.encodePacked(address(this)))); setInitialize(); return isInitialized(); } function getBridgeInterfacesVersion() external pure returns (uint64 major, uint64 minor, uint64 patch) { return (1, 0, 0); } function getBridgeMode() external pure returns (bytes4 _data) { return bytes4(keccak256(abi.encodePacked("nft-to-nft-amb"))); } function transferToken(address _from, uint256 _tokenId) external { ERC721 token = erc721token(); address to = address(this); token.transferFrom(_from, to, _tokenId); bridgeSpecificActionsOnTokenTransfer(_from, _tokenId); } /** * getKitty(uint256) returns: * bool isGestating, * bool isReady, * uint256 cooldownIndex, * uint256 nextActionAt, * uint256 siringWithId, * uint256 birthTime, * uint256 matronId, * uint256 sireId, * uint256 generation, * uint256 genes **/ function getMetadata(uint256 _tokenId) internal view returns (bytes memory metadata) { bytes memory callData = abi.encodeWithSelector(GET_KITTY, _tokenId); address tokenAddress = erc721token(); metadata = new bytes(320); assembly { let result := call(gas, tokenAddress, 0x0, add(callData, 0x20), mload(callData), 0, 0) returndatacopy(add(metadata, 0x20), 0, returndatasize) switch result case 0 { revert(0, 0) } } } function nonce() internal view returns (bytes32) { return Bytes.bytesToBytes32(bytesStorage[NONCE]); } function setNonce(bytes32 _hash) internal { bytesStorage[NONCE] = abi.encodePacked(_hash); } function setMessageHashTokenId(bytes32 _hash, uint256 _tokenId) internal { uintStorage[keccak256(abi.encodePacked("messageHashTokenId", _hash))] = _tokenId; } function messageHashTokenId(bytes32 _hash) internal view returns (uint256) { return uintStorage[keccak256(abi.encodePacked("messageHashTokenId", _hash))]; } function setMessageHashRecipient(bytes32 _hash, address _recipient) internal { addressStorage[keccak256(abi.encodePacked("messageHashRecipient", _hash))] = _recipient; } function messageHashRecipient(bytes32 _hash) internal view returns (address) { return addressStorage[keccak256(abi.encodePacked("messageHashRecipient", _hash))]; } function setMessageHashFixed(bytes32 _hash) internal { boolStorage[keccak256(abi.encodePacked("messageHashFixed", _hash))] = true; } function messageHashFixed(bytes32 _hash) public view returns (bool) { return boolStorage[keccak256(abi.encodePacked("messageHashFixed", _hash))]; } function requestFailedMessageFix(bytes32 _txHash) external { require(!bridgeContract().messageCallStatus(_txHash)); require(bridgeContract().failedMessageReceiver(_txHash) == address(this)); require(bridgeContract().failedMessageSender(_txHash) == mediatorContractOnOtherSide()); bytes32 dataHash = bridgeContract().failedMessageDataHash(_txHash); bytes4 methodSelector = this.fixFailedMessage.selector; bytes memory data = abi.encodeWithSelector(methodSelector, dataHash); bridgeContract().requireToPassMessage(mediatorContractOnOtherSide(), data, requestGasLimit()); } function claimTokens(address _token, address _to) public onlyIfUpgradeabilityOwner validAddress(_to) { claimValues(_token, _to); } function fixFailedMessage(bytes32 _dataHash) external; function bridgeSpecificActionsOnTokenTransfer(address _from, uint256 _tokenId) internal; } // File: contracts/interfaces/IForeignMediator.sol pragma solidity 0.4.24; interface IForeignMediator { function handleBridgedTokens(address _recipient, uint256 _tokenId, bytes32 _nonce) external; } // File: contracts/interfaces/ISimpleBridgeKitty.sol pragma solidity 0.4.24; interface ISimpleBridgeKitty { function mint( uint256 _tokenId, bool _isReady, uint256 _cooldownIndex, uint256 _nextActionAt, uint256 _siringWithId, uint256 _birthTime, uint256 _matronId, uint256 _sireId, uint256 _generation, uint256 _genes, address _owner ) external; function burn(uint256 _tokenId) external; } // File: contracts/mediator/HomeMediator.sol pragma solidity 0.4.24; contract HomeMediator is BasicMediator { function passMessage(address _from, uint256 _tokenId, bytes _metadata) internal { bytes4 methodSelector = IForeignMediator(0).handleBridgedTokens.selector; bytes memory data = abi.encodeWithSelector(methodSelector, _from, _tokenId, nonce()); bytes32 dataHash = keccak256(data); setMessageHashTokenId(dataHash, _tokenId); setMessageHashRecipient(dataHash, _from); setMessageHashMetadata(dataHash, _metadata); setNonce(dataHash); bridgeContract().requireToPassMessage(mediatorContractOnOtherSide(), data, requestGasLimit()); } function handleBridgedTokens( address _recipient, uint256 _tokenId, bytes _metadata, bytes32 /* _nonce */ ) external { require(msg.sender == address(bridgeContract())); require(bridgeContract().messageSender() == mediatorContractOnOtherSide()); mintToken(_recipient, _tokenId, _metadata); } function mintToken(address _recipient, uint256 _tokenId, bytes _metadata) internal { ISimpleBridgeKitty(erc721token()).mint( _tokenId, getMetadataBoolValue(_metadata, 2), // isReady getMetadataUintValue(_metadata, 3), // cooldownIndex getMetadataUintValue(_metadata, 4), // nextActionAt getMetadataUintValue(_metadata, 5), // siringWithId getMetadataUintValue(_metadata, 6), // birthTime getMetadataUintValue(_metadata, 7), // matronId getMetadataUintValue(_metadata, 8), // sireId getMetadataUintValue(_metadata, 9), // generation getMetadataUintValue(_metadata, 10), // genes _recipient ); } function bridgeSpecificActionsOnTokenTransfer(address _from, uint256 _tokenId) internal { bytes memory metadata = getMetadata(_tokenId); ISimpleBridgeKitty(erc721token()).burn(_tokenId); passMessage(_from, _tokenId, metadata); } function getMetadataUintValue(bytes _data, uint256 _index) internal pure returns (uint256 value) { uint256 offset = 32 * _index; assembly { value := mload(add(_data, offset)) } } function getMetadataBoolValue(bytes _data, uint256 _index) internal pure returns (bool value) { uint256 offset = 32 * _index; assembly { value := mload(add(_data, offset)) } } function setMessageHashMetadata(bytes32 _hash, bytes _metadata) internal { bytesStorage[keccak256(abi.encodePacked("messageHashMetadata", _hash))] = _metadata; } function messageHashMetadata(bytes32 _hash) internal view returns (bytes) { return bytesStorage[keccak256(abi.encodePacked("messageHashMetadata", _hash))]; } function fixFailedMessage(bytes32 _dataHash) external { require(msg.sender == address(bridgeContract())); require(bridgeContract().messageSender() == mediatorContractOnOtherSide()); require(!messageHashFixed(_dataHash)); address recipient = messageHashRecipient(_dataHash); uint256 tokenId = messageHashTokenId(_dataHash); bytes memory metadata = messageHashMetadata(_dataHash); setMessageHashFixed(_dataHash); mintToken(recipient, tokenId, metadata); emit FailedMessageFixed(_dataHash, recipient, tokenId); } }
Contract ABI
[{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"fixFailedMessage","inputs":[{"type":"bytes32","name":"_dataHash"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setBridgeContract","inputs":[{"type":"address","name":"_bridgeContract"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"transferToken","inputs":[{"type":"address","name":"_from"},{"type":"uint256","name":"_tokenId"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"isInitialized","inputs":[],"constant":true},{"type":"function","stateMutability":"pure","payable":false,"outputs":[{"type":"bytes4","name":"_data"}],"name":"getBridgeMode","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"initialize","inputs":[{"type":"address","name":"_bridgeContract"},{"type":"address","name":"_mediatorContract"},{"type":"address","name":"_erc721token"},{"type":"uint256","name":"_requestGasLimit"},{"type":"address","name":"_owner"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"handleBridgedTokens","inputs":[{"type":"address","name":"_recipient"},{"type":"uint256","name":"_tokenId"},{"type":"bytes","name":"_metadata"},{"type":"bytes32","name":""}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"claimTokens","inputs":[{"type":"address","name":"_token"},{"type":"address","name":"_to"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setMediatorContractOnOtherSide","inputs":[{"type":"address","name":"_mediatorContract"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"mediatorContractOnOtherSide","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"owner","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"messageHashFixed","inputs":[{"type":"bytes32","name":"_hash"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"deployedAtBlock","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"requestFailedMessageFix","inputs":[{"type":"bytes32","name":"_txHash"}],"constant":false},{"type":"function","stateMutability":"pure","payable":false,"outputs":[{"type":"uint64","name":"major"},{"type":"uint64","name":"minor"},{"type":"uint64","name":"patch"}],"name":"getBridgeInterfacesVersion","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"requestGasLimit","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"bridgeContract","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"erc721token","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setRequestGasLimit","inputs":[{"type":"uint256","name":"_requestGasLimit"}],"constant":false},{"type":"event","name":"FailedMessageFixed","inputs":[{"type":"bytes32","name":"dataHash","indexed":true},{"type":"address","name":"recipient","indexed":false},{"type":"uint256","name":"tokenId","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","indexed":false},{"type":"address","name":"newOwner","indexed":false}],"anonymous":false}]
Contract Creation Code
0x608060405234801561001057600080fd5b50612686806100206000396000f3006080604052600436106100f85763ffffffff60e060020a6000350416630950d51581146100fd5780630b26cf66146101175780631072cbea14610138578063392e53cd1461015c578063437764df14610185578063530b97a4146101cc5780635d4f3b2a1461020357806369ffa08a146102375780636e5d6bea1461025e578063871c07601461027f5780638da5cb5b146102b057806399650862146102c55780639a454b99146102dd5780639a4a4395146103045780639cb7595a1461031c578063be3b625b1461035d578063cd59658314610372578063e5ebccf414610387578063f2fde38b1461039c578063f3b83791146103bd575b600080fd5b34801561010957600080fd5b506101156004356103d5565b005b34801561012357600080fd5b50610115600160a060020a036004351661051c565b34801561014457600080fd5b50610115600160a060020a0360043516602435610544565b34801561016857600080fd5b506101716105f0565b604080519115158252519081900360200190f35b34801561019157600080fd5b5061019a6106a9565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff199092168252519081900360200190f35b3480156101d857600080fd5b50610171600160a060020a03600435811690602435811690604435811690606435906084351661074c565b34801561020f57600080fd5b5061011560048035600160a060020a0316906024803591604435918201910135606435610839565b34801561024357600080fd5b50610115600160a060020a036004358116906024351661092c565b34801561026a57600080fd5b50610115600160a060020a03600435166109cf565b34801561028b57600080fd5b506102946109f4565b60408051600160a060020a039092168252519081900360200190f35b3480156102bc57600080fd5b50610294610ab2565b3480156102d157600080fd5b50610171600435610b26565b3480156102e957600080fd5b506102f2610bef565b60408051918252519081900360200190f35b34801561031057600080fd5b50610115600435610ca3565b34801561032857600080fd5b50610331611056565b6040805167ffffffffffffffff9485168152928416602084015292168183015290519081900360600190f35b34801561036957600080fd5b506102f2611060565b34801561037e57600080fd5b506102946110d3565b34801561039357600080fd5b50610294611147565b3480156103a857600080fd5b50610115600160a060020a03600435166111bb565b3480156103c957600080fd5b506101156004356111f5565b60008060606103e26110d3565b600160a060020a031633146103f657600080fd5b6103fe6109f4565b600160a060020a031661040f6110d3565b600160a060020a031663d67bdd256040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561044c57600080fd5b505af1158015610460573d6000803e3d6000fd5b505050506040513d602081101561047657600080fd5b5051600160a060020a03161461048b57600080fd5b61049484610b26565b1561049e57600080fd5b6104a78461121a565b92506104b2846112e9565b91506104bd846113ae565b90506104c884611516565b6104d38383836115e8565b60408051600160a060020a038516815260208101849052815186927f06297b0797e3363e96e454edd4ab62862051bf559a7a431ce09415306771d133928290030190a250505050565b610524610ab2565b600160a060020a0316331461053857600080fd5b6105418161170a565b50565b60008061054f611147565b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301523060248301819052604483018890529251939550919350908416916323b872dd9160648082019260009290919082900301818387803b1580156105c857600080fd5b505af11580156105dc573d6000803e3d6000fd5b505050506105ea84846117fb565b50505050565b60006004600060405160200180807f6973496e697469616c697a656400000000000000000000000000000000000000815250600d0190506040516020818303038152906040526040518082805190602001908083835b602083106106655780518252601f199092019160209182019101610646565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000205460ff1693505050505b90565b600060405160200180807f6e66742d746f2d6e66742d616d62000000000000000000000000000000000000815250600e0190506040516020818303038152906040526040518082805190602001908083835b6020831061071a5780518252601f1990920191602091820191016106fb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020905090565b60006107566105f0565b1561076057600080fd5b6107698661170a565b6107728561187b565b61077b846118ee565b61078483611975565b61078d82611aa6565b604080516c01000000000000000000000000300260208083019190915282518083036014018152603490920192839052815161081f93918291908401908083835b602083106107ed5780518252601f1990920191602091820191016107ce565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020611b64565b610827611c3d565b61082f6105f0565b9695505050505050565b6108416110d3565b600160a060020a0316331461085557600080fd5b61085d6109f4565b600160a060020a031661086e6110d3565b600160a060020a031663d67bdd256040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156108ab57600080fd5b505af11580156108bf573d6000803e3d6000fd5b505050506040513d60208110156108d557600080fd5b5051600160a060020a0316146108ea57600080fd5b610925858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437506115e8945050505050565b5050505050565b30600160a060020a0316636fde82026040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561096a57600080fd5b505af115801561097e573d6000803e3d6000fd5b505050506040513d602081101561099457600080fd5b5051600160a060020a031633146109aa57600080fd5b80600160a060020a03811615156109c057600080fd5b6109ca8383611cfe565b505050565b6109d7610ab2565b600160a060020a031633146109eb57600080fd5b6105418161187b565b60006002600060405160200180807f6d65646961746f72436f6e74726163740000000000000000000000000000000081525060100190506040516020818303038152906040526040518082805190602001908083835b60208310610a695780518252601f199092019160209182019101610a4a565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a0316949350505050565b60006002600060405160200180807f6f776e6572000000000000000000000000000000000000000000000000000000815250600501905060405160208183030381529060405260405180828051906020019080838360208310610a695780518252601f199092019160209182019101610a4a565b6000600460008360405160200180807f6d6573736167654861736846697865640000000000000000000000000000000081525060100182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b60208310610bab5780518252601f199092019160209182019101610b8c565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000205460ff1695945050505050565b600080600060405160200180807f6465706c6f7965644174426c6f636b0000000000000000000000000000000000815250600f0190506040516020818303038152906040526040518082805190602001908083835b60208310610c635780518252601f199092019160209182019101610c44565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054949350505050565b6000806060610cb06110d3565b600160a060020a031663cb08a10c856040518263ffffffff1660e060020a028152600401808260001916600019168152602001915050602060405180830381600087803b158015610d0057600080fd5b505af1158015610d14573d6000803e3d6000fd5b505050506040513d6020811015610d2a57600080fd5b505115610d3657600080fd5b30610d3f6110d3565b600160a060020a0316633f9a8e7e866040518263ffffffff1660e060020a028152600401808260001916600019168152602001915050602060405180830381600087803b158015610d8f57600080fd5b505af1158015610da3573d6000803e3d6000fd5b505050506040513d6020811015610db957600080fd5b5051600160a060020a031614610dce57600080fd5b610dd66109f4565b600160a060020a0316610de76110d3565b600160a060020a0316634a610b04866040518263ffffffff1660e060020a028152600401808260001916600019168152602001915050602060405180830381600087803b158015610e3757600080fd5b505af1158015610e4b573d6000803e3d6000fd5b505050506040513d6020811015610e6157600080fd5b5051600160a060020a031614610e7657600080fd5b610e7e6110d3565b600160a060020a031663e37c3289856040518263ffffffff1660e060020a028152600401808260001916600019168152602001915050602060405180830381600087803b158015610ece57600080fd5b505af1158015610ee2573d6000803e3d6000fd5b505050506040513d6020811015610ef857600080fd5b5051604080516024808201849052825180830390910181526044909101909152602081018051600160e060020a03167f0950d515000000000000000000000000000000000000000000000000000000009081179091529194509092509050610f5e6110d3565b600160a060020a031663dc8601b3610f746109f4565b83610f7d611060565b6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015610fea578181015183820152602001610fd2565b50505050905090810190601f1680156110175780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561103857600080fd5b505af115801561104c573d6000803e3d6000fd5b5050505050505050565b6001600080909192565b600080600060405160200180807f726571756573744761734c696d69740000000000000000000000000000000000815250600f01905060405160208183030381529060405260405180828051906020019080838360208310610c635780518252601f199092019160209182019101610c44565b60006002600060405160200180807f627269646765436f6e7472616374000000000000000000000000000000000000815250600e01905060405160208183030381529060405260405180828051906020019080838360208310610a695780518252601f199092019160209182019101610a4a565b60006002600060405160200180807f657263373231746f6b656e000000000000000000000000000000000000000000815250600b01905060405160208183030381529060405260405180828051906020019080838360208310610a695780518252601f199092019160209182019101610a4a565b6111c3610ab2565b600160a060020a031633146111d757600080fd5b600160a060020a03811615156111ec57600080fd5b61054181611aa6565b6111fd610ab2565b600160a060020a0316331461121157600080fd5b61054181611975565b6000600260008360405160200180807f6d65737361676548617368526563697069656e7400000000000000000000000081525060140182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061129f5780518252601f199092019160209182019101611280565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a031695945050505050565b60008060008360405160200180807f6d65737361676548617368546f6b656e4964000000000000000000000000000081525060120182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061136d5780518252601f19909201916020918201910161134e565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000205495945050505050565b6060600360008360405160200180807f6d657373616765486173684d657461646174610000000000000000000000000081525060130182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b602083106114335780518252601f199092019160209182019101611414565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600019166000191681526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561150a5780601f106114df5761010080835404028352916020019161150a565b820191906000526020600020905b8154815290600101906020018083116114ed57829003601f168201915b50505050509050919050565b6001600460008360405160200180807f6d6573736167654861736846697865640000000000000000000000000000000081525060100182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061159b5780518252601f19909201916020918201910161157c565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805460ff19169415159490941790935550505050565b6115f0611147565b600160a060020a031663319346678361160a846002611d26565b611615856003611d26565b611620866004611d26565b61162b876005611d26565b611636886006611d26565b611641896007611d26565b61164c8a6008611d26565b6116578b6009611d26565b6116628c600a611d26565b6040805160e060020a63ffffffff8e16028152600481019b909b5298151560248b015260448a01979097526064890195909552608488019390935260a487019190915260c486015260e4850152610104840152610124830152600160a060020a0387166101448301525161016480830192600092919082900301818387803b1580156116ed57600080fd5b505af1158015611701573d6000803e3d6000fd5b50505050505050565b61171381611d2e565b151561171e57600080fd5b806002600060405160200180807f627269646765436f6e7472616374000000000000000000000000000000000000815250600e0190506040516020818303038152906040526040518082805190602001908083835b602083106117925780518252601f199092019160209182019101611773565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03959095169490941790935550505050565b606061180682611d36565b9050611810611147565b600160a060020a03166342966c68836040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561185857600080fd5b505af115801561186c573d6000803e3d6000fd5b505050506109ca838383611de0565b806002600060405160200180807f6d65646961746f72436f6e7472616374000000000000000000000000000000008152506010019050604051602081830303815290604052604051808280519060200190808383602083106117925780518252601f199092019160209182019101611773565b6118f781611d2e565b151561190257600080fd5b806002600060405160200180807f657263373231746f6b656e000000000000000000000000000000000000000000815250600b019050604051602081830303815290604052604051808280519060200190808383602083106117925780518252601f199092019160209182019101611773565b61197d6110d3565b600160a060020a031663e5789d036040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156119ba57600080fd5b505af11580156119ce573d6000803e3d6000fd5b505050506040513d60208110156119e457600080fd5b50518111156119f257600080fd5b8060008060405160200180807f726571756573744761734c696d69740000000000000000000000000000000000815250600f0190506040516020818303038152906040526040518082805190602001908083835b60208310611a655780518252601f199092019160209182019101611a46565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000209390935550505050565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0611acf610ab2565b60408051600160a060020a03928316815291841660208301528051918290030190a1806002600060405160200180807f6f776e65720000000000000000000000000000000000000000000000000000008152506005019050604051602081830303815290604052604051808280519060200190808383602083106117925780518252601f199092019160209182019101611773565b60408051602080820184905282518083038201815282840184527f6e6f6e636500000000000000000000000000000000000000000000000000000060608401528351604581850301815260659093019384905282519093600393600093909282918401908083835b60208310611beb5780518252601f199092019160209182019101611bcc565b51815160001960209485036101000a01908116901991909116179052604080519490920184900390932086528583019690965250929093016000208451611c39959194509201919050612592565b5050565b60016004600060405160200180807f6973496e697469616c697a656400000000000000000000000000000000000000815250600d0190506040516020818303038152906040526040518082805190602001908083835b60208310611cb25780518252601f199092019160209182019101611c93565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805460ff191694151594909417909355505050565b600160a060020a0382161515611d1c57611d1781612004565b611c39565b611c398282612068565b602002015190565b6000903b1190565b604080516024808201849052825180830390910181526044909101909152602081018051600160e060020a03167fe98b7f4d000000000000000000000000000000000000000000000000000000001790526060906000611d94611147565b60408051610140808252610160820190925291925060208201612800803883390190505092506000808351602085016000855af13d6000602086013e8080156100f85750505050919050565b7f6435914e0000000000000000000000000000000000000000000000000000000060606000828686611e10612106565b60408051600160a060020a03909416602485015260448401929092526064808401919091528151808403909101815260849092018152602082018051600160e060020a03167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19909416939093178352518151919450849290918291908083835b60208310611eac5780518252601f199092019160209182019101611e8d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050611ee58186612264565b611eef8187612329565b611ef98185612417565b611f0281611b64565b611f0a6110d3565b600160a060020a031663dc8601b3611f206109f4565b84611f29611060565b6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611f96578181015183820152602001611f7e565b50505050905090810190601f168015611fc35780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611fe457600080fd5b505af1158015611ff8573d6000803e3d6000fd5b50505050505050505050565b604051303190600160a060020a0383169082156108fc029083906000818181858888f193505050501515611c3957808261203c612610565b600160a060020a039091168152604051908190036020019082f080158015610925573d6000803e3d6000fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290518391600091600160a060020a038416916370a0823191602480830192602092919082900301818787803b1580156120cd57600080fd5b505af11580156120e1573d6000803e3d6000fd5b505050506040513d60208110156120f757600080fd5b505190506105ea8484836124e9565b600061225f6003600060405160200180807f6e6f6e636500000000000000000000000000000000000000000000000000000081525060050190506040516020818303038152906040526040518082805190602001908083835b6020831061217e5780518252601f19909201916020918201910161215f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600019166000191681526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122555780601f1061222a57610100808354040283529160200191612255565b820191906000526020600020905b81548152906001019060200180831161223857829003601f168201915b505050505061258b565b905090565b806000808460405160200180807f6d65737361676548617368546f6b656e4964000000000000000000000000000081525060120182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b602083106122e75780518252601f1990920191602091820191016122c8565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020939093555050505050565b80600260008460405160200180807f6d65737361676548617368526563697069656e7400000000000000000000000081525060140182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b602083106123ad5780518252601f19909201916020918201910161238e565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0395909516949094179093555050505050565b80600360008460405160200180807f6d657373616765486173684d657461646174610000000000000000000000000081525060130182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061249b5780518252601f19909201916020918201910161247c565b51815160001960209485036101000a019081169019919091161790526040805194909201849003909320865285830196909652509290930160002084516109ca959194509201919050612592565b60408051600160a060020a0384166024820152604480820184905282518083039091018152606490910190915260208181018051600160e060020a03167fa9059cbb000000000000000000000000000000000000000000000000000000001781528251606093600093909290918491828a5af160005193508392508080156100f85750506000835111156125835781151561258357600080fd5b505050505050565b6020015190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106125d357805160ff1916838001178555612600565b82800160010185558215612600579182015b828111156126005782518255916020019190600101906125e5565b5061260c92915061261f565b5090565b60405160218061263a83390190565b6106a691905b8082111561260c57600081556001016126255600608060405260405160208060218339810160405251600160a060020a038116ff00a165627a7a723058203751013e5368ed767543fcd7b74f8fc3d8c0a9d69255daf3cd7b4dca9c01b65c0029
Deployed ByteCode
0x6080604052600436106100f85763ffffffff60e060020a6000350416630950d51581146100fd5780630b26cf66146101175780631072cbea14610138578063392e53cd1461015c578063437764df14610185578063530b97a4146101cc5780635d4f3b2a1461020357806369ffa08a146102375780636e5d6bea1461025e578063871c07601461027f5780638da5cb5b146102b057806399650862146102c55780639a454b99146102dd5780639a4a4395146103045780639cb7595a1461031c578063be3b625b1461035d578063cd59658314610372578063e5ebccf414610387578063f2fde38b1461039c578063f3b83791146103bd575b600080fd5b34801561010957600080fd5b506101156004356103d5565b005b34801561012357600080fd5b50610115600160a060020a036004351661051c565b34801561014457600080fd5b50610115600160a060020a0360043516602435610544565b34801561016857600080fd5b506101716105f0565b604080519115158252519081900360200190f35b34801561019157600080fd5b5061019a6106a9565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff199092168252519081900360200190f35b3480156101d857600080fd5b50610171600160a060020a03600435811690602435811690604435811690606435906084351661074c565b34801561020f57600080fd5b5061011560048035600160a060020a0316906024803591604435918201910135606435610839565b34801561024357600080fd5b50610115600160a060020a036004358116906024351661092c565b34801561026a57600080fd5b50610115600160a060020a03600435166109cf565b34801561028b57600080fd5b506102946109f4565b60408051600160a060020a039092168252519081900360200190f35b3480156102bc57600080fd5b50610294610ab2565b3480156102d157600080fd5b50610171600435610b26565b3480156102e957600080fd5b506102f2610bef565b60408051918252519081900360200190f35b34801561031057600080fd5b50610115600435610ca3565b34801561032857600080fd5b50610331611056565b6040805167ffffffffffffffff9485168152928416602084015292168183015290519081900360600190f35b34801561036957600080fd5b506102f2611060565b34801561037e57600080fd5b506102946110d3565b34801561039357600080fd5b50610294611147565b3480156103a857600080fd5b50610115600160a060020a03600435166111bb565b3480156103c957600080fd5b506101156004356111f5565b60008060606103e26110d3565b600160a060020a031633146103f657600080fd5b6103fe6109f4565b600160a060020a031661040f6110d3565b600160a060020a031663d67bdd256040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561044c57600080fd5b505af1158015610460573d6000803e3d6000fd5b505050506040513d602081101561047657600080fd5b5051600160a060020a03161461048b57600080fd5b61049484610b26565b1561049e57600080fd5b6104a78461121a565b92506104b2846112e9565b91506104bd846113ae565b90506104c884611516565b6104d38383836115e8565b60408051600160a060020a038516815260208101849052815186927f06297b0797e3363e96e454edd4ab62862051bf559a7a431ce09415306771d133928290030190a250505050565b610524610ab2565b600160a060020a0316331461053857600080fd5b6105418161170a565b50565b60008061054f611147565b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301523060248301819052604483018890529251939550919350908416916323b872dd9160648082019260009290919082900301818387803b1580156105c857600080fd5b505af11580156105dc573d6000803e3d6000fd5b505050506105ea84846117fb565b50505050565b60006004600060405160200180807f6973496e697469616c697a656400000000000000000000000000000000000000815250600d0190506040516020818303038152906040526040518082805190602001908083835b602083106106655780518252601f199092019160209182019101610646565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000205460ff1693505050505b90565b600060405160200180807f6e66742d746f2d6e66742d616d62000000000000000000000000000000000000815250600e0190506040516020818303038152906040526040518082805190602001908083835b6020831061071a5780518252601f1990920191602091820191016106fb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020905090565b60006107566105f0565b1561076057600080fd5b6107698661170a565b6107728561187b565b61077b846118ee565b61078483611975565b61078d82611aa6565b604080516c01000000000000000000000000300260208083019190915282518083036014018152603490920192839052815161081f93918291908401908083835b602083106107ed5780518252601f1990920191602091820191016107ce565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020611b64565b610827611c3d565b61082f6105f0565b9695505050505050565b6108416110d3565b600160a060020a0316331461085557600080fd5b61085d6109f4565b600160a060020a031661086e6110d3565b600160a060020a031663d67bdd256040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156108ab57600080fd5b505af11580156108bf573d6000803e3d6000fd5b505050506040513d60208110156108d557600080fd5b5051600160a060020a0316146108ea57600080fd5b610925858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437506115e8945050505050565b5050505050565b30600160a060020a0316636fde82026040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561096a57600080fd5b505af115801561097e573d6000803e3d6000fd5b505050506040513d602081101561099457600080fd5b5051600160a060020a031633146109aa57600080fd5b80600160a060020a03811615156109c057600080fd5b6109ca8383611cfe565b505050565b6109d7610ab2565b600160a060020a031633146109eb57600080fd5b6105418161187b565b60006002600060405160200180807f6d65646961746f72436f6e74726163740000000000000000000000000000000081525060100190506040516020818303038152906040526040518082805190602001908083835b60208310610a695780518252601f199092019160209182019101610a4a565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a0316949350505050565b60006002600060405160200180807f6f776e6572000000000000000000000000000000000000000000000000000000815250600501905060405160208183030381529060405260405180828051906020019080838360208310610a695780518252601f199092019160209182019101610a4a565b6000600460008360405160200180807f6d6573736167654861736846697865640000000000000000000000000000000081525060100182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b60208310610bab5780518252601f199092019160209182019101610b8c565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000205460ff1695945050505050565b600080600060405160200180807f6465706c6f7965644174426c6f636b0000000000000000000000000000000000815250600f0190506040516020818303038152906040526040518082805190602001908083835b60208310610c635780518252601f199092019160209182019101610c44565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054949350505050565b6000806060610cb06110d3565b600160a060020a031663cb08a10c856040518263ffffffff1660e060020a028152600401808260001916600019168152602001915050602060405180830381600087803b158015610d0057600080fd5b505af1158015610d14573d6000803e3d6000fd5b505050506040513d6020811015610d2a57600080fd5b505115610d3657600080fd5b30610d3f6110d3565b600160a060020a0316633f9a8e7e866040518263ffffffff1660e060020a028152600401808260001916600019168152602001915050602060405180830381600087803b158015610d8f57600080fd5b505af1158015610da3573d6000803e3d6000fd5b505050506040513d6020811015610db957600080fd5b5051600160a060020a031614610dce57600080fd5b610dd66109f4565b600160a060020a0316610de76110d3565b600160a060020a0316634a610b04866040518263ffffffff1660e060020a028152600401808260001916600019168152602001915050602060405180830381600087803b158015610e3757600080fd5b505af1158015610e4b573d6000803e3d6000fd5b505050506040513d6020811015610e6157600080fd5b5051600160a060020a031614610e7657600080fd5b610e7e6110d3565b600160a060020a031663e37c3289856040518263ffffffff1660e060020a028152600401808260001916600019168152602001915050602060405180830381600087803b158015610ece57600080fd5b505af1158015610ee2573d6000803e3d6000fd5b505050506040513d6020811015610ef857600080fd5b5051604080516024808201849052825180830390910181526044909101909152602081018051600160e060020a03167f0950d515000000000000000000000000000000000000000000000000000000009081179091529194509092509050610f5e6110d3565b600160a060020a031663dc8601b3610f746109f4565b83610f7d611060565b6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015610fea578181015183820152602001610fd2565b50505050905090810190601f1680156110175780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561103857600080fd5b505af115801561104c573d6000803e3d6000fd5b5050505050505050565b6001600080909192565b600080600060405160200180807f726571756573744761734c696d69740000000000000000000000000000000000815250600f01905060405160208183030381529060405260405180828051906020019080838360208310610c635780518252601f199092019160209182019101610c44565b60006002600060405160200180807f627269646765436f6e7472616374000000000000000000000000000000000000815250600e01905060405160208183030381529060405260405180828051906020019080838360208310610a695780518252601f199092019160209182019101610a4a565b60006002600060405160200180807f657263373231746f6b656e000000000000000000000000000000000000000000815250600b01905060405160208183030381529060405260405180828051906020019080838360208310610a695780518252601f199092019160209182019101610a4a565b6111c3610ab2565b600160a060020a031633146111d757600080fd5b600160a060020a03811615156111ec57600080fd5b61054181611aa6565b6111fd610ab2565b600160a060020a0316331461121157600080fd5b61054181611975565b6000600260008360405160200180807f6d65737361676548617368526563697069656e7400000000000000000000000081525060140182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061129f5780518252601f199092019160209182019101611280565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a031695945050505050565b60008060008360405160200180807f6d65737361676548617368546f6b656e4964000000000000000000000000000081525060120182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061136d5780518252601f19909201916020918201910161134e565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000205495945050505050565b6060600360008360405160200180807f6d657373616765486173684d657461646174610000000000000000000000000081525060130182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b602083106114335780518252601f199092019160209182019101611414565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600019166000191681526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561150a5780601f106114df5761010080835404028352916020019161150a565b820191906000526020600020905b8154815290600101906020018083116114ed57829003601f168201915b50505050509050919050565b6001600460008360405160200180807f6d6573736167654861736846697865640000000000000000000000000000000081525060100182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061159b5780518252601f19909201916020918201910161157c565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805460ff19169415159490941790935550505050565b6115f0611147565b600160a060020a031663319346678361160a846002611d26565b611615856003611d26565b611620866004611d26565b61162b876005611d26565b611636886006611d26565b611641896007611d26565b61164c8a6008611d26565b6116578b6009611d26565b6116628c600a611d26565b6040805160e060020a63ffffffff8e16028152600481019b909b5298151560248b015260448a01979097526064890195909552608488019390935260a487019190915260c486015260e4850152610104840152610124830152600160a060020a0387166101448301525161016480830192600092919082900301818387803b1580156116ed57600080fd5b505af1158015611701573d6000803e3d6000fd5b50505050505050565b61171381611d2e565b151561171e57600080fd5b806002600060405160200180807f627269646765436f6e7472616374000000000000000000000000000000000000815250600e0190506040516020818303038152906040526040518082805190602001908083835b602083106117925780518252601f199092019160209182019101611773565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03959095169490941790935550505050565b606061180682611d36565b9050611810611147565b600160a060020a03166342966c68836040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561185857600080fd5b505af115801561186c573d6000803e3d6000fd5b505050506109ca838383611de0565b806002600060405160200180807f6d65646961746f72436f6e7472616374000000000000000000000000000000008152506010019050604051602081830303815290604052604051808280519060200190808383602083106117925780518252601f199092019160209182019101611773565b6118f781611d2e565b151561190257600080fd5b806002600060405160200180807f657263373231746f6b656e000000000000000000000000000000000000000000815250600b019050604051602081830303815290604052604051808280519060200190808383602083106117925780518252601f199092019160209182019101611773565b61197d6110d3565b600160a060020a031663e5789d036040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156119ba57600080fd5b505af11580156119ce573d6000803e3d6000fd5b505050506040513d60208110156119e457600080fd5b50518111156119f257600080fd5b8060008060405160200180807f726571756573744761734c696d69740000000000000000000000000000000000815250600f0190506040516020818303038152906040526040518082805190602001908083835b60208310611a655780518252601f199092019160209182019101611a46565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000209390935550505050565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0611acf610ab2565b60408051600160a060020a03928316815291841660208301528051918290030190a1806002600060405160200180807f6f776e65720000000000000000000000000000000000000000000000000000008152506005019050604051602081830303815290604052604051808280519060200190808383602083106117925780518252601f199092019160209182019101611773565b60408051602080820184905282518083038201815282840184527f6e6f6e636500000000000000000000000000000000000000000000000000000060608401528351604581850301815260659093019384905282519093600393600093909282918401908083835b60208310611beb5780518252601f199092019160209182019101611bcc565b51815160001960209485036101000a01908116901991909116179052604080519490920184900390932086528583019690965250929093016000208451611c39959194509201919050612592565b5050565b60016004600060405160200180807f6973496e697469616c697a656400000000000000000000000000000000000000815250600d0190506040516020818303038152906040526040518082805190602001908083835b60208310611cb25780518252601f199092019160209182019101611c93565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805460ff191694151594909417909355505050565b600160a060020a0382161515611d1c57611d1781612004565b611c39565b611c398282612068565b602002015190565b6000903b1190565b604080516024808201849052825180830390910181526044909101909152602081018051600160e060020a03167fe98b7f4d000000000000000000000000000000000000000000000000000000001790526060906000611d94611147565b60408051610140808252610160820190925291925060208201612800803883390190505092506000808351602085016000855af13d6000602086013e8080156100f85750505050919050565b7f6435914e0000000000000000000000000000000000000000000000000000000060606000828686611e10612106565b60408051600160a060020a03909416602485015260448401929092526064808401919091528151808403909101815260849092018152602082018051600160e060020a03167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19909416939093178352518151919450849290918291908083835b60208310611eac5780518252601f199092019160209182019101611e8d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050611ee58186612264565b611eef8187612329565b611ef98185612417565b611f0281611b64565b611f0a6110d3565b600160a060020a031663dc8601b3611f206109f4565b84611f29611060565b6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611f96578181015183820152602001611f7e565b50505050905090810190601f168015611fc35780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611fe457600080fd5b505af1158015611ff8573d6000803e3d6000fd5b50505050505050505050565b604051303190600160a060020a0383169082156108fc029083906000818181858888f193505050501515611c3957808261203c612610565b600160a060020a039091168152604051908190036020019082f080158015610925573d6000803e3d6000fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290518391600091600160a060020a038416916370a0823191602480830192602092919082900301818787803b1580156120cd57600080fd5b505af11580156120e1573d6000803e3d6000fd5b505050506040513d60208110156120f757600080fd5b505190506105ea8484836124e9565b600061225f6003600060405160200180807f6e6f6e636500000000000000000000000000000000000000000000000000000081525060050190506040516020818303038152906040526040518082805190602001908083835b6020831061217e5780518252601f19909201916020918201910161215f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600019166000191681526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122555780601f1061222a57610100808354040283529160200191612255565b820191906000526020600020905b81548152906001019060200180831161223857829003601f168201915b505050505061258b565b905090565b806000808460405160200180807f6d65737361676548617368546f6b656e4964000000000000000000000000000081525060120182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b602083106122e75780518252601f1990920191602091820191016122c8565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020939093555050505050565b80600260008460405160200180807f6d65737361676548617368526563697069656e7400000000000000000000000081525060140182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b602083106123ad5780518252601f19909201916020918201910161238e565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0395909516949094179093555050505050565b80600360008460405160200180807f6d657373616765486173684d657461646174610000000000000000000000000081525060130182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061249b5780518252601f19909201916020918201910161247c565b51815160001960209485036101000a019081169019919091161790526040805194909201849003909320865285830196909652509290930160002084516109ca959194509201919050612592565b60408051600160a060020a0384166024820152604480820184905282518083039091018152606490910190915260208181018051600160e060020a03167fa9059cbb000000000000000000000000000000000000000000000000000000001781528251606093600093909290918491828a5af160005193508392508080156100f85750506000835111156125835781151561258357600080fd5b505050505050565b6020015190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106125d357805160ff1916838001178555612600565b82800160010185558215612600579182015b828111156126005782518255916020019190600101906125e5565b5061260c92915061261f565b5090565b60405160218061263a83390190565b6106a691905b8082111561260c57600081556001016126255600608060405260405160208060218339810160405251600160a060020a038116ff00a165627a7a723058203751013e5368ed767543fcd7b74f8fc3d8c0a9d69255daf3cd7b4dca9c01b65c0029